|
Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Статические и динамические матрицы
Задача 6.5. Задана матрица A(n,m). Поменять местами её максимальный и минимальный элементы.
Алгоритм решения этой задачи следующий: находим максимальный элемент матрицы (max) и его индексы (imax, jmax), а также минимальный (min) и его индексы (imin, jmin). После чего элементы A[imax][jmax] и A[imin][jmin] поменяем местами. Для поиска максимального элемента и его индексов в переменную max запишем A[0][0], в переменные imax, jmax (номер строки и столбца, где находятся максимальный элемент) запишем 0. Затем в двойном цикле (цикл по переменной
— по строкам, цикл по переменной
— по столбцам) перебираем все элементы, и каждый из них сравниваем с максимальным (со значением переменной max). Если текущий элемент массива оказывается больше максимального, то его переписываем в переменную max, а в переменную imax — текущее значение индекса
, в переменную jmax — текущее значение
. Поиск минимального элемента матрицы аналогичен и отличается только знаком операции сравнения. Далее представлен текст программы решения задачи 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.7. Поменять местами элементы главной и побочной диагонали матрицы
.
Алгоритм решения задачи следующий: перебираем все строки матрицы (цикл по переменной
от 0 до
в тексте программы), и в каждой строке меняем местами элементы, расположенные на главной и побочной диагоналях (в
-й строке надо поменять местами элементы 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. Заполнить матрицу
числами от 1 до 36 следующим образом:

Последовательно построчно заполняем матрицу возрастающей арифметической последовательностью 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;
}
