Тема 3. Матрицы.
Матрица представляет собой двумерный массив или массив массивов.
Синтаксис для объявления двумерных массивов:
тип_элемента имя_массива [размер_1] [размер_2];
Как и в одномерных массивах, здесь каждый индекс имеет нижнюю границу, равную 0, а число элементов для каждого уровня индекса определяется при объявлении двумерного массива.
Пример 3.1. Объявление матриц.
double matrix A [100][10];
char table [22][3];
int index [7][12];
Большинство компиляторов хранит элементы матрицы друг за другом, т.е. как длинный одномерный массив. Заполнение и обработку матриц чаще всего производят пользуясь вложенными циклами.
С++ дает возможность инициализировать матрицу способом, аналогичным инициализации одномерных массивов. Для этого нужно использовать список значений, расположенных в той же последовательности, в которой элементы многомерного массива хранятся в памяти ЭВМ.
Пример 3.2. Инициализация матрицы
...
int main ()
{ const int MAX_COL=4;
const int MAX_ROW=3;
double x[MAX_ROW][MAX_COL]= {{ 1, 2, 3, 4}, // строка # 1
{ 5, 6, 7, 8}, // строка # 2
{ 9,10,11,12}}; // строка # 3
...
return 0 };
Пример 3.3. Ввод многомерных массивов с клавиатуры.
...
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++)
{ cout << "x[" << i <<"][" << j<<"]=";
cin >> x[i][ j]; }
}
...
Пример 6.8. Ввод многомерных массивов с помощью генератора случайных чисел.
...
#include <time.h>
time_t t;
srand(time(&t)); //<stdlib.h>
...
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++) x[i][ j]=rand ()%10;
}
...
Вывод массивов также осуществляется с помощью циклов, одиночных для одномерных массивов или вложенных для многомерных массивов.
Пример 3.4. Вывод матриц
...
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++)
{ cout << setw(5) << x[i][ j];
}
cout << endl; }
При обработке матриц чаще всего встречаются следующие типы задач:
1) работа с матрицей в целом;
2) работа со строкой (столбцом) матрицы;
3) работа с диагональными элементами.
При работе с матрицей в целом, в качестве объекта для сравнения выбирают элемент с индексами (0,0), затем, последовательно перебирая все элементы матрицы, выполняют необходимые действия. Перебор элементов происходит с использованием вложенных циклов.
Пример 3.5. Определить среднее арифметическое значение элементов матрицы x[6][7] целого типа.
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <iomanip>
using namespace std;
int main()
{ const int MAX_COL=6;
const int MAX_ROW=7;
int x[MAX_ROW][MAX_COL];
int i,j,sum=0;
float sred;
time_t t;
srand(time(&t)); // инициализация генератора случайных
// чисел
for(i=0; i<MAX_ROW; i++) // Заполнение массива
for(j=0; j<MAX_COL; j++) // случайными числами
x[i][j]=rand()%10;
for(i=0; i<MAX_ROW; i++) // Вывод матрицы на экран
{ cout << endl;
for(j=0; j<MAX_COL; j++)
{ cout << setw(5) << x[i][j]; // и вычисление суммы
sum+=x[i][j]; // ее элементов
}
}
sred= float (sum)/(MAX_ROW*MAX_COL);
cout << "\nСумма = " << sum << "\nСреднее арифметическое = " << sred;
return 0;
}
Для поиска элемента строки (столбца) объектом сравнения является первый элемент строки с индексами i,0 или столбца с индексами 0,j и обработка идет до конца строки (столбца). Обычно результатом такой обработки массива является вектор-столбец или вектор-строка.
Пример 3.6. Определить минимальный элемент каждой строки действительной матрицы matr [8][4].
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <iomanip>
using namespace std;
int main()
{ const int COL=4;
const int ROW=8;
float matr[ROW][COL]; //объявление матрицы вещественного типа
int i,j;
float min[ROW];
time_t t;
srand(time(&t));
for (i=0; i<ROW; i++) // заполнение и вывод матрицы
{ for (j=0; j<COL; j++) // на экран
{ matr[i][j]=rand(100);
cout << setw(6) << matr[i][j];
}
cout << endl;
}
for (i=0; i<ROW; i++) // формирование вектора-столбца
{ min[i]=matr[i][0]; // из минимальных элементов строк
for (j=0; j< COL; j++)
if (matr[i][j]<min[i]) min[i]=matr[i][j];
cout << "min= " << min[i];
}
cout <<endl;
for (i=0; i< ROW; i++) cout << setw(6) << min[i];
}
При работе с диагональными элементами учитывают, что индексы элементов, стоящих на главной диагонали, удовлетворяют условию i = j.
Элементы, стоящиена побочной диагонали, имеют индексы, удовлетворяющие условию
i=n - j - 1,
если n - порядок матрицы (предполагается, что матрица - квадратная).
Пример 3.7. Найти количество четных элементов целочисленной квадратной матрицы порядка 9, стоящих ниже побочной диагонали.
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <iomanip>
using namespace std;
void main()
{ const int RANG=9;
int matr[RANG][RANG];
int i,j,kol=0;
time_t t;
srand(time(&t));
for (i=0;i<RANG;i++)
{ for (j=0;j<RANG;j++)
{ matr[i][j]=rand()%10;
cout << setw(4) << matr[i][j];
}
cout <<endl;
}
for (i=0; i<RANG; i++)
{ for (j=0; j<RANG; j++) if ((i>RANG-j-1) && (matr[i][j]%2==0)) kol++; }
cout << "Количество четных элементов под главной диагональю равно " << kol; }
Задания для самостоятельной работы.
Написать программу с использованием двумерных массивов. При написании программы использовать функции.
Дана целочисленная матрица размера 5´4. Сформировать одномерные массивы, состоящие из количества положительных и количества отрицательных элементов каждого столбца матрицы | |
Дано: int matr [8] [10]. Поменять местами левую и правую половины матрицы | |
Дана целочисленная матрица 5´6. Сформировать новую матрицу путем замены элементов каждой строки числом, равным сумме элементов этой строки | |
Дана действительная квадратная матрица 5х5, все элементы которой различны. Найти наименьший элемент среди стоящих на главной диагонали и поменять его местами с элементом стоящим в правом нижнем углу матрицы | |
В данной целочисленной матрице размера 5´4 найти сумму элементов той строки, в которой расположен наименьший элемент матрицы | |
Дана целочисленная матрица 6´6. Сформировать два одномерных массива, состоящих из минимальных и максимальных элементов каждого столбца матрицы | |
Дано: int arr [7] [8]. Найти количество нечетных элементов каждой строки матрицы. Сформировать вектор из найденных значений | |
Дана целочисленная матрица размера 5´4. Сформировать одномерные массивы, состоящие из количества положительных и суммы отрицательных элементов каждой строки матрицы | |
В данной целочисленной матрице 5х8 заменить элементы, большие введенного с клавиатуры числа на 1, меньшие – на 0. Вычислить количество 1 и 0 в каждом столбце полученной матрицы. | |
Дана действительная квадратная матрица 5х5. Получить новую матрицу умножением элементов каждой строки матрицы на наибольшее значение среди элементов этой строки | |
Найти под главной диагональю матрицы 9х9 минимальное значение, а над главной диагональю – максимальное. Поменять местами найденные значения. | |
Дана целочисленная матрица 6´9. Сформировать одномерные массивы, состоящие из сумм элементов четных строк и нечетных столбцов матрицы. | |
В данной целочисленной матрице 7х7 определить координаты точек, которые будучи максимальными в своей строке, являются максимальными и в своем столбце. | |
Определить, является ли данная целочисленная матрица 5х5 «магическим квадратом», то есть равны ли в ней суммы значений всех строк суммам значений всех столбцов. | |
Дана целочисленная матрица размера 5´6. Найти номера строк, где все элементы нулевые, все элементы одинаковы. | |
Определить, упорядочены ли по возрастанию строки в данной целочисленной матрице 6х8. | |
В данной целочисленной матрице 9х9 определить координаты точек, которые будучи максимальными в своей строке, являются минимальными в своем столбце. | |
Определить, отсортирована ли по возрастанию данная целочисленная матрица 5х4. | |
В данной целочисленной матрице 6х6 определить координаты точек, которые будучи минимальными в своей строке, являются минимальными и в своем столбце. | |
Определить, упорядочены ли по убыванию столбцы в данной целочисленной матрице 6х8. | |
В данной целочисленной матрице 8х8 определить координаты точек, которые будучи минимальными в своей строке, являются максимальными в своем столбце. | |
Дана целочисленная матрица 5´5. Получить новую матрицу путем умножения всех элементов на наименьший по модулю элемент. | |
Дана целочисленная матрица 7´7. Сформировать массив, состоящий из диагональных элементов данной матрицы. | |
Дано: int arr [6][4]. В верхней половине матрицы определить сумму элементов каждой строки, в нижней половине – произведение элементов каждой строки. | |
Дана целочисленная матрица 6´6. Сформировать массив, состоящий из количества нулевых элементов в каждой строке матрицы. | |
Дана действительная матрица 5´7. Сформировать массив, состоящий из средних арифметических значений элементов каждой строки матрицы. | |
Дана целочисленная матрица 7´7. Найти сумму положительных элементов и количество отрицательных среди элементов, стоящих под главной диагональю. | |
Дана целочисленная матрица 6´6. Сформировать два одномерных массива, состоящих из максимальных и минимальных элементов каждой строки матрицы | |
В каждом столбце матрицы 5´4 найти среднее арифметическое значение положительных элементов | |
Дана целочисленная матрица 7´7. Найти среднее арифметическое положительных элементов, стоящих над побочной диагональю. |