«

»

C++. Матрицы. Общие сведения

Матрица — это двумерный массив, каждый элемент которого имеет два индекса: номер строки и номер столбца, поэтому для работы с элементами матрицы необходимо использовать два цикла. Если значениями параметра первого цикла будут номера строк матрицы, то значениями параметрами второго — столбцы (или наоборот). Обработка матрицы заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т.д. до последней.

Перед тем, как приступить к изучению алгоритмов обработки матриц, давайте рассмотрим, как описываются матрицы в C++. Двумерный массив можно объявить так:

тип имя_переменной [n] [m];

Здесь тип определяет тип элементов массива, имя_переменной — имя матрицы, n — количество строк, m — количество столбцов. Строки нумеруются от 0 до n-1, столбцы от 0 до m-1.

Например int h[10] [15];

Выше матрица целых чисел h, состоящая из 10 строк и 15 столбцов (строки нумеруются от 0 до 9, столбцы от 0 до 14).

Для обращения к элементу матрицы необходимо указать ее имя и в квадратных скобках номер строки, затем номер столбца. Например, h[2] [5].

Ввод-вывод матриц

Матрицы, как и одномерные массивы, нужно вводить (выводить) поэлементно. Блок-схема ввода элементов матрицы A[n] [m] изображена ниже:

Ввод элементов матрицы

Код программы на Visual C++ вода-вывода матрицы будет иметь примерно такой вид:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int i,j,N,M,a[20][20];
cout<<"N="; //ввод количества строк
cin>>N;
cout<<"M="; //ввод количества столбцов
cin>>M;
cout<<"Input matrix A \n";
//цикл по переменной i, в которой перебираем строки матрицы
for (i=0; i<N; i++)
//цикл по переменной j, в котором перебираем элементы внутри строки
for (j=0; j<M; j++)
cin>>a[i][j]; //ввод очередного элемента матрицы
cout<<"matrix A \n";
for (i=0; i<N; i++)
{
//цикл по переменной i, в котором перебираем строки матрицы
for (j=0; j<M; j++)
cout<<a[i][j]<<"\t"; //вывод очередного элемента матрицы
cout<<endl; //переход на новую строку после вывода всех элементов строки
}
system("pause");
return 0;
}

 

Результат работы программы:

Теперь, давайте рассмотрим некоторые свойства матриц:

  • если номер строки элемента совпадает с номером столбца  (i = j), это означает , что элемент лежит на главной диагонали матрицы;
  • если номер строки превышает номер столбца (i > j), то элемент находиться ниже главной диагонали;
  • если номер столбца больше номера строки (i < j), то элемент находиться выше главной диагонали;
  • элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i+j+1=n;
  • неравенство i+j+1<n характерно для элемента, находящегося выше побочной диагонали;
  • соответственно, элементу, лежащему ниже побочной диагонали, соответствует выражение i+j+1>n.

Примеры задач обработки матриц

Задача 1

Найти сумму элементов матрицы, лежащих выше главной диагонали (рис. ниже)

Элементы матрицы выше главной диагонали

Алгоритм решения данной задачи можно построить следующим образом: обнулить ячейку для накапливания суммы (переменная S). Затем с помощью двух циклов просмотреть каждый элемент матрицы, суммировать элементы при условии, что элемент находиться выше главной диагонали. Текст решения задачи:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int S, i, j, N, M, a[20][20];
cout<<"N="; cin>>N;
cout<<"M="; cin>>M;
cout<<"Введите матрицу А \n";
for (i=0; i<N; i++)
for (j=0; j<M; j++)
cin>>a[i][j];
for (S=i=0; i<N; i++)
for (j=0; j<M; j++)
//если элемент лежит выше главной диагонали, то наращиваем сумму
if (j>i) S+=a[i][j];
cout<<"S="<<S<<endl;
system("pause");
return 0;
}
Задача 2

Проверить, является ли заданная квадратная матрица единичной. Единичной называют матрицу, у которой элементы главной диагонали — единицы, а все остальные — нули. Например:

Единицы на главной диагонали

Решать задачу будем так. Предположим, что матрица единичная и попытаемся доказать обратное. Если окажется, что хотя бы один диагональный элемент не равен единице или любой из элементов вне диагонали не равен нулю, то матрица единичной не является. Воспользовавшись логическими операциями языка C++, все эти условия можно соединить в одно и составить программу:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int pr, i, j, N, a[20][20];
cout<<"N="; cin>>N;
cout<<"Введите матрицу А \n";
for (i=0; i<N; i++)
for (j=0; j<N; j++)
cin>>a[i][j];
//предположим, что матрица единичная, и присвоем переменной pr значение 1
//если значение этой переменной при выходе из цикла не измениться,
//это будет означать, что матрица действительно единичная
for (pr=1, i=0; i<N; i++)
for (j=0; j<N; j++)
if (((i==j) && (a[i][j]!=1)) || ((i!=j) && (a[i][j]!=0)))
//если элемент лежит на главной диагонали и не равен единице или
//элемент лежит вне главной диагонали и не равен нулю, то
{
//переменной pr присвоить значение 0, это будет означать, что
//матрица единичной не является, и выйти из цикла.
pr=0;
break;
}
//проверка значения переменной pr и вывод соответствующего сообщения
if (pr) cout<<"Single matrix"<<endl;
else cout<<"No single matrix"<<endl;
system("pause");
return 0;
}
Задача 3

Преобразовать исходную матрицу так, чтобы нулевой элемент каждый строки был заменен среднем арифметическим элементом этой строки.

Для решения задачи необходимо найти в каждой строке сумму элементов, которую разделить на их количество. Полученный результат записать в нулевой элемент соответствующей строки.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int i, j, N, M;
double S, a[20][20];
cout<<"N="; cin>>N;
cout<<"M="; cin>>M;
cout<<"Введите матрицу А \n";
for (i=0; i<N; i++)
for (j=0; j<M; j++)
cin>>a[i][j];
for (i=0; i<N; a[i][0]=S/M, i++)
//цикл по i завершается записью среднего значения в нулевой элемент
//строки и наращиванием i
for (S=j=0; j<M; j++)
//вычисление суммы жлементов строки
S+=a[i][j];
cout<<"выход матрицы A"<<endl;
for (i=0; i<N; cout<<endl, i++)
for (j=0; j<M; j++)
cout<<a[i][j]<<endl;
system("pause");
return 0;
}

1 комментарий

  1. Roman

    Писать на C++ в процедурном стиле — ересь.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вы можете использовать эти теги HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Проверка на человечность *