Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 4

using namespace std;

//Прототип функции

void fun(int *pt,int n,int &sum,int &pr);

void main ()

{ setlocale(LC_ALL,"rus_rus.1251");

 int mass[5]={1,2,3,4,5},s,p;

 fun(mass,5,s,p);

 cout<<"Сумма и произведения равны: "

<<setw(3)<<s<<setw(5)<<p<<endl;

}

// Определение функции

void fun(int *pt,int n,int &sum,int &pr)

{          int i; sum=0, pr=1;

            for(i = 0; i<n; i++)

{

                        pr*= pt[i];

                         sum+=pt[i];

}

}

Результат

Сумма и произведения равны:  5 120

Функция  fun  имеет четыре формальных параметра:  ptуказатель на переменную такого же типа, что и обрабатываемый массив mass[], n – количество элементов массива, sum, pr – сумма и произведение элементов массива. Причем и sumи prявляются ссылочными параметрами, при обращении к функции fun() в них автоматически передаются адреса переменных s и p. Поэтому операции над sum иprизменяют фактические параметры s и p.

В этом примере мы использовали все три способа передачи параметров в функцию: через указатель (ptmass), по значению (n→5) и с помощью ссылочных параметров, который мы обсудили выше.

Запись pt[i]следует понимать как взятие значения по адресу  pt + i, т. е.

pt[i]== *(pt + i)или &pt[i] == pt + i.

Ничего в программе не изменится, если прототип и заголовок функции в определении записать следующим образом:

void fun(int pt[],int n,int &sum,int &pr).

Передача в функцию двумерного массива (матрицы)

Многомерный массив в соответствии с синтаксисом языка есть массив массивов, т. е. массив, элементами которого служат массивы. Например, двумерный массив

intmass[4][3]

состоит из четырех элементов, каждый из которых – одномерный массив из трех элементов. Как и в случае одномерных массивов, доступ к элементам многомерных массивов возможен с помощью индексированных переменных и с помощью указателей. Необходимо помнить, что при добавлении целой величины к указателю его внутреннее значение изменится на «длину» элемента соответствующего типа. Для приведенного массива mass – указатель, поставленный в соответствие элементу типа int[3]. Добавление единицы к указателю mass приводит к изменению значения адреса на величину

sizeof(int)*3== 6 байт

Именно поэтому *(mass + 1) есть адрес элемента mass[1], т. е. указатель на одномерный массив, состоящий из трех элементов и отстоящий от начала массива на 6 байт. Если рассматривать двумерный массив как матрицу, то mass[0] – это адрес нулевой строки (ее первого байта) матрицы, mass[1] – адрес первой строки и т. д.

Для передачи в функцию двумерного массива достаточно передать адрес его начала в виде mass[0] и его размеры (n и m – количество строк и столбцов), т. е. фактически вместо работы с двумерным массивом мы будем работать с одномерными массивами – строками матрицы, где n – количество этих одномерных массивов, m – их размер, а mass[i] – адреса. Тогда для передачи массива в качестве формального параметра можно использовать указатель на переменную такого же типа, что и массив.

Значит, если int *pt – формальный параметр, которому при обращении к функции передается адрес начала массива mass[0], то доступ к любому элементу двумерного массива в теле функции осуществляется согласно выражению

*(pt + i*m + j) == pt[i*m + j], где  i – номер строки,  j – номер столбца.

Перегруженные функции

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

Предположим, вам требуется написать функцию, которая определяет максимальное значение в одномерном массиве типа double. Прототип этой функции будет иметь вид

double maxdouble (double *x, int len);

Затем возникает аналогичная задача, но для массива типа int. Вы создаете другую функцию, похожую на первую, с прототипом

int maxint(int *x, int len);