- •Алгоритмы
- •Свойства алгоритма
- •Способы описания алгоритмов
- •Язык программирования
- •Способы описания синтаксиса языка программирования
- •1. Бнф (Бэкуса-Наура форма)
- •Компиляторы и интерпретаторы
- •Обзор языков программирования высокого уровня (таблица)
- •Язык программирования Паскаль Первая программа на языке программирования Паскаль
- •Типы, переменные и константы
- •Основные типы данных языка Pascal
- •Операторы ввода/вывода
- •Форматы вывода
- •Выражения и операции Выражения
- •Операции
- •Операции div и mod для целых
- •Операции shl и shr для целых
- •Логические операции
- •Часто используемые правила математической логики
- •Стандартные процедуры и функции Стандартные функции
- •Стандартные функции в Dephi
- •Стандартные процедуры для целых
- •Явление переполнения
- •Погрешность округления и вычислительная погрешность
- •Примеры на суммирование рядов
- •Процедуры break и continue
- •Оператор безусловного перехода goto
- •Подпрограммы. Процедуры и функции
- •Процедуры
- •Синтаксис описания процедуры
- •Оператор вызова процедуры
- •Функции
- •Переменная Result
- •Способы передачи параметров Передача по значению. Параметры-значения
- •Передача по ссылке. Параметры-переменные (с ключевым словом var)
- •Семантика вызова подпрограммы
- •Алгоритм вызова подпрограммы
- •Статическая и автоматическая память
- •Локальные и глобальные переменные
- •Обращение к глобальным переменным и побочный эффект
- •Область видимости и время жизни объекта
- •Статическая локальная переменная
- •Перегрузка имен подпрограмм
- •Структура модуля
- •Перечислимый и диапазонный типы Перечислимый тип
- •Записи с вариантами
- •Как записи с вариантами хранятся в памяти
- •Сортировка массивов записей
- •Индексная сортировка
- •Множества
- •Стандартные подпрограммы для работы с символами
- •Виды строк в Delphi
- •Cтроки shortstring
- •Основные подпрограммы для работы со строками
- •Основные подпрограммы для работы со строками (Delphi)
- •Алгоритмы на строках
- •Использование Split
Алгоритм вызова подпрограммы
Выделить место на стеке для записи активации подпрограммы.
Запомнить адрес возврата и адрес записи активации вызывающей подпрограммы.
Вычислить значения фактических параметров и подставить их на место формальных. При передаче по ссылке на стек кладется адрес фактического параметра.
Перейти на начало кода вызываемой подпрограммы.
Выполнить тело вызываемой подпрограммы.
Если это – функция, то заполнить ячейку результата в записи активации.
Освободить память, занимаемую записью активации подпрограммы.
Осуществить переход на адрес возврата.
Замечания.
Выделение и освобождение места под запись активации происходит быстро.
Локальные переменные не инициализируются.
Статическая и автоматическая память
Статическая память – память, выделяемая в начале работы программы (под глобальные и под локальные статические переменные). Инициализируется нулевыми значениями.
Автоматическая память – память, выделяемая в процессе работы программы на стеке. Не инициализируется.
Локальные и глобальные переменные
Переменные, определенные в основной программе, называются глобальными. Переменные, определенные в подпрограмме называются локальными по отношению к этой подпрограмме. Поскольку в языке Паскаль разрешены вложенные описания подпрограмм, то принято также говорить о нелокальных по отношению к данной подпрограмме переменных.
Обращение к глобальным переменным и побочный эффект
Обращение к глобальным переменным внутри процедуры потенциально опасно (не ошибочно, но чревато ошибками, потому нежелательно, по крайней мере, делать это часто).
Особенно опасно изменение глобальных переменных.
Изменение глобальной переменной называют побочным эффектом процедуры.
Переменная-параметр цикла, вызываемого в процедуре, должна быть локальной.
Пример. Ошибка, возникающая при нарушении последнего правила.
var i: integer; procedure row; var i: integer; begin for i:=1 to 10 do write('*'); writeln end; ... begin for i:=1 to 5 do row end.
Значения локальных переменных не определены при входе в процедуру, в отличие от значений глобальных переменных.
Область видимости и время жизни объекта
Время жизни объекта в памяти – время, в течении которого для объекта выделена память. Для локального объекта его время жизни распространяется с момента описания до конца блока, в котором он описан.
Область видимости объекта – фрагмент программы, в котором можно обратиться к объекту по имени.
Пространство имен – фрагмент программы, в котором не допускается использовать одинаковые имена (исключение составляют перегруженные имена подпрограмм). В Паскале пространство имен определяет подпрограмма.
Пример.
procedure p; var i: integer; procedure q(j: integer); // имя q принадлежит области видимости процедуры p var j: real; // - ошибка - повторное объявление var q: real; // - верно begin end; begin end.
Статическая локальная переменная
procedure p; const n: integer = 0; begin Inc(n); end;
В данном примере n - переменная, она распределяется в статической памяти, ее время жизни совпадает с временем жизни программы, областью же видимости является процедура p.