Программу MakeArray (пример 2 предыдущего раздела) можно было бы написать следующим образом:
Program MakeArray1; Const Nmax=500;Type Ar1=array[1..Nmax] of
real;Ar2=array[1..Nmax] of word;Var i,n:word;X:Ar1;Y:Ar2;
Function Elem(k:word):word;Var p:word;Begin p:=0;For i:=1 to
n do If x[i]>x[k] then Inc(p);Elem:=p;End;Begin В в о д n, X
For i:=1 to n do y[i]:=Elem(i); П е ч а т ь Y End.
Не требуется комментариев, чтобы сделать вывод о том, что такую программу очень трудно читать и понимать.
С точки зрения ЭВМ не имеет значения форма написания исходной программы, лишь бы она была правильной. Но хотя программа выполняется на ЭВМ, все-таки читать, использовать и модифицировать ее приходится программисту. Поэтому одним из основных принципов в проектировании программ является следующий: программа составляется в первую очередь для человека, а не для машины. В связи с этим в тексте программы обязательно должны содержаться средства, облегчающие ее понимание и улучшающие ее читабельность.
Исходный текст программы MakeArray1 занимает меньший объем памяти на диске по сравнению с программой MakeArray, однако это не должно служить критерием для выбора формы ее представления. Если возникает противоречие между экономией машинных ресурсов и читабельностью программы, то в этом случае нужно руководствоваться следующим: рабочее время программиста значительно дороже машинных ресурсов.
Специальных стандартов на тексты программ не существует. Тем не менее профессиональные программисты при написании программы придерживаются определенных правил, направленных на соблюдение указанного выше принципа программирования.
При написании текста программы рекомендуется выполнять приведенные ниже требования (в перечень включены также языковые средства, которые рассматриваются несколько позже).
1) Заголовки модуля и его секций, заголовки программы и каждого ее раздела (разделы Label, Const, Type, Var, раздел описания процедур и функций, раздел операторов) начинать с первой позиции строки.
2) После заголовка модуля (Unit) указывать в комментарии основное назначение входящих в модуль процедур и функций.
3) После заголовка процедуры или функции приводить в комментарии краткое описание выполняемой ею работы.
4) Длинные тексты программы разделять комментариями на фрагменты. В комментарии кратко описывать работу фрагмента.
5) После объявления имени переменной в комментарии описывать назначение переменной.
6) Процедуры и функции отделять друг от друга пунктирной линией, заключенной в комментарий.
7) После слова End, завершающего блок процедуры или функции, в комментарии указывать имя данной процедуры или функции.
8) В качестве символов комментария использовать только фигурные скобки.
9) Каждое слово Begin начинать с новой строки.
10) Каждое слово Endзаписывать с новой строки строго с той позиции, с которой начинается относящееся к нему слово Begin, Case или record.
11) Текст программы между словами Begin и End, Case и End, Recordи Endдолжен быть сдвинут на один отступ вправо. Отступ равен двум позициям строки.
12) Текст программы после слов do, then, else должен начинаться с новой строки, сдвинутой на один отступ вправо.
13) Каждое слово else должно быть расположено под тем словом if, к которому оно относится.
14) Разделы описания, как правило, располагать в порядке, предусмотренном стандартным языком Паскаль: Label, Const, Type, Var, описание процедур и функций.
15) Имена переменных записывать, как правило, с большой буквы.
16) Имена переменных в программе в общем случае не должны отличаться от обозначений, принятых в исходной постановке задачи. Например, было бы нелогично обозначать в программе ускорение свободного падения именем Z вместо общепринятого обозначения g, даже снабдив это имя комментарием.
17) Отдельные части имени, состоящего из нескольких слов, выделять большими буквами (например, FromSetToNumber).
18) Длина строки программы не должна превышать 68 символов (для печати текста программы стандартным шрифтом на бумаге формата А4).
19) Оператор Goto разрешается применять в программе в двух случаях:
- для принудительного выхода из цикла;
- для перехода к далеко отстоящему фрагменту программы.
Совершенно недопустимо использовать оператор Gotoдля перехода снизу вверх.
Если оператор Goto производит переход на конец процедуры или функции, то его целесообразно заменить оператором Exit, а для принудительного выхода из цикла использовать оператор Break.
20) В программе вместо значений констант использовать, как правило, имена констант.
21) В разделе описания переменных использовать имена типов, а не описания типов. Например, вместо описания
Var A : array[1..100] of string[40];
целесообразно использовать описание
ConstNmax = 100;
Type string40 = string[40];
Ar = array[1..Nmax] of string40;
Var A : Ar;
Последнее требование связано с тем, что в большой программе любая переменная может быть использована где-либо как фактический параметр при обращении к процедуре, а при таком обращении всегда требуется совпадение имени типа формального и фактического параметров. Неприятные последствия использования в разделе Varописания типа вместо имени типа могут проявиться и в других, более редких случаях.
22) Следует избегать различных программных "трюков", затрудняющих понимание программы.
Например, трудно понять работу такого фрагмента:
Varx,y,z,w : real;
......
If x>y then
w:=0
Else
w:=y-x;
z:=x+w;
Оказывается, это вычисление значения, равного большему из двух чисел: x и y.
В данном случае целесообразно написать:
If x>y then
z:=x
Else
z:=y;
Второй пример.
Для обмена значений двух переменных иногда записывают:
x:=x-y; y:=x+y; x:=y-x;
вместо более ясной схемы обмена "по треугольнику":
z:=x; x:=y; y:=z .
Программирование в соответствии с приведенными выше правилами часто именуется структурным программированием, а написанную в таком стиле программу называют структурированной.