Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Передача массива в качестве параметра функции




 

Сначала рассмотрим передачу массива в качестве параметра самостоятельной функции без использования класса и указателей.

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

Есть два варианта объявления массива в скобках в заголовке (прототипе) функции:

* c помощью явных или предварительно объявленных констант (const n=10; const m=10) указываем одну или обе размерности:

void FunMatr1(…, int M[10],int size1,…).//для одномерного

где обрабатываются все 10 элементов массива или меньшее их количество переданные через - size1;

void FunMatr2(…, int M[10][10],int size1,…). //для двухмерного

где обрабатываем либо все (у нас 10) строки, либо меньшее их количество, которое можно, но не обязательно, передать через параметр (size1);

* первую левую размерность можно оставить свободной, т. е. вместо количества строк оставляем пустые скобки:

void FunMatr1(…, int M[],int size1,…).//для одномерного

где количество элементов передается через параметр - size1;

void FunMatr2(…,int M[][10], int size1…). //для двухмерного

где количество столбцов записать обязательно, а количество строк передаётся в качестве параметра (size1), которое используется в соответствующих циклах.

Замечание.

1) Нельзя оставить свободными обе размерности для двухмерного массива или одну вторую правую размерность. В таком случае непонятно, где заканчивается предыдущая строка и начинается следующая.

2) В обоих вариантах в функции необязательно обрабатывать указанное количество столбцов (у нас 10). Его (size2), как и первую размерность (size1), можно также передать в качестве параметра и затем использовать в теле функции:

void FunMatr2(…, int M[][10], int size1, int size2…);

В вызываемой функции (у нас в main) объявляем матрицу int A[10][10] ( или int A[n][m]), учитывая следующее ограничение: количество столбцов при объявлении должно быть точно таким, как и в заголовке функции. Количество строк может быть меньше, чем в заголовке, например, int A[5][10]. При этом обрабатываться будут пять строк (а не 10).

 

При вызове функции в любом случае указываем только имя матрицы без указания размерности и типа её элементов, реальное количество строк и, если надо, столбцов:

FunMatr1(…, A, 5,…);

или FunMatr2(…, A, 5, 6, …);

где 5 — количество обрабатываемых строк, 6 — количество обрабатываемых столбцов.

Замечание.

1) При использовании массива в качестве параметра функции фактически передаётся не сам массив, а указатель на него (адрес массива), то есть номер первого байта первой ячейки массива (с индексом 0). Поэтому если в функции массив изменить каким либо образом, то этим самым мы изменим и массив A в основной программе.

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

 

Пример. Составим функции для ввода, вывода прямоугольной матрицы и сортировки строк по элементам k –го столбца, где k передаём как параметр функции. При этом содержимое каждой строки не меняется.

const int m=10;//глобальная константа для описания количества столбцов

void in_mas2(double x[][m], int, int);//прототипы функций формирование массива

void out_mas2(double x[][m], int, int);//вывод массива

void sort_mas2(double x[][m], int, int, int);//сортировка

void main()

{ int n1, n2; //количество строк и столбцов

int k;//номер столбца для сортировки

double a[m][m];

cout<<”Введите кол-во строк-->”; cin>>n1;

cout<<”Введите кол-во столбцов-->”; cin>>n2;

in_mas2(a,n1,n2);

cout<<"\nСтарая матрица\n";

out_mas2(a,n1,n2);

cout <<"\nВведите номер столбца для сортировки =>";

while (1) // проверка правильности ввода

{ cin>>k;

if (k>=0 && k<m) break;

cout<<"Повторите ввод: 0 <= k < " << m<<”\n”;

}

sort_mas2(a, n1,n2, k);

cout<<"\nМатрица после сортировки \n";

out_mas2(a,n1,n2);

getch();

}

//*************************************

void sort_mas2(double x[][m], int n1, int n2, int k)

{

int i,j,m,mn,N;

for (i=0;i<n1-1;i++)

{

min=x[i][k]; N=i;

// Поиск в k –м столбце минимального элемента, начиная с i–го (min), и его номера(N)

for (m=i+1;m<n;m++)

if (x[m][k]<min) { min=x[i][k]; N=m;}

// Перестановка i –й и N –й строк

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

{ double dop=x[i][j];

x[i][j]=x[N][j]; x[N][j]=dop;

}

}

}

void out_mas2(double x[][m], int n1, int n2)

{

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

{ for (int j=0; j<n2; j++) printf(“%7.2f”,x[i][j];

printf(“\n”);

}

}

void in_mas2(double x[][m],int n1, int n2)

{randomize();

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

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

x[i][j]=random(20)-10;

}

 

 





Поделиться с друзьями:


Дата добавления: 2016-10-06; Мы поможем в написании ваших работ!; просмотров: 443 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Не будет большим злом, если студент впадет в заблуждение; если же ошибаются великие умы, мир дорого оплачивает их ошибки. © Никола Тесла
==> читать все изречения...

2602 - | 2280 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.