Двумерни масиви в C++
01-11-2011
В този урок ще ви покажа как се декларират, инициализират и извеждат двумерни масиви в 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)


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

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


Урока в блога ми

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








/ Трябва да сте регистриран за да напишете коментар /
От: t0shk0
23:05 07-11-2011
Браво за урока. Много е добър... :) Аз мислех да направя подобен в най-скоро време, но ти ме изпревари. Сега сигурно ще направя за работата с файлове :)
От: IzKuFeLiQqQqQ
23:30 07-11-2011
АКО не те изпреваря! xD бтв ако знаеш enum прави урок, щот аз не бях на даскaло тогава ииии така и не ги схванах от учебниците :X
От: relax4o
2:11 02-12-2011
А защо ? Ако пишеш чист C++ не е нужно това разширение .h . Но предполагам това зависи вече от компилатора, на който пишеш.
Иначе браво за труда и все пак се надявам админа да сложи [php] тагове и тука, защото така кода просто изглежда ужасно :(
От: relax4o
2:12 02-12-2011
Ох, забранени са таговете. Исках да кажа "А защо iostream.H", но го написах в GREATER THAN и LOWER THAN скобки :D
От: IzKuFeLiQqQqQ
14:22 02-12-2011
@relax4o разбрах за .h споко :D Тая по инерция го пиша от даскало... с Dev C++ съм, то го пише горе. А за оцветяването го чакаме вече доста време :D Виж кода в блога ми... там е оцветен и всичко е номерирано и т.н :P
От: relax4o
17:30 16-12-2011
Не, на мен уроци по C++ не са ми нужни, особено основите, но реших да видя какво си съчинил и като гледах кода се отказвах да го чета, защото мразя да чета такива кодове.
Пък за тези тагове, които толкова време чакаме, админа мисля, че беше казал, че по някаква причина беше решил да не ги слага, ама не знам...
1