Одно из важных правил программирования гласит – структура алгоритма должна соответствовать структуре обрабатываемых данных.
Таблица Вирта
№ | Схема строения | Оператор | Тип данных |
---|---|---|---|
1. | Атомарный элемент | Присваивание | Скалярный |
2. | Следование | Составной оператор | Запись |
3. | Выбор | Условный оператор | Запись с вариантами |
4. | Известное число повторений | Оператор цикла с параметром | Массив |
5. | Неизвестное число повторений | Итерационный оператор цикла | Последовательность или файл |
6. | Рекурсия | Оператор процедуры | Рекурсивный |
7. | Универсальный граф | Оператор безусловного перехода | Структура, связанная ссылками |
1. <переменная> := <значение>
2. rec = record
a: integer;
b: real;
end;
var r: rec;
begin
r.a := 0;
r.b := 0;
end;
3. rec = record
case flag: Boolean of
false: a: integer;
true: b: real;
end;
var r: rec;
if flag then
...
else
...
Выбор реализуется не только в записях с вариантами. Если мы ищем в массиве, например, положительные числа, то каждый элемент массива тоже реализует выбор – является ли значение элемента массива положительным или нет. Соответственно, для обработки используется условный оператор.
4. for i := 1 to n do
...
Матрица является структурой, которую можно описать как «массив из одномерных массивов». Соответственно нам нужен внешний цикл для обработки строк/столбцов, а в теле внешнего цикла используется внутренний цикл, хотя тело цикла может быть более сложным.
5. переход к началу списка
while не достигнут конец списка do
begin
обработка текущего элемента списка
переход к следующему элементу списка
end;
6. Рекурсивные (т.е. вызывающие себя) подпрограммы незаменимы при обработке данных рекурсивной структуры, например, бинарного дерева.
procedure Tree(root: node);
begin
обработать вершину дерева
if root.left then
Tree(root.left);
if root.rigth then
Tree(root.right);
end;
Задача о Ханойских башнях
procedure Hanoi(count: integer; initial, target, free: integer);
begin
if count > 0 then
begin
Hanoi(count – 1, initial, free, target);
перенести самый большой диск с начального (initial) столбика на целевой (target)
Hanoi(count – 1, free, target, initial);
end;
end;