- •Введение
- •1. Общие положения
- •1.1. Понятие алгоритма. Данные в задачах и алгоритмах
- •1.2. Понятие о технологии разработки программ. Принципы и этапы разработки программ
- •1.3. Состав документации по отдельным этапам
- •1. Задача
- •9. Структурные тесты
- •1.4. Нисходящая разработка и нисходящая отладка
- •2. Процесс разработки программы на примере решения типовой задачи
- •2.1. Разработка алгоритма и программы уровня 0 с заглушками
- •2. Входные данные
- •3. Выходные данные
- •5. Функциональные тесты
- •6. Метод
- •7. Алгоритм
- •8. Программа на паскале. Диалоговый вариант
- •9. Структурные тесты
- •2.2. Отладка программы с заглушкой
- •2.3. Общая схема перехода от метода к алгоритму решения
- •2.4. Разработка алгоритма и программы для примера
- •2. Входные данные
- •5. Функциональные тесты
- •6. Метод
- •7. Алгоритм
- •8. Программа на паскале
- •9. Структурные тесты
- •2.5. Отладка полной программы
- •2.6. Список заданий
- •3. Организация хранения данных с позиций эффективности отладки и использования программы
- •3.1. Как лучше хранить, вводить и выводить данные
- •3.2. Использование текстовых файлов для хранения входных и выходных данных
- •3.3. Использование параметров в Паскаль-программах
- •3.4. Задание
- •4. Некоторые методы решения типовых задач
- •4.1. Поиск экстремальных значений (максимума, минимума) в одномерном массиве
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.2. Поиск элемента, удовлетворяющего заданному условию
- •2. Входные данные
- •6. Метод
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.3. Задача со сложной логикой
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.4. Упорядочение одномерного массива
- •3. Выходные данные
- •6_А. Метод включения
- •6_Б. Метод пузырька
- •4.5. Список заданий
- •5. Работа с двумерными массивами (матрицами)
- •5.1. Схема обработки матриц
- •5.2. Ввод и вывод матрицы
- •5.3. Пример решения задачи
- •3. Выходные данные
- •6. Метод
- •5.4. Список заданий
- •6. Оформление алгоритмов в виде процедур
- •6.1. Основные положения
- •6.2. Кодирование процедур на языке Паскаль
- •6.3. Специфика оформления процедур ввода – вывода
- •6.4. Рекомендации по оформлению процедур
- •6.5. Примеры разработки процедур
- •3. Выходные данные
- •6. Метод
- •3 Истина, если все элементы строки больше 1, ложь, в противном случае . Выходные данные
- •7. Описание процедуры
- •8. Кодирование на паскале
- •9. Структурные тесты
- •2. Входные данные
- •3. Выходные данные
- •4. Аномалии не рассматриваем
- •6. Метод
- •7. Алгоритм
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •8. Кодирование на паскале
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •8. Кодирование на паскале
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •7. Описание процедуры
- •8. Кодирование на Паскале
- •6.6. Список заданий
- •7. Внешние модули (unit) в турбо-Паскале
- •7.1. Суть и описание модуля
- •7.2. Связь модуля с другими модулями и главной программой. Область действия описаний объектов
- •7.3. Специфика оформления процедур ввода – вывода в модулях
- •7.4. Примеры оформления процедур во внешних модулях
- •7.5. Задания
- •7.6. Обработка многомодульных программ в среде турбо-Паскаль
- •8. Контрольные вопросы к главе 1
- •К главе 2
- •К главе 3
- •К главе 6
- •К главе 7
- •Заключение
- •Литература
- •Приложение 1. Базовые структуры алгоритмов
- •Приложение 2. Простые типы в Паскале
- •Приложение 3. Структура типов данных в языке Паскаль
- •Содержание
6.3. Специфика оформления процедур ввода – вывода
Решение любой задачи состоит в преобразовании ее входных данных в результаты. Операции ввода – вывода с этой точки зрения стоят особняком, так как связаны только с применением компьютера как инструмента для решения. Эти операции не меняют значений данных, а только преобразуют их из одной формы в другую и осуществляют обмен между внешней памятью и оперативной (ввод – перенос с внешнего носителя в оперативную память с преобразованием из внешней формы во внутреннюю, вывод – перенос из оперативной памяти на внешний носитель с преобразованием внутренней формы во внешнюю).
Первым вопросом в связи с этим является вопрос о том, что считать входными и выходными данными подзадач ввода – вывода. При оформлении ввода и вывода в виде процедур этот вопрос является определяющим.
Первый напрашивающийся ответ таков. Если в подзадаче вводится некоторая совокупность данных, то входные данные подзадачи – эта совокупность данных во внешней форме (на внешнем носителе), а выходные – эта совокупность данных во внутреннем представлении (в оперативной памяти).
Входная форма связана с этой подзадачей и является схемой, согласно которой описывается ввод.
Однако все преобразования данных «по существу» (преобразования значений, приводящие к результату, «счет») осуществляются компьютером тольков оперативной памяти. Для подзадач, составляющих собственно решение, входными считаются получаемые подзадачей значения, а выходными – формируемые значения (практически так же, как и при решении задач без компьютера). Они же образуют интерфейс подзадачи, а в случае оформления ее решения в виде процедуры будут представлять параметры последней.
С этой точки зрения процедура, содержащая операции ввода, не получает данных извне, а процедура вывода не формирует результатов.
Целесообразно остановиться на такой трактовке и расценивать как «нормальные», т.е. подлежащие передаче в процедуру и обработке, только данные во внутреннем представлении. Тогда подзадача ввода не будет иметь входных данных, но будет по-прежнему связана со входной формой.
Ситуация с выводом обратная.
В связи с этим появляется ряд сугубо технических, однако весьма существенных моментов, связанных с проектированием и организацией ввода – вывода.
● Режим диалога. Здесь сложностей не возникает.
Процедура ввода некоторой совокупности данных будет имеет только выходные данные, представленные этой совокупностью, а процедура вывода – только входные.
К специфическим моментам относится вывод приглашений перед заданием входных данных. Эти операции могут расцениваться как служебные операции, а сами приглашения – как служебные элементы входной формы.
● Использование файловдля хранения данных.
Для определенности будем говорить о вводеизодногофайла,независимом от физического имени файла, т.е. о ситуации, когда физическое имя задается при очередном запуске программы как параметр или запрашивается программой.
Здесь появляются элементы, связанные не с решением задачи, а только с техническими аспектами использования файлов:
файловые переменные;
имя файла;
операции назначения, открытия и закрытия файлов.
Если ввод или вывод не оформляется в виде процедуры, эти элементы со спокойной совестью можно отнести к служебным.
При оформлении процедуры сразу возникает ряд важных вопросов. Варианты их решения определяют варианты принципиально различающихся процедур. Поэтому проанализируем эти варианты.
•• Возможный статус файловой переменной:
объявить ее вне процедуры как глобальную;
локализовать в теле процедуры;
передать как параметр.
•• Размещение операции назначения:
вне процедуры;
внутри процедуры.
•• Размещение операций открытия и закрытия:
вне процедуры;
внутри процедуры.
Комбинация этих альтернатив формально дает следующие варианты.
Файловая переменная |
Операции назначения |
Операции открытия |
Комментарии |
Глобальная |
Вне процедуры |
Вне процедуры |
|
Глобальная |
Вне процедуры |
Внутри процедуры |
Нецелесообразно |
Глобальная |
Внутри процедуры |
Вне процедуры |
Невозможно |
Глобальная |
Внутри процедуры |
Внутри процедуры |
Бессмысленно |
Параметр |
Вне процедуры |
Вне процедуры |
|
Параметр |
Вне процедуры |
Внутри процедуры |
Нецелесообразно |
Параметр |
Внутри процедуры |
Вне процедуры |
Невозможно |
Параметр |
Внутри процедуры |
Внутри процедуры |
Бессмысленно |
Локальная |
Вне процедуры |
Вне процедуры |
Невозможно |
Локальная |
Вне процедуры |
Внутри процедуры |
Невозможно |
Локальная |
Внутри процедуры |
Вне процедуры |
Невозможно |
Локальная |
Внутри процедуры |
Внутри процедуры |
|
Пять из этих вариантов нереализуемы; два – бессмысленны (в этих ситуациях файловая переменная в вызывающем модуле вообще не нужна); два – нецелесообразны (нелогично назначать файл вне процедуры, а открывать внутри).
Обсуждению подлежат оставшиеся варианты, представленные в табл. 6.1.
Таблица 6.1
№ |
Файловая переменная |
Операции назначения |
Операции открытия |
1 |
Глобальная |
Вне процедуры |
Вне процедуры |
2 |
Параметр |
Вне процедуры |
Вне процедуры |
3 |
Локальная |
Внутри процедуры |
Внутри процедуры |
Оценка каждого из вариантов зависит не только от особенностей ввода – вывода в задаче, но и от оформления процедуры – внутренней или в отдельном модуле.
Наилучшим с точки зрения надежности, универсальности и стиля является вариант, когда все, что связано с технической стороной ввода – вывода, локализовано внутри процедуры (последний в таблице).К нему по возможности следует стремиться. Однако в зависимости от задачи этот вариант может привести к практически неоправданному переусложнению программы.
В целом можно утверждать, что варианты в таблице упорядочены «от худшего к лучшему», но конкретное решение должно приниматься в результате анализа конкретной ситуации.
•• Если процедура оформляется как внутренняя,то и с точки зрения корректности, и с точки зрения здравого смысла все варианты сопоставимы.
Процедуры вариантов 1 и 3 должны содержать в списке параметров только выходные величины (введенные входные данные).
Процедуры варианта 2 будут содержать служебный входной параметр– имя файловой переменной. Однако передавать имя файловой переменной всегда необходимо какпараметр-переменную.Если параметром процедуры является файловая переменная, перед ней всегда должен стоять описатель var.
Отрицательные стороны передачи файловых переменных как глобальных (вариант 1) компенсируются отсутствием в соответствующих процедурах служебных параметров, представляющих техническую сторону хранения данных и наличествующих в варианте 2.
Третий вариант лишен обоих недостатков, но, как сказано выше, в ряде ситуаций его реализация может оказаться не вполне оправданной.
Пример оформления процедур ввода – вывода как внутренних приведен в § 6.5 (пример 2, с. 93).
•• Размещение процедур ввода – вывода во внешних модулях рассмотрено в § 7.3.
● Резюме
Представляется целесообразным, учитывая специфику ввода – вывода, подходить к разработке процедур соответствующих подзадач специфически.
Если процедура использует файл:
определить состав входных – выходных данных, исходя из содержания подзадачи; это будут «содержательные» параметры процедуры, т.е. те, которые задаются в задаче или являются результатами ее решения;
принять решение о размещении процедуры – в отдельном модуле или в виде внутренней процедуры в вызывающем модуле;
определить способ доступа процедуры к файлу – доступ к уже открытому файлу или открытие (и закрытие) файла внутри процедуры;
определить «технические» параметры процедуры (таковыми могут быть файловая переменная или имя файла; см. § 7.3).
В описании процедур ввода – вывода на псевдокоде реально можно только указать порядок операций согласно формам ввода – вывода со ссылками на образцы. Поэтому этап проектирования такой процедуры чаще всего оказывается вырожденным. Решив все перечисленные выше вопросы, зачастую рационально сразу записать код процедуры.