На этом шаге мы рассмотрим назначение и использование пошаговой детализации.
Структурное программирование до сих пор было у нас представлено как свойство или оценка окончательного текста программы.
Необходимо добавить еще один ключевой момент - методологию, или особенности мыслительного процесса, управляющего процессом получения структурной программы. Этот мыслительный процесс называется пошаговой детализацией и был первоначально предложен Э.Дейкстрой [1], а затем улучшен Н.Виртом [2].
Причем на протяжении всего процесса логика выражается основными конструкциями структурного программирования.
В методе пошаговой детализации можно выделить следующие существенные этапы [3].
Псевдокод включает в себя наборы фраз для написания таких групп операторов: последовательность, выбор, итерация, - дополняемых текстом на обычном языке. Псевдокод не имеет строгого определения, поэтому Вы всегда можете сконструировать свой собственный псевдокод, используя, например, конструкции школьного алгоритмического языка: если, пока, для, выбор, а также комментарии, формулы и словесное описание действий и процессов.
В описание процессов могут входить операторы конкретного языка программирования, организующие ввод и вывод, а также оператор присваивания, но не операторы перехода или другие средства передачи управления, применение которых должно ограничиваться реализацией трех указанных выше типов структур на заключительном этапе процесса проектирования.
4., 2.51, 10, -5, 7.5 ,
0.4, 0.251, 1, -0.5, 0.75 .
Уровень 1:
1) ввести данные; 2) найти максимум введенных данных; 3) вывести результаты.
Детализация 1.1. Ввод данных можно детализировать на псевдокоде следующим образом:
1) определить количество чисел; 2) пока не все элементы введены, прочитать и запомнить значение элемента; 3) конец цикла.
Это описание можно перевести на язык Turbo Pascal следующим образом:
Write ('Укажите количество элементов: '); ReadLn(N); For i:=1 To Do ReadLn(A[i]);
Детализация 1.2. Отыскание максимума можно детализировать следующим образом:
1) выбрать в качестве максимума первый элемент данных; 2) пробежать все введенные значения, заменяя текущий максимум на очередное значение, если оно не превысило его.
Детализация 1.3. Вывод результатов можно детализировать следующим образом:
1) пока не все результаты выведены; 2) вывод значения очередного элемента, поделенное на максимум; 3) конец цикла.
Это описание можно немедленно перевести на Turbo Pascal следующим образом:
For i:=1 To N Do WriteLn(A[i]/M); .
Уровень 2. Он включает в себя три детализованные выше части, из которых только детализация 1.2 требует дополнительного внимания. Ее можно детализировать на псевдокоде следующим образом:
1) положить М, равное первому элементу данных; 2) пока не все элементы просмотрены; 3) если М<текущий элемент, то M = текущий элемент; 4) конец цикла.
Это описание можно перевести на Turbo Pascal следующим образом:
M:=A[1]; For i:=1 TO N Do If M<A[i] Then M:=A[i];
Так как приведенные выше модули используются только по одному разу и очень просты, то можно не делать из них подпрограммы, а объединить их вместе в одну программу:
{Программа, полученная из псевдокода.} Program Primer; Var A: Array [1..20] Of Real; M: Real; N, i: Byte; Begin {Первый уровень.} Write('Укажите количество элементов: '); ReadLn(N); For i:=1 To N Do ReadLn(A[i]); {Второй уровень.} M:=A[1]; For i:=1 TO N Do If M<A[i] Then M:=A[i]; {Третий уровень.} For i:=1 To N Do WriteLn(A[i]/M); End.
При решении реальной задачи может потребоваться написать на псевдокоде много уровней, чтобы довести все модули до такого состояния, при котором они окажутся готовыми для программирования.
На следующем шаге мы поговорим о трюках.