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

Автор: Пьянков Денис
ИТП-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);
}
Предыдущая страница         Следующая страница
Сайт создан в системе uCoz