- •4. Понятие объекта программы. Виды объектов: константа, переменная, функция. Задание (определение) объектов программы.
- •Константы
- •1. Понятие алгоритма. Свойства алгоритма.
- •9. Неодродные типы (структура). Характеристика основных составляющих неоднородных типов.
- •10. Понятие ссылочного типа (тип указатель). Характеристика основных составляющих типа указатель.
- •11. Понятие файла. Виды файлов: текстовые, двоичные. Способы обращения к элементам файлов. Операции над файлами.
- •14. Языковые средства вычислений над данными: выражение, оператор присваивания. Синтаксис и симантика выражения и опретора присваивания.
- •12. Совместимость типов. Преобразование типов.
- •Циклические управляющие структуры
- •18. Понятие структурного программирования.
- •19. Понятие подпрограммы и модульного программирования. Цели модульного программирования. Виды подпрограмм: функция, процедура.
- •Подпрограммы
- •20. Синтаксис и семантика функции языка с.
- •22. Понятие формального параметра. Использование формального параметра для передачи данных в подпрограмму (исходных данных и результатов).
- •23. Понятие фактического параметра подпрограммы. Правила связывания формального и фактического параметров.
- •25. Понятие рекурсии. Глубина рекурсии. Механизм реализации рекурсий в языках программирования.
- •24. Модульно - блочная структура программы и правила локализации объектов.
- •Местом или областью локализации может быть:
- •Способ связывания:
Подпрограммы
Синтаксически подпрограмма состоит из:
– определения подпрограммы,
– обращения к подпрограмме.
Определение подпрограммы:
<определение подпрограммы> ::= <заголовок подпрограммы>
<тело подпрограммы>
Тело подпрограммы является описанием того частичного алгоритма, который объявляется подпрограммой.
Заголовок подпрограммы задает ее имя и определяет данные, с которыми эта подпрограмма работает. Обращение к подпрограмме служит для ее активации. Большинство языков программирования допускает подпрограммы двух видов – подпрограммы-процедуры и подпрограммы-функции (или просто процедуры и функции). В отличие от процедуры функция реализует функциональную зависимость, у которой один результат. Кроме того, результат функции может быть, как правило, простого типа. Программа на языке Си это совокупность подпрограмм – функций (в дальнейшем просто функций), среди которых выделяется одна обязательная (главная) с именем 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) имена формальных параметров можно опускать.
В Си принят единый способ передачи параметров, который называется ПЕРЕДАЧЕЙ ПО ЗНАЧЕНИЮ. Выглядит он так:
-формальные параметры являются собственными переменными функции;
-при вызове функции происходит присваивание значений фактических параметров формальным (копирование первых во вторые);
-при изменении формальных параметров значения соответствующих им фактических параметров не меняются.
Единственным исключением из этого правила является передача имени массива в качестве параметра. В этом случае формальный параметр также является собственной переменной, но не массивом, а указателем на него. Поэтому размерность такого массива в функции несущественна и может отсутствовать, а изменение элементов массива - формального параметра приводит к изменению значений массива -фактического параметра функции. В этом случае формальный параметр как бы “отображается” на соответствующий фактический и такой способ передачи параметров носит название передача параметра по ссылке.