Структура программ и подпрограмм

В этом разделе приводится обзор программ на языке C и описание их выполнения. Также здесь приводятся термины и функции, важные для понимания программ и компонентов на языке C. В разделе рассматриваются следующие темы.

  • Файлы с исходным кодом и исходные программы
  • Функция main и выполнение программ
  • Анализ аргументов командной строки
  • Время существования, область, видимость и компоновка
  • Пространства имен

Поскольку в этом разделе приводятся общие сведения, в указанных выше темах представлен лишь вводный материал. Для получения дополнительных сведений см. соответствующие перекрестные ссылки.

Источник: learn.microsoft.com

Глава 34 Структура программы

В этой главе мы рассмотрим структуру программы, и завершим тем самым боевое построение нашего войска, начатое в 32-й главе.

СТРУКТУРА ЭМОЦИОНАЛЬНОГО ПОЛЯ. Программы и подпрограммы.

Управляющие структуры

Управляющие структуры составляют основу языков программирования. Ключевых структур всего три: ∙ линейная последовательность – это естественный порядок выполнения операторов друг за другом, то есть слева направо и сверху вниз; ∙ альтернатива – выбор одного из двух или нескольких направлений исполнения операторов; ∙ цикл – повторное исполнение операторов до соблюдения некоторого условия. Альтернатива и цикл представлены в Паскале несколькими операторами, из которых программист выбирает тот, что лучше подходит к решаемой задаче (рис. 77). Управляющие структуры Линейная последоваАльтернатива Цикл тельность

IF-THEN IF-THEN-ELSE CASE-OF-ELSE-END
REPEAT-UNTIL WHILE-DO FOR-TO-DO FOR-DOWNTO-DO

Рис. 77 – Управляющие структуры языка Паскаль Итак, для организации альтернативы может быть использован один из трех операторов: 241

Структура программы

∙ неполный условный оператор IF-THEN ; ∙ полный условный оператор IF-THEN-ELSE ; ∙ оператор выбора CASE-OF-ELSE-END . Для организации циклов программист также применяет три оператора: ∙ цикл с проверкой условия в конце REPEAT-UNTIL ; ∙ цикл с проверкой условия в начале WHILE-DO ; ∙ цикл со счетчиком FOR-TO-DO и FOR-DOWNTO-DO . Обратите внимание на условия продолжения циклов WHILE-DO и REPEATUNTIL , — они взаимно противоположны! Первый из них выполняется, пока условие истинно , а второй — пока оно ложно . Странно, что из этих немногих структур лепятся столь сложные программы!

Структура программы Программа на Паскале состоит из ряда секций ( Section — «часть», «раздел»). Под структурой программы будем понимать взаимное положение этих секций. На рис. 78 показана упрощенная структура программы. Объявления констант

Const … Объявления типов
Секции
Type …
описаний Объявления переменных
Var …
Объявления процедур
Function … и функций
Исполняемые Procedure …
Главная программа
секции

Begin … end. Рис. 78 – Структура программы на языке Паскаль

Подпрограммы (процедура)

Глава 34 Структура программы Каждую секцию открывает своё ключевое слово. Три секции: Const , Type и Var — образуют описательную часть программы. Здесь компилятор черпает информацию о размещении данных в памяти. Секции с описаниями процедур и функций и главная программа формируют исполнительную часть, — здесь содержатся исполняемые операторы (секция кода).

Читайте также:
Программа которая распознает иероглифы

Все секции, кроме главной программы, необязательны. Но, при необходимости, секции могут повторяться и чередоваться в любом порядке, соблюдая два простых правила: ∙ любой объект программы – будь то константа, тип, переменная или процедура – объявляется до своего применения; ∙ главная программа располагается в тексте последней (хотя исполнение начинается именно с нее!). Два слова о точке с запятой (;). В описательной и в исполнительной частях программы её назначение слегка различается. Если в объявлениях точка с запятой завершает оператор и обязательна, то в секции кода она разделяет операторы и не нужна за последним оператором блока.

Структура процедур и функций

Процедуры и функции — основные строительные блоки программ, в крупных проектах их сотни. Главная программа обычно содержит несколько операторов, а основная работа отдается процедурам и функциям. Такой подход не только упрощает разработку, отладку и понимание программ, но и существенно уменьшает их размер (объем занимаемой памяти).

Всё, что требует алгоритм, достигается вызовом одних процедур и функций из тела других, — то есть применением вложенных вызовов. Глубина вложения таких «матрешек» практически не ограничена. Опытный программист обычно разбивает большую программу на ряд мелких и простых процедур и функций. Внутренняя структура процедур и функций схожа со структурой программы.

Это своего рода программы в программе, потому их и называют подпрограммами. На рис. 79 показана упрощенная структура процедуры с условным именем ABC .

Обмен данными с подпрограммами

Вызов процедур и функций обычно сопровождается передачей данных между вызываемой подпрограммой с одной стороны и вызывающим её фрагментом с другой. Иначе говоря, данные либо передают внутрь подпрограммы, либо получают от нее. Иногда делают и то, и другое. Существует три способа такого обмена: ∙ через глобальные переменные; ∙ через параметры процедур и функций; ∙ возвратом результата через имя функции.

Глава 34 Структура программы Передача данных через глобальные переменные кажется самой простой, — ведь эти переменные видны из многих частей программы. Но этот способ оправдан лишь в небольших проектах. С ростом размера и сложности программы все труднее отслеживать взаимные влияния её частей через глобальные переменные. Это запутывает программу и снижает её надежность.

Для обмена данными разумнее использовать параметры процедур и функций, а также имена функций . В табл. 4 показаны три способа передачи данных через параметры. Табл. 4 – Три способа передачи данных через параметры

Способ передачи Пример заголовка процедуры Пример
данных вызова
По значению : ABC(10);
в процедуру Procedure ABC (arg:integer);
передается значение ABC(X+3);
параметра.
По ссылке CONST :
В процедуру Procedure ABC (const ABC(10);
передается ссылка на
константу или arg:integer); ABC(X);
переменную,
содержащую данные.
По ссылке VAR :
В процедуру Procedure ABC (var ABC(X)
передается ссылка на
arg:integer);
переменную,
содержащую данные.

Опытного программиста отличает умение эффективно передавать данные; табл. 5 поможет вам выбрать наиболее удачный способ такой передачи. Табл. 5 – Рекомендуемые способы передачи данных

Читайте также:
Основные принципы разработки производственной программы
Куда передавать данные Рекомендуемый способ
Только в процедуру или функцию 1) По значению (простые типы)
2) По ссылке CONST (сложные типы)
Только из процедуры и функции 1) Через имя функции (одно значение)
2) По ссылке VAR (несколько значений)
В обоих направлениях По ссылке VAR (любые данные)

Источник: studfile.net

Модульное программирование

Аннотация: Процедуры и функции: описание и использование. Виды параметров подпрограмм: значения, переменные, константы, открытые, процедурные. Рекурсия. Модули: описание и использование. Стандартные модули Паскаля.

Презентацию к данной работе Вы можете скачать здесь.

С увеличением объема программы становится невозможным удерживать в памяти все детали. Естественным способом борьбы со сложностью любой задачи является ее разбиение на части. В Паскале задача может быть разделена на более простые и понятные фрагменты — подпрограммы, после чего программу можно рассматривать в более укрупненном виде — на уровне взаимодействия подпрограмм.

Использование подпрограмм является первым шагом к повышению степени абстракции программы и ведет к упрощению ее структуры. Разделение программы на подпрограммы позволяет также избежать избыточности кода, поскольку подпрограмму записывают один раз, а вызывать ее на выполнение можно многократно из разных точек программы.

Следующим шагом в повышении уровня абстракции программы является группировка подпрограмм и связанных с ними данных в отдельные файлы ( модули ), компилируемые раздельно. Разбиение на модули уменьшает время перекомпиляции и облегчает процесс отладки, скрывая несущественные детали за интерфейсом модуля и позволяя отлаживать программу по частям (при этом, возможно, разным программистам).

Подпрограммы

Подпрограммы нужны для того, чтобы упростить структуру программы и облегчить ее отладку. В виде подпрограмм оформляются логически законченные части программы.

Подпрограмма — это фрагмент кода, к которому можно обратиться по имени. Она описывается один раз, а вызываться может столько раз, сколько необходимо. Одна и та же подпрограмма может обрабатывать различные данные, переданные ей в качестве аргументов.

В Паскале имеется два вида подпрограмм: процедуры и функции. Они определяются в соответствующих разделах описания (до начала блока исполняемых операторов) и имеют незначительные отличия в синтаксисе и правилах вызова.

Само по себе описание не приводит к выполнению подпрограммы. Чтобы подпрограмма выполнилась, ее надо вызвать. Вызов записывается в том месте программы, где требуется получить результаты работы подпрограммы . Подпрограмма вызывается по имени, за которым следует список аргументов в круглых скобках. Если аргументов нет, скобки не нужны.

Список аргументов при вызове как бы накладывается на список параметров, поэтому они должны попарно соответствовать друг другу. Правила соответствия рассматриваются далее.

Процедура вызывается с помощью отдельного оператора, а функция — в правой части оператора присваивания, например:

inc(i); writeln(a, b, c); < вызовы процедур >y := sin(x) + 1;

Внутри подпрограмм можно описывать другие подпрограммы. Они доступны только из той подпрограммы, в которой описаны.

Читайте также:
Почему выкидывает из программы справка бк

Процедуры

Структура процедуры аналогична структуре основной программы:

procedure имя [(список параметров)]; < заголовок >разделы описаний begin раздел операторов end;

Квадратные скобки в данном случае не являются элементом синтаксиса, а означают, что список параметров может отсутствовать. Рассмотрим простой пример.

Пример. Найти разность средних арифметических значений двух вещественных массивов из 10 элементов.

Как видно из условия, для двух массивов требуется найти одну и ту же величину — среднее арифметическое. Следовательно, логичным будет оформить его нахождение в виде подпрограммы, которая сможет работать с разными массивами ( пример 4.1 ).

program dif_average; const n = 10; type mas = array[1 .. n] of real; var a, b : mas; i : integer; dif, av_a, av_b : real; procedure average(x : mas; var av : real); < 1 >var i : integer; begin av := 0; for i := 1 to n do av := av + x[i]; av := av / n; end; < 2 >begin for i := 1 to n do read(a[i]); for i := 1 to n do read(b[i]); average(a, av_a); < 3 >average(b, av_b); < 4 >dif := av_a – av_b; writeln(‘Разность значений ‘, dif:6:2); end.
Листинг 4.1. Разность средних арифметических значений массивов (процедура)

Описание процедуры average расположено в строках с по . В строках и эта процедура вызывается сначала для обработки массива а , затем — массива b . Массивы передаются в качестве аргументов. Результат вычислений возвращается в главную программу через второй параметр процедуры.

Функции

Описание функции отличается от описания процедуры незначительно:

function имя [(список параметров)] : тип; < заголовок >разделы описаний begin раздел операторов имя := выражение; end;

Квадратные скобки в данном случае означают, что список параметров может отсутствовать. Функция вычисляет одно значение, которое передается через ее имя.

Следовательно, в заголовке должен быть описан тип этого значения, а в теле функции — оператор, присваивающий вычисленное значение ее имени. Он не обязательно должен находиться в конце функции. Более того, таких операторов может быть несколько — это определяется алгоритмом. Рассмотрим пример применения функции для программы, приведенной в предыдущем разделе.

Пример. Найти разность средних арифметических значений двух вещественных массивов из 10 элементов ( пример 4.2).

program dif_average1; const n = 10; type mas = array[1 .. n] of real; var a, b : mas; i : integer; dif : real; function average(x : mas) : real; < 1 >var i : integer; < 2 >av : real; begin av := 0; for i := 1 to n do av := av + x[i]; average := av / n; < 3 >end; begin for i := 1 to n do read(a[i]); for i := 1 to n do read(b[i]); dif := average(a) – average(b); < 4 >writeln(‘Разность значений ‘, dif:6:2) end.
Листинг 4.2. Разность средних арифметических значений массивов (функция)

Оператор представляет собой заголовок функции.

Тип функции определен как вещественный, потому что к такому типу относится среднее арифметическое элементов вещественного массива. Оператор присваивает имени функции вычисленное значение . В операторе функция вызывается дважды: сначала для одного массива, затем для другого.

Источник: intuit.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru