- •Функции
- •1. Определение, описание и вызовы функций
- •Тело функции
- •Формальные параметры:
- •Глобальные переменные:
- •Return (выражение);
- •Void r ( int a, int b, int c)
- •Void main ( )
- •Void rr ( int* a, int* b, int*c)
- •Void main ( )
- •Void rrr ( int & a , int &b , int & c )
- •Void main ( )
- •2. Классификация формальных параметров
- •1) Формальные параметры функции являются:
- •Формальный параметр – скаляр, указатель на скаляр, ссылка на скаляр
- •Void mult ( int a , int b , int *s )
- •Void minmax (int a[n], int & min, int & max)
- •Int main ()
- •2) Формальные параметры - массивы, указатели на массивы
- •Void f1(float a [ ][n][k], int m, float & s)
- •Int main ()
- •Формальный параметр - указатель:
- •Void f (int*a, int*b, int*c, int n, int m)
- •Int main () {
- •Int main ( )
- •Void mas (double** ptr, int m, int n)
- •Int main ( ){
- •Void mas (int (*lp) [3][4], int n)
- •Int main ()
- •3.Результат функции, возвращаемый с помощью оператора return.
- •Return (выражение);
- •Int * poisk (int*c, int m, int n)
- •Int main ()
- •Int main ( )
- •Int main ( )
- •Int main ()
- •Int& rmax (int d [ ], int n)
- •Int main ()
Int main ( ){
int m, n, i, j;
cin>>m>>n;
double **ptr = new float* [m]; // динамическое выделение памяти
// на массив указателей на строки массива
for (i=0; i< m; i++)
ptr[i] = new double [n]; //динамическое выделение памяти на
// значения в строках массива
mas (ptr, m, n); //вызов функции
for (i = 0; i < m; i++)
{ cout << endl;
for (j = 0; j < n; j++)
cout << setw (8) << ptr [i][j];
}
for (i=0; i< m; i++) delete ptr[i]; //освобождение памяти на значения
//в строках
delete [ ] ptr; //освобождение памяти на массив указателей на строки
system("pause");
return 0;
}
Формальные параметры указатели - для передачи многомерного массива. Параметрами являются указатель на подмассив и количество подмассивов в многомерном массиве.
При этом размеры подмассива должны быть фиксированы.
<type> (* имя_указателя) [N1][ N2] [N3]…[NN]; - определение указателя на массив размерностью [N1][N2]…[NN] с элементами type.
Для иллюстрации определим функцию, заполняющую натуральными числами трехмерный массив, состоящий из произвольного числа матриц 3х4:
Void mas (int (*lp) [3][4], int n)
{ int i, j, k, t=1;
for (i=0; i < n; i++) {cout << "\n\n";
for (j=0; j < 3; j++) {cout << "\n";
for (k=0; k< 4; k++) { lp[i][j][k] = t++;cout <<lp [i][j][k] << " ";
} } }
}
Int main ()
{ int i, j, k, n; cin >> n; //вводится количество матриц в трехмерном массиве
int (*tp) [3][4]; //определен указатель на матрицу
tp = new int [ n] [3][4];
/* выделена динамическая память на n матриц, и адрес первой матрицы присвоен указателю tp */
mas (tp, n);
//далее можно работать с элементами массива tp[i][j][k]
…
delete [ ] tp; //освобождение памяти
return 0;
}
3.Результат функции, возвращаемый с помощью оператора return.
Оператор return - оператор возврата управления программой и значения в точку вызова функции. С помощью этого оператора функция может вернуть одно скалярное значение любого типа. Форма оператора:
Return (выражение);
выражение вычисляется, результат преобразуется к типу возвращаемого значения и передается в точку вызова функции.
К скалярам относятся данные простых стандартных типов, указатели и ссылки. Рассмотрим некоторые возможные результаты работы функций, возвращаемые с помощью оператора return:
скалярное значение любого простого типа, например, return (5);
указатель на скаляр, массив;
ссылка - возвращаемый результат функции
Результат указатель на скаляр, массив
Функция возвращает указатель на скаляр - возвращает адрес скаляра. Определим функцию поиска числа в произвольном массиве. Функция возвращает адрес числа или NULL, то есть указатель на элемент массива.
Int * poisk (int*c, int m, int n)
/* c – указатель на первый элемент массива, m – количество элементов массива, n- искомое число*/
{
for (int i =0; i < m; i++)
{if (*c = = n) return (c);
c++;
}
return (0);
}
Int main ()
{int a [5][4] = {…}, i, j;
int*p = poisk (*a, 20 ,7); //*a-адрес первого элемента, 20 - общее количество //элементов, ищем число 7
if (p== 0) cout << "число отсутствует";
else {cout << (i = (p - *a) / 4); //номер строки
cout << (j = p - *a – i * 4);}; //номер столбца
system("pause");
return 0;
}
Результат функции – указатель на одномерный массив.
Используя указатель на элемент массива можно в теле функции выделить память на одномерный динамический массив.
Этот указатель можно возвратить из функции с помощью оператора return, и тем самым возвратить "указатель на одномерный массив".
Определим функцию, формирующую одномерный динамический массив, заполняя его значениями, вводимыми с клавиатуры. Формальный параметр функции – количество элементов в формируемом массиве. Функция возвращает указатель на первый элемент массива:
float* vvod (int n)
{
float*p = new float [n]; // динамическое выделение памяти под
//массив,
for (int i=0; i < n; i++) cin >> p[i]; //заполнение элементов
//массива
return p; //возвращение массива;
}
