русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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

Здесь рассматривается этот вопрос без явного использования указателей.

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

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

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

· c помощью явных или предварительно объявленных констант указываем обе размерности: void FunMatr1(…, int M[5][10], int size1,…). В этом варианте обрабатываем либо все (у нас 5) строки, либо меньшее их количество, которое можно, но не обязательно, передать через параметр (size1);

· первую левую размерность можно оставить свободной, т. е. вместо количества строк оставляем пустые скобки. При этом количество столбцов обязательно надо записать: void FunMatr1(…, int M[][10], int size1…). В этом способе, как правило, передаётся в качестве параметра и количество строк (size1), которое используется в соответствующих циклах.

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

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

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

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

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

const int n2=3;

void INP1(double x[][n2] , int );

void OUT1(double x[][n2], int );

void SORT1(double x[][n2], int , int );

int main()

{ const int size=5; int k;

double a[size][n2]; INP1(a,size);

cout<<"\nOld matrix\n"; OUT1(a,size);

cout <<"\nInput the number of collumn for sorting =>";

while(1) // Ввод номера столбца с проверкой правильности ввода

{ cin>>k;

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

cout<<"k>=0 && k<"<<n2<<" Repeat ";

}

SORT1(a,size,k); cout<<"\nMatrix after sorting\n"; OUT1(a,size);

getch(); return 0;

}

void SORT1(double x[][n2], int n, int k)

{ int i,j,m,mn,N;

for (m=0;m<n-1;m++)

{ mn=x[m][k]; N=m;

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

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

if (x[i][k]<mn) { mn=x[i][k]; N=i;

}

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

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

{ double t; t=x[m][j];

x[m][j]=x[N][j]; x[N][j]=t;

}

}

}

void OUT1(double x[][n2], int n)

{ int X,j,Y=wherey();

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

for (X=1, j=0; j<n2; j++, X+=7)

{ gotoxy(X,Y); cout<<x[i][j];

}

cout<<endl;

}

void INP1(double x[][n2],int n)

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

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

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

При работе с матрицей в методах класса необходимо руководствоваться следующими правилами и рекомендациями.

Матрица объявляется в классе в качестве поля с максимальными первой и второй размерностями, в качестве которых можно использовать глобальные константы. Реальное количество строк и столбцов также объявляем, как два поля класса, и определяем их с помощью конструктора. Желательно в нём предусмотреть проверку, не превосходят ли реальные размерности матриц их наибольшие значения.

В методах класса матрица и её размерности в качестве параметров не записываются. Значения элементов матрицы определяются в каком–нибудь из методов класса одним из описанных в § 1 способов.

Для использования методов такого класса создаём объект.

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

const unsigned n1max=5, n2max=10;

class MatrClass

{ double x[n1max][n2max]; unsigned size1, size2;

public:

MatrClass (unsigned n1, unsigned n2)

{ if (n1<=0 || n1>n1max) n1=n1max;

if (n2<=0 || n2>n2max) n2=n2max;

size1=n1; size2=n2;

}

void INP1( );

/* Поля класса (матрицу и её две размерности) в качестве параметров методов не записываем! Размерности передаём с помощью конструктора, а матрицу получаем с помощью метода INP1.*/

void OUT1( );

void SORT1( int );

} ;

void MatrClass::INP1()

{ for (int i=0; i<size1; i++)

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

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

}

void MatrClass::SORT1(int k)

{ int i,j,m,mn,N;

for (m=0;m<size1-1;m++)

{ mn=x[m][k]; N=m;

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

if (x[i][k]<mn)

{ mn=x[i][k]; N=i;

}

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

{ double t; t=x[m][j];

x[m][j]=x[N][j]; x[N][j]=t;

}

}

}

void MatrClass::OUT1()

{ int X,j,Y=wherey();

for (int i=0; i<size1; i++, Y++)

for (X=1, j=0; j<size2; j++, X+=7)

{ gotoxy(X,Y);

cout<<x[i][j];

}

cout<<endl;

}

int main()

{ const int N1=3, N2=6; int k;

MatrClass ObjMatr ( N1, N2);

ObjMatr.INP1(); cout<<"\nOld matrix\n";

ObjMatr.OUT1();

cout <<"\nInput the number of collumn for sorting =>";

//Ввод номера столбца, по которому будем сортировать,

//с контролем ввода

while(1)

{ cin>>k;

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

cout<<"k>=0 && k<"<<N2<<" Repeat ";

}

ObjMatr.SORT1(k);

cout<<"\nMatrix after sorting\n";

ObjMatr.OUT1();

getch(); return 0;

}

Просмотров: 705


Вернуться в оглавление



Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.