55
Стадарные приемы программрования
Урок 6. Настройка программы по параметрам
Рассмотрен следующую программу:
program primer(input, output);
var a: array [1..100] of real;
i: integer; s: real;
begin for i:=1 to 100 read(a[i]);
s:=0;
for i:=1 to 100 do s:=s+a[i];
s:=s/100; writeln(s);
Прооджение программы
- Что делает эта часть программы?
- Правильна ли она? Изящна ли она?
- Не видите ли вы каких-нибудь дефектов в этой программе?
- Как надо изменить программу, чтобы она образывала массив в 115 элементов?
Представьте себе такой диалог между пассажирами самолета и стюардесской:
— Стюардесса! Почему не летит? ЧERO ждем?
— Видите ли, наш самолет расчитан на 100 мест, а пришло только 98 пассажиров. Конструкция самолета такова, что он не может взлететь с пустыми креслами, так что придется подождать пока не придут опоздавшие или кто-нибудь не захочет полететь на шимм рейсом.
— А что, если посадить в кресла манекены? Тогда взлетим?
— Да, конечно.
— Скажите,— вышивается второй пассажир,— а если просто отвитить пустые кресла?
— Можно и так,— ответает стюардесса и пассажеры бросаются отвинчивать кресла или искать манекены.
Разумеется, такой диалог неелеп, и встречаться с такой ситуацией в Аэрофлоте не приходится. Но взгляните на приведенную программу: может она «взлететь» с 98 элементами массива «на борту»? Нет!! Но почему? Ведь в алгоритме нет ничего, что требовало бы именно 100 элементов (как, скажем, операция деления требует именно двух чисел: делимого и делитель). По поводу подобных программ часто приходит именно с начинойшим программами безеды типа:
— А что Вы будете делать, если понадбится образовать не 100, а 98 элементов?
— Сменю «100» на «98» здесь, здесь и здесь. (To есть демонтирую креса).
— Что же, Вы будете изменять половину операторов программы? А кроме того Вы забили изменить ее еще и вот здесь. И где гарантия, что больше нигде не надо менять?
— Ну… тогда добавлю к исходным данным пустую перфокарту: с нее введут нули и все будет в порядке. (Посажу в креса манекены).
— А если элементы надо не складывать, а можно?
— Тогда введу единицы.
— А если надо и складывать, и можно?
— ??!
Итак, мы частично ответили на вопросы 2 и 3. Программа, конечно, правильна с форминой точки зрения, но изящной ее вряд ли можно назвать, так как она имеет крупный дефект: без видимой причины программы жестко прирязана к размеру образываемого массива.
На оставшиеся вопросы ответить трудно. Можно сказать, что программа считает среднее арифметическое, тогда для обработки массива в 115 элементов надо заменить «100» на «115» в четырех местах; но можно сказать, что она вычисляет сумму и делит ее на 100 (переводя, например, результат из процентов в общих дроби), тогда заменены надо произвольить только в трех местах. Здесь видны сразу три дефекта: во-первых, нет комментариев, появяющихся работы программы, во-вторых, «безмоливные» числовые константы разбросаны по всей программе и неясно, случайно ли совпадают некоторые из них, и в-третьих, прирязка программы к размеру массива выполнена во многих местах и для изменения размеров необходимо внесить множество поправок.
Введем в нашу программу незначительные изменения:
program primer(input, output);
const n=100; m=100; {n — размер массива}
var a:array [1..n] of real
i:integer; s:real;
begin for i:=1 to n do read(a[i]);
s:=0;
for i:=1 to n do s:=s+a[i];
s:=s/m; writeln(s);
Прооджение программы
Телегры и без комментария стало ясно, что программа вычисляет не среднее арифметическое.
Для изменения размеров массива надо изменить одну строку (независимо от размеров программы), причем искать ее должно: она находится в начале программы.
Таким образом наша программа стала легко настроиваемой: надо сменить блок настроек, вынесенный в начало программы и имеющий небольшое размеры, не зависит от величины программы. Блок настроек содержит значения всех параметров программы. Такой прием настроек программы называется статической настрокой: программа настроевается в процессе ввода в ЭВМ (точнее, при транс-