Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




 

При передаче многомерных массивов в функцию все размерности должны передаваться в качестве параметров. По определению многомерные массивы в C и С++ не существуют. Если мы описываем массив с несколькими индексами, например, массив int mas[3][4], то это означает, что мы описали одномерный массив mas, элементами которого являются указатели на одномерные массивы int[4].

Рассмотрим функцию, которая решает задачу транспонирования квадратной матрицы (поворот матрицы на 90 градусов). Если определить заголовок функции как:

void transp(int a[][],int n){….},

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

Самый простой вариант решения этой проблемы, определить функцию следующим образом:

 

//Транспонирование квадратной матрицы

#include<iostream.h>

/*глобальная переменная, задает количество строк и столбцов в матрице*/

const int N=10;   

void transp(int a[][N],int n)

{

int r;

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

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

if(I<j)

{

r=a[I][j];

a[I][j]=a[j][I];

a[j][I]=r;

}

}

 

void main()

{

int mas[N][N];

for(int I=0;I<N;I++)

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

cin>>mas[I][j];

for(I=0;I<N;I++)

{

for(j=0;j<N;j++)

cout<<mas[I][j]

cout<<”\n”;

}

transp(N,mas);

for(I=0;I<N;I++)

{

for(j=0;j<N;j++)

cout<<mas[I][j]

cout<<”\n”;

}

}

Также при передаче многомерных массивов можно интерпретировать их как одномерные и внутри функции пересчитывать индексы (рис.9 )

//передача матрицы как одномерного массива

#include <iosream.h>

//передаем указатель на первый элемент матрицы

void form_matr(int *matr, int n)

{

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

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

matr[i*n+j]=rand()%10;//пересчитываем индекс элемента

}

void print_matr(int *matr, int n)

{

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

{

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

cout<<matr[i*n+j]<<” “;

cout<<”\n”;

}

}

void main()

{

int matr[5][5];

 /*передаем адрес первого элемента матрицы как фактический параметр*/

form_matr (&matr[0][0],5);

print_matr (&matr[0][0],5);

}

 

 

Вызов такой функции можно записать еще и следующим образом:

//выполняем приведение типов

form_matr ((int*)matr,5);

print_matr ((int*)matr,5);

 

 


 

                                       

Рис. 9 Размещение двумерного массива в памяти

 


Функции с начальными значениями параметров (по-умолчанию)

 

В определении функции может содержаться начальное (умалчиваемое) значение параметра. Это значение используется, если при вызове функции соответствующий параметр опущен. Все параметры, описанные справа от такого параметра, также должны быть умалчиваемыми.

 

void print(char* name=”Номер дома: ”, int value=1)

{

cout<<”\n”<<name<<value;

}

 

Вызовы:

1. print();

Вывод: Номер дома: 1

2. print(”Номер квартиры”,15);

Вывод: Номер квартиры: 15

3. print(,15); - ошибка, т. к. параметры можно опускать только с конца.

Поэтому функцию лучше переписать так:

 

void print(int value=1, char* name=”Номер дома: ”)

{

cout<<”\n”<<name<<value;

}

 

Вызовы:

1. print();

Вывод: Номер дома: 1

2. print(15);

Вывод: Номер дома: 15

3. print(6, “Размерность пространства”);

Вывод: Размерность пространства: 6










Последнее изменение этой страницы: 2018-04-12; просмотров: 284.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...