Приведение к процедурному представлению
В линейном алгоритме, где все действия выполняются последовательно, любое неэлементарное действие можно выделить в процедуру. Рекомендуется выделять процедуры, которые выполняются не один раз и/или облегчают чтение алгоритма.
К сожалению не всегда можно привести алгоритм к процедурному представлению. На примере вычисления среднего слоя атмосферного слоя методом квадратов рассмотрим алгоритм с вложенными циклами. В этом случае в процедуры целесообразно выделять только те части алгоритма, которые содержат циклы только самого нижнего уровня вложения и при этом выполняются последовательно.
Задача может быть представлена в виде четырех последовательных действий, которые надо привести к элементарным действиям:
· Разбить площадь водосбора сетью равновеликих квадратов числом n.
· В квадратах, где есть станции, определить среднюю величину осадков как среднее арифметическое из слоя осадков станций, попавших в квадрат.
· В квадратах, где нет станций, определить среднюю величину осадков интерполированием значений осадков в соседних квадратах.
· Вычислить среднее значение слоя осадков делением суммы осадков во всех квадратах, расположенных в пределах водосбора, на число квадратов.
Чтобы выполнить действия 2, 3, 4 надо вычислить величины осадков во всех квадратах. Однако эти действия нельзя объединить в один «цикл по квадратам», т.к. квадраты со станциями должны быть «обработаны» раньше квадратов без станций. Поэтому можно организовать либо три цикла, либо два цикла: на второе и на остальные 3 и 4 действия.
В первом «цикле по квадратам» для вычисления суммы осадков в квадрате необходимо проверить координаты всех станций, чтобы определить, попадают ли они в данный квадрат. «Цикл по станциям» будет вложен внутрь «цикла по квадратам».
Наконец, в условиях задачи не указано число квадратов, и может понадобиться производить различные разбиения площади водосбора и сравнивать результаты, поэтому необходим внешний «цикл делений площади», включающий все остальные циклы. В итоге получаем следующую схему алгоритма:
1. начало
2. выполнить процедуру ввода исходных данных по станциям
3. цикл деления площади водосбора на n квадратов: начало
. . .
3.1. цикл по квадратам для определения средней величины осадков как средней арифметической из слоя осадков станций, попавших в квадрат: начало
3.1.1. цикл по станциям для определения суммы осадков по станциям, попавшим в квадрат: начало
3.1.2. конец цикла по станциям
3.2. конец цикла по квадратам
3.3. цикл по квадратам для определения средней величины осадков интерполированием величин осадков в соседних квадратах и для определения суммы осадков во всех квадратах: начало
3.4. конец цикла по квадратам
3.5. вычислить среднее значение слоя осадков
. . .
4. конец цикла деления площади
5. конец
В этой схеме ввод исходных данных выделен в отдельную процедуру и вынесен в начало для удобства чтения алгоритма и облегчения отладки. Но если данных много, и они не требуют особого контроля, то это действие можно включить в цикл по станциям, пункт 3.1.1.
В окончательном виде алгоритм может иметь следующий вид:
1. начало
2. объявление переменных
S – площадь водосбора (квадрат)
m – число станций
Z[m] – массив осадков по метеостанциям
X[m], Y[m] – массивы координат станций
n – число квадратов
a – сторона квадрата
D[n] – массив осадков по квадратам
DS[n] – массив числа станций по квадратам
ix – номер квадрата по оси OX
iy – номер квадрата по оси OY
REZ – результат, средний слой осадков на площади водосбора
3. вып. процедуры ввода исходных данных: S, m, Z[m], X[m], Y[m]
4. цикл деления площади водосбора на n квадратов: начало
4.1.вып. процедуры задания числа квадратов
4.2.присвоение начальных значений D[i]=0, DS[i]=0 для i=i,m; ix=0; iy=0; a=кв. корень из S/n; b=кв. корень из n;
4.3.цикл по n квадратам, i=1,n: начало
4.3.1. если квадрат находится в начале строки матрицы квадратов, т.е. i=b*iy+1, то ix=1; iy=iy+1, иначе ix=ix+1
4.3.2. цикл по m станциям, j=1,m: начало
4.3.2.1.если j-ая станция с координатами x[ j ], y[ j ] попадает в квадрат, т.е. (ix-1)*a < X[ j ] < ix*a .И. (iy-1)*a < Y[ j ] <= iy*a, то D[i]=D[i]+Z[ j ]; DS[i]=DS[i]+1
4.3.3. конец цикла по станциям
4.3.4. если D[i]<>0 .И. DS[i]<>0, то D[i]=D[i] / DS[i]
4.4.конец цикла по квадратам
4.5.цикл по n квадратам, i=1,n: начало
4.5.1. если станций в квадрате нет, DS[i=0], то вып. процедуры интерполирования осадков по квадратам, результат а D[i]
4.5.2. REZ=REZ+D[i]
4.6.конец цикла по квадратам
4.7.вычисление среднего слоя осадков: REZ=REZ / n
4.8.вывод результатов
5. конец цикла деления площади водосбора
6. конец