Приведение к процедурному представлению

 

В линейном алгоритме, где все действия выполняются последовательно, любое неэлементарное действие можно выделить в процедуру. Рекомендуется выделять процедуры, которые выполняются не один раз и/или облегчают чтение алгоритма.

К сожалению не всегда можно привести алгоритм к процедурному представлению. На примере вычисления среднего слоя атмосферного слоя методом квадратов рассмотрим алгоритм с вложенными циклами. В этом случае в процедуры целесообразно выделять только те части алгоритма, которые содержат циклы только самого нижнего уровня вложения и при этом выполняются последовательно.

Задача может быть представлена в виде четырех последовательных действий, которые надо привести к элементарным действиям:

· Разбить площадь водосбора сетью равновеликих квадратов числом 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. конец