Понятие о параметрах функций




Лабораторная работа № 5

Функции в языке С++

Объявление и определение функций

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

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

Обычно в программах присутствует описание функции, называемое прототипом и содержащее информацию о параметрах каждой функции:

тип имя_функции(инф.пар1, инф.пар2, …),

где информация о параметре < инф.пар.> имеет один из форматов: тип или тип имя_параметра, т.е. параметры функций могут быть объявлены с использованием как именных, так и безымянных параметров при объявлении прототипов:

void My_Func(int Par1, float Par2, double Par3);

void My_Func(int, float, double);

 

Приведенные формы записи эквивалентны, так как компилятор игнорирует имена параметров, обращая внимание только на их тип.

Каждая функция должна быть определена где-нибудь в программе после ее объявления, но не внутри другой функции, в том числе и не внутри main().

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

 

Формат определения функции имеет вид:

[тип] имя_функции (тип имя_параметра, …, тип имя_параметра)

{

// тело_функции

}

Указание типа перед именем функции не является обязательным для программ на языке С, но необходимо для программ на языке С++. После имени функции приводится список формальных параметров с указанием их типов. У каждой С-программы есть по крайней мере одна функция – main().

Допускается не объявлять прототип функции в программе, но тогда ее определение должно находиться перед функцией main().

Рассмотрим пример использования функций.

Пример 1

#include <stdio.h>

void CntUp(void); // объявление

void CntDown(void); // прототипов функций.

main()

{CntUp(); // использование функций

CntDown(); // в программе (т.е. их вызов)

return 0;

}

void CntUp(void); // определение функции CntUp

{

int i;

printf("\n\n Считаем от 1 до 10 \n");

for (i=1; i<=10; i++)

printf("%4d",i);

}

void CntDown(void); // определение функции CntDown

{

int i;

printf("\n\n Считаем от 10 до 1 \n");

for (i=10; i>=1; i--);

printf("%4d",i);

}

Ключевое слово void, стоящее перед именем функции при объявлении ее прототипа, сообщает о том, что функция выполняет некоторые действия, но не возвращает никаких значений. Слово void внутри круглых скобок, где обычно находится список параметров, сообщает компилятору, что функция не требует передачи аргументов.

 

Понятие о параметрах функций

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

Формальными называются параметры, находящиеся в скобках, при объявлении прототипа функции и при ее определении, а фактическими – параметры, подставляемые на место формальных при вызове функции.

Любые переменные, объявленные внутри функции, называются локальными и существуют в памяти ЭВМ только пока функция активна.

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

При выходе из функции используют оператор return, в том числе при выходе по условию.

Пример 2

void Func_with_if(void)

{ if (условие) // При истинном значении условия происходит return; // немедленное завершение функции,

оператор; // при ложном –

return; // после выполнения оператора;

}

Применение оператора return без указания значения вызывает завершение функции и передачу управления в вызывающую программу. Но так как у данного оператора отсутствует возвращаемое значение, в вызывающую программу никакого значения не передается.

Рассмотрим пример функции, которая не только производит некоторые действия, но и возвращает определенное значение целого типа.

Пример 3. Найти квадрат введенного числа.

#include <stdio.h>

#include <ctype.h>

int Kwadrat(void) // объявление прототипа функции

// возвращающей значение целого типа

main()

{ int k;

k=Kwadrat;

printf("%d",k);

return 0;

}

int Kwadrat(void)

{ int a,c;

printf("Введите число, которое нужно возвести в квадрат ->");

scanf("%d",&a);

return c=a*a;

}

Если предполагается, что функция будет возвращать некоторое значение, то перед именем функции вместо слова void следует указать тип возвращаемого значения, который будет определять тип функции.

Обратим внимание на то, что перед main() не стоит тип void, хотя предполагается, что программа написана на языке С++. В данном случае объявление типа void заменено оператором return 0; стоящим последним в функции main().

Все функции, которые возвращают значения, должны содержать по крайней мере один оператор return, за которым следует возвращаемое значение объявленного типа.

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

Функции, возвращающие значения, также можно немедленно завершить при выполнении некоторого условия. Но оператор return здесь может нести дополнительную нагрузку.

Пример 4.

int Ffunc_with_if(void)

{ if (условие)

return 0;

оператор;

return 1;

}

Если условие оператора if истинно, первый оператор return передает 0 в качестве значения функции, а последующий оператор и второй return не выполняются. Если условие ложно, выполняется оператор и второй return в качестве значения функции возвращает 1. Вызывающая программа может затем анализировать возвращенное значение и в зависимости от полученного результата выполнять различные действия.

Очевидно, что функции могут возвращать не только целые, но и вещественные значения, а также значения любого базового типа С++.

Пример 5.

float MyFloatFn(void);

double MyDoubleFn(void);

long double MyLongDoubleFn(void);

 

Функции также могут возвращать значения строкового типа и указатели.

Необходимо помнить о том, что функции без указания типов в языке С рассматриваются как имеющие тип int. Однако не следует пользоваться таким умолчанием при написании программ на языке С++, так как это может привести к трудно обнаруживаемым ошибкам.

Рассмотрим пример функции, которой нужны аргументы.

Пример 6.

double Cube (double r); // объявление прототипа функции Cube

main()

{

double x,y+3.14159;

x=Cube(y); // возвращаемое значение функции

// присваивается переменной х.

return 0;

}

double Cube(double r)

{

return r*r*r; // возвращаемое значение функции

} // параметр r равен значению

// переданного аргумента

Лучше всего, если типы аргументов (фактических параметров) соответствуют типам объявленных в функции формальных параметров. Значения совместимых типов (например, при передаче аргумента типа int параметру типа float) расширяются автоматически, но может произойти искажение информации из-за ошибок округления. При передаче аргумента типа float параметру типа int выдается предупреждение (Warning), но преобразование допустимо, хотя и с явной потерей информации. В случае несовместимых типов компилятор фиксирует ошибку "Type mismatch…".

Внутренние параметры функции трактуются аналогично локальным переменным. В функции

void AnyFn(int x)

{

int y;

……

}

целые x и y запоминаются в стеке и их область ограничена операторами функции AnyFn().

Если для работы некоторой функции требуется более одного аргумента, то в скобках задается список аргументов, разделенных запятыми.

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

#include <stdio.h>

#include <conio.h>

 

int MaxMin(int p, int x, int y);

 

void main()

{ int sign, s1, s2, res;

printf("\nВведите признак (0 – поиск min, 1 – max)");

scanf("%d",&sign);

printf("\nВведите сравниваемые значения");

scanf("%d,%d",&s1,&s2);

res=MaxMin(sign,s1,s2);

printf("res=%d\n",res);

}

int MaxMin(int p, int x, int y);

{ int m_m;

if (p==0)

{ if (x<y) m_m=x;

else m_m=y;

}

else { if (x>y) m_m=x

else m_m=y;

}

return m_m

}

Пример 8. Даны отрезки a,b,c,d. Для каждой тройки этих отрезков, из которых можно построить треугольник, определить площадь этого треугольника.

#include <stdio.h>

#include <conio.h>

#include <math.h>

 

float square(float, float, float);

 

main()

{ float a,b,c,d;

printf("Введите значения сторон")ж

scanf("%f%f%f%f",&a,&b,&c,&d);

printf("a=%f, b=%f, c=%f, S=%f \n",a,b,c,square(a,b,c));

printf("a=%f, b=%f, d=%f, S=%f \n",a,b,d,square(a,b,d));

printf("a=%f, c=%f, d=%f, S=%f \n",a,c,d,square(a,c,d));

printf("b=%f, c=%f, d=%f, S=%f \n",b,c,d,square(b,c,d));

}

float square(float x, float y, float z);

{ float p;

if ((x+y>z)&&(y+z>x)&&(x+z>y))

{ p=(x+y+z)/2;

return sqrt(p*(p-x)*(p-y)*(p-z));

}

}

 

Параметры функций



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: