- •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.4 Действия над записями
- •19.5 Записи с вариантами
- •19.2 Доступ к полям записи.
- •19.3 Оператор with
- •Замечание1:Порядок частей – именно такой, как показано: фиксированная часть всегда первая (или единственная)
- •19.6 Типизированные константы - записи
- •20. Модули (Unit)
- •20.1 Что такое модуль?
- •20.2 Зачем нужны модули и какие есть средства, аналогтчные (в какой-то мере) модулям
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Подключение других модулей к данному (модулю)
- •20.4 Ссылки на описания модуля
- •Пример создания модуля
- •Использование модулей. Режимы Compile, Build и Make при компиляции модулей
- •Косвенные и перекрестные ссылки на модули
- •Пример модуля (стек)
- •Модули и большие программы
18.9. Побочный эффект (side effect)
Под термином "главный эффект", понимается возврат функцией одного значения или возврат процедурой вычисленных значений (результатов) через параметры-переменные. Обычно предполагается (с точки зрения ясности работы программы), что все действия, которые выполняются в процедурах или функциях, соответствуют главному эффекту, т.е. предполагается, что главный эффект является единственным и за пределами подпрограммы невозможно обнаружить никаких других последствий ее выполнения. Однако по аналогии с фармакологией наряду с главным эффектом часто бывает и побочный.
Побочным эффектом называется такой эффект, который появляется вне тела процедуры или функции, и заключается в выполнении действий, отличных от тех, которые производят главный эффект.
Наиболее часто побочный эффект проявляется в следующих вариантах:
1 вариант. В изменении в теле процедуры или функции значений глобальных параметров. При этом использование глобальных переменных само по себе не является побочным эффектом. Побочных эффектом является их изменение в теле процедуры или функции. При этом предполагается, что главная (вызывающая) программа и подпрограммы обмениваются между собой данными через общие области памяти (глобальные переменные).
ПРИМЕР.
var
x, y : real;
стандартная функция
begin
пользовательская (наша) подпрограмма
тело (код) программы (основной раздел
действий)
end;
begin
x:= 2;
writeln ('x =', x);
y:= A(x); Вызов
подпрограммы
writeln ('y =', y, ' при x = ', x);
end.
Побочный эффект заключается в изменении значения глобального параметра X. Вначале выполняется X := 2, далее при вызове функции А Х изменяется на 1.5. После этого вызова в главный алгоритм будет возвращено новое значение глобального параметра Х = 1.5. Это значение и будет выведено на экран последним оператором. Главное, глядя только на главную программу невозможно понять, почему значение X изменилось.
2 вариант. Необоснованный вызов в теле процедуры или функции процедур ввода–вывода, где этого никто (из тех, кто ее запускает) не ждет (обычно вывод выполняет в вызывающей части программы - при получении результатов - а не в вызываемой, где требуется только вычислять). Например, из текста программы может быть видно (ожидаться), что вывод результата должен быть только после вызова определенной подпрограммы (р1), однако при вызове другой подпрограммы (р2) тоже наблюдается вывод чего-то. Возникает вопрос, а что выводится? В результате ухудшается понятность программы.
3 вариант. В изменении значений фактических параметров, которые не должны изменяться (по логике человека, использующего программу). Например, функция не может по определению изменять ничего кроме возвращаемого значения. Если же функция изменяет какой-либо из параметров (из заголовка), то это - побочный эффект.
Если вызов функции, использующей побочный эффект, находится в выражении, то значение этого выражения может зависеть от порядка следования в нем операндов.
Пример:
X:=X
- B
Var 10 10 = X x = 0; B = 10;
X, Y : word; x:= x - 10=-10;
function F (B : word) :word; f:= 10*10=100;
begin
X:= X - B; x = 10; B = 10;
F:=B*B; x:= x - B=10 - 10=0;
end; f:= B*B=10*10=100
begin
X:= 10; x = 0; B = 0;
Y:= F(10)*F(X); x:= x - B=0;
writeln ('y =', y, ' при x = ', x); f:= 0*0=0;
X:=10;
Y:= F(X)*F(10); x = 10; B = 10;
writeln ('y =', y, ' при x = ', x); x:= x-B=0;
end. f:= B*B=100;
На экран будет выведено:
y=10000 при x= -10
y=0 при x= 0
Объяснение: при включенной оптимизации при вычислении значения выражения типа А1*А2 на Паскале вначале вычисляется А2, а потом А1 (для целей оптимизации операнды операции вычисляются в порядке помещения их на стек – в обратном порядке, т.е. справа налево).
При наличии в программе побочных эффектов невозможно предсказать по тексту главного алгоритма, какие реальные действия в программе выполняются, если не анализировать ход выполнения каждой процедуры и функции, что ухудшает понимание программы.
Вывод: Можно использовать побочный эффект для определенных целей (например, для обмена данными между главной программой и подпрограммами), но надо строго оговаривать все такие случаи.
