Что такое "хорошая" программа?
Если отвлечься от конкретного содержания той или иной задачи, то основные этапы ее решения с помощью компьютера, преобразующего исходные данные в выходные, приведены в таблице ниже.
Номер этапа |
Содержание |
Исполнитель | |||||
1 |
Формулировка задачи |
Человек | |||||
2 |
Выбор алгоритма |
Человек | |||||
3 |
Составление исходной программы на алгоритмическом языке |
Человек | |||||
4 |
Перевод исходной программы в коды машинных команд |
Компьютер | |||||
5 |
Исполнение машинной программы |
Компьютер | |||||
Эта схема достаточно условна. В ней скрыты довольно важные моменты, связанные с использованием готовых к употреблению библиотечных программ, с устранением синтаксических и алгоритмических ошибок в тексте исходной программы. В некоторых системах программирования (к ним, в частности, относится и QBasic) этапы 4 и 5 совмещены.
Каждому из этапов присущи свои особенности. Формулировка задачи должна исключать какую-либо неопределенность в задании исходных данных и устанавливать область их допустимых значений. Состав исходной информации должен быть достаточен для решения поставленной задачи. Так, например, нельзя построить треугольник, зная только два его параметра. Задание трех его углов тоже не позволяет найти однозначное решение. Алгоритм, как правило, должен приводить к решению задачи за конечное чис-
ло шагов или предусматривать прекращение бесконечных циклов при выполнении определенных условий. Программа на алгоритмическом языке .должна иметь четко выраженную структуру и быть понятной не только ее автору. В случае необходимости она должна допускать участие человека в процессе принятия решений. Машинная программа должна располагать удобным интерфейсом и предоставлять в распоряжение пользователя интуитивно понятные средства ввода, управления вычислительным процессом, визуализации промежуточных и окончательных результатов. Это — далеко не полный перечень требований, выработанных многолетней практикой. Но остановимся чуть подробнее на деталях, связанных с организацией исходной программы на алгоритмическом языке.
Во-первых, программа должна выполнять свое главное функциональное назначение — правильно решать поставленную задачу при любом допустимом наборе исходных данных. Без этого любая программа теряет свой смысл.
Во-вторых, программа должна быть, по возможности, эффективной и не тратить на решение задачи лишнее время и ресурсы компьютера. Это особенно важно, когда предполагается многократное использование программы или ее включение в состав более сложного программного комплекса. Конечно, эффективность программы в первую очередь зависит от выбранного алгоритма. Но и реализация последнего может внести свою лепту. Профамма может быть идеальной с точки зрения использования конструкций алгоритмического языка, но далеко не самой эффективной из-за неудачного алгоритма. Представим себе, что потребовалось сложить натуральные числа от kl до R2. Такая процедура реализуется простым циклом, например, на Паскале:
s:=0;
for j:=k1 to k2 do s:=s+j;
Однако сумму членов арифметической прогрессии можно найти вспомнив или элементарно получив нужную формулу. Выпишем друг под другом ее элементы в прямом и обратном порядках:
kl kl+1 kl+2 ........ kl+(k2-kl)
kl+(k2-kl) k2-l k2-2 ........ kl
Сумма каждой пары равна (kl+k2), и таких пар (k2—kl+1). Поэтому искомая сумма может быть найдена по формуле
s:=(kl+k2)*(k2-kl+l)/2;
И для ее нахождения потребуется всего пять операций, независимо от числа слагаемых. Из этого примера можно сделать довольно тривиальный вывод -знание техники программирования является необходимым, но не всегда достаточным фактором для эффективного решения задачи.
В-третьих, программа не должна быть очень замысловатой по своей реализации и не должна допускать модификацию или расширение возможностей другими программистами. Поэтому такие моменты, как простота и наличие полноценного комментария способствуют продлению жизненного цикла программы. Очень вредит простоте программы неумеренное использование оператора безусловного перехода. Приводимый ниже пример программы-
спагетти на языке Бейсик предназначен для поиска максимального среди значений трех переменных — max (a,b,c).
10 INPUT А,В,С
20 IF А>В THEN GOTO 80
30 IF B>C THEN GOTO 60
40 PRINT "Наибольшее число = "; С
50 GOTO 100
60 PRINT "Наибольшее число = "; В
70 GOTO 100
80 IF A<C THEN GOTO 40
90 PRINT "Наибольшее число = "; A
100 END
Представляете, как разрастется подобный монстр, если количество переменных, среди которых ищется максимум, достигнет 10. Насколько изящнее выглядит следующая программа:
10 INPUT А,В,С
20 МАХ=А
30 IF MAX<B THEN MAX=B
40 IF MAX<C THEN MAX=C
50 PRINT "Наибольшее число = ";МАХ
Эта программа значительно короче, и в ней нет ни одного оператора перехода. Кроме того, она допускает простое обобщение на поиск максимума среди элементов массива:
МАХ=А(1)
FOR K=2 TO N
IF MAX<A(K) THEN MAX=A(K) NEXT К
Красивую программу можно сравнить со скульптурой, гениальный творец которой отсек от камня все лишнее.