Функции. Основные принципы структурной методологии. Принцип формальности. Принцип иерархического упорядочивания, страница 9

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

int f(const char*);

char  *t (char *a, const int *b);

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

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

void aFunc(int& a, const int& b);  //прототип функции; параметр b, передаваемый

// по ссылке с модификатором const, разрешено только «считывать»

int main()

   {

int alpha = 7;

int beta = 11;

aFunc(alpha, beta);

return 0;

}

//-------------------------------------------------------------void aFunc(int& a, const int& b)   //определение функции

{

a = 107;   //OK

b = 111;   //ошибка, невозможно изменять аргумент с модификатором const

}

Примеры передачи в функцию параметров базовых типов:

Пример 1. Вычислить минимальное из расстояний между точками плоскости А(х1; у1), В(х2; у2) и С(1;2). Алгоритм решения этой задачи: вычислить расстояния dl=AB, d2=AC, d3=BC; вычислить m=min{dl, d2, d3}.

Расстояние между точками с произвольными координатами (х; у), (х'; у') выражается формулой d=sqrt((x-x')2 +(у-y')2). Для вычисления расстояний необходимо трижды написать вариант этой формулы с различными наборами координат: xl, у1, х2, у2, затем xl, у1, 1, 2, затем х2, у2, 1, 2. Такую запись можно упростить.

В случае вычисления расстояния между двумя точками параметрами будут четыре их координаты. Назовем их а1, b1, а2, b2. Опишем повторяемые вычисления в виде функции, которой мы дадим имя dd:

double dd(double al, double  b1, double  а2, double  b2) {             return (sqrt ((al-a2)*(a1-a2) + (b1-b2)*(b1-b2))); }

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

#include <iostream.h>

#include <math.h>

double dd (double, double, double, double);  //прототип функции

main()

{double x1, y1, x2, y2, d1, d2, d3, m;

cout << "Input koordinaty:\n";

 cin >> x1 >> y1 >> x2 >> y2;

d1=dd (x1, y1, x2, y2) ;       //вызовы функции

d2=dd (x1, y1, 1, 2);

d3=dd (x2, y2, 1, 2);

m = (d1<d2) ? d1 : d2;

if (d3<m) m=d3;

cout <<  "min: " << m <<endl;

return 0;}

double dd (double a1, double  b1, double  a2, double  b2)    //определение функции

{         

return (sqrt ((a1-a2)*(a1-a2) + (b1-b2)*(b1-b2)));

}

Выполнение программы начинается с оператора cout <<“Input koordinaty:\n”; программы main. После чтения значений переменных выполняется первый вызов функции dd: значения переменных xl, yl, x2, y2 присваиваются соответствующим формальным параметрам al, b1, а2, b2 и вычисляетcя расстояние. Оно и становится возвращаемым значением функции, т.е. значением выражения dd(х1,у1,х2,у2), которое присваивается переменной dl.

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

Пример 2. Опишем в виде функции вычисление факториала N! итеративным методом в соответствии с формулами N=1*2*3…*N (при N>0); 0!=1.

#include <iostream.h>

#include <conio.h>

long  Iter_Fact (int);                     //прототип функции

main()

{ int i;

long Fact1, Fact2, Fact3;

Fact1= Iter_Fact (10);         //вызов функции

i= 10;

Fact2 =Iter_Fact (i);            // вызов функции  

Fact3= Iter_Fact (5+ 5);      // вызов функции