Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
9 - Матрицы.docx
Скачиваний:
7
Добавлен:
16.11.2019
Размер:
107.67 Кб
Скачать

Обработка строк и столбцов по отдельности

Мы уже рассмотрели, как вычислить сумму элементов всех матрицы или найти максимум во всей матрице. Рассмотрим теперь, как сделать это, но для строк или столбцов отдельно.

Начнём с того, что вычислим сумму элементов в первой строке. Заметим, что элементы первой строки определяются тем, что их первый индекс равен нулю, поэтому решением данной задачи является следующий код:

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;

}

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Как представляется матрица в программировании?

  2. Как объявить и инициализировать матрицу?

  3. Как заполнить матрицу случайными числами?

  4. Опишите алгоритм вычисления суммы элементов матрицы.

  5. Опишите алгоритм вычисления суммы элементов в заданном столбце или в заданной строке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]