DVODIMENZIONALNI NIZOVI - MATRICE U PROGRAMSKOM JEZIKU C++

Sadržaj stranice

Dobrodošli na stranicu posvećenu dvodimenzionalnim i višedimenzionalnim nizovima u C++! Ova stranica nudi sve ključne informacije, primere koda i praktične savete o radu sa matricama i višedimenzionalnim strukturama podataka. Pomoću tabele sadržaja možete brzo preskočiti na interesantne sekcije i pronaći sadržaj koji vas zanima.

Uvod

Dvodimenzionalni nizovi, ili matrice, predstavljaju ključni koncept u C++ programiranju, omogućavajući efikasno skladištenje i manipulaciju podacima u tabelarnom formatu. Ova stranica pruža sveobuhvatan uvod u rad sa dvodimenzionalnim nizovima, uključujući deklaraciju, inicijalizaciju i praktične primere koji ilustruju njihovu primenu u realnim situacijama.

Formiranje matrice

Primer 1: Ispisivanje po redovima i kolonama

Pretpostavimo da želimo da ispišemo niz od prvih 100 prirodnih brojeva, ali da budu ispisani u 10 redova i 10 kolona, kao na slici ispod:Matrični prikaz 100 brojeva u 10 redovaDa bi smo ovo ispisali koristimo ugnježdenu for petlju:
​
#include <iostream>
using namespace std;

// Program za ispis prvih 100 prirodnih brojeva u 10 redova i 10 kolona
int main() {

for (int i = 0; i < 10; i++) {
// i predstavlja red (počinje od 0 i ide do 9)
for (int j = 0; j < 10; j++) {
// j predstavlja kolonu (počinje od 0 i ide do 9)
int broj = 10 * i + (j + 1); // Računanje broja u zavisnosti od reda i kolone
cout << broj << " "; // Ispis broja u istoj liniji
}
cout << endl; // Prelazak u novi red nakon što se završi kolona
}

return 0; // Kraj programa
}
Da bi ove brojeve stavili u memoriju, morali bi smo da uvedemo ili 10 nizova po 10 elemenata ili ako želimo da sve podatke upamtimo u jednoj promenljivoj, onda bi upotrebili dvodimenzioni niz(matricu)
int matrica[ 10 ][ 10 ] ;
Ovo je matrica celih brojeva koja ima 10 redova i 10 kolona.
Pristup određenom elementu koji se recimo, nalazi u 3 redu i 5. koloni bi bio:
matrica[3][5];
​
Prethodni primer bi bio malo izmenjen
#include <iostream>
using namespace std;

// Program za popunjavanje i ispis dvodimenzionalnog niza (matrice)
int main() {
int matrica[10][10]; // Deklaracija matrice sa 10 redova i 10 kolona

// Popunjavanje matrice
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
matrica[i][j] = 10 * i + (j + 1); // Računanje vrednosti i smeštanje u matricu
}
}

// Ispis matrice
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cout << matrica[i][j] << " "; // Ispis elemenata u redu
}
cout << endl; // Prelazak u novi red
}

return 0; // Kraj programa
}
U svakom ciklusu izračunat broj a se smešta u matricu u i-ti red i j-tu kolonu.

Testirajte svoj kod ovde

// Ovde pišite C++ kod...

Inicijalizacija matrice

Ukoliko unapred znamo brojeve koje treba staviti u matricu, možemo ih definisati na sličan način kao što inicijalizujemo jednodimenzioni niz, ali u ovom slučaju se radi o nizu nizova. Na primer, ocene iz nekih predmeta za više učenika mogu se smestiti u matricu:

intocene[3][8] = { {2,3,2,2,4,5,5,4},  
                                       {2,3,2,2,4,5,5,4},  
                                       {2,3,2,2,4,5,5,4} };
    

U uglastim zagradama je potrebno navesti dimenzije, čak i ako su one implicitno određene nizovima korišćenim za inicijalizaciju matrice – ovde 3 reda i 8 kolona. Ovo ukazuje da je matrica zapravo niz elemenata, gde su ti elementi takođe nizovi, a svaki red i kolona imaju svoj indeks pomoću kojeg se pristupa pojedinačnim elementima (u ovom primeru redovi su indeksirani od 0 do 2, a kolone od 0 do 7).

Da bi izračunali prosek svih elemenata matrice, potrebno je prvo sabrati sve elemente, a zatim podeliti dobijeni zbir sa ukupnim brojem elemenata. Za to se koristi ugnježdena for petlja.

Primer 2: Prosek ocena svih učenika

Tekst: Izračunati prosečnu ocenu svih učenika iz prethodno zadatih nizova
#include <iostream>
using namespace std;

// Funkcija za izračunavanje prosečne ocene svih učenika
void prosek() {
int ocene[3][8] = { {2, 3, 2, 2, 4, 5, 5, 4}, // Ocene prvog učenika
{2, 5, 2, 5, 4, 5, 5, 4}, // Ocene drugog učenika
{2, 4, 4, 2, 4, 3, 5, 4} }; // Ocene trećeg učenika

int zbir = 0; // Promenljiva za sabiranje svih ocena
double prosek; // Promenljiva za čuvanje proseka

// Petlja za prolazak kroz sve ocene u matrici
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 8; j++) {
zbir = zbir + ocene[i][j]; // Dodavanje trenutne ocene u zbir
cout << ocene[i][j] << " "; // Ispis trenutne ocene
}
cout << endl; // Novi red nakon svakog reda ocena
}

cout << "Prosek: ";
prosek = zbir / (3.0 * 8.0); // Izračunavanje proseka (3 reda x 8 ocena)
cout << prosek; // Ispis proseka
}

int main() {
prosek(); // Poziv funkcije za izračunavanje proseka
return 0; // Kraj programa
}

Objašnjenje:

1. Deklaracija matrice:
2. Prolazak kroz matricu:

3. Izračunavanje proseka:


4. Ispis:
Posle pokretanja
Računanje proseka-izvršenje konzolne aplikacije

Primer 3: Prosek ocena po svakom učeniku

Tekst: Izračunati prosečnu ocenu za svakog učenika ponaosob iz prethodno zadatih nizova
​Da bi izračunali prosek po svakom učeniku, onda moramo posebno sabrati svaki red ocena i podeliti sa brojem elemenata svakog unutrašnjeg niza jer red svaki ocena predstavlja ocene jednog učenika. Prosek će sada biti niz brojeva: 
#include <iostream>
using namespace std;

// Funkcija za izračunavanje prosečne ocene za svakog učenika
void proseciPoUceniku() {
int ocene[3][8] = { {2, 3, 2, 2, 4, 5, 5, 4}, // Ocene prvog učenika
{2, 5, 2, 5, 4, 5, 5, 4}, // Ocene drugog učenika
{2, 4, 4, 2, 4, 3, 5, 4} }; // Ocene trećeg učenika

double zbir = 0; // Promenljiva za sabiranje ocena jednog učenika
double prosek[3]; // Niz za čuvanje proseka za svakog učenika

// Petlja za prolazak kroz ocene svakog učenika
for (int i = 0; i < 3; i++) {
// Prolazak kroz sve ocene trenutnog učenika
for (int j = 0; j < 8; j++) {
zbir += ocene[i][j]; // Dodavanje trenutne ocene u zbir
cout << ocene[i][j] << " "; // Ispis trenutne ocene
}
prosek[i] = zbir / 8; // Računanje proseka za trenutnog učenika
zbir = 0; // Resetovanje zbira za sledećeg učenika
cout << endl; // Novi red nakon ocena jednog učenika
}

// Ispis proseka za svakog učenika
cout << "Proseci po učeniku:" << endl;
for (int i = 0; i < 3; i++) {
cout << "Učenik " << i + 1 << ": " << prosek[i] << endl;
}
}

int main() {
proseciPoUceniku(); // Poziv funkcije za izračunavanje proseka po učeniku
return 0; // Kraj programa
}

Objašnjenje:

1. Deklaracija matrice i nizova:
2. Računanje proseka:
3. Ispis proseka:Posle pokretanja:Izračunavanje prosečne ocene pojedinačno-izvršenje programa

Učitavanje matrice

U prethodnom primeru, matrica ocena je bila zadata. Da bi korisnik mogao samostalno da unese matricu, potrebno je prvo učitati broj redova i kolona matrice. Ovaj proces se može postići sledećim koracima:

int matrica[10][10], m, n;
cin >> m >> n; // Učitavanje dimenzija matrice
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> matrica[i][j]; // Učitavanje elemenata matrice
}
}

Kompletno rešenje:


#include <iostream>
using namespace std;

// Funkcija za unos matrice od strane korisnika
void ucitajMatricu() {
int matrica[10][10]; // Matrica maksimalne veličine 10x10
int m, n; // Broj redova i kolona

cout << "Unesite broj redova i kolona matrice (maksimalno 10x10): ";
cin >> m >> n; // Učitavanje dimenzija matrice

if (m > 10 || n > 10 || m <= 0 || n <= 0) {
cout << "Nevalidne dimenzije matrice!" << endl;
return; // Završetak funkcije ako su dimenzije nevalidne
}

cout << "Unesite elemente matrice:" << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> matrica[i][j]; // Učitavanje elementa matrice
}
}

cout << "Uneta matrica je:" << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << matrica[i][j] << " "; // Ispis elementa matrice
}
cout << endl; // Novi red za sledeći red matrice
}
}

int main() {
ucitajMatricu(); // Poziv funkcije za unos matrice
return 0; // Kraj programa
}

Primer 5: Skakač napada


Učitati poziciju skakača u šahu m i n i odrediti koja polja skakač napada. Ako su kolone obeležene 1-8 a redovi A-H, obeležiti šiframa polja koja skakač napada. Ostala polja obeležiti zvezdicom, osim polja gde se nalazi skakač.
Ulaz
Red i kolona koji predstavljaju poziciju skakača 1<=m<=8, 1<=n<=8
Izlaz
Šifre polja na onim poljima koji skakač napada, prazno na polju gde  se nalazi skakač, zvezdice na ostalim
Primer: Skakač napada
Uputstvo:
Da bi smo ispisali odgovarajući tekst na odgovarajuće polje koristićemo matricu čiji su elementi tipa string. Pošto je šahovska tabla dimenzija 8*8, a indeks u matrici počinje od nule, kreiraćemo matricu reda 9*9. 

    string tabla[9][9];

Treba redom proći kroz sve elemente matrice. Pošto je poslednji red u matrici prvi red u šahovskoj tabli treba formirati ugnježdenu for petlju na sledeći način:
for(int i=8; i>=1; i--)
{
for(int j=1; j<=8; j++)
        {
...
        }
}

Kada se naiđe na poziciju i=m, j=n, odatle treba ispisati šifre na poljima koju napada skakač. Npr. pozicija i=m+2, j=n-1 i j=n+1 itd.
Primer:
Ulaz
4
4
Izlaz
Primer Skakač napada - izvršenje

Rešenje:

#include <iostream>
#include <string>
using namespace std;

int main() {
int m, n;
string tabla[9][9]; // Matrica za šahovsku tablu

cout << "Unesite poziciju skakača (red i kolona): ";
cin >> m >> n;

for (int i = 8; i >= 1; i--) {
for (int j = 1; j <= 8; j++) {
if (i == m && j == n) {
tabla[i][j] = " "; // Polje skakača ostaje prazno
} else if ((i == m + 2 && (j == n - 1 || j == n + 1)) ||
(i == m - 2 && (j == n - 1 || j == n + 1)) ||
(i == m + 1 && (j == n - 2 || j == n + 2)) ||
(i == m - 1 && (j == n - 2 || j == n + 2))) {
tabla[i][j] = "S"; // Polje koje skakač napada
} else {
tabla[i][j] = "*"; // Ostala polja su zvezdice
}
}
}

cout << "Šahovska tabla:" << endl;
for (int i = 8; i >= 1; i--) {
for (int j = 1; j <= 8; j++) {
cout << tabla[i][j] << " ";
}
cout << endl; // Novi red nakon svakog reda table
}

return 0;
}
Objašnjenje:
  1. Unos korisnika: Unose se red i kolona na kojima se nalazi skakač.
  2. Logika šahovske table:
    • Matrica tabla predstavlja šahovsku tablu.
    • Ugnježdene petlje prolaze kroz sve redove i kolone table.
    • Određuju se polja koja skakač napada pomoću pravila kretanja u šahu.
  3. Ispis rezultata: Prikazuje šahovsku tablu sa označenim poljima:
    • " " za polje na kojem je skakač.
    • "S" za polja koja skakač napada.
    • "*" za ostala polja.

Zadaci za vežbanje

​Kako biste bolje razumeli rad sa dvodimenzionalnim nizovima u C++, pripremili smo nekoliko praktičnih zadataka koji će vam pomoći da savladate osnovne koncepte.

​1. Kreiranje tabele za evidenciju ocena učenika

Opis zadatka:
Napravite program koji koristi dvodimenzionalni niz za čuvanje ocena učenika iz nekoliko predmeta.
Primer ispisa:
​Unesite ocene za 3 učenika i 4 predmeta:
Učenik 1: 5 4 3 5
Učenik 2: 4 3 4 4
Učenik 3: 5 5 5 4

Prosečna ocena po učeniku:
Učenik 1: 4.25
Učenik 2: 3.75
Učenik 3: 4.75

Prosečna ocena po predmetu:
Predmet 1: 4.67
Predmet 2: 4.00
Predmet 3: 4.00
Predmet 4: 4.33

2. Izračunavanje prosečne vrednosti elemenata u matrici

Opis zadatka:
Napravite program koji koristi dvodimenzionalni niz za unos brojeva u matricu dimenzija N×MN \times MN×M.​
Primer ulaza i izlaza:​​Unesite dimenzije matrice (redovi i kolone): 2 3
Unesite elemente matrice:
1 2 3
4 5 6

Prosečna vrednost elemenata matrice: 3.5

3. Implementacija igre "Iks-Oks" (Tic-Tac-Toe)

Opis zadatka:
Kreirajte jednostavnu verziju igre "Iks-Oks" za dva igrača.
Primer igre:
​Trenutno stanje table:
_ _ _
_ _ _
_ _ _

Igrač 1 (X) bira polje (red, kolona): 1 1
Trenutno stanje table:
X _ _
_ _ _
_ _ _

Igrač 2 (O) bira polje (red, kolona): 1 2
Trenutno stanje table:
X O _
_ _ _
_ _ _

Igrač 1 (X) bira polje (red, kolona): 2 2
...

Igrač 1 (X) je pobedio!

​Višedimenzionalni nizovi – Proširenje koncepta

Dvodimenzionalni nizovi su korisni za predstavljanje matrica, tabela i sličnih struktura. Međutim, ponekad su potrebni složeniji modeli podataka, gde dolazimo do višedimenzionalnih nizova, poput trodimenzionalnih nizova.
Šta su trodimenzionalni nizovi?Trodimenzionalni nizovi su nizovi sa tri indeksa. Možemo ih zamisliti kao niz "matrica" ili kao prostornu strukturu, poput kocke, gde svaki element ima:
Sintaksa za deklaraciju trodimenzionalnog niza u C++:
int niz[dim1][dim2][dim3];
​Primer:int trodimenzionalniNiz[2][3][4];
Ovaj niz ima:
Primer upotrebe trodimenzionalnog nizaKao praktičan primer, trodimenzionalni nizovi se mogu koristiti za čuvanje vrednosti u različitim vremenskim intervalima, poput:
Kratak primer:
#include<iostream>
usingnamespace std;

int main() {
// Deklaracija trodimenzionalnog niza za temperature (grad, dan, vreme)
float temperature[2][3][4] = {
{ {22.5, 23.1, 21.8, 22.0}, {24.2, 25.0, 23.5, 24.1}, {19.8, 20.0, 18.7, 19.5} },
{ {28.5, 27.9, 29.0, 28.7}, {26.5, 25.8, 27.0, 26.9}, {30.0, 31.2, 29.8, 30.5} }
};

// Prikaz temperature za drugi grad, prvi dan, drugo vreme
cout << "Temperatura u drugom gradu, prvog dana, u drugom vremenu: "
<< temperature[1][0][1] << "°C" << endl;
return 0;
}
Rezultat:
​Temperatura u drugom gradu, prvog dana, u drugom vremenu: 27.9°C

Dalje učenje

Ako želite detaljnije da naučite o trodimenzionalnim i višedimenzionalnim nizovima u C++-u i njihovoj primeni, posetite sledeći resurs:



Srodni članci

Matrice-primeri
Nizovi-primeri
Matematički algoritmi
Klase i objekti
Grananje u programu u C/C++