- •Функции
- •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 ()
Void minmax (int a[n], int & min, int & max)
{
min = max = a [0];
for (int i = 0; i< n; i++)
if (a[i] < min) min = a[i]; else if (a[i] > max) max = a[i];
}
Int main ()
{
int b[n], min, max;
srand (time (0)); //инициализация генератора случайных чисел
for (int i = 0; i< n; i++)
b[i] = rand (); //массив заполняем случайными числами
for (int i = 0; i < n; i++)
cout << setw(8) <<b[i] << " "; //вывод массива
cout << endl<<endl;
minmax (b, min, max);
cout << "min ="<<min << ", max =" <<max<<endl;
system("pause");
return 0;
}
2) Формальные параметры - массивы, указатели на массивы
Массив в качестве фактического параметра может быть передан в функцию только по адресу, то есть с использованием указателя.
Формальный параметр- определение массива:
В качестве формальных параметров можно использовать:
определение массива с фиксированными границами, например:
float A [5], int B [3][4][2], char S [25];
определение одномерного символьного массива с открытой границей:
char S1[];
При работе со строками, то есть с одномерными массивами данных типа char, последний элемент которых имеет известное значение - '\0', нет необходимости передавать размеры массива
определение числового или многомерного символьного массива с открытой левой границей и параметр для передачи размера левой границы:
float A [ ], int B[ ][4][2], char S2 [ ][60], и int n
При всех этих определениях, в стеке выделяется оперативная память на один указатель для передачи в функцию адреса нулевого элемента массива – фактического параметра.
Массив, адрес которого будет использован при вызове функции, как фактический параметр, может быть изменен за счет выполнения операторов функции.
Если формальный параметр - массив с фиксированными границами как в первом случае, фактическим параметром будет имя массива из вызывающей программы с теми же фиксированными границами или же значение указателя на такой фиксированный массив.
При использовании второго определения, фактическим параметром будет имя символьного массива, или указателя на первый элемент массива.
При использовании третьего определения, фактическими параметрами будут имя массива из вызывающей программы, но уже с произвольным количеством элементов по первому измерению и размер массива по первому измерению.
Проиллюстрируем сказанное на примере определения функции, заполняющей трехмерный массив – параметр последовательными натуральными числами, начиная с единицы и возвращающей по ссылке сумму его элементов:
#include <iostream>
#include <iomanip>
using namespace std;
const int n = 4, k = 5;
Void f1(float a [ ][n][k], int m, float & s)
{ s = 0; int t = 1;
for (int i = 0; i< m; i++)
for (int j = 0; j< n; j++)
for (int l = 0; l< k; l++)
{a[i][j][l] = t++; s += a[i][j][l];}
}
Int main ()
{
float s, dat[3][n][k];
f1(dat, 3, s); //вызов функции, заполняющей массив dat
for (int i = 0; i < 3; i++)
{ cout << endl << endl;
for (int j = 0; j < n; j++)
{ cout << endl;
for (int l = 0; l < k; l++)
cout << setw (8) << dat [i][j][l];
}
}
cout << "\n\n"<< "sum = "<<s<<endl;
system("pause");
return 0;
}
