Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конструирование программ.doc
Скачиваний:
12
Добавлен:
05.05.2019
Размер:
12.37 Mб
Скачать

2.4.8. Передача наименования подпрограммы как параметра

Если необходимо передать в качестве фактического параметра имя подпрограммы, то соответствующий ему формальный параметр должен иметь процедурный тип, соответствующий прототипу подпрограммы.

Пример процедурного типа :

type

MinMaxFunc = function (first, second: integer):boolean;

Спецификации подпрограмм, имена которых передаются как параметры, должны содержать ключевое слово far («дальний вызов»). Это указание необходимо компилятору для правильной генерации исполняемой программы.

Смотрите использование процедурного типа в разделе 3.1.2.3.

2.5 Отладка программ

Отладка программы – это поиск ошибок в программе (тестирование) и исправление ошибок.

Интегрированная среда разработки Delphi предоставляет программисту средства, которые позволяют просматривать и модифицировать значения данных в процессе выполнения программы, а также выполнять программу в пошаговом режиме и прерывать ее выполнение в точке останова (рисунок 2.9).

Режимы выполнения программы

М еню Run содержит следующие пункты, которые определяют режимы выполнения программы:

Run выполнение программы;

Step over выполнение программы «по шагам» (трассировка программы): оператор за оператором. При этом вызов подпрограммы выполняется за один шаг. Если операторы расположены на одной строке, то шаг отладки будет распространяться на все операторы строки. Чтобы точно определить, какие операторы выполняются, располагайте на строке только один оператор!

Trace intoвыполнение программы «по шагам» с трассировкой операторов подпрограмм;

Run to Cursorвыполнение программы до оператора, указанного курсором;

Run Until Returnвыполнение до конца программы

Program Reset – завершение (прерывание) выполнения программы.

Точки останова и просмотр значений

Для просмотра/модификации значений и установки точек останова в процессе выполнения программы используйте следующие пункты меню Run:

Evaluate/Modify… – вычислить/изменить значение

Add Watch… – добавить переменную в окно просмотра (Watch)

Add Breakpointдобавить точку останова.

Чтобы добавить/удалить точку останова можно щелкнуть левой клавишей мыши на маленькой кнопке слева от оператора, на котором Вы хотите остановить выполнение программы. Аналогичный результат Вы получите, если в контекстном меню (вызывается щелчком правой клавишей мыши на требуемом операторе) выполните Debug/Toggle breakpoint.

Для добавления/удаления переменных в окне просмотра вызовите контекстное меню и выберите пункты Edit Watch…, Add Watchи другие.

Рисунок 2.9 – Пошаговая отладка программы с просмотром значений переменных в окне Watch

Советы профессионала

Зачем использовать подпрограммы?

  • Самая важная причина – снижение сложности программ.

Создайте подпрограмму для сокрытия информации, чтобы о ней можно было не думать, и дальше используйте этот подпрограмму, не задумываясь, как подпрограмма работает.

Пример создания подпрограммы

В коде программы в нескольких местах преобразуется значение deviceUnits, выраженное в аппаратных единицах, в число точек points:

points:= deviceUnits(POINTS_PER_INCH / DeviceUnitsPerInch)

Сконструируем простую функцию DeviceUnitsToPoints, которая вычисляет это выражение:

Function DeviceUnitsToPoints (deviceUnits: integer): integer;

begin

if DeviceUnitsPerInch<>0 then

DeviceUnitsToPoints:=deviceUnits( POINTS_PER_INCH /

DeviceUnitsPerInch)

else

DeviceUnitsToPoints:= 0;

end;

После этого в коде программы все фрагменты вычисления points будут выглядеть так:

points:= DeviceUnitsToPoints (deviceUnits);

Если оставить прежний вариант программы, то в каждом фрагменте пришлось бы вставлять проверку деления на 0. Использование функции потребовало всего 5 строчек для этого!

  • Другие важные причины использования подпрограмм:

  • Минимизация размера кода программы

  • Предотвращение дублирования кода

  • Облегчение сопровождение программы

  • Снижение числа ошибок.

Как оценить «длину» подпрограммы?

  • Рекомендуемый размер подпрограммы: 50 - 150, 200 операторов

  • Используйте для анализа длины цикломатическую сложность МакКейба

Цикломатическая сложность подсчитывает число точек принятия решений в подпрограмме:

  1. Начните считать с 1

  2. Добавляйте 1 для каждого из ключевых слов: if, while, for, repeat, and, or

  3. Добавляйте 1 для каждого варианта case.

Если полученный результат 0..5 – все нормально, 6..10 –возможно следует подумать об упрощении, 10 и более – упрощайте подпрограмму!

Процедура или функция?

  • Используйте функцию, если основная цель подпрограммы – возврат значения, указанного в имени функции. Иначе используйте процедуру!

Как правильно использовать параметры?

  • Передавайте параметры в порядке входные значения – изменяемые значения – выходные значения

  • Передавайте переменные состояния или кода ошибки последними

  • Не используйте параметры подпрограммы в качестве рабочих переменных

  • Ограничивайте число параметров примерно семью

  • Убедитесь, что фактические параметры соответствуют формальным.

НЕ используйте рекурсию для решения задач, подобных нахождению факториала или чисел Фибоначчи!

Рекурсия – это очень мощный инструмент. Используйте рекурсию для решения задач сортировки, поиска путей, задач с использованием динамических структур данных.

Пример итерационного вычисления факториала

function Factorial (N:integer): integer;

var

i, fact: integer;

begin

fact:= 1;

For i:=2 to N do

fact:= fact * i;

Factorial:= fact;

end;

Используйте глобальные данные только в том случае, если Вы не можете бз них обойтись

Дорога в ад программирования вымощена глобальными данными!