Методы программирования
..pdf221
if (pt^.pl^.pl=nil) and (pt^.pl^.pl=nil) then begin dispose(pt^.pl);
pt^.pl:=nil;
end;
end {left}
else begin {rigth}
if (pt^.pr^.pl=nil) and (pt^.pr^.pl=nil) then begin dispose(pt^.pr);
pt^.pr:=nil;
end;
end; {rigth}
end; {delete_element} {-=-=-=-=-=-=-=-=-=-=-=-=-=-} BEGIN {main program}
clrscr;
new (p_root); p_root^.d:=1; p_root^.pl:=nil; p_root^.pr:=nil;
add_element (2, true , p_root); add_element (3, false, p_root); p_temp:=p_root^.pl;
add_element (4, true , p_temp); add_element (5, false, p_temp); p_temp:=p_root^.pr;
add_element (6, true , p_temp); add_element (7, false, p_temp); show_tree(p_root); delete_element(p_temp, true); writeln;
show_tree(p_root); END.
#include <stdlib.h> #include <stdio.h> #include <time.h> #include <iostream.h>
typedef struct tree { int d;
struct tree *pl; struct tree *pr;
};
void show_tree (tree *pt) {
//показывает список top-down if (pt != NULL) {
cout << (*pt).d)<< "\n"; show_tree ((*pt).pl); show_tree ((*pt).pr);
}
}
void add_element (int d, int f, tree *pt) {
//вставляет элемент за указателем if (pt != NULL) {
if (f) { //left
if ((*pt).pl == NULL) {
222
(*pt).pl = new tree; (*(*pt).pl).d = d; (*(*pt).pl).pl = NULL; (*(*pt).pl).pr = NULL;
} //left
}
else { //rigth
if ((*pt).pr == NULL) { (*pt).pr = new tree; (*(*pt).pr).d = d; (*(*pt).pr).pl = NULL; (*(*pt).pr).pr = NULL;
}
}
}
}
void delete_element (tree *pt, int f) {
//удаляет текущий элемент if (pt != NULL) {
if (f) { //left
if (((*(*pt).pl).pl == NULL) && ((*(*pt).pl).pl == NULL)) { delete (*pt).pl;
(*pt).pl = NULL;
}
} //left
else { //rigth
if (((*(*pt).pr).pl == NULL) && ((*(*pt).pr).pl == NULL)) { delete (*pt).pr;
(*pt).pr = NULL;
}
}
}
}
int main (void)
{
tree *a;
a = new tree; (*a).d = 1; (*a).pl = NULL; (*a).pr = NULL;
add_element (2, 1, a); add_element (3, 0, a); add_element (4, 1, (*a).pl); add_element (5, 0, (*a).pl); add_element (6, 1, (*a).pr); add_element (7, 0, (*a).pr); cout << (*a).d <<"\n";
cout << "---------------\n"; show_tree (a);
delete_element ((*a).pl, 0);
cout << "---------------\n"; show_tree (a);
return 0;
}
223
Работа со списками
{пример работы двунаправленного списка} uses crt;
type l2_element=record
d : integer;{данные}
p1 : pointer;{указатель на следующий}
p2 : pointer;{указатель на предыдущий}
end; var
l2_first, {указатель на первый элемент}
l2_current, {указатель на текущий элемент} l2_temp : ^l2_element; {временный указатель} i,j : integer;
{-=-=-=-=-=-=-=-=-=-=-=-=-=-} procedure show_list;
{показывает список} begin
l2_temp:=l2_first;
while l2_temp^.p1<>nil do begin
{ writeln(l2_temp^.d:6,' ',seg(l2_temp^),' ',ofs(l2_temp^));} writeln(l2_temp^.d:3);
l2_temp:=l2_temp^.p1; end;{while}
if l2_temp<>nil then writeln(l2_temp^.d:3); end;{show_list} {-=-=-=-=-=-=-=-=-=-=-=-=-=-}
procedure add_element (d : integer);
{вставляет элемент за указателем} var p : pointer;
begin
new (l2_temp);
{writeln(i,' ',seg(l2_temp^),' ',ofs(l2_temp^),' ',seg(l2_current^),' ',ofs(l2_current^));}
l2_temp^.d:=i;
l2_temp^.p1:=l2_current^.p1;
l2_temp^.p2:=l2_current;
l2_current^.p1:=l2_temp; p:=l2_temp; l2_temp:=l2_temp^.p1; l2_temp^.p2:=p;
{writeln(i,' ',seg(p^),' ',ofs(p^));}
end;{add_element} {-=-=-=-=-=-=-=-=-=-=-=-=-=-} procedure delete_element ;
{удаляет текущий элемент} begin
if l2_current^.p1<>nil then begin l2_temp:=l2_current^.p1; l2_temp^.p2:=l2_current^.p2;
end;
if l2_current^.p2<>nil then begin l2_temp:=l2_current^.p2; l2_temp^.p1:=l2_current^.p1;
end;
release (l2_current); end;{add_element} {-=-=-=-=-=-=-=-=-=-=-=-=-=-} BEGIN
new (l2_first);
224
l2_first^.d:=0;
l2_first^.p1:=nil;
l2_first^.p2:=nil;
l2_current:=l2_first;
for i:=1 to 5 do add_element(i); show_list;
l2_current:=l2_first^.p1; delete_element; show_list;
END.
#include <stdlib.h> #include <stdio.h> #include <time.h> #include <iostream.h>
typedef struct l2_element { int d;
struct l2_element *p1; struct l2_element *p2;
};
void show_list (l2_element *pt) {
//показывает список l2_element *pp; pp = pt;
while ((*pp).p1 != NULL) { cout << (*pp).d << " "; pp = (*pp).p1;
}
if (pp != NULL) cout << (*pp).d << "\n";
}
void add_element (int d, l2_element *pt) {
// вставляет элемент за указателем if (pt != NULL) {
l2_element *pp, *t; pp = new l2_element; (*pp).d = d; (*pp).p1 = (*pt).p1; (*pp).p2 = pt; (*pt).p1 = pp;
t = pp;
pp = (*pp).p1; (*pp).p1 = t;
}
}
void delete_element (l2_element *pt) {
//удаляет текущий элемент if (pt != NULL) {
l2_element *pp;
if ((*pt).p1 != NULL) { pp = (*pt).p1; (*pp).p2 = (*pt).p2;
}
if ((*pt).p2 != NULL) { pp = (*pt).p2;
225
(*pp).p1 = (*pt).p1;
}
delete pt;
}
}
int main (void)
{
l2_element *a, *c; a = new l2_element; (*a).d = 0;
(*a).p1 = NULL;
(*a).p2 = NULL;
c = a;
for (int i = 1; i < 6; i++) { add_element (i, c);
c = (*c).p1;
}
c = a; show_list (c);
c = (*a).p1; delete_element (c);
c = a; show_list (a);
return 0;
}
226
Пример оформления контрольной работы.
1. Титульный лист:
Министерство образования Российской Федерации Томский государственный университет систем управления и радиоэлектроники
Кафедра комплексной информационной безопасности электронно-вычислительных систем
Контрольная работа № 1 по курсу "Структуры данных и прикладные алгоритмы" вариант 0
выполнил студент группы 200 город Томск
Иванов Иван Иванович
проверил доцент кафедры КИБЭВС Мещеряков Р.В.
Томск
2002
2. Задание
1. Дана действительная квадратная матрица порядка 8. Найти минимальное значение матрицы.
227
3. Обобщенная блок-схема алгоритма.
|
начало |
|
|
Задание матрицы m |
|
|
размерностью nxn |
|
|
случайным образом |
|
|
Вывод матрицы |
|
|
m на экран |
|
|
min = m1,1 |
|
кц |
i = 1, n, 1 |
|
|
|
|
|
j = 1, n, 1 |
кц |
|
|
|
нет |
min > mi,j |
|
|
|
|
|
да |
|
|
min = mi,j |
|
|
Вывод значения |
|
|
min на экран |
|
конец
228
Алгоритм программы состоит из последовательности следующих шагов:
1)Задание матрицы случайным образом.
2)Отображение матрицы на экран.
3)Поиск минимального значения матрицы.
4)Вывод найденного значения матрицы на экран.
Наиболее важная часть: поиск минимального значения.
Вначале предполагаем, что элемент матрицы с индексами 1,1 , т.е. m1,1 является самым минимальным элементом. Затем проводится прохождение по всем элементам матрицы (два цикла по индексам). Если находится элемент, который меньше текущего минимального, то текущему минимальному присваивается значение текущего элемента. По окончанию сравнения текущего минимального со всеми элементами матрицы значение текущего минимального будет равно минимальному элементу матрицы.
4. Исходный текст программы.
uses crt;
const n=8;{размерность матрицы}
var m : array [1..n,1..n] of integer;{задаем матрицу nxn типа целое} i,j : integer;{}
min : integer;{}
procedure show;
{отображает матрицу} var i,j : integer; begin
for i:=1 to n do begin
for j:=1 to n do write(m[i,j]:4);{выводим строку} writeln;{переход на новую строку}
end;
end;
BEGIN
clrscr; {очистка экрана} randomize;{запускаем датчик случайных чисел} for i:=1 to n do
for j:=1 to n do m[i,j]:=random(100)-50;{задаем матрицу случайным образом} show;
min:=m[1,1];
for i:=1 to n do for j:=1 to n do
if min>m[i,j] then min:=m[i,j];{находим минимальный} writeln('минимальное значение матрицы',min:4)
END.
229
5. В основной программе используются следующие типы данных:
n=6 |
|
|
|
|
|
Константа, определяющая размерность |
|
|
|
|
|
|
|
матрицы. Является входным параметром. |
|
m : array [1..n,1..n] of integer |
Матрица целых чисел m размерностью nxn . |
||||||
i,j : integer |
|
|
|
|
Переменные типа целое для организации |
||
|
|
|
|
|
|
индексов матрицы. |
|
min : integer |
|
|
|
|
Переменная типа целое для поиска |
||
|
|
|
|
|
|
результата. Является выходным значением. |
|
Процедура show осуществляет отображение матрицы на экран |
|||||||
i,j : integer |
|
|
|
|
Переменные типа целое для организации |
||
|
|
|
|
|
|
индексов матрицы. |
|
m [] |
|
|
|
|
|
Используется как глобальная переменная из |
|
|
|
|
|
|
|
основной программы. Является входным |
|
|
|
|
|
|
|
параметром. |
|
6. Результаты работы программы на тестовых примерах; |
|||||||
-7 |
30 |
-8 |
-40 -33 |
48 |
-44 -11 |
||
35 |
-31 |
11 |
-10 |
7 |
-22 15 -29 |
||
30 |
40 |
-46 |
46 |
29 |
36 |
-21 -16 |
|
48 |
36 |
9 |
3 |
8 |
-17 -2 -43 |
||
40 |
5 |
47 |
-9 |
44 |
-6 21 -46 |
||
-22 |
2 |
-11 |
15 |
-18 |
48 |
5 -1 |
|
-6 -49 |
1 |
42 |
8 |
10 |
49 -44 |
||
-12 |
10 |
22 |
25 |
28 |
25 |
-39 -25 |
|
минимальное значение |
матрицы -49 |
||||||
230
Вопросы к экзамену
1.Простые структуры данных.
2.Представление целых чисел.
3.Представление вещественных чисел (с фиксированной и плавающей точкой).
4.Логические типы данных.
5.Перечисления.
6.Диапазоны.
7.Кодировки символов.
8.Представление строк в виде строки со счетчиком.
9.Представление строк в виде строки с признаком конца строки.
10.Структура данных стек.
11.Структура данных очередь.
12.Структура данных дек.
13.Структура данных последовательность.
14.Структура данных множество, нагруженное множество.
15.Структура данных однонаправленный список.
16.Структура данных двунаправленный список.
17.Структура данных вектор.
18.Структура данных матрица.
19.Структура данных динамический вектор.
20.Структура данных граф.
21.Представление графов.
22.Структура данных дерево.
23.Представление деревьев.
24.Бинарное дерево.
25.Правило обхода дерева внизу вверх.
26.Правило обхода дерева cверху вниз.
27.Ориентированные графы.
28.Задача нахождения наикратчайшего пути.
29.Сортировка.
30.Условия, при которых возможна сортировка.
31.Внутренняя сортировка.
32.Сортировка посредством выбора.
33.Обменная сортировка.
34.Сортировка вставкой.
35.Сортировка методом подсчета.
36.Метод сортировки Шелла.
37.Внешняя сортировка.
38.Сортировка слиянием.
39.Хранение данных в файлах.
