- •Содержание
- •Предисловие
- •1. Этапы разработки программы
- •1.1. Формальная постановка задачи
- •1.2. Выбор метода решения
- •1.3. Внешняя спецификация программы
- •1.4. Разработка алгоритма
- •1.5. Кодирование алгоритма на языке программирования
- •1.6. Испытания программы на тестах
- •Вопросы для самоконтроля
- •2. Язык для записи алгоритмов
- •2.1. Базовые типы величин
- •2.2. Объявление величин в алгоритме
- •2.3. Структура компьютера с позиций программы
- •2.4. Базовые операции
- •2.5. Управляющие структуры
- •2.6. Структура алгоритма
- •Вопросы для самоконтроля
- •3. Введение в язык программирования паскаль
- •3.1. Краткая характеристика языка
- •Алфавит, лексемы, разделители
- •3.1.2. Структура программы
- •3.2. Средства кодирования вычислительных операций
- •3.2.1. Операция ввода
- •3.2.2. Операция присваивания
- •3.2.3. Операция вывода
- •3.3. Средства кодирования управляющих конструкций
- •3.3.1. Кодирование структуры «Ветвление»
- •3.3.2. Кодирование структуры «Цикл»
- •3.4. Кодирование алгоритма в целом
- •Заключение
- •Вопросы для самоконтроля
- •Разработка алгоритмов методом пошаговой детализации
- •4.1. Структура алгоритма
- •4.2. Описание действий
- •4.3. Обратная подстановка
- •4.4. Пример
- •4.4.1. Разработка внешней спецификации
- •4.4.2. Разработка главного алгоритма
- •4.4.3. Подстановка
- •4.4.4. Кодирование на языке Паскаль
- •4.4.5. Разработка алгоритма подпрограммы сортировки
- •4.5. Вопросы для самоконтроля
- •5.Тестирование
- •5.1. Общие принципы тестирования
- •5.2. Виды тестирования
- •5.3. Стратегии тестирования
- •5.3.1. Методы стратегии «черного ящика»
- •5.3.2. Методы стратегии «белого ящика»
- •5.4. Правила записи трассировки
- •Вопросы для самоконтроля
- •6. Характеристики качества программы
- •Вопросы для самоконтроля
- •Вопросы для самоконтроля (продолжение)
- •7. Типовые алгоритмы обработки массивов
- •А1. Ввод массива с клавиатуры
- •А7. Выбор элементов по условию
- •А8. Проверка выполнения некоторого условия
- •Пример 2. ”Найти значение элемента, встречающегося в массиве наибольшее количество раз”.
- •Пример 3. В матрице a[1..N, 1..M] поменять местами первый и третий отрицательные элементы, встретившиеся при просмотре матрицы по строкам слева направо и сверху вниз.
- •8. Обработка символьной информации
- •8.1. Обработка строк
- •8.2. Особенности ввода информации строкового вида
- •Вопросы для самоконтроля
- •9. Типы данных, задаваемых пользователем
- •9.1. Множества
- •9.2. Записи
- •9.3. Оператор with
- •Вопросы для самоконтроля
- •10. Файлы
- •Введение
- •10.2. Классификация файлов в Турбо-Паскале
- •10.3. Объявление файла
- •10.4. Открытие и закрытие файла
- •10.5. Чтение и запись
- •10.6. Текстовые файлы
- •10.7. Нетипизированные файлы
- •10.8. Пример. Программа работы с файлами
- •Вопросы для самоконтроля
- •11. Подпрограммы
- •11.1. Область действия идентификаторов
- •11.2. Способы передачи параметров
- •11.3. Примеры
- •Вопросы для самоконтроля
- •12. Динамические структуры данных
- •12.1. Указатели
- •12.2. Динамические структуры типа «Список»
- •12.3. Средства языка Паскаль для организации списков
- •12.4. Типовые алгоритмы работы со списками
- •А1. Инициализация списка. (Создание нового и пустого списка)
- •А2. Добавить элемент в конец односвязного списка
- •А9. Добавить элемент в упорядоченный односвязный список
- •Задачи для закрепления материала
- •Вопросы для самоконтроля
- •13. Динамические структуры данных типа «дерево»
- •13.1. Определение дерева и способы представления в программе
- •13.2. Рекурсия
- •1. Наличие тривиального случая.
- •2. Определение сложного случая в терминах более простого.
- •13.3. Алгоритмы работы с деревьями
- •А1. Вычисление суммы значений информационных полей элементов
- •А2. Подсчет количества узлов в бинарном дереве
- •А3. Подсчет количества листьев бинарного дерева
- •A5. Поиск элемента в двоичном упорядоченном дереве
- •Вопросы для самоконтроля
- •14. Модули
- •14.1. Введение
- •14.2. Форма модульной программы
- •14.3. Стандарты структурного программирования
- •14.4. Модули в турбо-паскале
- •14.5. Использование модулей
- •14.6. Стандартные модули Турбо-Паскаля
- •14.7. Пример использования модулей
- •Вопросы для самоконтроля
- •15. Основы объектно-ориентированного программирования
- •15.1. Основные понятия
- •15.2. Объявление классов объектов
- •15.3. Статические и динамические объекты
- •15.4. Правила построения и использования объектов а. Правила наследования
- •Б. Виртуальные методы
- •В. Ранее и позднее связывание
- •Г. Совместимость классов объектов
- •Вопросы для самоконтроля
- •Заключение
- •Библиографический список
11.2. Способы передачи параметров
Взаимодействие программной единицы (программы или подпрограммы) с некоторой подпрограммой происходит в результате обращения к последней (вызова её). Прежде чем рассмотреть способы обмена информации между ними, введем следующее обозначение. Ту подпрограмму, к которой происходит обращение, будем называть вызываемой подпрограммой, а ту программную единицу, которая вызывает подпрограмму, в данном разделе будем называть вызывающей программой (хотя вызывающей может быть как программа, так и подпрограмма). Это будет сделано только для более компактного изложения материала.
Существуют два варианта обмена информацией между вызывающей программой и вызываемой подпрограммой:
с помощью механизма формальных - фактических параметров;
с использованием глобальных переменных .
Вначале коснемся способа, основанного на использовании глобальных переменных. Напомним, что глобальные переменные – это переменные, описанные в вызывающей и доступные в вызываемой подпрограмме. Поэтому значения всех глобальных переменных, которые были изменены в подпрограмме, без всяких дополнительных действий могут быть использованы и в вызывающей программе.
Несмотря на очевидную простоту данного способа взаимодействия, он имеет и недостатки. В первую очередь это относится к тому, что в процессе работы подпрограммы кроме переменных, в которых должны быть возвращены результаты работы вызываемой подпрограммы, могут быть изменены также значения тех переменных вызывающей программы, которые не должны были изменяться. Это приведет к тому, что гарантировать правильную работу вызывающей программы только на основе анализа ее алгоритма, станет невозможно. Могут возникнуть проблемы также и при разработке подпрограммы, поскольку обеспечить правильность ее работы в процессе разработки также будет непросто, а иногда и невозможно, в связи с тем, что нельзя обеспечить гарантированно известные значения глобальных для нее переменных в подпрограмме к моменту начала ее работы после вызова.
Следствием сказанного становится невозможность применения в чистом виде технологии нисходящего проектирования, а это усложняет процедуру и увеличивает время разработки программы.
Теперь рассмотрим способ, основанный на передаче параметров.
При активизации (вызове) подпрограммы ей можно передать параметры. Параметры, указываемые в заголовке подпрограммы при ее описании, называются формальными. Посредством этих параметров вызывающая программа может передать входные данные в вызываемую подпрограмму, а при завершении работы последней получить результаты ее работы.
Параметры, которые содержат исходные данные для работы подпрограммы, называются входными. Их значение обязательно должно быть определено к моменту вызова подпрограммы. Параметры, в которых подпрограмма формирует результаты работы, возвращаемые в вызывающую программу, называются выходными. Значения выходных параметров могут быть не определены (не инициализированы) при вызове подпрограммы, но обязательно получат значения в процессе ее выполнения.
Некоторые параметры могут быть одновременно входными и выходными, т.е. вызывающая программа должна инициализировать их до или в момент вызова подпрограммы, а после завершения работы последней получит в них новые значения (результаты). Такие параметры оформляются также как и выходные, но при разработке подпрограммы учитывается, что их значения в момент вызова инициализированы.
Формальные параметры обеспечивают возможность задать формальные функциональные связи между входными и выходными параметрами.
Параметры, указываемые при вызове подпрограммы, называются фактическими. Они определяются при вызове подпрограммы и в них используются данные, внешние по отношению к вызываемой подпрограмме. В момент вызова формальные параметры заменяются фактическими.
При передаче параметров необходимо обеспечить выполнение следующих требований:
число формальных и фактических параметров должно совпадать;
порядок перечисления формальных и фактических параметров должны совпадать;
каждый фактический параметр должен соответствовать по типу своему формальному параметру.
Сфера действия имен параметров такая же, как и локальных данных.
По способу передачи параметры различаются:
По взаимодействию вызывающей и вызываемой подпрограммы:
только входной параметр;
только выходной параметр;
как входной, так и выходной параметр (входной-выходной).
По механизму передачи:
передача по значению;
передача по наименованию (по ссылке)
Суть передачи по значению заключается в следующем: в момент вызова значение фактического параметра, присваивается переменной, являющейся формальным параметром. Если формальный параметр выходной, то при возврате из подпрограммы, его значение присваивается соответствующему фактическому параметру.
При передаче по наименованию присваивания значений не происходит, а вместо этого, адрес в памяти формального параметра замещается адресом фактического параметра (ссылкой на фактический параметр).
В Турбо Паскале реализованы следующие способы передачи:
если входной параметр скалярный – он может передаваться как по значению, так и по ссылке;
если входной параметр не скалярный (например, массив) – он может передаваться только по ссылке;
выходной или входной-выходной параметры могут передаваться только по ссылке.
При описании параметра в заголовке подпрограммы необходимо придерживаться следующих правил:
если параметр передается по значению, его описание в заголовке имеет вид
если параметр передается по ссылке, его описание в заголовке имеет вид
Требования к способу представления фактического параметра:
если параметр подпрограммы входной и передается по значению, фактическим параметром может быть любое выражение (константа или переменная – это частный случай выражения), имеющее тип, совместимый по присваиванию с типом формального параметра;
если параметр подпрограммы передается по ссылке, фактическим параметром может быть только идентификатор переменной, совместимый по присваиванию с типом формального параметра.
