Структуры данных и структуры алгоритмов

Одно из важных правил программирования гласит – структура алгоритма должна соответствовать структуре обрабатываемых данных.

Таблица Вирта

Схема строения Оператор Тип данных
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;