Автор: Пьянков Денис ИТП-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); } |