Книга: Песни о Паскале
Глава 34 Структура программы
Разделы на этой странице:
Глава 34
Структура программы
В этой главе мы рассмотрим структуру программы, и завершим тем самым боевое построение нашего войска, начатое в 32-й главе.
Управляющие структуры
Управляющие структуры составляют основу языков программирования. Ключевых структур всего три:
• линейная последовательность – это естественный порядок выполнения операторов друг за другом, то есть слева направо и сверху вниз;
• альтернатива – выбор одного из двух или нескольких направлений исполнения операторов;
• цикл – повторное исполнение операторов до соблюдения некоторого условия.
Альтернатива и цикл представлены в Паскале несколькими операторами, из которых программист выбирает тот, что лучше подходит к решаемой задаче (рис. 77).
Рис.77 – Управляющие структуры языка Паскаль
Итак, для организации альтернативы может быть использован один из трех операторов:
• неполный условный оператор IF-THEN;
• полный условный оператор IF-THEN-ELSE;
• оператор выбора CASE-OF-ELSE-END.
Для организации циклов программист также применяет три оператора:
• цикл с проверкой условия в конце REPEAT-UNTIL;
• цикл с проверкой условия в начале WHILE-DO;
• цикл со счетчиком FOR-TO-DO и FOR-DOWNTO-DO.
Обратите внимание на условия продолжения циклов WHILE-DO и REPEAT-UNTIL, – они взаимно противоположны! Первый из них выполняется, пока условие истинно, а второй – пока оно ложно.
Странно, что из этих немногих структур лепятся столь сложные программы!
Структура программы
Программа на Паскале состоит из ряда секций (Section – «часть», «раздел»). Под структурой программы будем понимать взаимное положение этих секций. На рис. 78 показана упрощенная структура программы.
Рис.78 – Структура программы на языке Паскаль
Каждую секцию открывает своё ключевое слово. Три секции: Const, Type и Var – образуют описательную часть программы. Здесь компилятор черпает информацию о размещении данных в памяти. Секции с описаниями процедур и функций и главная программа формируют исполнительную часть, – здесь содержатся исполняемые операторы (секция кода). Все секции, кроме главной программы, необязательны. Но, при необходимости, секции могут повторяться и чередоваться в любом порядке, соблюдая два простых правила:
• любой объект программы – будь то константа, тип, переменная или процедура – объявляется до своего применения;
• главная программа располагается в тексте последней (хотя исполнение начинается именно с нее!).
Два слова о точке с запятой (;). В описательной и в исполнительной частях программы её назначение слегка различается. Если в объявлениях точка с запятой завершает оператор и обязательна, то в секции кода она разделяет операторы и не нужна за последним оператором блока.
Структура процедур и функций
Процедуры и функции – основные строительные блоки программ, в крупных проектах их сотни. Главная программа обычно содержит несколько операторов, а основная работа отдается процедурам и функциям. Такой подход не только упрощает разработку, отладку и понимание программ, но и существенно уменьшает их размер (объём занимаемой памяти). Всё, что требует алгоритм, достигается вызовом одних процедур и функций из тела других, – то есть применением вложенных вызовов. Глубина вложения таких «матрешек» практически не ограничена. Опытный программист обычно разбивает большую программу на ряд мелких и простых процедур и функций.
Внутренняя структура процедур и функций схожа со структурой программы. Это своего рода программы в программе, потому их и называют подпрограммами. На рис. 79 показана упрощенная структура процедуры с условным именем ABC.
Рис.79 – Структура процедуры
Такой же структурой обладают и функции, которые, в отличие от процедур, возвращают значение некоторого типа. Правила чередования секций внутри подпрограмм – локальных секций – точно такие же, как и для секций программы в целом, а именно:
• любой объект объявляется до своего применения;
• тело процедуры или функции обязательно и размещается последним.
Объявленные внутри подпрограммы константы, типы и переменные – локальные объекты – видны лишь внутри этой подпрограммы. При совпадении их имен с глобальными объектами, локальные имеют преимущество, то есть закрывают собою внешние объекты.
Обмен данными с подпрограммами
Вызов процедур и функций обычно сопровождается передачей данных между вызываемой подпрограммой с одной стороны и вызывающим её фрагментом с другой. Иначе говоря, данные либо передают внутрь подпрограммы, либо получают от нее. Иногда делают и то, и другое. Существует три способа такого обмена:
• через глобальные переменные;
• через параметры процедур и функций;
• возвратом результата через имя функции.
Передача данных через глобальные переменные кажется самой простой, – ведь эти переменные видны из многих частей программы. Но этот способ оправдан лишь в небольших проектах. С ростом размера и сложности программы все труднее отслеживать взаимные влияния её частей через глобальные переменные. Это запутывает программу и снижает её надежность.
Для обмена данными разумнее использовать параметры процедур и функций, а также имена функций. В табл. 4 показаны три способа передачи данных через параметры.
Табл. 4 – Три способа передачи данных через параметры
Способ передачи данных | Пример заголовка процедуры | Пример вызова |
По значению:в процедуру передается значение параметра. | Procedure ABC (arg:integer); | ABC(10);ABC(X+3); |
По ссылке CONST:В процедуру передается ссылка на константу или переменную, содержащую данные. | Procedure ABC (const arg:integer); | ABC(10);ABC(X); |
По ссылке VAR:В процедуру передается ссылка на переменную, содержащую данные. | Procedure ABC (var arg:integer); | ABC(X) |
Опытного программиста отличает умение эффективно передавать данные; табл. 5 поможет вам выбрать наиболее удачный способ такой передачи.
Табл. 5 – Рекомендуемые способы передачи данных
Куда передавать данные | Рекомендуемый способ |
Только в процедуру или функцию | 1) По значению (простые типы) 2) По ссылке CONST (сложные типы) |
Только из процедуры и функции | 1) Через имя функции (одно значение) 2) По ссылке VAR (несколько значений) |
В обоих направлениях | По ссылке VAR (любые данные) |
В каждом случае предпочтительный способ указан первым. Данные простых типов лучше передавать внутрь подпрограмм по значению. По ссылке CONST передают строки и другие сложные типы данных (скоро мы изучим их). Через имя функции возвращают лишь один результат. А если надо вернуть несколько результатов, или вернуть сложный тип данных, используют ссылки VAR.
Встроенные процедуры и функции
Программа, сработанная профессионалом, состоит почти из одних только процедур и функций, разработка которых отнимает львиную долю времени. Но не всегда программисты пишут их сами. В Паскале запасено немало готовых подпрограмм – это встроенные в язык и в библиотеки процедуры и функции. С ними можно ознакомиться в руководстве по языку и во встроенной справке. Некоторые из них вам известны, и применялись нами.
Текстовые файлы
Напоследок напомню об основных средствах обработки текстовых файлов.
Для чтения из файлов применяют следующие процедуры и функции:
Assign(F, ...) - Связать файловую переменную с файлом
Reset(F) - Открыть файл для чтения
Read(F, ...) - Прочитать часть строки файла
Readln(F, ...) - Прочитать строку файла и перейти к следующей
Eoln(F) - Проверить на конец строки
Eof(F) - Проверить на конец файла
Close(F) - Закрыть файл
Для записи в файл применяют такие процедуры:
Assign(F, ...) - Связать файловую переменную с файлом
Rewrite(F) - Открыть файл для записи
Write(F, ...) - Записать часть строки файла
Writeln(F, ...) - Записать строку файла и перейти к следующей
Close(F) - Закрыть файл
Чтобы связать текстовый файл с клавиатурой (при вводе) или с экраном (при выводе), можно прибегнуть к двум приёмам. Первый состоит в том, чтобы назначить файлу пустое имя.
var F_In, F_Out : Text;
begin
Assign(F_In,’’); Reset(F); { F_In связали с клавиатурой }
Assign(F_Out,’’); Rewrite(F); { F_Out связали с экраном }
. . .
end.
Второй приём заключается в применении специального имени "CON" — от слова Console (оно предусмотрено в MS-DOS и Windows).
Assign(F_In,’Con’); Reset(F); { F_In связали с клавиатурой }
Assign(F_Out,’Con’); Rewrite(F); { F_Out связали с экраном }
В операционных системах MS-DOS и Windows существует несколько специальных имен файлов, вот некоторые из них:
AUX - Первый асинхронный коммуникационный порт
CON - Клавиатура и экран (CONsole)
NUL - Фиктивное устройство (для тестирования)
PRN - Первый параллельный принтер
Аналогичные имена применяют и в UNIX-подобных системах.
Наконец, для действий с текстовыми файлами можно применять две встроенные в язык файловые переменные: INPUT и OUTPUT. Они не нуждаются ни в объявлении, ни в открытии, ни в закрытии файлов:
Readln(Input, S); { - то же самое, что Readln(S) }
Writeln(Output, S); { - то же самое, что Writeln(S) }
Файловые переменные INPUT и OUTPUT можно передавать в качестве фактических параметров внутрь процедур и функций, а также связывать их с дисковыми файлами. Вот пример копирования файла из «MyText.in» в «MyText.out»:
var S: string;
begin
Assign(Input,’MyText.in’); Reset(Input);
Assign(Output,’MyText.out’); Rewrite(Output);
While not Eof do begin
Readln(S);
Writeln(S);
end;
Close(Input); Close(Output);
end.
Что дальше?
Мы изучили фундамент языка Паскаль, который составляют простые типы данных и управляющие структуры. Впереди интересные и серьезные проекты, в основе которых лежат сложные типы данных. Вы осилите их, если пройденный материал надежно закрепился в вашей голове. Вы чувствуете это? Нет? Тогда без ложного стыда вернитесь к началу книги, ведь повторение – мать учения!
Итоги
• Основу программ составляют три базовые управляющие структуры: линейная последовательность, альтернатива и цикл.
• Альтернатива организуется условными операторами и оператором выбора.
• Для циклов в Паскале предусмотрено три оператора: 1) цикл с проверкой в начале, 2) цикл с проверкой в конце и 3) цикл со счетчиком.
• Программа состоит из ряда секций. Секции описания констант, типов и переменных нужны для размещения данных. Исполняемые секции содержат процедуры, функции и главную программу.
• Обязательной является лишь секция главной программы, прочие секции включают в программу по мере необходимости.
• Секции могут чередоваться произвольно. Но любой объект программы должен быть объявлен до того, как будет использован.
• Основная нагрузка по обработке данных возлагается на процедуры и функции – подпрограммы. Из тела одних подпрограмм вызывают другие подпрограммы, – такие вызовы называют вложенными.
• Передачу данных между подпрограммами предпочтительней выполнять через параметры и имена функций.
А слабо?
А) Найдите две ошибки в следующей программе.
var X : TNum;
type TNum = integer;
const A = 10;
begin
X:= A+B;
end.
Б) Напишите булеву функцию Test и программу для её демонстрации. Функция должна проверять, делится ли без остатка первое число на второе, например:
Writeln( Test(20, 4) ); { true }
Writeln( Test(21, 5) ); { false }
В) Напишите целочисленную функцию Division для деления первого числа на второе без применения операции DIV. Вот примеры вызовов:
Writeln( Division(20, 4) ); { 5 }
Writeln( Division(21, 5) ); { 4 }
Подсказка: внутри функции вычитайте второе число из первого. Предотвратите деление на ноль (как результат возвращайте ноль). Сделайте два варианта: 1) деление положительных чисел, 2) деление чисел с учетом знака.
Г) Пусть ваша программа распечатает все множители (кроме единицы) введенного пользователем целого положительного числа, например:
Введите число: 60
2 2 3 5
Д) Напишите функцию для ввода целого числа. Она принимает строку-приглашение и возвращает введенное число, например:
X:= GetNumber(‘Введите стоимость покупки=’);
- Только для взрослых
- Детям до 16–ти
- Глава 1 Путь далек у нас с тобою…
- Глава 2 Вместо теории
- Глава 3 Консольный интерфейс
- Глава 4 Оружие – к бою!
- Глава 5 Программа номер один
- Глава 6 Подготовка к следующему штурму
- Глава 7 Развиваем успех
- Глава 8 Постоянные и переменные
- Глава 9 Переменные: продолжение знакомства
- Глава 10 Условный оператор
- Глава 11 Операторный блок
- Глава 12 Цикл с проверкой в конце
- Глава 13 Правда и кривда
- Глава 14 Дважды два – четыре
- Глава 15 Айда в Монте-Карло!
- Глава 16 Делу время, а потехе час
- Глава 17 И вновь за парту
- Глава 18 Аз, Буки
- Глава 19 Процедуры и функции: разделяй и властвуй
- Глава 20 Процедуры: первый опыт
- Глава 21 Отладка
- Глава 22 О передаче параметров
- Глава 23 Функции
- Глава 24 Криптография
- Глава 25 Текстовые файлы
- Глава 26 Я не читатель, – я писатель!
- Глава 27 Дайте кораблю минутный отдых!
- Глава 28 Редактор и справочная система
- Глава 29 Читайте по-новому
- Глава 30 Журнальная история
- Глава 31 Финал журнальной истории
- Глава 32 Порядковые типы данных
- Глава 33 Вещественные числа
- Глава 34 Структура программы
- Глава 35 Множества
- Глава 36 Множества в Паскале
- Глава 37 Ввод и вывод множеств
- Глава 38 Множества в «бою»
- Глава 39 Командная игра (массивы)
- Глава 40 Пристрелка на знакомых мишенях
- Глава 41 По порядку, становись!
- Глава 42 Кто ищет, тот всегда найдет
- Глава 43 Сортировка по-взрослому
- Глава 44 Строки
- Глава 45 Очереди и стеки
- Глава 46 Огромные числа
- Глава 47 Системы счисления
- Глава 48 Железная логика
- Глава 49 Сложные массивы
- Глава 50 Неспортивные рекорды (записи)
- Глава 51 Указатели в море памяти
- Глава 52 Динамические переменные
- Глава 53 Массив указателей
- Глава 54 Односвязные списки
- Глава 55 Слова, слова, слова…
- Глава 56 И снова очереди, и снова стеки…
- Глава 57 Графомания
- Глава 58 По графу шагом марш!
- Глава 59 Крупные проекты
- Глава 60 Мелкие хитрости
- Глава 61 «Кубики» программиста (ООП)
- Глава 62 Самое интересное только начинается!
- Приложение А Установка и настройка IDE Borland Pascal
- Приложение Б Консольная программа в среде Delphi
- Приложение В Особенности IDE Pascal ABCNet
- Приложение Г Зарезервированные слова
- Приложение Д Ошибки компиляции
- Приложение Е Ошибки исполнения
- Приложение Ж Директивы управления компиляцией
- Приложение З Назначение пунктов меню
- Приложение И Стандартная кодировка символов MS–DOS
- Приложение К Некоторые встроенные процедуры и функции
- Приложение Л Перечень программ
- Приложение М Пример олимпиадной задачи
- Библиография
- Содержание книги
- Популярные страницы
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- Программы, которыми мы будем пользоваться
- Структура программы: обзор
- 7.2.5. Структура программы и блок-схема алгоритма
- 1.4. Почему программы GNU лучше
- 1.4.2. Поведение программы
- Структура простой программы на C#
- Структура программы
- 7.1.4. Структура программы и блок-схема алгоритма
- 7.3.4. Структура программы и блок-схема алгоритма
- 7.4.4. Структура программы и блок-схема алгоритма
- 7.5.4. Структура программы и блок-схема алгоритма