Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.doc
Скачиваний:
38
Добавлен:
22.09.2019
Размер:
812.03 Кб
Скачать

12Функции и массивы

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

Если массив-параметр фиксированного размера, то проблем тоже нет, иначе необходимо передать в функцию количество параметров основным способом. Так как имя массива есть указатель, который связывается с началом массива, то любой массив может быть изменен за счет выполнения операторов тела функции. Например, функция, формирующая новый массив на основание двух целочисленных массивов, элементы в каждом из которых упорядочены по возрастанию. Новый массив должен включать все элементы двух исходных массивов таким образом, чтобы они оказались упорядоченными по возрастанию.

#include <iostream.h>

int *fusion(int n, int *a, int m, int *b)

{int *x=new int[n+m];

int ia=0, ib=0, ix=0;

while (ia<n && ib<m)

if (a[ia]=b[ib]) x[ix++]=b[ib++];

else x[ix++]=a[ia++];

if (ia>=n)

while (ib<m) x[ix++]=b[ib++];

else

while (ia<n) x[ix++]=a[ia++];

return x;

}

void main(void)

{ int c[]={1,3,5,7,9};

int d[]={0,2,4,5,};

int *h;

int kc=sizeof(c)/sizeof(c[0]);

int kd=sizeof(d)/sizeof(d[0]);

h=fusion(kc,c,kd,d);

cout<<"\n Объединенный массив \n";

for (int i=0; i<kc+kd; i++)

cout << " " << h[i];

delete[]h;

}

Результат

Объединенный массив

0 1 2 3 4 5 5 7 9

По определению многомерных массивов в С++ не существует. Описание double prim[6][4][2]; описывает одномерный массив с именем prim, включающий 6 элементов, каждый из которых имеет тип double[4][2]. В свою очередь, каждый из этих элементов есть одномерный массив из двух элементов типа double.

При описании массива (или спецификации массива-параметра) неопределенным может быть только первый размер. Для избавления от фиксации количества элементов многомерного массива при передаче параметров используются следующие пути:

  • подмена многомерного массива одномерным и имитация внутри функции доступа к многомерному массиву;

  • использование вспомогательных массивов указателей на массив.

Рассмотрим представление и передачу матриц с использованием вспомогательных массивов указателей на одномерные массивы:

#include <iostream.h>

void trans(int n, double *p[])

{double x;

for (int i=0; i<n-1; i++)

for (int j=i+1; j<n; j++)

{ x=p[i][j];

p[i][j]=p[j][i];

p[j][i]=x;

}

}

void main ()

{ double a[4][4]={11,12,13,14,

21,22,23,24,

31,32,33,34,

41,42,43,44};

double *prt[]={(double *) & a[0],(double *) & a[1],

(double *) & a[1],(double *) & a[3]}

int n=4;

trans(n, ptr);

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

{cout << "\n строка" << (i+1)<<":";

for(int j=0; j<n; j++)

cout << "\t" << a[i][j];

}

}

Результат:

Строка 1: 11 21 31 41

Строка 2: 12 22 32 42

Строка 3: 13 23 33 43

Строка 4: 14 24 34 44

Функция trans() выполняет транспонирование квадратной матрицы, определенной вне тела функции в виде двухмерного массива. Параметры int n - порядок матрицы, double *p[i]-массив указателей на одномерные массивы элементов типа double. В основной программе матрица представлена двухмерным массивом с фиксированным размером double a[4][4]. Такой массив нельзя передавать в качестве фактического параметра. Поэтому вводим дополнительный массив указателей double *ptr[]. В качестве начальных значений элементов этого массива присваиваются адреса строк матрицы, преобразованные к типу double*.