
- •Глава 3. Производные типы данных. Массивы.
- •3.3. Многомерные массивы.
- •3.4. Базовые алгоритмы обработки двумерных массивов.
- •Глава 4. Функции.
- •4.1. Стандартное определение функции.
- •4.2. Локальные переменные.
- •4.3. Размещение тела функции. Прототип функции.
- •4.4. Глобальные переменные.
- •4.5. Классы памяти.
- •5.1. Директива # define.
- •5.2. Использование макроопределений с аргументами.
- •5.3. Директива # include. Включение файла.
- •5.4. Условная компиляция.
4.2. Локальные переменные.
Следует отметить, что переменные в функции являются ее внутренними переменными и не известны вызывающей функции. Аналогично переменные вызывающей функции не известны вызываемой функции. Поэтому для связи вызывающей и вызываемой функций используются параметры (аргументы функции) с помощью которых передается информация в вызываемую функцию и оператор возврата для передачи единственного результата в вызывающую функцию. Переменные, известные только одной функции называются локальными. В языке Си/Си++ имеется возможность объявить переменные, доступные нескольким функциям (глобальные), но этот вопрос будет рассмотрен несколько позже. Если схематично изобразить все вышеcказанное, то получится следующая картинка:
главная функция main() вызываемая функция имя_ф-ии (аргументы)
переменные a,b,c; . точка вызова
. (со значением или без значения) |
переменные a,b,c;
return; ( return выражение);
|
аргументы вызываемой функции также являются локальными
память
|
|
|
|
|
|
|
а |
b |
c |
|
a |
b |
c |
рис. 3
main() вызываемая
функция функция
Формат обращения к функции традиционный: имя_функции (список фактических параметров)
Между формальными параметрами (указанными в заголовке функции) и фактическими параметрами при вызове функции должны соблюдаться правила соответствия по порядку размещения параметров и по типам. Фактический параметр – это выражение того же типа, что и у соответствующего ему формального параметра. Стандарт языка Си допускает автоматическое преобразование значений фактических параметров к типу формальных параметров в Си++ такое преобразование не предусмотрено.
Следует отметить еще один принцип, действующий в Си/Си++: передача параметров происходит только по значению, т.е. действует принцип строгого определении функции: f(x,y)=значение - получить значение функции в зависимости от значения ее аргументов. Изменить значения переменных, указанных в качестве фактических параметров можно только на уровне памяти (в дальнейшем этот механизм будет рассмотрен ).
4.3. Размещение тела функции. Прототип функции.
Рассмотрим вопрос размещения тела функции по отношению к телу главной функции (main).
1. Тело функции размещается перед телом главной функции main().
Пример 1.Определить функцию нахождения наибольшего значения из трех чисел a,b,c.
//определение функции нахождения наибольшего числа
int max_(int a,int b,int c)
{
int max;
if(a>b)
max=a;
else
max=b;
if(c>max)
max=c;
return max;
}
void main()
{
int a,b,c;
int max;a=...;b=...;c=...; // в общем случае значения переменных a,b,c задаются с клавиатуры
max=max_(a,b,c);
}
2. Прототип функции.
Полный текст функции перед телом основной функции main() можно не размещать, но в этом случае перед телом основной функции размещается прототип вспомогательной функции. Под прототипом функции понимается предварительное описание функции, в котором содержатся все необходимые сведения для правильного обращения к ней: имя и тип функции, типы формальных параметров; указывать имена формальных параметров в прототипе необязательно. Заканчивается описание прототипа функции точкой с запятой.
Возможно описать прототип функции и в теле основной функции, вопрос размещения описания связан с понятием области видимости, он будет рассматриваться позже.
Пример 2. Определить функцию odd_(x), принимающую значение 0, в том случае, когда число является нечетным, и 1 в противном случае.
int odd_(int); //прототип функции
void main()
{
int a=17;
int c;
c=odd_(a);
}
//определение функции odd_
int odd_(int x)
{
if(x%2==0)
return 1;
else return 0;
}
//в режиме отладки проверить значение переменной с при а=17, затем изменить в режиме отладки значение а на 22
Примечание.
Так как материал по языку Си/Си++ полностью еще не изучен, в ближайшее время будут рассматриваться функции, возвращающие значения целого или вещественного типа. Если тип результата для функции не указывается, то предполагается, что результат имеет тип int. Допустимы также функции, не возвращающие результата (тип void).