- •Введение в конструирование программ
- •Пенза 2006 г.
- •Предисловие
- •1 Обработка информации на компьютере
- •1.1 Модель обработки информации на компьютере
- •1.2 Основные объекты языка программирования
- •1.2.1 Синтаксические элементы языка программирования
- •1.2.2. Значения и типы
- •1.2.3. Константы и переменные
- •1.2.4. Выражения
- •1.2.5. Операторы
- •1.3 Лабораторные задания
- •1.3.1 Логическая разминка
- •1.3.2 Реализовать схемы программ на языке Object Pascal
- •2 Структурное конструирование программ
- •2.1 Простая программа
- •2.2 Консольное приложение
- •2.2.1 Создание, сохранение и загрузка программы
- •2.2.2 Компиляция и выполнение программы
- •2.3 Лабораторные задания
- •2.3.1 Составление простых программ
- •2.3.2 Выполните трассировку и определите результаты работы программы
- •2.3.3 Программирование с использованием управляющих структур
- •2.4 Подпрограммы
- •2.4.1 Глобальные данные
- •2.4.2 Способы передачи параметров
- •2.4.3 Функции
- •2.4.4 Процедуры
- •2.4.5 Значения параметров по умолчанию
- •2.4.6 Перегрузка функций
- •2.4.7. Рекурсивные подпрограммы
- •2.4.8. Передача наименования подпрограммы как параметра
- •2.5 Отладка программ
- •2.6 Лабораторные задания. Подпрограммы
- •2.6.1 Конструирование подпрограмм
- •2.6.2 Разработка рекурсивных подпрограмм
- •2.7. Модули
- •Interface {интерфейс модуля}
- •Implementation {реализация}
- •Initialization {инициализация}
- •3. Структуры данных
- •3.1. Массивы
- •3.1.1. Действия над массивами
- •I, j : byte; { индексы элементов массивов }
- •3.1.2 Передача массивов в качестве параметров
- •3.1.2.1. Формальные параметры как массивы с фиксированными размерами
- •3.1.2.2. Формальные параметры как массивы со «свободными» размерами
- •3.1.2.3. Определение наименьшего/наибольшего значения массива
- •3.1.3 Лабораторные задания
- •3.1.3.1 Одномерные массивы
- •3.1.3.2. Двумерные массивы
- •3.2. Строки
- •3.2.1 Лабораторные задания
- •3.3. Записи
- •3.3.1 Лабораторные задания
- •3.4 Файлы.
- •3.4.1 Основные понятия и операции
- •3.4.2 Типизированные файлы
- •3.4.3 Текстовые файлы
- •3.4.4 Лабораторные задания
- •3.5 Динамические структуры данных. Указатели
- •3.5.1 Основные понятия и определения
- •3.5.2 Процедуры выделения и освобождения памяти
- •3.5.3 Односвязный список
- •3.5.4 Лабораторные задания. Указатели, список
- •3.5.5 Динамические массивы
- •4. Введение в объектно-ориентированное конструирование программ
- •4.1 Основные понятия и определения
- •4.2 Классы и объекты
- •4.2.1 Структура класса
- •4.2.2 Создание и уничтожение объектов
- •4.2.3 Пример. Класс – динамический массив
- •4.2.5 Операции с объектами
- •4.2.5.1 Оператор is
- •4.2.5.2 Оператор as
- •4.2.5.3 Копирование объектов одного класса
- •4.2.6 Свойства
- •4.2.7 Наследование и полиморфизм
- •4.2.8 События
- •4.2.9 Исключительные ситуации
- •4.2.9.1 Операторы try…except
- •4.2.9.2 Операторы try…finally
- •5. Визуальная разработка программ в delphi
- •5.1. Интегрированная среда разработки программ
- •5.1.1 Проект
- •5.2 Конструирование простого приложения
- •5.2.1 Интерфейс Пользователя
- •5.2.2 Визуальное конструирование
- •5.2.3 Реализация методов
- •5.2.4 Обработка исключительных ситуаций
- •5.2.5 Файлы приложения Калькулятор
- •5.3 Компоненты ввода/вывода данных StringGrid и Memo
- •5.3.1 Компонент StringGrid – таблица строк
- •5.3.1 Ввод массива. Компонент StringGrid
- •5.3.3 Компонент Memo – многострочное окно редактирования
- •5.3.4 Ввод массива. Компонент Memo
- •5.4 Немного о графике
- •5.4.1 Свойство Canvas. Построение графика функции
- •5.4.2 Событие OnPaint
- •Список литературы
- •Приложение а. Кратко о Delphi а.1 Свойства проекта
- •А.2 Программный код пустой формы
- •А.3 Главная форма
- •А.3.1 Свойства главной формы
- •А.3.2 События главной формы
- •А.4 Компоненты Delphi
- •Приложение b. Приложение «Калькулятор»
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 для каждого из ключевых слов: if, while, for, repeat, and, or
Добавляйте 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;
Используйте глобальные данные только в том случае, если Вы не можете бз них обойтись
Дорога в ад программирования вымощена глобальными данными!