Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 6:

Статические и динамические матрицы

Задача 6.5. Задана матрица A(n,m). Поменять местами её максимальный и минимальный элементы.

Алгоритм решения этой задачи следующий: находим максимальный элемент матрицы (max) и его индексы (imax, jmax), а также минимальный (min) и его индексы (imin, jmin). После чего элементы A[imax][jmax] и A[imin][jmin] поменяем местами. Для поиска максимального элемента и его индексов в переменную max запишем A[0][0], в переменные imax, jmax (номер строки и столбца, где находятся максимальный элемент) запишем 0. Затем в двойном цикле (цикл по переменной i — по строкам, цикл по переменной j — по столбцам) перебираем все элементы, и каждый из них сравниваем с максимальным (со значением переменной max). Если текущий элемент массива оказывается больше максимального, то его переписываем в переменную max, а в переменную imax — текущее значение индекса i, в переменную jmax — текущее значение j. Поиск минимального элемента матрицы аналогичен и отличается только знаком операции сравнения. Далее представлен текст программы решения задачи 6.5.

#include <iostream>
using namespace std;
int main ( )
{
	int i, j, imax, jmax, imin, jmin,N,M;
	double min, max, b, **a;
	cout<<" N = "; //Ввод размеров матрицы.
	cin>>N;
	cout<<" M = ";
	cin>>M;
	a=new double * [N ]; //Создаём динамическую матрицу
	for ( i =0; i<N; i++)
		a [ i ]=new double [M];
	cout<<"Ввод элементов матрицы A "<<endl;
	for ( i =0; i<N; i++)
		for ( j =0; j<M; j++)
			cin>>a [ i ] [ j ];
	//Двойной цикл для поиска максимального, минимального элементов и их индексов.
	for (max=min=a [ 0 ] [ 0 ], imax=jmax=imin=jmin= i =0; i<N; i++)
		for ( j =0; j<M; j++)
		{
			if ( a [ i ] [ j ]>max) {max=a [ i ] [ j ]; imax= i; jmax=j; }
			if ( a [ i ] [ j ]<min ) {min=a [ i ] [ j ]; imin= i; jmin=j; }
		}
	//Обмен двух элементов матрицы.
	b=a [ imax ] [ jmax ];
	a [ imax ] [ jmax ]=a [ imin ] [ jmin ];
	a [ imin ] [ jmin ]=b;
	//Вывод преобразованной матрицы.
	cout<<"Преобразованная матрица A "<<endl;
	for ( i =0; i<N; cout<<end l, i++)
		for ( j =0; j<M; j++)
			cout<<a [ i ] [ j ]<<" \t ";
}

Задача 6.6. Преобразовать матрицу A(m,n) так, чтобы строки с нечётными индексами были упорядочены по убыванию, с чётными — по возрастанию.

В связи с нумерацией строк в C++ с нуля необходимо помнить, что нулевая, вторая, четвёртая строки упорядочиваются по убыванию, а первая, третья, пятая и т.д. — по возрастанию. Алгоритм решения этой задачи сводится к тому, что уже известный нам по предыдущей главе алгоритм упорядочивания элементов в массиве выполняется для каждой строки матрицы. Блок-схема приведена на рис. 6.9. Текст программы с комментариями приведён ниже.

#include <iostream>
using namespace std;
int main ( )
{
	int i, j, k,N,M;
	double b, **a;
	cout<<" M = "; //Ввод размеров матрицы.
	cin>>M;
	cout<<" N = ";
	cin>>N;
	a=new double * [N ]; //Создаём динамическую матрицу
	for ( i =0; i<N; i++)
		a [ i ]=new double [M];
	cout<<"Ввод элементов матрицы A "<<endl;
	for ( i =0; i<M; i++)
		for ( j =0; j<N; j++)
			cin>>a [ i ] [ j ];
	for ( i =0; i<M; i++) //Цикл по i — для перебора строк матрицы.
		if ( i%2==0) //Если строка чётна, то
		{ //упорядочиваем элементы строки по возрастанию,
		for ( k=1;k<N; k++)
			for ( j =0; j<N-k; j++)
			if ( a [ i ] [ j ]>a [ i ] [ j +1 ])
			{
				b=a [ i ] [ j ];
				a [ i ] [ j ]=a [ i ] [ j + 1 ];
				a [ i ] [ j +1]=b;
			}
		}
		else //иначе нечётные строки упорядочиваем по убыванию.
			for ( k=1;k<N; k++)
				for ( j =0; j<N-k; j++)
					if ( a [ i ] [ j ]<a [ i ] [ j +1 ])
					{
						b=a [ i ] [ j ];
						a [ i ] [ j ]=a [ i ] [ j + 1 ];
						a [ i ] [ j +1]=b;
					}
	cout<<"Преобразованная матрица A "<<endl; //Вывод преобразованной матрицы.
	for ( i =0; i<M; cout<<endl, i++)
	for ( j =0; j<N; j++)
	cout<<a [ i ] [ j ]<<" \t ";
}
Блок-схема алгоритма задачи 6.6.

увеличить изображение
Рис. 6.9. Блок-схема алгоритма задачи 6.6.

Задача 6.7. Поменять местами элементы главной и побочной диагонали матрицы A(k,k).

Алгоритм решения задачи следующий: перебираем все строки матрицы (цикл по переменной i от 0 до k-1 в тексте программы), и в каждой строке меняем местами элементы, расположенные на главной и побочной диагоналях (в i-й строке надо поменять местами элементы A[i][i] и А[i][k-i-1]). Текст программы с комментариями приведён далее.

#include <iostream>
using namespace std;
int main ( )
{
	int i, j, k;
	double b, ** a;
	cout<<" k = "; //Ввод размера матрицы.
	cin>>k;
	a=new double * [ k ]; //Создаём динамическую матрицу
	for ( i =0; i<k; i++)
		a [ i ]=new double [ k ];
	cout<<"Ввод элементов матрицы A "<<endl;
	for ( i =0; i<k; i++)
		for ( j =0; j<k; j++)
			cin>>a [ i ] [ j ];
	for ( i =0; i<k; i++) //Цикл по строкам.
	{//В каждой строке обмен между элементами, лежащими на главной и побочной диагоналях.
		b=a [ i ] [ i ];
		a [ i ] [ i ]=a [ i ] [ k-1-i ];
		a [ i ] [ k-1-i ]=b;
	}
	cout<<"Преобразованная матрица A "<<endl; //Вывод преобразованной матрицы.
	for ( i =0; i<k; cout<<end l, i++)
		for ( j =0; j<k; j++)
			cout<<a [ i ] [ j ]<<" \t ";
}

Задача 6.8. Заполнить матрицу A(6, 6) числами от 1 до 36 следующим образом:

\left(\begin{matrix}
1&2&3&4&5&6\\
12&11&10&9&8&7\\
13&14&15&16&17&18\\
24&23&22&21&20&19\\
25&26&27&28&29&30\\
36&35&34&33&32&31
\end{matrix}\right)

Последовательно построчно заполняем матрицу возрастающей арифметической последовательностью 1, 2, 3,..., 36. Чётные строки заполняем от нулевого элемента к последнему, а нечётные — от последнего к нулевому. Текст программы приведён далее.

#include <iostream>
using namespace std;
int main ( int arg c, char **argv )
{
	int **a, n=6,k=0, i, j;
	a=new int * [ n ]; //Выделяем память для хранения матрицы
	for ( i =0; i<n; i++)
		a [ i ]=new int [ n ];
	for ( i =0; i<n; i++) //Перебираем все строки матрицы.
		if ( i%2==0) //Строки с чётными номерами заполняем возрастающей последовательностью
			for ( j =0; j<n; j++) //чисел слева направо
				a [ i ] [ j ]=++k;
		else //Строки с нечётными номерами заполняем возрастающей последовательностью чисел
			for ( j=n-1; j >=0; j --) //справа налево
				a [ i ] [ j ]=++k;
		cout<<"Вывод матрицы A "<<endl;
		for ( i =0; i<n; cout<<end l, i++)
			for ( j =0; j<n; j++)
				cout<<a [ i ] [ j ]<<" \t ";
	return 0;
}
Сергей Радыгин
Сергей Радыгин

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

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?