- •Лабораторная работа 3 Функции
- •Примеры вызовов функций
- •Демонстрация функции без аргументов и не возвращающей значения
- •Демонстрация функции, определенной перед ее вызовом
- •Демонстрация функции с аргументами и не возвращающей значения
- •Демонстрация использования глобальных переменных при обмене данными между функциями
- •Демонстрация использования в функции локальных статических переменных
- •Передача в функцию в качестве параметра переменных разных типов Функция вычисления минимального расстояния между точками плоскости
- •Функция вычисления факториала
- •Функция вычисления хn через умножение
- •Функция определения максимального и минимального из двух чисел
- •Функция с параметром перечисляемого типа
- •Функция, выделяющая целую и дробную части вещественного числа
- •Функция, возвращающая ссылку как результат своей работы
- •Демонстрация inline-функций
- •Демонстрация функции с параметрами по умолчанию
- •Перегрузка функций
- •Перегрузка функций с равным числом аргументов
- •Перегрузка функций с разным числом аргументов
- •Шаблоны семейства функций
- •Рекурсивные функции
- •Рекурсивная функция вычисления факториала
- •Рекурсивная функция вывода на печать символов строки в обратном порядке
- •Рекурсивная функция печати числа в виде строки символов
- •Вычисление нод через итерации и через рекурсивную функцию
- •Вычисление интеграла по методу правых прямоугольников
- •Использование одинаковых вызовов функции для вычисления интеграла разными методами и для разных функций
- •Использование при вычислении интеграла многофайловой компиляции
- •Вычисление корня нелинейного уравнения
- •Правила оформления и вызова функций
- •Элементы оптимизации работы с функциями
Демонстрация использования глобальных переменных при обмене данными между функциями
char ch = 'a'; //глобальная переменная ch описана вне всех функций
void getachar(); //прототипы функций
void putachar();
int main()
{
getachar(); //вызов функции
while( ch != '\r' ) // глобальная переменная ch доступна в main()
{
putachar(); //вызовы функций
getachar();
}
cout << endl;
_getch();
return 0;
}
//--------------------------------------------------------------
void getachar() // глобальная переменная ch доступна в getachar()
{
ch = _getch();
return ;
}
//--------------------------------------------------------------
void putachar() // глобальная переменная ch доступна в putachar()
{
_putch(ch);
_putch( '\r' ); // возврат каретки
_putch( '\n' ); // перевод строки
return ;
}
Демонстрация использования в функции локальных статических переменных
float getavg(float); //прототип функции
int main()
{
float data=1, avg;
while( data != 0 )
{
cout << "Enter a number: ";
cin >> data; //вводим значение 5
avg = getavg(data); //вызов функции
cout << avg << endl; //результат: 5
cout << "Enter a number: ";
cin >> data; //вводим значение 15
avg = getavg(data); //вызов функции
cout << avg << endl; //результат: 10
}
_getch();
return 0;
}
//--------------------------------------------------------------
float getavg (float newdata)
{
static float total = 0; //статическая переменная размещается в сегменте данных и
static int count = 0; //инициализируется только один раз при первом вызове
count++; //count получает значение 1 при первом вызове функции
//count получает значение 2 при втором вызове функции
total += newdata; //total получает значение 5 при первом вызове функции
// total получает значение 20 при втором вызове функции
return total / count;
}
Передача в функцию в качестве параметра переменных разных типов Функция вычисления минимального расстояния между точками плоскости
Функция вычисляет минимальное из расстояний между точками плоскости А(х1; у1), В(х2; у2) и С(1;2).
Алгоритм решения задачи:
-
вычислить расстояния dl=AB, d2=AC, d3=BC;
-
вычислить m=min{dl, d2, d3}
double dd (double, double, double, double); //прототип функции
int 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;
_getch();
return 0;
}
double dd (double a1, double b1, double a2, double b2) //определение функции
{
return (sqrt ((a1-a2)*(a1-a2) + (b1-b2)*(b1-b2)));
}
Функция вычисления факториала
Функция вычисляет факториал N! итеративным методом в соответствии с формулами N=1*2*3…*N (при N>0); 0!=1.
long Iter_Fact (int n); //прототип функции
int main()
{ int i;
long Fact1, Fact2, Fact3;
Fact1= Iter_Fact (10); //вызов функции
i= 10;
Fact2 =Iter_Fact (i); // вызов функции
Fact3= Iter_Fact (5+ 5); // вызов функции
cout << Fact1 << " " << Fact2 << " " << Fact3 << endl;
_getch();
return 0;
}
long Iter_Fact (int n) //определение функции
{ long f=1;
for (int i=2; i<=n; i++)
f*= i;
return (f);
}
Приведенные вызовы функции показывают различные способы задания аргумента; при этом значения, возвращаемые функцией Iter_Fact, присваиваются переменным Fact1, Fact2, Fact3.
Передадим параметры другим способом:
void Iter_Fact (int, long*); //прототип функции
int main()
{ int i;
long Fact1, Fact2, Fact3; //не инициализированы !!!
Iter_Fact (10, &Fact1); //вызов функции
i= 10;
Iter_Fact (i, &Fact2); //вызов функции
Iter_Fact (5+ 5, &Fact3); //вызов функции
cout << Fact1 << " " << Fact2 << " " << Fact3 << endl;
_getch();
return 0;
}
void Iter_Fact (int n, long *f) //определение функции
{ *f = 1;
for (int i=2; i<=n; i++)
*f *= i;
}
И еще одним способом:
void Iter_Fact (int, long&); //прототип функции
int main()
{ int i;
long Fact1, Fact2, Fact3; //не инициализированы !!!
Iter_Fact (10, Fact1); //вызов функции
i= 10;
Iter_Fact (i, Fact2); //вызов функции
Iter_Fact (5+ 5, Fact3); //вызов функции
cout << Fact1 << " " << Fact2 << " " << Fact3 << endl;
_getch();
return 0;
}
void Iter_Fact (int n, long &f) //определение функции
{ f = 1;
for (int i=2; i<=n; i++)
f *= i;
}