О стиле программирования
Стиль программирования - стиль мышления, проявляющийся в умении отображать алгоритм решения задачи на конкретный язык программирования. Глубоко ошибочно мнение, что неважно, как написана программа, лишь бы она работала. Это особенно касается программ с большим жизненным циклом, которые используются и другими пользователями; последние должны иметь возможность вносить в программу изменения, исправлять выявляющиеся ошибки. Отсюда требования к программе в первую очередь касаются наглядности ее представления и удобства отладки. Можно предложить следующие рекомендации по выработке хорошего стиля программирования: 1) структурированная программа во всех случаях более понятна, чем неструктурное нагромождение операторов; в первом приближении это достигается использованием структурно-ориентированных языков (Паскаль, Модула-2 и др.). Но у программиста имеются и дополнительные средства, владение которыми и создает стиль программирования: - идентификаторы программы должны, по возможности, иметь смысловое значение; - нужно помнить, что лучшей документацией для любой программы является сама программа; поэтому в нужных местах программы следует расставить комментарии; обычно отмечаются начало и конец некоторой части программы, начало и конец подпрограммы и объяснение ее функции, пояснение фрагментов программы, функция которых не очевидна или в которой используются специфические средства; - структурирование текста, т. е., расположение программных структур друг относительно друга, показывающее их вложенность и подчиненность; - следует не жалеть усилий на разработку средств, обеспечивающих наглядность представления вводимых и выводимых данных, в частности, разделять на экране исходные, промежуточные и конечные результаты; 2) элементы стиля, помогающие в отладке программы: - не жалеть времени на разработку и изучение математической модели исходной задачи; - помнить об отладке с самого начала создания программы. Для этого активно использовать отладочную печать; например, в местах ветвления выводить данные, определяющие выбор ветви; - во избежание ошибок следует явным образом присваивать начальные значения всем используемым в программе переменным; - стараться явно не употреблять в программе константы, за исключением, может быть, 0 и 1. Следует вводить для констант имена, что приводит к лучшей читабельности программ и уменьшению числа возможных ошибок; - желательно предусмотреть в программе контрольную ее прогонку, при которой в качестве теста используется задача с заранее известным результатом; - нужно испытывать свою программу в экстремальных ситуациях; - при программировании арифметических и логических выражений не жалеть скобок; - длинную формулу целесообразно разбивать на несколько частей и записывать несколькими операторами присваивания; - перед программировании формулы следует попытаться ее сократить, но так, чтобы не скрылась смысловая сущность формулы, если таковая имеется; - следует избегать употребления в одном выражении данных различных типов; - для снижения погрешности результатов при выполнении вычислений с вещественными данными следует: а) избегать вычитания близких по величине чисел; б) избегать деления очень больших по модулю чисел на очень маленькие; в) сложение и вычитание последовательностей чисел начинать с самых маленьких; г) стремиться уменьшать число выполняемых операций.
Применим некоторые рекомендации по выработке хорошего стиля программирования на примере разработки алгоритма и программы поиска минимума функции в некотором интервале. Существует много способов поиска экстремумов функции, из которых самым простым и достаточно эффективным является метод дихотомии. Применение этого метода к поиску минимума иллюстрируется следующей схемой:
Ниже приводится алгоритм поиска минимума функции f(x), в структуру которого включен контрольный пример - поиск минимума достаточно простой функции y = x2 , которая имеет минимум в точке x = 0.
Далее приводится текст соответствующей задаче рабочей программы, выполненной на языке Турбо-Паскаль.
поиск экстремума (минимума) функции CONST c1=0.5; c2=0.25; VAR k:INTEGER; a,b,a0,b0,Eps,EpsX,x0,xL,xR,yL,yR:REAL; FUNCTION CONT(x:REAL):REAL; функция для контрольного просчета BEGIN CONT:=x*x END; FUNCTION F(x:REAL):REAL; исследуемая Функция CONST b=2.0; c=1.0; BEGIN F:=x*x+b*x+c
BEGIN END; WriteLn('Введите цифру для задания режима решения; Write('0 - контрольный просчет, 1 - ваша функция: ? '); ReadLn(k); CASE k OF 0: BEGIN
END; 1: BEGIN
END a0:=-1; b0:=2; Eps:=1e-5
Write('ввод границ интервала и точности: '); ReadLn(a0,b0,Eps) END; WriteLn; EpsX:=c2*Eps; a:=a0; b:=b0; Repeat x0:=c1*(a+b); WriteLn(a:8:5,b:8:5); отладочная печать ReadLn; xL:=x0-EpsX; xR:=x0+EpsX; CASE k OF 0: BEGIN yL:=CONT(xL); yR:=CONT(xR) END; 1: BEGIN yL:=F(xL); yR:=F(xR) END END; IF yL>=yR THEN a:=xL ELSE
x0:=c1*(a+b); b:=xR UNTIL b-a<=Eps; IF (x0-a0<Eps) OR (b0-x0<Eps) THEN WriteLn('экстремума в указанном интервале нет. Повторите поиск.') ELSE
THEN WriteLn('точка экстремума: x =',x0:8:5, ' f(x) =',c1*(yL+yR):8:5); IF k=0 BEGIN
WriteLn; WriteLn('для контрольного примера (функция y =x*x) ');
END.
ReadLn WriteLn('правильный ответ: x = 0.00000, f(x) = 0.00000') END;
|
|