Здесь мы рассмотрим один из наиболее важных вопросов: как создавать программу?
До сих пор мы имели дело с относительно небольшими программами для решения несложных алгоритмических проблем. Мы познакомились с важностью и ролью спецификации программы, ясностью формулировки основных шагов алгоритма при обработке данных, трансляцией этих шагов в эффективные последовательности операторов программы на языке Pascal, комментировании программы, проверки ее правильности. Мы убедились, что проверять правильность программы надо, даже тогда, когда корректность использованного алгоритма была доказана. Причем, заметим, что внутренняя организация всех программ, которые мы написали до сих пор, может быть представлена в a’le Pascal форме как на рис. 13.1.
Разработка большой программы отличается от разработки малой в двух основных аспектах.
Текст программы для решения большой проблемы занимает много больше места, чем одна страница.
Создание таких программ путем написания Pascal программы “с листа”практически невозможно.
Как правило, эта разработка предполагает систематический подход:
описание проблемы;
разработка алгоритма;
написание программы.
Созданная программа должна быть читабельной, эффективной и корректной.
{{Q} Exmpl {R}}
{Описание используемых пременных в пред и пост условиях}
begin
{Ввод исходных данных}
{Проверка выполнения предусловия,
т.е. корректности исходных данных}
if {Данные корректны} then
{Q}
begin {Обработка данных}
{R}
{Вывод}
end
else {Сообщение об ошибке ввода}
end
Рис. 13.1. Типичная внутренняя организация программы.
Создание программы - это систематический процесс, состоящий из определённых этапов. В результате этого процесса мы получаем программу. Поскольку мы хотим получать программу
ясную для понимания, т.е. читабельную;
эффективную, т.е. экономно расходующую ресурсы исполнителя и выполняемую им быстро;
правильную, т.е. не содержащую ошибок;
то не любой процесс создания программы нам подходит.
Нам нужна методика создания ясных, правильных, эффективных программ.
Ясность означает, что любой, кто знаком с языком Pascal и прикладной областью, поймет алгоритм, читая текст программы, комментарии и спецификацию проблемы.
Эффективность предполагает, что алгоритм и программа составлены так, чтобы минимизировать по возможности ресурсы вычислительной системы, необходимые для ее решения.
Корректность означает, что любое исполнение программы с допустимыми исходными данными дает правильный результат.
Под методикой создания какого-либо продукта мы будем понимать чётко определённую последовательность этапов, выполнив которую, мы получим желаемый продукт с нужными характеристиками.
Давайте напишем небольшую программу, сосредоточив теперь наше внимание именно на процессе её создания. Пусть к нам обратились с просьбой написать программу на Pascal, которая размещает компоненты вектора в возрастающем порядке. Пусть после общения с заказчиком нам удалось выяснить, что:
компонентами вектора могут быть только натуральные числа;
компонентов всегда 100;
все компоненты попарно различны.
Мы уже специфицировали исходные данные для этой задачи в лекции 7. Там исходные данные мы специфицировали так:
Q1 = "i : 1 £i £ 100 :viÎN Ù vi>0.
Теперь надо выразить тот факт, что все компоненты различны:
Q2 = "i : 1 £i £ 100 : Ø$j : 1 £ j £ 100 : vi = vj Ù i¹j.
Отсюда спецификация исходных данных выглядит так:
Q=Q1ÙQ2="i : 1 £i £ 100 : (viÎN Ù vi>0)ÙØ$j : 1 £ j £ 100 : vi = vj Ù i¹j .
Спецификация множества возможных результатов там была записана в следующей форме:
"i : 1 £i < 100 :(oiÎN Ù oi>0 Ù o100ÎN Ù o100>0 Ù oi0)ÙØ$j: 1 £ j £ 100: vi = vj Ù i¹j .
Output:
R "i: 1 £i £ 100: оiÎN Ù оi>0 Ù$j : 1 £ j £ 100 : оi= vj Ù
"k : 1 £ k £ 100 : îk0 ;
"i: 1 £ i £ 100 : Ø$j: 1 £ j £ 5: v[i] = v[j] Ù i¹j .
{Проверка условия Q1: "i: 1 £ i £ 100 : v[i]ÎN Ù v[i]>0}
errngtv:=0 ; for i:=1 to 100 do if v[i]