Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты МП.docx
Скачиваний:
55
Добавлен:
27.03.2015
Размер:
145.11 Кб
Скачать

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

Синтаксически подпрограмма состоит из:

– определения подпрограммы,

– обращения к подпрограмме.

Определение подпрограммы:

<определение подпрограммы> ::= <заголовок подпрограммы>

<тело подпрограммы>

Тело подпрограммы является описанием того частичного алгоритма, который объявляется подпрограммой.

Заголовок подпрограммы задает ее имя и определяет данные, с которыми эта подпрограмма работает. Обращение к подпрограмме служит для ее активации. Большинство языков программирования допускает подпрограммы двух видов – подпрограммы-процедуры и подпрограммы-функции (или просто процедуры и функции). В отличие от процедуры функция реализует функциональную зависимость, у которой один результат. Кроме того, результат функции может быть, как правило, простого типа. Программа на языке Си это совокупность подпрограмм – функций (в дальнейшем просто функций), среди которых выделяется одна обязательная (главная) с именем main. Остальные функции вводятся в структуру программы для улучшения ее структурированности. Их выполнение инициируется прямо или косвенно вызовами из функции main. Таким образом, тело функции задается блоком (блок это последовательность описаний и операторов, заключенная в фигурные скобки) или составным оператором. В заголовке функции задается тип ее результата, если функция имеет возвращаемый результат, иначе тип void. Список формальных параметров, если он не опущен, содержит перечисленные

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

Выражение определяет возвращаемый результат, его тип описан в загОловке функции. Если функция не возвращает никакого значения (т.е. имеет тип void), оператор возврата опускается.

20. Синтаксис и семантика функции языка с.

Следующим синтаксическим элементом в структуре программы за выражением и оператором идет функция. В отличие от предыдущих она является не только средством написания некоторой части программы, но и служит для оформления логически завершенного действия с собственным набором входных и выходных параметров. Термин функция, принятый в Си, имеет в других языках программирования родственные термины -процедура, модуль. Функция является основной программной единицей уже потому, что вся программа представляет собой множество вызывающих друг друга функций. Часть из них может быть получена “со стороны” -из библиотек или из программ, написанных в другое время, в другом месте, другими людьми и даже на другом языке программирования. То есть на уровне функций осуществляется “сборочный процесс” программы из отдельных составляющих.

Функция состоит из двух частей: ЗАГОЛОВКА ФУНКЦИИ, создающего “интерфейс” функции к внешнему миру, и ТЕЛА ФУНКЦИИ, реализующего заложенный и нее алгоритм с использованием внутренних локальных данных. Вместе заголовок и тело составляют ОПРЕДЕЛЕНИЕ ФУНКЦИИ.

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

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

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

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

Поскольку все переменные в Си имеют типы, тип результата также должен быть определен. Это делается в заголовке функции тем же способом, что и для обычных переменных. Используется тот же самый синтаксис, в котором имя функции выступает в роли переменной-результата.

Значение переменной-результатa устанавливается в операторе return, который производит это действие наряду с завершением выполнения функции и выходом из нее. Между ключевым словом return и ограничивающим символом ";" может стоять любое выражение, значение которого и становится результатом функции. Если вспомнить еще и о преобразованиях типов, то при таком "присваивании" результата таковое должно производиться от типа, соответствующего выражению к типу результата функции.

Имеется специальный пустой тип результата - void, который обозначает, что функция не возвращает никакого результата и, соответственно, не может быть вызвана внутри выражения. Оператор return в такой функции также не содержит никакого выражения.

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

В “классическом” Си формальными параметрами и результатом функции могут быть только переменные, занимающие ограниченный объем памяти: базовые типы данных и указатели (в Си++ к этому перечню добавлены структурированные переменные (объекты)). Это сделано, исходя из общего положения о том, что транслятор не должен оказывать сильное влияние на эффективность программы путем включения каких-либо неявных операций. Использование же массивов и структур в этом качестве приведет к появлению таких операций копирования. Более подробно обсудить этот вопрос сейчас нам мешает отсутствие знаний о типах данных и способах передачи параметров.

Тело функции представляет собой уже известную нам синтаксическую конструкцию -блок. Это простая последовательность операторов, заключенная в фигурные скобки. После открывающейся скобки в блоке могут стоять определения переменных. Это ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ блока (в данном случае тела функции). Они обладают следующими свойствами:

-локальные переменные создаются в момент входа в блок (тело функции) и уничтожаются при выходе из нее;

-локальные переменные могут использоваться только в том блоке, в котором они определены. Это значит, что за пределами блока они "не видны";

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

Локальные переменные в теле функции обозначаются в Си термином автоматические переменные.

21. СПОСОБЫ ПЕРЕДАЧИ ДАННЫХ В ПОДПРОГРАММУ.

Одним из важных моментов при организации подпрограмм является задание данных, над которыми будут выполняться действия подпрограммы. Данные в подпрограмму можно передавать двумя способами:

1) используя для этого глобальные объекты,

2) используя формальные параметры.

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

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

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

Формальным параметрам n, m, p ставятся в соответствие фактические str, stb1, stb2. Связь между этими параметрами устанавливается по значению. Это значит, что формальному параметру n присваивается значение фактической переменной str, формальной m присваивается значение фактической переменной stb1, а формальной p значение фактической stb2. Таким образом, в функции действия выполняются над формальными переменными n, m, p, получившими значения фактических переменных.

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

<cпецификация типа результата функции> <имя функции> ( [ <cписок формальных параметров> ] )

| void <имя функции> ( [ <cписок формальных параметров> ] )

Основные отличия:

1) в конце прототипа ставится точка с запятой,

2) имена формальных параметров можно опускать.

В Си принят единый способ передачи параметров, который называется ПЕРЕДАЧЕЙ ПО ЗНАЧЕНИЮ. Выглядит он так:

-формальные параметры являются собственными переменными функции;

-при вызове функции происходит присваивание значений фактических параметров формальным (копирование первых во вторые);

-при изменении формальных параметров значения соответствующих им фактических параметров не меняются.

Единственным исключением из этого правила является передача имени массива в качестве параметра. В этом случае формальный параметр также является собственной переменной, но не массивом, а указателем на него. Поэтому размерность такого массива в функции несущественна и может отсутствовать, а изменение элементов массива - формального параметра приводит к изменению значений массива -фактического параметра функции. В этом случае формальный параметр как бы “отображается” на соответствующий фактический и такой способ передачи параметров носит название передача параметра по ссылке.