Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не 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; }