|
Автор: Пьянков Денис ИТП-3-08 |
|
|
Функции в С++ не могут быть вложенными - функции в программе записываются последовательно друг за другом. Местоположение функции в последовательности функций определя-ется основным правилом типизированных языков: Пример программы вычисления значения выражения с = 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 и δx математическое ожидание и стандартное отклонение тестовых оценок испытуемых по тесту х, My и δy математическое ожидание и стандартное отклонение тестовых оценок испытуемых по тесту y. Mx, δx, My и δy вычисляются по формулам: | |
![]() |
|
|
Алгоритм расчета коэффициента надежности на псевдокоде: Ввод n Ввод х Ввод y Вычисление Mx Вычисление My Вычисление δx Вычисление δy Вычисление 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);
}
|