- •Содержание
- •Часть 1. Основные понятия программирования §1.1. Этапы разработки программного обеспечения
- •§1.2. Основные сведения об алгоритмах Понятие алгоритма
- •Свойства алгоритма
- •Формы записи алгоритмов
- •Блок-схемы алгоритмов
- •§1.3. Языки программирования
- •§1.4. Паскаль и Object Pascal, Турбо-Паскаль и Delphi
- •Контрольные вопросы
- •Язык, оболочка и интегрированная среда разработки
- •Часть 2. Общие сведения о языке Паскаль §2.1. Алфавит и служебные слова
- •Описание общих конструкций языка
- •§2.2. Структура программы
- •§2.3. Разделы описаний Описание меток
- •Определение констант
- •Определение типов
- •Описание переменных
- •Контрольные вопросы
- •Часть 3. Простые типы данных Иерархия типов
- •§3.1. Целые типы
- •§3.2. Вещественные типы
- •§3.3. Логический тип
- •§3.4. Литерный тип
- •§3.5. Перечисляемый тип
- •§3.6. Диапазоны (интервальный тип)
- •Дополнительные типы в Delphi
- •Контрольные вопросы
- •Глава 4. Операторы языка Паскаль Выражения
- •§4.1. Оператор присваивания
- •§4.2. Ввод-вывод данных
- •§4.3. Составной оператор
- •§4.4. Пустой оператор
- •§4.5. Безусловный оператор перехода
- •§4.6. Условный оператор
- •§4.7. Оператор цикла с параметром for
- •§4.8. Оператор цикла с предусловием while
- •§4.9. Оператор цикла с постусловием repeat
- •§4.10. Оператор выбора case
- •Контрольные вопросы
- •Глава 5. Процедурное программирование §5.1. Функции
- •Параметры – значения
- •Параметры – переменные
- •Бестиповые параметры
- •§5.2. Процедуры
- •Правила использования подпрограмм
- •Рекурсия
- •Директивы
- •Процедурные типы
- •Пример использования подпрограмм
- •Контрольные вопросы
- •Глава 6. Структурированные типы данных
- •§6.1. Массивы
- •§6.2. Строки
- •§6.3. Записи
- •§6.4. Множества
- •Пример использования множеств
- •§6.5. Файлы
- •Установочные и завершающие операции
- •Операции ввода-вывода
- •Перемещения по файлу
- •Пример работы с файлом
- •Обработка ошибок ввода-вывода
- •Специальные операции
- •Пример объединения двух файлов
- •Текстовые файлы
- •Стандартные текстовые файлы
- •Файлы без типа
- •Контрольные вопросы
- •Глава 7. Динамические структуры данных §7.1. Динамические переменные
- •§7.2. Указатели
- •Работа с динамическими переменными
- •Пример двухсвязанного циклического списка
- •Указатели без типа
- •Контрольные вопросы
- •Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
- •§8.2. Доступ к аппаратуре Доступ к памяти
- •Доступ к портам ввода-вывода
- •Работа по прерываниям
- •Контрольные вопросы
- •Глава 9. Модули §9.1. Основные понятия
- •§9.2. Использование модулей
- •§9.3. Стандартные модули
- •§9.4. Модуль Crt
- •Работа с экраном в текстовом режиме
- •Работа с клавиатурой
- •Работа со звуком
- •§9.5. Модуль dos
- •§9.6. Графический режим монитора
- •Контрольные вопросы
- •Глава 10. Введение в объектно-ориентированное программирование §10.1. История развития программирования
- •Понятие объекта
- •§10.2. Свойства объектов
- •Раннее и позднее связывание
- •§10.3. Виртуальные методы
- •Конструкторы и деструкторы
- •§10.4. Динамические объекты
- •Скрытые поля и методы
- •Контрольные вопросы
- •Литература
Процедурные типы
До сих пор процедуры и функции рассматривались как текстовые фрагменты программы, определяемые именами. Турбо-Паскаль позволяет вводить переменные специального вида, значениями которых могут служить подпрограммы. Таким образом, Турбо-Паскаль позволяет интерпретировать процедуры и функции как значения, которые можно присваивать переменным и передавать в качестве параметров, причем речь идет именно о последовательности вычислений, а не о значениях, полученных после выполнения подпрограмм.
Общее описание процедурного типа следующее:
Type <имя типа>=Function (<список параметров>):<тип>;
Type <имя типа>=Procedure (<список параметров>);
Механизм процедурных типов предоставляет удобные возможности при разработке программ, но необходимо соблюдать следующие правила.
Подпрограмма, присваиваемая процедурной переменной, должна быть оттранслирована в режиме дальнего типа вызова (см. пример ниже).
Подпрограмма не должна быть стандартной процедурой или функцией. Это ограничение легко обойти, заключив стандартную подпрограмму в оболочку подпрограммы пользователя.
Данные подпрограммы не могут быть вложенными в другие подпрограммы.
Такие подпрограммы не могут быть процедурами прерываний.
Пример использования подпрограмм
Поскольку процедурные типы можно использовать в любом контексте, то можно описывать процедуры и функции, параметрами которых являются процедурные переменные. В качестве примера рассмотрим вычисление суммы двух интегралов, причем интеграл вычисляется с использованием подпрограммы по методу трапеций:
.
Вычисление производится по формуле
,
где
,
,
количество отрезков разбиения площади интегрирования определяется по заданной точности = 10-3. Сначала интеграл представляется в виде одной трапеции, потом двух, потом четырех и т.д., то есть шаг интегрирования в каждом цикле уменьшается в два раза.
Program SumInt;
{ Демонстрационная программа на использование функций: вычисление суммы двух интегралов методом трапеций с заданной точностью }
Const EPS=1E-3; { Точность зададим константой }
Type Func=Function(x:real):real; { процедурный тип }
Var SI:Real; { Результат: сумма интегралов }
{ Сначало опишем подпрограммы с использованием дальнего вызова, которые будут передаваться в подпрограмму как параметры }
{$f+}
Function F1(x:real):real;
Begin
F1:=exp(-x)*(x*x+7*x+9)
End;
Function F2(x:real):real;
Begin
F2:=sin(x)*(x*x*x+3)
End;
{$f-}
{ В функцию передаем границы (вещественные) и последовательность вычислений – процедурный тип }
Function IntTrap(A,B:Real;F:Func):real;
Var IntAlt,IntNew, { старое и новое значение интеграла }
H,S,x,
v:real; { вспомогательная переменная }
Begin
H:=B-A;
v:=F(A)+F(B); { для сокращения вычислений }
IntNew:=H/2*v; { Первый интеграл из одной трапеции }
Repeat
IntAlt:=IntNew; { Старим предыдущее значение }
H:=H/2; { Уменьшаем шаг в 2 раза }
S:=0; x:=A;
Repeat
x:=x+H;
S:=S+F(x)
Until x>=B;
IntNew:=H/2*(v+2*S);
Until Abs(IntAlt-IntNew)<EPS; { Проверка, насколько мала разность интегралов, вычисленных с разным шагом }
IntTrap:=IntNew;
End;
{ Раздел операторов – непосредственно сама программа }
Begin
{ Очень важно соблюдать типы и последовательность параметров при обращении к функциям}
SI:=IntTrap(0.0,2.0,F1)+IntTrap(0.0,2.0,F2);
Writeln('Сумма интегралов=',SI:7:3)
End.
