- •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.8 Особенности использования процедур и функций в Турбо Паскале
Если формальным параметром процедуры или функции является параметр - значение, то при вызове этой процедуры или функции соответствующим фактическим параметрам может быть любое выражение (частный случай выражения: переменная, константа). Если формальным параметром является параметр-переменная, то при вызове процедуры или функции фактическим параметром может быть только переменная эквивалентного типа.
Типом любого формального параметра может быть либо стандартный тип, либо тип ранее определенный в секции описания типов. (Нельзя конструировать типы в заголовках процедур и функций).
Вывод: Если надо передать нестандартный тип в процедуру или функцию, то этот тип следует до (выше) описания подпрограммы определить (описать в секции определения типов), а в заголовке подпрограммы должна быть только ссылка на этот тип.
хотя
можно: Function
summa (a: array of byte): integer;
неверная запись
Function summa (a: array [1..10] of byte): integer;
надо
Type
t = array [1..10] of byte;
function summa (a : t) : integer;
Требование запрета конструирования типов в заголовке процедуры и функции, введено для обеспечения совместимости типов формальных и фактических параметров-переменных, поскольку по правилам Паскаля то, что описано в разных местах, имеет разные типы.
Тип параметра значения может быть любым, кроме файлового. Тип параметра переменной может быть любым, включая файловый.
Вывод: Если необходимо в процедуру или функцию передавать файл, то он должен быть передан как параметр переменная.
Фактически при передаче параметров в процедуру и функцию по значению, значения этих параметров копируются в стек, что приводит к потерям времени и памяти на такое копирование. Если копируемые значения являются сложными (записи, большие массивы и т.д.), то чтобы избежать потерь времени от такого копирования есть две возможности:
Можно передавать длинные фактические параметры не как параметры-значения, а как параметры-переменные (по адресу). В этом случае в стек копируется не значение, а только адрес начала параметра. Неудобства этого способа состоит в том, что а) во время работы подпрограммы значение фактического параметра может быть заменено, что м.б. нежелательно, б) ухудшается понятность программы (по адресу принято передавать только результаты, а мы передаем входные данные).
Для избавления от этого недостатка можно использовать т.н. параметры-константы. Параметры-константы похожи на параметры-переменные тем, что передаются по адресу, т.е. в стек копируется адрес. Отличие состоит в следующем: в заголовке процедуры или функции вместо слова var указывается слово const
( const a : byte )
Компилятор при использовании параметра-константы жестко следит за тем, чтобы значение этих параметров не менялось.
Можно использовать параметр - переменную или параметр - константу без типа.
( …Var a; const b; …)
Они передаются только по адресу. Их использование позволяет избавиться от несовместимости типов формальных и фактических параметров. В этом случае фактический параметр может быть параметром любого типа. Сложность использования параметров без типа состоит в том, что в теле процедуры или функции их нельзя использовать без операции приведения типа.
Можно в качестве формального параметра использовать т.н. "открытые" массивы - массивы без границ. A : array of char;
В качестве фактического параметра для формального параметра типа открытого массива может выступить или статический (обычный) массив или динамический массив (в куче).
Наличие таких формальных параметров (открытых массивов) позволяет в качестве фактических параметров использовать в подпрограмме массивы любого размера (только тип элементов должен быть таким же). Конкретное число элементов массива определяется при вызове подпрограммы (на основании того, что передается в качестве фактического параметра). Имеется возможность в подпрограмме просмотреть нижнюю и верхнюю границы массива. Для этого используются стандартные функции low и high. Для открытых массивов low равно 0, high возвращает число элементов массива – 1. Так если имеется описания:
Var z:array[1..10] of integer;
…
Procedure P(x:array of integer);
Var
i : byte;
Begin
for i := low(x) to high(x) do
writeln(x[i]);
… вернет low(x)
end;
begin здесь элементы x[0] ≡ z[1]
… x[9] ≡ z[10]
P(z); вернет high(x)
...
end.
Можно использовать так называемые локальные статические переменные, которые отличаются от обычных локальных переменных глобальным временем жизни. Обычные локальные переменные имеют время жизни = времени выполнения процедуры или функции (где они объявлены), а статические локальные переменные имеют время жизни, равное времени выполнения всей программы (правда у них ограничена область видимости). Это достигается за счет того, что память под статические локальные переменные распределяется не в стеке, а в сегменте данных. Описываются статические локальные переменные в теле процедуры или функции как типизированные константы. Один из возможных вариантов использования статических локальных переменных - подсчет числа вызовов процедур или функций.
Function summa (...) : byte;
const
count : byte = 0; это действие выполняется лишь один раз за все время выполнения
begin программы. А именно – при первом вызове функции.
count := count + 1;
end;
Есть следующие возможности «внезапного» выхода из процедур или функций ( программы). Процедуры:
exit; - обеспечивает прекращение выполняемой процедуры или функции и возвращает управление в точку вызова (одноуровневый выход - на один уровень выше по цепочке вызовов).
Halt(n); - процедура используется для преждевременного выхода и из подпрограммы и из всей программы, на каком бы уровне вложенности подпрограмма бы не вызывалась.
n -код возврата; принято, если n = 0 то завершение было нормальным; если n > 0 то программа завершена некорректно. Код возврата анализируется или порождающим процессом с помощью DosExitCode (из модуля Dos), или помощью проверки ERRORLEVEL в командном файле.
