Характеристика базовых типов
Характеристика базовых типов
int – 2 байта – (-32 768, 32767)
char – 1 байт – (-128,127) общее 255 для символьного набора ASCII
bool – 1 байт – (0,1)
float – 4 байта – (3.4е-48,3.4у+38) внутренее представление состоит из двух частей – мантиссы и порядка, 1 разряд знак, 8 разрядов под порядок, 23 под мантиссу
7. ПОНЯТИЕ СЛОЖНОГО ТИПА. КЛАССИФИКАЦИЯ СЛОЖНЫХ ТИПОВ.
Сложный тип – значение состоит из частей/элементов, операции выполняются над элементами или всем значением в целом.
Сложные типы характеризуются тем, что любое значение такого типа состоит из множества компонентов (элементов) каким-то образом связанных между собой в единое целое, т.е. имеет сложную структуру.
Сложный тип строится по следующим правилам:
- элемент сложной структуры может иметь как простую, так и сложную структуры. Таким образом, значения сложных типов в общем случае имеют иерархическую структуру, на самом нижнем уровне которой элементы только простого типа (при этом уровень вложенности может ограничиваться или нет);
- внутри сложной структуры тип всех элементов может быть
– одинаков – однородная структура,
– различен – неоднородная структура;
- количество элементов в структуре может быть:
– фиксировано в течение времени существования структуры (структуры фиксированного размера или статические),
– переменным, т.е. динамически меняться путем включения или исключения элементов в процессе работы со структурой (структуры переменного размера или динамические);
- обращение (доступ) к элементам структуры может быть:
– непосредственное (прямое) - вычисляемое (по индексу или месту в структуре) или не вычисляемое (по имени элемента);
– последовательное - характерное для структур переменного размера.
Вид обращения определяется способом объединения компонент в единую структуру;
значение структуры может храниться, либо в оперативной (внутренняя структура), либо во внешней памяти.
8. ОДНОРОДНЫЕ ТИПЫ. ВИДЫ ОДНОРОДНЫХ ТИПОВ: МАССИВ, СТРОКА. ХАРАКТЕРИСТИКА ОСНОВНЫХ СОСТАВЛЯЮЩИХ ОДНОРОДНЫХ ТИПОВ.
Однородный тип –тип, элементы которого одного типа.
Массив –конечная именованная последовательность однотипных величин.
Если с группой величин одинакового типа требуется выполнить однообразные действия, то ей дают одно имя, а величины различают по порядковому номеру.
Массив– это пример сложного (структурированного) типа. Регулярный тип (массив) – это сложный тип с однородной структурой фиксированного размера и прямым вычисляемым доступом к элементам. Размер структуры фиксируется при описании массива. Как следствие однородности, все элементы последовательности следуют один за другим. Все значение массива: совокупность всех значений, между которыми нет свободных участков памяти.
Общий вид идентификации:
<спецификация типа> <идентификатор> [<К1>][K2]…[Kn]
Kn-натуральные числа-константное выражение, определяет число компонентов в массиве по своему измерению.
Конечное измерения должно быть обязательно простого типа.
Многомерный массив – это массив, элементы которого типа массив.
Характеристика типа массив
Элементы массива хранятся в памяти по строкам.
Способ обращения:1)по индексу 2) используя указатель
По индексу:
Для обращения к элементам массива необходимо указать имя массива и место(индекс) элемента в структуре. Нумерация элементов в массиве ведется с нуля. Логический смысл индекса – номер элемента, физический адрес. По номеру – вычисление адреса элемента, по которому можно обраться к элементу. Транслятор по номеру вычисляет адрес, а процессор, получая адрес, ведет вычисления и проводит операции.
Используя указатель:
Указатель – это переменная, значением которой является адрес другой переменной, т.е. номер(адрес) единицы памяти, которая выделена по переменную.
Указатель-это адрес области памяти.
Имя массива является константой указателем на первый элемент массива (с многомерными массивами так же). Увеличивая на единицу значение указателя, получаем адрес следующего элемента.
!!!!за индексом нужно следить самому!!!!
!!!!используем массив, когда имеем дело с конечным числом данных!!!!!
!!!!позволяет обобщить алгоритм обработки большой информации!!!!
«Строковый» тип (или просто строка) в Си рассматривается как подмножество типа массив. Строка задается одномерным массивом, элементы которого символы, последний символ массива – ‘\0’. Эта «нуль-литера», кодируемая нулевым байтом, является признаком конца строки. Литера ‘\0’ также как другие символы входит в строку. Размер строки (количество символов) определяется решаемой задачей и ограничивается доступным объемом памяти.
Так как строковый тип – это особый массив, то для строки сохраняются все свойства регулярного типа (т.е. над отдельны-ми элементами можно выполнять операции, допустимые для базового типа). С «нуль-литерой» можно работать, как и с остальными символами (не забывая о ее основном назначении).
Исходный текст это, как правило, последовательность символов, состоящая из слов, разделенных символами-разделителями и оканчивающаяся символом-признаком конца текста. При выборе структуры данных для отображения текста надо стремиться к тому, чтобы текст занимал минимально необходимый объем памяти, и выбранная структура представляла средства для быстрого (непосредственного) обращения к элементам текста, которыми, как правило, являются его слова. Таким требованиям отвечает структура данных – массив.
Текст можно представить:
- двумерным массивом - матрицей, строка которой это слово текста, оканчивающееся символом конца строки-‘\0’. Количество столбцов равно максимальной длине слова плюс один (символ ‘\0’). Количество строк равно максимальному числу слов в тексте. Обращение к строке матрицы это обращение к слову. Чтобы создать такую структуру, надо читать текст посимвольно, помещая каждое очередное слово в новую строку матрицы и добавляя к слову символ ‘\0’.
- одномерным массивом – строкой. Такая структура полностью соответствует внешнему представлению текста. Размер массива равен максимальной длине исходного текста с учетом
разделителей. Чтобы обратиться к слову, необходимо последовательно просматривать символы массива, обнаруживая очередной символ-разделитель, который завершает текущее слово, за ним начинается новое слово. Так продолжаем, пока очередное слово не завершится признаком конца строки. Для создания массива-строки можно использовать функцию gets из библиотеки stdio.h – cчитывание строки из стандартного входного файла. Исходный текст должен завершаться символом новой строки ’\n’, который не включается в результирующую строку, символ ‘\0’ добавляется к строке автоматически. Также можно использовать функцию scanf со спецификацией преобразования %s, «нуль-литера» добавляется к строке автоматически. Для выделения слова из строки можно использовать функцию работы со строками strtok.
9. НЕОДРОДНЫЕ ТИПЫ (СТРУКТУРА). ХАРАКТЕРИСТИКА ОСНОВНЫХ СОСТАВЛЯЮЩИХ НЕОДНОРОДНЫХ ТИПОВ.
Неоднородный тип (структура, запись) позволяет конструировать структуры данных самой произвольной природы. Он используется для представления объектов, имеющих достаточно сложное, неоднородное строение и, как правило, используется при создании различного рода информационных систем.
Значение неоднородного типа состоит из фиксированного количества элементов (полей) разных типов, поэтому каждый элемент должен иметь уникальное имя, которое используется для доступа к элементу. Программист сам описывает неоднородный (структурный) тип, задавая его “внутреннее строение”: количество элементов, их тип и имена.
Структурированная переменная (или просто структура) играет в языке программирования роль, противоположную массиву. Так, если массив представляет из себя упорядоченное множество переменных одного типа, последовательно размещенных в памяти, то структура - аналогичное множество, состоящее из переменных разных типов.
Составляющие структуру переменные имеют различные типы и имена, по которым они идентифицируются в структуре. Их называют ЭЛЕМЕНТАМИ СТРУКТУРЫ, и они имеют синтаксис определения обычных переменных. Использоваться где-либо еще, кроме как в составе структурированной переменной, они не могут.
Другое важное свойство структуры -это наличие у нее имени. Имя структуры идентифицирует данную последовательность элементов, поэтому в программе в дальнейшем можно определять новые структурированные переменные, не раскрывая содержания уже определенной структуры.
Структура может быть определена и сама по себе, то есть без конкретных структурированных переменных. При определении глобальной (внешней) структурированной переменной или массива таких переменных они могут быть инициализированы списками значений элементов, заключенных в фигурные скобки и перечисленных через запятую
Способ работы со структурированной переменной вытекает из ее аналогии с массивом. Точно так же, как нельзя выполнить операцию над всем массивом, но можно над отдельным его элементом, структуру можно обрабатывать, выделяя отдельные ее элементы.
Структура играет особую роль среди всех других способов представления данных. Элементы структуры связаны между собой не только физически (общая память), но и логически, поскольку обычно представляют собой характеристики и свойства одной сущности или предмета, состояние которого отображается в программе. Иначе говоря, структурированная переменная соответствует в программе понятию ОБЪЕКТА.
10. ПОНЯТИЕ ССЫЛОЧНОГО ТИПА (ТИП УКАЗАТЕЛЬ). ХАРАКТЕРИСТИКА ОСНОВНЫХ СОСТАВЛЯЮЩИХ ТИПА УКАЗАТЕЛЬ.
Тип указатель – это тип, значение которого – адрес некоторой области памяти. Синтаксически тип указатель определяется, спецификация типа * описатель.
В простейшем случае описатель – это идентификатор переменной типа указатель. Если же описатель имеет более сложную конструкцию, то описатель совместно со спецификацией типа определяет тип величины, на которую он указывает. Спецификация типа определяет тип величины, на которую может указывать переменная типа указатель. Спецификация типа может быть задана любым простым типом, сложным, функцией и самим указателем.
Указатель позволяет работать с областью памяти, определяющей указатель. Посредством формального параметра типа указатель имеет возможность обращаться к области памяти к вызывающей её функции, и в эту область памяти что-то помещать, либо из этой области памяти что-то брать – входной параметр.
11. ПОНЯТИЕ ФАЙЛА. ВИДЫ ФАЙЛОВ: ТЕКСТОВЫЕ, ДВОИЧНЫЕ. СПОСОБЫ ОБРАЩЕНИЯ К ЭЛЕМЕНТАМ ФАЙЛОВ. ОПЕРАЦИИ НАД ФАЙЛАМИ.
Файловый тип – это тип, который связывает программу с внешними устройствами ЭВМ. Значение файлового типа представляет собой произвольной длины последовательность компонент.
Размер файла (т.е. длина последовательности) никак не оговаривается при объявлении файла и ограничивается только емкостью устройств внешней памяти. Для указания конца структуры используется признак конца файла (end of file).
В Си файл рассматривается как поток или последовательность символов (байтов), независящая от конкретного устройства, с которым ведется обмен данными. При обмене с потоком часто используется вспомогательный участок основной памяти, называемый буфер потока (буфер ввода, буфер вывода).
При работе с потоком можно производить следующие действия:
- открывать и закрывать потоки;
- вводить (читать) и выводить (записывать): символ, строку, форматированные данные, порцию данных произвольной длины;
- анализировать условие достижения конца потока (конца файла) и ошибки ввода-вывода;
- получать и устанавливать указатель текущей позиции в потоке;
- управлять буферизацией потока и размером буфера.
Все операции ввода-вывода реализованы с помощью функций, находящихся в
библиотеке языка Си. Чтобы использовать эти функции, необходимо включить в программу заголовочный файл stdio.h, который содержит прототипы функций ввода-вывода, определения констант, типов и структур, необходимых для работы функций.
Поток можно открыть в текстовом или двоичном режиме. В соответствии с этим различают файлы текстовые и двоичные.
При открытии файла в текстовом режиме прочитанная из потока последовательность символов преобразуется, если это необходимо из символьного представления во внутреннее представление. Например, если при форматном вводе
читается числовая информация, то происходит преобразование прочитанной последовательности символов в двоичное целое или число с плавающей точкой в соответствии со спецификацией формата; при форматном выводе числовой информации происходит преобразование из внутреннего представления числа в последовательность символов, изображающих число. Последовательность символов, хранящаяся в текстовом файле, может быть разбита на строки. При записи в текстовый поток символа новой строки ‘\n’ он заменяется последовательностью символов CR (“возврат каретки”) и LR (“перевод строки”). При
чтении из текстового файла последовательность символов CR и LR преобразуется в один символ новой строки ‘\n’.
Если в файле хранится не текстовая информация, а двоичная, то никакие преобразования не должны выполняться. Например, в файл записывается (а затем читается) числовая информация в своем внутреннем представлении. Такой файл надо открыть как двоичный.
Функции форматного обмена предназначены для ввода/вывода отдельных символов, строк, целых и вещественных чисел всех типов. При вводе данные помещаются в буфер, а затем побайтно или определенными порциями передаются программе пользователя. При выводе данных в файл они сначала накапливаются в буфере, а при заполнении буфера записываются в виде единого блока в файл за одно обращение
к нему. Таким образом, использование буфера позволяет сократить число обменов с файлом. Буфер выделяется программе по умолчанию при открытии файла.
Функция читает последовательность символов из входного потока, начиная с байта, на который показывает текущее положение указателя файла. Ввод прекращается, если встретился пробельный символ или прочитано количество
символов, указанных в спецификации преобразования. Прочитанная последовательность символов интерпретируется в соответствии с форматной строкой (форматная строка просматривается последовательно от первого символа к последнему) как символьное представление целого числа или вещественного числа или один символ или строка символов. Затем преобразуется во внутреннее представление и записывается в область памяти очередной переменной из списка аргументов (указатель текущей позиции файла при этом перемещается
на новую текущую позицию в соответствии с числом прочитанных байтов).
Этот процесс продолжается пока не исчерпана форматная строка или не достигнут конец файла или не произошла ошибка. В первом случае функция возвращает количество объектов, получивших значение при вводе, при достижении конца файла – возвращает константу EOF, в случае ошибки – значение –1.
Функция просматривает форматную строку слева направо все встреченные произвольные символы выводит в файл, при встрече спецификации преобразования вычисляет значение соответствующего ему выражения из списка аргументов, преобразует его из внутреннего представления в последовательность символов в соответствии со спецификацией и выводит в текущую позицию файла. Для каждого аргумента должна быть указана одна спецификация преобразования. Если аргументов меньше , чем спецификаций, то результат зависит
от реализации языка. Вывод заканчивается, когда исчерпана форматная строка или возникла ошибка. Функция возвращает число выведенных символов, а при ошибке отрицательное число.
В двоичном режиме в файл можно записать содержимое любой области памяти без преобразования из внутреннего представления. Таким образом, форма представления данных в памяти и в двоичном файле одинакова. Поэтому при чтении из двоичного файла преобразование во внутреннее представление не нужно. Для обмена с двоичным файлом используются функции fread и fwrite.
12. СОВМЕСТИМОСТЬ ТИПОВ. ПРЕОБРАЗОВАНИЕ ТИПОВ.
В выражениях в качестве операндов могут присутствовать переменные и константы разных типов (здесь и далее мы ограничимся пока только известными нам базовыми типами данных), так же выражения.
Результат вычисления значения выражения зависит от приоритета операций и порядка выполнения операций (ассоциативность операций). Для задания правильного порядка вычислений используются скобки, они повышают приоритет операции, но для операций. В одном выражении операции одного приоритета могут встречаться несколько раз. Например, если в выражении операция присваивания производится несколько раз, то вычисления производятся справа налево. Тип значения выражения имеет тип результата последней выполняемой операции в этом выражении
Результат каждой операции также имеет свой определенный тип, который зависит от типов операндов. Если в бинарных операциях типы данных обоих операндов совпадают, то результат будет иметь тот же самый тип. Если нет, то транслятор должен включить в код программы неявные операции, которые преобразуют тип операндов, то есть выполнить ПРИВЕДЕНИЕ ТИПОВ.
При выполнении операции, как правило, происходит преобразование типов ее операндов к общему типу. Правила преобразования типов определяют таким образом, чтобы преобразование происходило без потери значений данных. Общим типом является тип того операнда операции, который включает в себя как подмножество область значений типа другого операнда. Градация основных типов:
В тех случаях, когда программиста не устраивает принятый порядок неявного преобразования типов, он может сам преобразовать результат к такому типу, какой ему необходим. Это можно сделать, в частности, путем присваивания результата дополнительной переменной, во время которого требуемое преобразование будет произведено. Но он может сделать то же самое внутри выражения "на лету" с помощью специальной операции. Она представляет собой имя типа, к которому осуществляется приведение, заключенное в круглые скобки и стоящее перед операндом. В качестве примера рассмотрим получение дробной части числа:
double x,d; // double x,d; int n;
d = x - (int)x; // n = x; d = x - n;
13. ПОНЯТИЕ ПРОГРАММЫ. СТРУКТУРА ПРОГРАММЫ.
Простая программа – это программа с управляющей структурой, обладающей следующими особенностями:
1) имеется только один вход и один выход,
2) через каждый узел программы проходит путь от входа к выходу структуры.
Логически программы можно разбить на 2 блока:
1. величины с которыми работаем
2. действия производимые над величинами (в соответствии с алгоритмом решения задачи).
Программа в си состоит из подпрограмм. Из них путем механического объединения формируется текст программы, но всегда существует основная подпрограмма. Синтаксис подпрограммы: 1. Заголовок void main ()
2. тело – {блок} – составной оператор, позволяющий задавать величины и действовать над ними – крупная единица действия. В блоке величина сначала должна быть определена и только потом использована.
Программа на языке Си состоит из одной или более функций. Одна из этих функций – главная, она имеет имя main. Операционная система передает управление в программу пользователя на функцию с этим именем и тем самым начинается выполнение программы. Функция main вызывает другие функции программы. Кроме функций программа может содержать директивы препроцессору, указания компилятору, объявления и определения.
Директивы препроцессора используют для того, чтобы облегчить модификацию программы. Директива - это инструкция препроцессору языка Си. Препроцессор обрабатывает исходную программу перед ее компиляцией.
Текст программы на языке Си может быть разделен на несколько исходных файлов. Исходный файл – это текстовый файл, который содержит либо всю программу, либо ее часть. Исходный файл не обязательно должен содержать выполняемые операторы. Удобно размещать определения переменных в одном файле, а в других файлах использовать эти переменные
путем их объявления. Каждый исходный файл компилируется отдельно, а затем связывается с другими компоновщиком программ. Отдельные исходные файлы можно объединить в один исходный файл, компилируемый как единое целое, используя директиву препроцессора – include.
14. Понятие структурного программирования. Основные управляющие структуры
Структурное программирование – это такой метод составления программ, который способствует построению надежных, корректных и хорошо понимаемых программ.
Такие программы имеют ясную логику, их легко читать сверху вниз, в них можно гораздо быстрее отыскать ошибки, внести изменения и исправления.
Принцип структурного программирования: программа составляется из небольшого набора структурных конструкций управления вычислениями. При этом каждая структурная конструкция имеет один выход и один вход. Программа написания с помощью таких структур называется структурированием.
Структуры:
̶ Следования. Задает определенный порядок следования действий. Действия выполняются в порядке их написания. Структура может задаваться явно(когда используются какие-то средства для выделения структуры) или неявно(один оператор следует за другим).
̶ Ветвления. Задает выбор одного действия из нескольких возможностей.
̶ Цикл. Предназначена для задания действия, которые должны быть многократно повторить.
Подпрограммы
Синтаксически подпрограмма состоит из:
– определения подпрограммы,
– обращения к подпрограмме.
Определение подпрограммы:
<определение подпрограммы> ::= <заголовок подпрограммы>
<тело подпрограммы>
Тело подпрограммы является описанием того частичного алгоритма, который объявляется подпрограммой.
Заголовок подпрограммы задает ее имя и определяет данные, с которыми эта подпрограмма работает. Обращение к подпрограмме служит для ее активации. Большинство языков программирования допускает подпрограммы двух видов – подпрограммы-процедуры и подпрограммы-функции (или просто процедуры и функции). В отличие от процедуры функция реализует функциональную зависимость, у которой один результат. Кроме того, результат функции может быть, как правило, простого типа. Программа на языке Си это совокупность подпрограмм – функций (в дальнейшем просто функций), среди которых выделяется одна обязательная (главная) с именем main. Остальные функции вводятся в структуру программы для улучшения ее структурированности. Их выполнение инициируется прямо или косвенно вызовами из функции main. Таким образом, тело функции задается блоком (блок это последовательность описаний и операторов, заключенная в фигурные скобки) или составным оператором. В заголовке функции задается тип ее результата, если функция имеет возвращаемый результат, иначе тип void. Список формальных параметров, если он не опущен, содержит перечисленные
через запятую спецификации формальных параметров. В теле функции, если она возвращает результат, обязательно должен быть хотя бы один оператор возврата в точку вызова:
Выражение определяет возвращаемый результат, его тип описан в загОловке функции. Если функция не возвращает никакого значения (т.е. имеет тип void), оператор возврата опускается.
20. СИНТАКСИС И СЕМАНТИКА ФУНКЦИИ ЯЗЫКА С.
Следующим синтаксическим элементом в структуре программы за выражением и оператором идет функция. В отличие от предыдущих она является не только средством написания некоторой части программы, но и служит для оформления логически завершенного действия с собственным набором входных и выходных параметров. Термин функция, принятый в Си, имеет в других языках программирования родственные термины -процедура, модуль. Функция является основной программной единицей уже потому, что вся программа представляет собой множество вызывающих друг друга функций. Часть из них может быть получена “со стороны” -из библиотек или из программ, написанных в другое время, в другом месте, другими людьми и даже на другом языке программирования. То есть на уровне функций осуществляется “сборочный процесс” программы из отдельных составляющих.
Функция состоит из двух частей: ЗАГОЛОВКА ФУНКЦИИ, создающего “интерфейс” функции к внешнему миру, и ТЕЛА ФУНКЦИИ, реализующего заложенный и нее алгоритм с использованием внутренних локальных данных. Вместе заголовок и тело составляют ОПРЕДЕЛЕНИЕ ФУНКЦИИ.
Определение функции представляет собой всего лишь “заготовку” программы. Выполнение ее происходит тогда, когда в процессе вычисления выражения встречается вызов функции.
Вызов функции – выполнение тела функции в той части выражения, где встречается имя функции со списком фактических параметров.
Интерфейс функции состоит из формальных параметров (вход) и результата (выход). В заголовке функции имеется список формальных параметров, в котором они имеют синтаксис определений обычных переменных. Использование их в теле функции также не отличается от обычных переменных.
Результат функции – это временная переменная, которая возвращается функцией и может быть использована как операнд в контексте (окружении) выражения, где был произведен её вызов.
Поскольку все переменные в Си имеют типы, тип результата также должен быть определен. Это делается в заголовке функции тем же способом, что и для обычных переменных. Используется тот же самый синтаксис, в котором имя функции выступает в роли переменной-результата.
Значение переменной-результатa устанавливается в операторе return, который производит это действие наряду с завершением выполнения функции и выходом из нее. Между ключевым словомreturn и ограничивающим символом ";" может стоять любое выражение, значение которого и становится результатом функции. Если вспомнить еще и о преобразованиях типов, то при таком "присваивании" результата таковое должно производиться от типа, соответствующего выражению к типу результата функции.
Имеется специальный пустой тип результата - void, который обозначает, что функция не возвращает никакого результата и, соответственно, не может быть вызвана внутри выражения. Оператор return в такой функции также не содержит никакого выражения.
Вызов функции выглядит как имя функции, за которым в скобках следует список фактических параметров.
В “классическом” Си формальными параметрами и результатом функции могут быть только переменные, занимающие ограниченный объем памяти: базовые типы данных и указатели (в Си++ к этому перечню добавлены структурированные переменные (объекты)). Это сделано, исходя из общего положения о том, что транслятор не должен оказывать сильное влияние на эффективность программы путем включения каких-либо неявных операций. Использование же массивов и структур в этом качестве приведет к появлению таких операций копирования. Более подробно обсудить этот вопрос сейчас нам мешает отсутствие знаний о типах данных и способах передачи параметров.
Тело функции представляет собой уже известную нам синтаксическую конструкцию -блок. Это простая последовательность операторов, заключенная в фигурные скобки. После открывающейся скобки в блоке могут стоять определения переменных. Это ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ блока (в данном случае тела функции). Они обладают следующими свойствами:
-локальные переменные создаются в момент входа в блок (тело функции) и уничтожаются при выходе из нее;
-локальные переменные могут использоваться только в том блоке, в котором они определены. Это значит, что за пределами блока они "не видны";
-инициализация локальных переменных заменяется присваиванием им значений во время их создания при входе в блок. Поскольку под инициализацией понимается процесс установки начальных значений переменных в процессе трансляции (которые затем попадают в программный код), то для локальных переменных это сделать принципиально невозможно.
Локальные переменные в теле функции обозначаются в Си термином автоматические переменные.
21. СПОСОБЫ ПЕРЕДАЧИ ДАННЫХ В ПОДПРОГРАММУ.
Одним из важных моментов при организации подпрограмм является задание данных, над которыми будут выполняться действия подпрограммы. Данные в подпрограмму можно передавать двумя способами:
1)используя для этого глобальные объекты,
2)используя формальные параметры.
Если используется только первый способ, то в определении подпрограммы (ее теле) непосредственно используются данные, определенные вне тела функции. Такие подпрограммы не имеют параметров. В таких подпрограммах жестко зафиксированы объекты, над которыми выполняются действия подпрограммы, и в случае, если необходимо применить эту подпрограмму для других объектов, то требуется изменение самих глобальных объектов(их имен) в теле подпрограммы.
Поэтому чтобы сделать подпрограмму более гибкой и обеспечить ее общность, данные в подпрограмму передаются через список формальных параметров. Формальные параметры задают не какие-то конкретные данные программы, а лишь условно определяют объекты подпрограммы. Это позволяет применять подпрограммы к различным объектам программы, конкретизируя при каждом обращении ее данные в списке фактических параметров. Все объекты подпрограммы можно разделить на входные данные, промежуточные и выходные. В список формальных параметров необходимо вводить только те объекты, которые изменяются при вызове подпрограммы, т.е. входные и выходные данные.
Формальные параметры в Си задаются в списке формальных параметров перечислением через запятую спецификаций отдельных параметров. Спецификация каждого параметра имеет вид: <спецификация типа> <имя параметра>
22. ПОНЯТИЕ ФОРМАЛЬНОГО ПАРАМЕТРА. ИСПОЛЬЗОВАНИЕ ФОРМАЛЬНОГО ПАРАМЕТРА ДЛЯ ПЕРЕДАЧИ ДАННЫХ В ПОДПРОГРАММУ (ИСХОДНЫХ ДАННЫХ И РЕЗУЛЬТАТОВ).
Формальные параметры – это условное обозначение величин, над которыми в подпрограмме будут выполняться действия. Они позволяют гибко устанавливать связь с фактическим значением, над которой в момент выполнения подпрограммы необходимо выполнять действие.
В программе с многоуровневой структурой возникает проблема взаимодействия объектов, описанных в разных частях и модулях программы.
В языках с блочной структурой принят следующий принцип локализации объектов: объекты, вводимые в употребление в блоке, могут использоваться только в пределах данного блока. В подпрограмме могут действовать три вида объектов:
– локальные,
– формальные,
– глобальные.
Формальные объекты – это объекты, описанные в заголовке определения подпрограммы. Область действия этих объектов – тело подпрограммы. Формальные параметры это также локальные объекты подпрограммы.
Область действия формальных параметров, описанных в прототипе функции – прототип функции.
В заголовке функции имеется список формальных параметров, в котором они имеют синтаксис определений обычных переменных.
Формальные параметры задают не какие-то конкретные данные программы, а лишь условно определяют объекты подпрограммы. Это позволяет применять подпрограммы к различным объектам программы, конкретизируя при каждом обращении ее данные в списке фактических параметров. В список формальных параметров необходимо вводить только те объекты, которые изменяются при вызове подпрограммы, т.е. входные и выходные данные.
Формальные параметры в Си задаются в списке формальных параметров перечислением через запятую спецификаций отдельных параметров.
Спецификация каждого параметра имеет вид:
<спецификация типа> <имя параметра>
23. ПОНЯТИЕ ФАКТИЧЕСКОГО ПАРАМЕТРА ПОДПРОГРАММЫ. ПРАВИЛА СВЯЗЫВАНИЯ ФОРМАЛЬНОГО И ФАКТИЧЕСКОГО ПАРАМЕТРОВ.
Фактические параметры – переменные, константы или выражения, значения которых при вызове присваиваются соответствующим по списку формальным параметрам.
Список фактических параметров задается перечислением через запятую фактических данных, над которыми функция должна выполнять действия при данном вызове. При обращении к функции между списком формальных параметров и списком фактических параметров устанавливается соответствие: по взаимному расположению параметров в списках (первому формальному параметру соответствует первый фактический параметр и т. д.), количеству, типу и способу связывания. Если формальных параметров у функции нет, то не должно быть и фактических параметров при обращении к этой функции. Фактические параметры (аргументы) передаются из вызывающей программы в функцию по значению, т.е. вычисляется значение каждого аргумента, и именно оно используется в теле функции вместо заменяемого формального параметра.
Связь между фактическими и формальными параметрами может устанавливаться двумя способами:
– связь по значению – значение фактического параметра присваивается формальному. Действия в подпрограмме выполняются над формальной переменной, получившей значение фактического параметра. Такой способ используется, прежде всего, для передачи входных данных в подпрограмму;
– связь по адресу (ссылке) – фактический параметр заменяет в теле подпрограммы формальный и подпрограмма получает доступ к фактическому параметру. Если говорить более точно, то формальному параметру присваивается адрес (ссылка) фактического параметра. Значение такого формального параметра при его использовании в операциях рассматривается как адрес того объекта, над которым надо выполнить эту операцию. Такой способ используется как для передачи входных данных, так, и, прежде всего, для выходных данных (результатов). В Си связь между формальными и фактическими параметрами устанавливается по значению. Фактический параметр в этом случае – выражение того же типа, что и соответствующий ему формальный. В момент вызова функции вычисляется значение фактического параметра и присваивается формальному параметру. Такой способ позволяет передать в подпрограмму значения входных данных. Изменение формального параметра, получившего значение фактического, не приводит к изменению фактического параметра.
Если через список формальных параметров должен передаваться результат функции, то формальный параметр должен быть типа указатель, а соответствующий ему фактический параметр это выражение, значение которого адрес переменной результата.
Если в качестве параметра функции обозначен массив, то в функцию передается только адрес начала массива. В этом случае можно говорить, что связь между формальным и фактическим параметрами устанавливается по адресу, если формальный параметр специфицирован как параметр типа массив. При этом формальный параметр на самом деле – это параметр типа указатель. Поэтому размерность формального массива по первому измерению можно опускать (остальные размерности не опускаются, так как они необходимы для вычисления адреса элемента массива). При выполнении действий над этими параметрами из них извлекается адрес фактического массива и действия выполняются над элементами фактического массива.
Так как имя массива – это константа указатель, значение которой есть адрес начала массива, то массив можно передавать, явно определяя тип формального параметра как указатель. В таком случае связь между формальным и фактическим параметрами устанавливается по значению.
Строгое согласование по типам между формальными и фактическими параметрами требует, чтобы до первого обращ