Функции.
Технологии и методы программирования
Вторая форма обеспечивает передачу управления и возвращение значения выражения в вызывающую функцию. Применяется в функциях типа, отличного от void. Тип возвращаемого значения должен совпадать с типом функции. Прототип функции сообщает компилятору тип возвращаемых данных, количество параметров и их тип, порядок их следования. Компилятор использует прототип функции для проверки правильности… Читать ещё >
Функции. Технологии и методы программирования (реферат, курсовая, диплом, контрольная)
Функция — это поименованный блок программы, состоящий из последовательности операторов. Функция вызывается на выполнение другими функциями через набор параметров.
Функция состоит из заголовка и тела (текста) функции. Заголовок функции задает имя функции, типы аргументов и тип возвращаемого значения. Тело функции включает объявления локальных переменных, определения типов, операторы.
Вызову функции в программе должно предшествовать либо объявление функции (прототип функции), либо определение функции (текст функции).
Прототип функции — это заголовок функции без тела функции, заканчивающийся разделителем (;). Прототип функции обычно помещают в заголовочный файл, который подключают к соответствующему файлу кодов с помощью директивы компилятора #include. Синтаксис прототипа функции:
(.
[, ,…]) ;
Например:
// функция poisk принимает 2 значения типа массив char // и int,.
// возвращает значение типа int int poisk (char tabn[], int nomer);
// Параметры можно задавать без имен переменных int poisk (char*, int);
// Функция init не принимает и не возвращает значений void init ();
// функция sr принимает значение типа int, возвращает // float.
float sr (int n) ;
Прототип функции сообщает компилятору тип возвращаемых данных, количество параметров и их тип, порядок их следования. Компилятор использует прототип функции для проверки правильности вызовов функции.
Определение функции — это заголовок и тело функции. Синтаксис определения функции:
(.
[, , …]);
{.
… //объявление переменных и операторы [return ;].
} где значение — это возвращаемое значение указанного в заголовке функции типа.
Оператор return осуществляет передачу управления из текущей функции в вызывающую. Существует две формы оператора return:
return;
return (выражение);
Первая форма обеспечивает простую передачу управления из текущей функции в вызывающую. Применяется для выхода из функции типа void.
Вторая форма обеспечивает передачу управления и возвращение значения выражения в вызывающую функцию. Применяется в функциях типа, отличного от void. Тип возвращаемого значения должен совпадать с типом функции.
Оператор вызова функции служит для вызова вызываемой функции в теле вызывающей функции. Он может быть представлен двумя способами:
- • как простой оператор без возврата значений через оператор return;
- • как операнд в выражении при возврате значений через оператор return.
Вызов функции осуществляется либо прямо по имени функции, либо через указатель на функцию.
Синтаксис вызова функции по имени:
^фактический параметр1> [, …])),.
Например:
int main () //вызывающая функция.
{.
floats;
int kol;
s = sr (kol); // вызов функции sr с фактическим // параметром kol.
}.
Оператор вызова функции передает управление вызываемой функции, копии фактических параметров присваиваются формальным параметрам вызываемой функции. Значения фактических входных параметров перед вызовом функции должны быть определены. Оператор return передает управление обратно в вызывающую функцию. Необходимо заметить, что формальные и фактические параметры изолированы друг от друга.
Передача параметров может выполняться двумя способами:
- • передача значений переменных — вызываемой функции передаются копии значений переменных вызывающей функции;
- • передача значений указателей — вызываемой функции передаются копии значений указателей — адреса переменных вызывающей функции.
Пример 5.7.1
Даны два числа. Вывести наибольшее из них. Для нахождения наибольшего числа использовать функцию.
1. Передача параметров по значениям переменных:
#include.
// вызываемая функция, х и у — формальные параметры int max (int х, int у).
{.
return (х > у? х: у) ;
}.
int main{).
{.
int a, b, c;
scanf («%d %d», &a, &b); // ввод исходных данных с = max (a, b); // вызов функции, а и b ;
// фактические параметры.
printf («%d», с); return 0;
}.
Этот способ передачи параметров, как правило, используется для небольших по объему данных: данных базовых типов.
2. Передача значений указателей:
#include.
// вызываемая функция, х и у — формальные // параметры (используются указатели на них) int max (int *х, int *у).
{.
return (*х > *у? *х: *у) ;
}.
int main О.
{.
int a, b, c;
scant («%d %d», &a, &b);
// вызов функции, а и b — фактические параметры // (используется операция адресации) с = шах (&а, &Ь); printf («%d», с); return 0;
}.
Этот способ целесообразно использовать при передаче данных большого объема: массивов, структур.
Передача значений указателей используется и при необходимости изменения значений переменных вызывающей функции.
При передаче параметров по значениям переменных значения фактических параметров копируются в формальные параметры, поэтому при выходе из вызываемой функции никаких изменений значений фактических параметров в вызывающей функции не происходит. При этом вызываемая функция может вернуть вызывающей с помощью оператора return только одно значение. Решить данную проблему позволяет передача значений указателей.
Пример 5.7.2.
Ввести два числа х и у. Поменять значения переменных х и у так, чтобы числа рас полагал ись в порядке возрастания. Для обмена переменных использовать функцию.
1. Передача параметров по значению переменных:
#include.
void change (float x, float y).
{.
float z;
if (у < x) // если вторая переменная меньше первой {.
z = х; // переменные меняются местами х = у;
У = z;
}.
}.
int main{).
{.
float a, b;
scanf («%f %f», &a, &b) ;
change (a, b); // в вызывающей функции переменные // местами не поменялись printf («%f %f» / а, b); return 0;
}.
2. Передача значений указателей:
#include.
// формальные параметры — значения, записанные.
// по адресам у и х.
void change (float *х, float *у).
{.
float z; if (*y < *x).
{.
z = *x;
*x = *y;
*y = z;
}.
} int main ().
{.
float a, b;
scanf <" %f %f", Sea, &b) ;
// фактические параметры — адреса переменных, а и b change (&а, &b); printf («%f %f», a, b); return 0;
}.
В результате вызываемая функция переставит значения, записанные в тех участках памяти, адреса которых были переданы из вызывающей функции.
Обычно одни функции вызывают другие функции согласно иерархической структуре программы. Однако любая функция может вызвать на выполнение и саму себя. Такой вызов функции называется рекурсивным.
Рекурсивная функция — это функция, которая вызывает на выполнение сама себя.
При каждом рекурсивном вызове функции для формальных параметров выделяется новая область памяти, так что их значения из предыдущих вызовов не теряются, но в каждый момент времени доступны только значения текущего вызова.
Пример 5.7.3.
С клавиатуры ввести массив из п чисел. Найти максимальное из них. Нахождение максимального числа можно рассматривать как рекурсивный алгоритм, в котором каждое очередное число сравнивается с максимальным из предыдущих.
#include.
#include.
// вызываемая функция находит максимальное.
//из двух чисел.
int max (int х, int m).
{.
return x > m? x: m;
}.
int main ().
{.
int n;
int i, m;
scanf («%d», &n);
int *x = (int *)malloc (n*sizeof (int)); for (i = 0; i < n; i + +) scanf («%d», &x[i]);
m = x[0]; //за максимум принимается нулевой элемент // массива for (i = 1; i < n; i + +).
m = max (x[i], m); // функция max вызывается // рекурсивно.
// очередной элемент массива сравнивается с текущим.
// максимумом.
printf{" %d «, m);
free (x); // освободить память.
return 0;
_}_.
Допускается любое количество рекурсивных вызовов функции. Их число ограничивается только размером области памяти, в которой сохраняется информация о каждом вызове. При слишком большом числе рекурсивных вызовов может произойти переполнение памяти.