Двумерни масиви в C++

Автор: IzKuFeLiQqQqQ

В този урок ще ви покажа как се декларират, инициализират и извеждат двумерни масиви в c++ и как да се работи с тях и диагоналите им. Работната среда, която използвам е Dev C++!
Чрез двумерния масив също така се нарича матрица която има зададени колони(в някои учебници може да го срещнете като „стълб“) и редове.
Има два вида матрица:

1.Квадратна матрица където колоните са равни на редовете
2.Правоъгълна матрица където колоните НЕ са равни на редовете
Ето какво представлява квадратна матрица с 4 колони и 4 реда:

А правоъгълна матрица с 3 колони и 4 реда изглежда така:

Не забравяйте, че в всички програмни езици броенето започва от 0 а не от 1!

Декларирането на двумерен масив става по следния начин:

int a[m][n];

като „m“ са колоните, а „n“ редовете в нашата матрица, като стойностите им са зададени в програмата

int m = 3,n = 4;//3 колони с по 4 реда

или са въведете чрез оператора cin

int m,n;
cin>>m>>n;

Инициализацията(задаването на стойности) става по 2 начина:

1.В самата програма, като фрагмент от кода:
a)Първин начин – деклариране и инициализация в едно:

int a[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};//3 колони с по 4 реда

b)Втори начин – деклариране и след това инициализация на всека колона с ред:

int a[3][4];//3 колони с по 4 реда
a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;
a[0][3] = 4;
a[1][0] = 5;
a[1][1] = 6;
a[1][2] = 7;
a[1][3] = 8;
a[2][0] = 9;
a[2][1] = 10;
a[2][2] = 11;
a[2][3] = 12;

Като след въвеждането на тези стойности матрицата ще изглежда така

2.Въведени чрез оператора cin и 2 цикъла с брояч(for):

int a[m][n];//Като сте задали стойности на m и n
for(int i=0;i<n;i++) {//Първия цикъл ВИНАГИ е за редовете...
for(int j=0;j<m;j++) {//...а втория за колоните!
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
}

Извеждането на стойностите има става по този начин:

1.Извеждане на стойноста на точно определени колона и ред

cout<<a[1][2];//Това ще изведе стойноста на 3-рия ред от 2-рата колона

2.Извеждане на стойностите на всички колони и редове

for(int i=0;i<n;i++) {//Първия цикъл ВИНАГИ е за редовете...
for(int j=0;j<m;j++) {//...а втория за колоните!
cout<<"a["<<i<<"]["<<j<<"]="<<a[i][j]<<endl;
}
}

Диагонали в квадратната матрица:

1.Главен диагонал

Примерни задачи по главния диагонал:
Намиране на сбора на елементите по главния диагонал.
Както забелязвате в таблицата по-горе номера на колоната и номера на реда по диагонала са еднакви, тоест в проверката ще проверяваме дали No.колона==No.ред.
Ето и цялото решение на задачата

#include<iostream.h>
#include<conio.h>
int main() {
int n;
double Sbor=0;
cout<<"n=";
cin>>n;//въвеждаме броя на колони и редове
int a[n][n];
for(int i=0;i<n;i++) {//започваме циклите за въвеждане на стойности
for(int j=0;j<n;j++) {
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
if(i==j) Sbor = Sbor + a[i][j];//проверяваме дали No.колона==No.ред и ако да добавяме ст-ста на елемента към общия сбор
}
}
cout<<"Sbor="<<Sbor;
getch();
return 0;
}

Намиране на сбора на елементите НАД главния диалонал.
Както забелязвате в таблицата по-горе No.колона винаги е по-малък от No.реда, тоест проверката ще е No.колона < No.реда.
За да не пишем излишен текст и код можете просто да вземете кода от горната задача, като само промените проверката от

if(i==j)

на

if(i<j)

Намиране на сбора на елементите Под главния диалонал.
Погледнете в таблицата по-горе… No.колона винаги е по-голям от No.реда, тоест тук вече проверката ще е No.колона > No.реда.
Вземете кода от първата задача и променете проверката от

if(i==j)

на

if(i>j)

и сте готови

2.Второстепенен(втори главен) диагонал

Примерни задачи по второстепенния диагонал:
Намиране на сбора на елементите по второстепения диагонал.
Както виждате в таблицата за втория главен диагонал по-горе сбора на No.колона и No.ред е равен на зададения брой колони и редове, тоест проверката ще е No.колона + No.реда == броя(n) – 1(защото започва да брои от 0)

#include<iostream.h>
#include<conio.h>
int main() {
int n;
double Sbor=0;
cout<<"n=";
cin>>n;
int a[n][n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
if(i+j==n-1) Sbor = Sbor + a[i][j];
}
}
cout<<"Sbor="<<Sbor;
getch();
return 0;
}

Намиране на сбора на елементите НАД второстепения диагонал.
Както виждате в таблицата за втория главен диагонал по-горе сбора на No.колона е по-малък от общия брой – No.ред – 1 е равен на зададения брой колони и редове, тоест проверката ще е No.колона < броя(n) No.ред – 1.
За да спестим място вземете кода от горната задача и променете проверката от

if(i+j==n-1)

на

if(i+j<n-1)

Намиране на сбора на елементите ПОД второстепения диагонал.
Както виждате в таблицата за втория главен диагонал по-горе сбора на No.колона е по-голям от общия брой – No.ред – 1 е равен на зададения брой колони и редове, тоест проверката ще е No.колона > броя(n) No.ред – 1.
За да спестим място вземете кода от по-по-горната задача и променете проверката от

if(i+j==n-1)

на

if(i+j>n-1)

Останалите задачи се създават по същатата логика!

Ето това беше, дано съм ви бил полезен! При проблеми или въпроси ми пишете!

Урока е авторски и забранявам копирането му в други сайтове без разрешението ми!!!

Вашият коментар