- •Тема 9. Матрицы Понятие матрицы
- •Матрицы в программировании
- •Инициализация матрицы
- •Вывод матрицы на экран
- •Вывод ровных столбцов матрицы
- •Заполнение матрицы
- •Работа с матрицей заранее не известного размера
- •Немного о генерации псевдослучайных чисел
- •Заполнение матрицы случайными числами
- •Обработка матрицы
- •Заполнение матрицы с условием
- •Обработка строк и столбцов по отдельности
- •Комбинированная обработка матрицы
Обработка строк и столбцов по отдельности
Мы уже рассмотрели, как вычислить сумму элементов всех матрицы или найти максимум во всей матрице. Рассмотрим теперь, как сделать это, но для строк или столбцов отдельно.
Начнём с того, что вычислим сумму элементов в первой строке. Заметим, что элементы первой строки определяются тем, что их первый индекс равен нулю, поэтому решением данной задачи является следующий код:
int sum = 0;
for (int j=0; j<size; j++) {
sum += matrix[0][j];
}
Сумма элементов во второй строке вычисляется так:
int sum = 0;
for (int j=0; j<size; j++) {
sum += matrix[1][j];
}
Теперь вычислим сумму элементов первого столбца:
int sum = 0;
for (int i=0; i<size; i++) {
sum += matrix[i][0];
}
Сумма элементов во втором столбце вычисляется так:
int sum = 0;
for (int i=0; i<size; i++) {
sum += matrix[i][1];
}
Заметьте, что во избежание путаницы во всех примерах за номер строки отвечает переменная i, а за номер столбца – переменная j. Хотя, естественно, с точки зрения компилятора эти имена значения не имеют.
А теперь вычислим суммы элементов во всех строках:
for (int i=0; i<size; i++) {
int sum = 0;
for (int j=0; j<size; j++) {
sum += matrix[i][j];
}
cout << "Строка " << i << " ";
cout << "Сумма = " << sum << endl;
}
Важно заметить, что в данной программе переменной sum присваивается значение 0 перед обработкой каждой строки: внутри внешнего цикла.
Вычислить сумму элементов всех столбцов можно так:
for (int j=0; j<size; j++) {
int sum = 0;
for (int i=0; i<size; i++) {
sum += matrix[i][j];
}
cout << "Столбец " << j << " ";
cout << "Сумма = " << sum << endl;
}
В этом примере цикл по i находится уже внутри, поскольку вначале нужно пробежаться по элементам столбца, а потом – по столбцам (используя переменную j).
Комбинированная обработка матрицы
Напоследок объединим задачи вычисления суммы и поиска максимума с целью определения номера строки, сумма элементов в которой максимальна.
//Вычисляем сумму элементов в первой строке
int i_max=0, sum_max = 0;
for (int j=0; j<size; j++) {
sum_max += matrix[i_max][j];
}
for (int i=1; i<size; i++) {
//Вычисляем сумму в строке номер i
int sum = 0;
for (int j=0; j<size; j++) {
sum += matrix[i][j];
}
//Если сумма в очередной строке больше текущей
//максимальной, то текущую максимальную сумму
//заменяем новой суммой.
if (sum_max < sum) {
sum_max = sum;
i_max = i;
}
}
cout << "Максимальная сумма = " << sum_max << endl;
cout << "Номер строки = " << i_max << endl;
Программа для определения номера столбца с максимальной суммой:
int j_max=0;
int sum_max = 0;
for (int i=0; i<size; i++) {
sum_max += matrix[i][j_max];
}
for (int j=1; j<size; j++) {
int sum = 0;
for (int i=0; i<size; i++) {
sum += matrix[i][j];
}
if (sum_max < sum) {
sum_max = sum;
j_max = j;
}
}
cout << "Максимальная сумма = " << sum_max << endl;
cout << "Номер столбца = " << j_max << endl;
ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ
Задача 1. Матрица называется нулевой, если все ее элементы равны нулю. Напишите программу, которая принимает с клавиатуры число N, создает нулевую матрицу размера N на N и выводит ее на экран.
#include "stdafx.h"
#include <iostream>
using namespace std;
int matrix[100][100];
int N;
void fillZeroMatrix() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
matrix[i][j] = 0;
}
}
}
void printMatrix() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
cout.width(2);
cout << matrix[i][j];
}
cout << endl;
}
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите размер матрицы:\n";
cin >> N;
fillZeroMatrix();
printMatrix();
system("pause");
return 0;
}
Задача 2. Напишите программу, которая принимает с клавиатуры число N, создает матрицу размера N на N, заполненную случайными числами, и выводит ее на экран. Затем найдите номер строки, в которой расположен максимальный элемент этой матрицы.
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
int matrix[100][100];
int N;
int rnd(int min, int max) {
return rand()%(max-min) + min;
}
void randomize() {
srand(time(0));
}
void fillRandomMatrix() {
randomize();
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
matrix[i][j] = rnd(-50, 50);
}
}
}
void printMatrix() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
cout.width(4);
cout << matrix[i][j];
}
cout << endl;
}
}
int getRowOfMax() {
int max = matrix[0][0];
int row_max = 0;
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
if (matrix[i][j] > max) {
max = matrix[i][j];
row_max = i;
}
}
}
return row_max;
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите размер матрицы:\n";
cin >> N;
fillRandomMatrix();
printMatrix();
cout << getRowOfMax() << endl;
system("pause");
return 0;
}
Задача 3. Квадратная матрица A называется симметричной, если она симметрична относительно главной диагонали, другими словами, для всех ее элементов выполняется равенство Aij=Aji. Напишите программу, которая принимает с клавиатуры число N, создает симметричную матрицу размера N на N, заполненную случайными числами, и выводит ее на экран.
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
int matrix[100][100];
int N;
int rnd(int min, int max) {
return rand()%(max-min) + min;
}
void randomize() {
srand(time(0));
}
void fillSymmetricMatrix() {
randomize();
for (int i=0; i<N; i++) {
for (int j=i; j<N; j++) {
matrix[i][j] = rnd(-50, 50);
}
}
for (int i=0; i<N; i++) {
for (int j=0; j<i; j++) {
matrix[i][j] = matrix[j][i];
}
}
}
void printMatrix() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
cout.width(4);
cout << matrix[i][j];
}
cout << endl;
}
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите размер матрицы:\n";
cin >> N;
fillSymmetricMatrix();
printMatrix();
system("pause");
return 0;
}
Задача 4. Квадратная матрица называется трехдиагональной, если все ее элементы равны нулю, за исключением тех, которые расположены на главной диагонали и двух соседних с ней диагоналях. Напишите программу, которая принимает с клавиатуры число N и создает трехдиагональную матрицу размера N на N, ненулевые элементы которой заполните случайными числами. Затем выведите матрицу на экран.
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
int matrix[100][100];
int N;
int rnd(int min, int max) {
return rand()%(max-min) + min;
}
void randomize() {
srand(time(0));
}
void fill3DiagonalMatrix() {
randomize();
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
matrix[i][j] = abs(i-j)<2 ? rnd(-50, 50) : 0;
}
}
}
void printMatrix() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
cout.width(4);
cout << matrix[i][j];
}
cout << endl;
}
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите размер матрицы:\n";
cin >> N;
fill3DiagonalMatrix();
printMatrix();
system("pause");
return 0;
}
Задача 5. Норма Фробениуса для матрицы вычисляется как корень квадратный из суммы квадратов элементов матрицы. Напишите программу, которая принимает с клавиатуры число N, создает матрицу размера N на N, заполненную случайными числами, и выводит ее на экран. Затем вычислите норму Фробениуса этой матрицы.
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
int matrix[100][100];
int N;
int rnd(int min, int max) {
return rand()%(max-min) + min;
}
void randomize() {
srand(time(0));
}
void fillRandomMatrix() {
randomize();
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
matrix[i][j] = rnd(-50, 50);
}
}
}
float getFrobeniusNorm() {
float sum = 0;
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
sum += matrix[i][j]*matrix[i][j];
}
}
return sqrt(sum);
}
void printMatrix() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
cout.width(4);
cout << matrix[i][j];
}
cout << endl;
}
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите размер матрицы:\n";
cin >> N;
fillRandomMatrix();
printMatrix();
cout << getFrobeniusNorm() << endl;
system("pause");
return 0;
}
КОНТРОЛЬНЫЕ ВОПРОСЫ
Как представляется матрица в программировании?
Как объявить и инициализировать матрицу?
Как заполнить матрицу случайными числами?
Опишите алгоритм вычисления суммы элементов матрицы.
Опишите алгоритм вычисления суммы элементов в заданном столбце или в заданной строке.