- •1. Структура (состав) языка
- •2. Алфавит
- •3. Лексическая структура языка
- •4. Структура программной единицы
- •5. Стиль записи программ на языке Паскаль
- •6. Типы данных в Паскале
- •6.3 Классификация типов данных в Турбо Паскале
- •6.4 Порядковые типы
- •6.4.2 Булевский (логический) тип
- •Repeat тело_цикла until (логическое_выражение);
- •6.4.3 Целые типы Выделяют целые типы ------------- со знаком – shortint, integer, longint)
- •1 Группа функций:
- •2 Группа функций:
- •3 Группа функций:
- •6.4.4 Перечисляемый тип.
- •6.4.6 Символьный тип
- •6.5 Вещественные типы.
- •7. Выражения в языке Паскаль.
- •10. Вычисление по формулам.
- •10.1 Оператор присваивания .
- •10.2 Характер использования переменных в математике и в программах.
- •10.3 Бесконечности
- •10.4 Нестандартные операции
- •6.6 Строки
- •1) Операции присваивания и сравнения.
- •3) Заполнение строки одним символом
- •4) Стандартные функции и процедуры для работы со строками:
- •5) Подпрограммы преобразования из строкового представления в числовое и наоборот:
- •8. Совместимость и преобразование типов.
- •Совместимость типов
- •8.2 Тип результата арифметических выражений.
- •8.3 Преобразование (приведение) типов и значений.
- •8.3.1 Явное преобразование (приведение) типов.
- •8.3.2 Неявное преобразование или приведение типов.
- •9. Простейший ввод-вывод на Паскале
- •Стандартные файлы Input и Output
- •9.2 Процедуры ввода информации (с клавиатуры.
- •9.3 Процедуры вывода в тр.
- •10. Вычисление по формулам (продолжение)
- •10.6. Уточнение многоместных (n - арных) операций
- •11. Средства языка Паскаль для циклов с известным числом повторений.
- •12. Табулирование функций
- •13. Разветвляющиеся алгоритмы
- •13.1 Таблица ситуаций и команда выбора.
- •13.2 Средства языка Паскаль для программирования разветствляющихся алгоритмов
- •13.4 Описание ситуаций
- •13.5 Запись команды выбора (case) (уточнение таблицы ситуаций) с помощью набора команд ветвления
- •13.6 Запись последовательных команд ветвления в случае, когда соседние зависимые ситуации имеют общие признаки.
- •13.6.1 Восходящий подход
- •13.6.2 Нисходящий подход
- •14. Циклы с неизвестным числом повторений
- •15. Структурированные типы данных. Массивы
- •15.1 Классификация (особенности) структурированных типов данных
- •15. 2. Определение массива
- •15.3 Объявление массива на Турбо Паскале
- •15.4 Хранение элементов массива. Доступ к элементам и частям массива
- •15.5 Уточнение команд обработки массива
- •16. Правила разработки цикла
- •15. 6 Действия над массивами
- •17. Множества.
- •17.1 Множества в Паскале и в математике. Сходства и различия между ними.
- •17.2 Объявление множества на Паскале
- •17.3 Присваивание значений множествам. Конструктор множества
- •17.4 Операции над множествами.
- •17.5 Сравнение множеств.
- •17.6 Применение множеств.
- •18. Вспомогательные алгоритмы (подпрограммы).
- •18.1 Три способа записи повторяющихся команд
- •18.2 Понятие блока
- •18.3 Объекты подпрограммы (то, над чем выполняются действия).
- •18.4 Свойства локальных и глобальных объектов
- •Свойства глобальных объектов:
- •18.5 Выделение памяти под локальные и глобальные переменные
- •18.6 Передача параметров в подпрограммы.
- •Фактические параметры
- •18.7 Подпрограммы, возвращающие значение (функции)
- •18.8 Особенности использования процедур и функций в Турбо Паскале
- •18.9. Побочный эффект (side effect)
- •18.10 Опережающее определение процедур и функций.
- •18.11 Рекурсия и итерация.
- •18.12 Процедуры и функции как параметры.
- •18.13 Директивы подпрограмм
- •Директива forward
- •Директивы far и near
- •Директива external
- •Директива assembler
- •Директива inline
- •Директива interrupt
- •Отладка и тестирование программ, содержащих подпрограммы
- •18.14.1 Нисходящее тестирование и подпрограммы-заглушки
- •18.14.2 Восходящее тестирование и программы-тестеры
- •18.14.3 Рекомендации по отладке программ, содержащих подпрограммы
- •18.14.4 Использование отладчика для трассировки процедур
- •18.14.5 Область действия идентификаторов и переменные в окне Watch
- •18.15. Получение доступа а параметрам командной строки, запуск внешних программ.
- •19. Записи.
- •19.1 Понятие записи. Объявление записи в программе.
- •19.2 Доступ к полям записи.
- •19.3 Оператор with
- •19.4 Действия над записями
- •19.5 Записи с вариантами
- •Замечание1:Порядок частей – именно такой, как показано: фиксированная часть всегда первая (или единственная)
- •19.6 Типизированные константы - записи
- •20. Модули (Unit)
- •20.1 Что такое модуль?
- •20.2 Зачем нужны модули и какие есть средства, аналогтчные (в какой-то мере) модулям
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Подключение других модулей к данному (модулю)
- •20.4 Ссылки на описания модуля
- •Пример создания модуля
- •Использование модулей. Режимы Compile, Build и Make при компиляции модулей
- •Косвенные и перекрестные ссылки на модули
- •Пример модуля (стек)
- •Модули и большие программы
18.12 Процедуры и функции как параметры.
Существует класс задач, где исходными данными (аргументами) для программ (подпрограмм) являются не переменные и константы, а функции и процедуры. К таким задачам относятся например задача создания неких универсальных программ типа, например, универсальной программы построения графика нескольких функций, определенных на разных (своих) интервалах. Вид такой программы не должен зависеть от вида функции, используемой для вычисления значения на интервале.
Если бы такую универсальную программу построения графика делать без передачи функции как параметра, то необходимо было бы сделать две вещи: 1). Распознавать, для какой конкретно функции (интервала) надо строить график; 2). Для каждого конкретного вида функции надо было бы использовать свой специфический вызов этой функции для определения положения и вывода точки на графике.
Если в функцию построения графика передавать как параметр функцию, вычисляющую значение на интервале, то в общем виде заголовок этой функции (построения графика) можно было бы записать так:
функция
f как формальный
параметр
Procedure
график(х : real; function
f(x:real))
: real; (так писать нельзя)
Костяк универсальной процедуры построения графика может иметь следующий вид:
function f1
(...):real;
begin
...
end;
function f2
(...):real; Описания
функций, для которых надо строить графики
begin
...
end;
function f3 (...):real;
begin
...
end; для
построения графика функции f1(x)
вызов
procedure график (x:real, function f(x: real)): real; процедуры имел бы вид: график(x, f1(x));
begin
В теле процедуры вывода графика
используется один оператор вывода для
всех функций (f1, f2,
f3).
writeln(.......... , f(x),
...);
end;
Конкретный вид функции указывался бы при вызове. В каждом конкретном случае вызывалась бы та функция, которая передавалась бы в качестве фактического параметра.
На Паскале в качестве формальных параметров допускается использовать имена процедур или функций. При вызове подпрограммы на место формальных параметров процедур или функций осуществляется подстановка имен соответствующих им фактических процедур или функций.
Но на Паскале нельзя описывать функцию как параметр в той форме, как это сделано выше (нельзя определять сложный тип прямо в заголовке). С этим мы уже сталкивались при передаче массивов как параметров.
Procedure
f(a : array[1..10] of char);
неверно
f: function (x: real);…) : real;
На Паскале для этого случая нужно объявить процедурный тип.
Имя функции не указывается
func = function (x: real): real;
Справа от "=" фактически приводится заголовок функции, только без имени.
Процедурный тип определяет, какой вид подпрограммы (процедуру, функцию) можно использовать в качестве параметра и с какими параметрами должна вызываться эта подпрограмма. Фактически соответствующий формальный параметр будет являться параметром-значением, т. к. записывается без зарезервированного слова var.
Правильный заголовок процедуры построения графика в этом случае должен иметь следующий вид:
procedure plot (x: real; f: func);
begin
...
writeln (... , f(x), ...);
end;
Переменной процедурного типа f может быть присвоено в качестве значения имя функции, например f1 (соответствующего по типу и числу параметров вида). Выполнения функции f1 при таком присваивании не происходит, но при вызове вида f(x) вызываться будет f1.
Примеры объявлений:
Туре
Proc_0 = Procedure; {тип-процедура без параметров}
Ргос_2 = Procedure(Var х, у); {тип-процедура с 2-мя параметрами}
Ргос_3 = Procedure(a, b : real; Var у : real); {тип-процедура с 3-мя параметрами }
Func_0 = Function : integer; {тип-функция без параметров }
Func_1 = Function(s : real): real; {тип-функция с одним параметром }
Установлены следующие правила использования подпрограмм в качестве параметров:
правила совместимости: процедурные типы для совместимости по присваиванию должны иметь одинаковое число формальных параметров, а параметры на соответствующих позициях в заголовках, должны иметь эквивалентный тип. Кроме того, для функций должны совпадать типы возвращаемых значений;
согласно принципу опережающего описания объектов в Паскале, процедура или функция может обращаться только к той процедуре или функции, описание которых располагается перед описанием вызывающей процедуры или функции.
для установки правильных связей между вызывающими и вызываемыми подпрограммами вызываемые процедуры или функции (передаваемые как параметры) должны быть скомпилирована с использованием дальней модели вызовов с формированием их полного адреса, что достигается двумя путями: они должны компилироваться с директивой компилятору {SF+}
1-й путь
{$F+}
function f1(...): real;
Перед и после описания функции помещается
директива {$F}
...
end;
{$F-}
2-й
путь:
function
f1(...): real; far;
явно указана необходимость использования дальнего вызова в заголовке функции.
они не должны объявляться внутри других процедур или функций;
они не должны быть стандартными процедурами или функциями;
