|
Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Использование функций при программировании на C++
4.2 Передача параметров в функцию
Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров.Список_переменных, указанный в заголовке функции, называется формальными параметрами или просто параметрами функции. Список_переменных в операторе вызова функции — это фактические параметры или аргументы.
Механизм передачи параметров обеспечивает замену формальных параметров фактическими параметрами и позволяет выполнять функцию с различными данными. Между фактическими параметрами в операторе вызова функции и формальными параметрами в заголовке функции устанавливается взаимно однозначное соответствие. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.
Передача параметров выполняется следующим образом. Вычисляются выражения, стоящие на месте фактических параметров. В памяти выделяется место под формальные параметры в соответствии с их типами. Затем формальным параметрам присваиваются значения фактических. Выполняется проверка типов и при необходимости выполняется их преобразование.
Передача параметров в функцию может осуществляться по значению и по адресу.
При передаче данных по значению функция работает с копиями фактических параметров, и доступа к исходным значениям аргументов у неё нет. При передаче данных по адресу в функцию передаётся не переменная, а её адрес, и, следовательно, функция имеет доступ к ячейкам памяти, в которых хранятся значения аргументов. Таким образом, данные, переданные по значению, функция изменить не может, в отличие от данных, переданных по адресу.
Если требуется запретить изменение параметра внутри функции, используют модификатор const. Заголовок функции в общем виде будет выглядеть так:
тип имя_функции ( const тип_переменной* имя_переменной, ...)
Например:
#include <iostream>
using namespace std;
int f1 ( int i ) //Данные передаются по значению
{
return ( i ++);
}
int f2 ( int * j ) //Данные передаются по адресу. При подстановке фактического параметра,
//для получения его значения, применяется операция разадресации * .
{
return ( ( * j )++);
}
int f3 ( const int * k ) //Изменение параметра не предусмотрено .
{
return ( ( * k )++);
}
int main ( )
{
int a;
cout<<"a="; cin >>a;
f1( a );
cout<<"a="<<a<<"\n";
f2(&a ); //Для передачи фактического параметра используется операция взятия адреса & .
cout<<"a="<<a<<"\n";
f3(&a );
cout<<"a="<<a<<"\n";
return 0;
}
Результат работы программы:
Введено значение переменной
.
a=5
Значение переменной a после вызова функции
не изменилось.
a=5
Значение переменной a после вызова функции
изменилось.
a=6
Значение переменной a после вызова функции
не изменилось.
a=6
Удобно использовать передачу данных по адресу, если нужно чтобы функция изменяла значения переменных в вызывающей программе.
Далее приведён пример программы, в которой исходя из радианной меры некоторого угла вычисляется величина смежного с ним угла. На экран выводятся значения углов в градусной мере. Функция degree выполняет перевод из радианной меры в градусную2Чтобы найти градусную меру угла по заданной радианной, нужно помножить число радиан на
; если из полученной дроби выделить целую часть, то получим градусы; если из числа полученного умножением оставшейся дробной части на 60, выделить целую часть, получим минуты; секунды вычисляются аналогично из дробной части минут.. Эта функция ничего не возвращает. Её аргументами являются значение переменной rad, определяющее величину угла в радианах, и адреса переменных deg, min, sec, в которых будут храниться вычисленные результаты — градусная мера угла.
#include <iostream>
#include <math.h>
#define PI 3.14159
using namespace std;
void degree ( double rad, int * deg, int * min, int * sec )
{
* deg= floor ( rad * 180/ PI );
* min=floor ( ( rad * 180/ PI -(* deg ) ) * 60);
* sec=floor ( ( ( rad * 180/ PI -(* deg ) ) *60 -(* min ) ) * 60);
}
int main ( )
{
int DEG, MIN, SEC; double RAD;
cout<<" Inpout :"<<endl;
cout << " Value in radian A="; cin >>RAD;
degree (RAD,&DEG,&MIN,&SEC);
cout << DEG<<" "<<MIN<<" "<<SEC << endl;
degree ( PI- RAD,&DEG,&MIN,&SEC);
cout << DEG<<" "<<MIN<<" "<<SEC << endl;
return 0;
}