Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

8.2. Определение и вызов функции

Синтаксис определения функции:

заголовок функции

{

тело функции

}

Заголовок функции задает интерфейс функции. Тело функции определяет алгоритм функции.

Синтаксис заголовка функции:

[Тип возвращаемого значения] имя функции ([список формальных параметров ])

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

Синтаксис формального параметра:

Тип имя

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

Если функция не возвращает значения, то перед ее именем указывается тип void. Если функция возвращает целое значение, то перед ее именем можно не указывать тип int. Таким образом, два заголовка функции int f() и f() эквивалентны.

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

return выражение;

Пример определения функции, которая имеет два целочисленных параметра и возвращает целое значение, равное сумме значений параметров:

int sum (int x, int y)

{

return x+y;

}

Функция sum возвращает целое значение, поэтому перед ее именем указан тип int, а в ее теле присутствует оператор return выражение, тип выражения также int.

Функция активизируется только в момент ее вызова. Функция вызывается по имени. Если у функции есть параметры, то при вызове после имени функции в кругых скобках указываются фактические параметры функции (аргументы функции). Аргументы указываются без типов и разделяются запятыми. Если у функции нет параметров, то она вызывается с пустыми круглыми скобками после имени функции.

Синтаксис вызова функции:

Имя функции ([список аргументов])

Пример вызова функции sum:

void main()

{

int a, b;

cout<<”sum=”<<sum(2, 5)<<endl; //вызов функции

cout<<”a, b? “; cin>>a>>b;

cout<<”sum=”<<sum(a, a+b); //вызов функции

getch();

}

Пример программы с функцией без параметров и без возвращаемого значения:

#include <iostream.h>

#include <conio.h>

// Функция выводит горизонтальную линию из 60 символов

void line( )

{

for (int i=1; i<=60; i++)

cout<<’-‘;

cout<<endl;

}

void main()

{

line(); //при вызове функции скобки обязательны

getch();

}

Если функция не возвращает значение, то наличие в теле функции оператора return не обязательно (функция завершает работу по последней фигурной скобке).

8.3. Место определения функции в программе

Функции в С++ не могут быть вложенными - функции в программе записываются последовательно друг за другом. Местоположение функции в последовательности функций определяется основным правилом типизированных языков: «Любое имя, в том числе и имя функции, должно быть объявлено до его использования». Компилятор использует список формальных параметров и тип возвращаемого функцией значения для проверки правильности ее вызова. Размещение определения функции до вызыва функции приводит к естественному выполнению рассмотренного правила.

Пример программы вычисления значения выражения с=n!m!/(n+m)!, в которой алгоритм вычисления факториала оформлен в виде функции:

#include <iostream.h>

#include <conio.h>

int fact (int n)

{

int f=1;

for (int i=1; i<=n; i++)

f*=i;

return f;

}

void main()

{

int n, m;

float c;

cout <<”n, m? ”;

cin>>n>>m;

c=(float) fact(n) * fact(m)/ fact (n+m); //функция вызывается 3 раза

cout<<”c=”<<c;

getch();

}

В С++ определение функции может находиться и после вызывающей ее функции (и даже в другом файле), что более соответствует нисходящему программированию, когда вначале кодируется и отлаживается главная функция (main), вызывающая другие функции, а затем кодируются вызываемые функции. При отладке главной функции вызываемые функции заменяются «заглушками». Размещение определения функции после ее вызова требует присутствия в программе до вызова функции прототипа (предварительного объявления) вызываемой функции. Прототип функции используется компилятором для проверки правильности вызова функции. Неправильный вызов обнаруживается на стадии компиляции, что облегчает отладку программы и повышает ее надежность.

Синтаксис прототипа функции:

тип_результата имя_функции ([список типов ФОП]) ;

или

тип_результата имя_функции ([список ФОП]);

Второй способ задания прототипа является более наглядным. Имена формальных параметров в списке могут быть любые.

Примеры прототипов функции:

int sum (int, int);

int sum (int x, int y);

Прототип функции может находиться:

  • Вне функций. В этом случае он действует на все вызовы функции, расположенные ниже прототипа в любых функциях.

  • Внутри одного из блоков (составного оператора) вызывающей функции. В этом случае он действует на вызовы функции из этого блока.

Желательно прототипы всех функций программы располагать в одном месте, например, в начале файла с программой или в отдельном файле (в заголовочном файле). В этом случае программа становится более наглядной, а определения функций и их вызовы функций могут следовать в любом порядке.

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

Группа из n (n<=300) испытуемых последовательно выполняет задания двух параллельных тестов. Суммарные оценки по двум тестам записываются в двух массивах (x и y). Один из критериев качества теста – коэффициент надежности теста. Для «идеального» теста он равен 1. Коэффициент надежности теста вычисляется по формуле:

где Mx и математическое ожидание и стандартное отклонение тестовых оценок испытуемых по тесту х,My и математическое ожидание и стандартное отклонение тестовых оценок испытуемых по тестуy. Mx, ,My и вычисляются по формулам:

, ,,

Алгоритм расчета коэффициента надежности на псевдокоде:

Ввод n

Ввод х

Ввод y

Вычисление Mx

Вычисление My

Вычисление

Вычисление

Вычисление r

Вывод r

Текст программы:

#include <iostream.h>

#include <conio.h>

#include <math.h>

void input (int a[], int n); //ввод массива

float m (int a[], int n); //математическое ожидание

float d (int a[], int n, float ma); //стандартное отклонение

float r (int a[], int b[], int n, float ma, float mb, float da,

float db); //коэффициент надежности

void main()

{

int n; //количество испытуемых

int x[300], y[300]; //массивы оценок

float mx, my ;//математические ожидания

float dx, dy; //стандартные отклонения

float rt; //коэффициент надежности

cout<<”n? ”; cin>>n;

cout<<”x? ”;

input(x,n);

cout<<”y? ”;

input(y,n);

mx=m(x,n);

my=m(y,n);

dx=d(x,n,mx);

dy=d(y,n,my);

rt=r(x, y,n,mx,my,dx,dy);

cout<<”rt=”<<rt;

getch();}

void input (int a[],int n)

{

for (int i=0; i<n; i++)

cin>>a[i];

}

float m (int a[],int n)

{

int s=0;

for (int i=0; i<n; i++)

s+=a[i];

return (float)s/n;

}

float d (int a[],int n, float ma)

{

float s=0;

for (int i=0; i<n; i++)

s+=(ma-a[i])*( ma-a[i]);

return sqrt(s/n);

}

float r (int a[], int b[], int n, float ma,float mb, float da, float db)

{

float s=0;

for (int i=0; i<n; i++)

s+=(a[i]-ma)*( b[i]-mb);

return n*s/(da*db);

}