Помощь в написании студенческих работ
Антистрессовый сервис

Функции. 
Технологии и методы программирования

РефератПомощь в написанииУзнать стоимостьмоей работы

Вторая форма обеспечивает передачу управления и возвращение значения выражения в вызывающую функцию. Применяется в функциях типа, отличного от 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;

_}_.

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

Показать весь текст
Заполнить форму текущей работой