DVODIMENZIONALNI NIZOVI - MATRICE U PROGRAMSKOM JEZIKU C
Dvodimenzionalni nizovi, ili matrice, predstavljaju ključni koncept u C programiranju, omogućavajući efikasno skladištenje i manipulaciju podacima u tabelarnom formatu. Na ovoj stranici ćete pronaći sveobuhvatan uvod u rad sa dvodimenzionalnim nizovima u C jeziku, uključujući deklaraciju, inicijalizaciju i praktične primere koji demonstriraju njihovu primenu u raznovrsnim situacijama.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:
Da bi smo ovo ispisali koristimo ugnježdenu for petlju:
#include<stdio.h>intmain() { // Popunjavanje matrice i ispis elemenatafor (inti = 0; i < 10; i++) { for (intj = 0; j < 10; j++) { // Računanje vrednosti elementainta = 10 * i + (j + 1); // Ispis elementa sa dva mesta širineprintf("%4d ", a); } // Novi red nakon svakog reda matriceprintf("\n"); } return0; }
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<stdio.h>intmain() { // Deklaracija dvodimenzionalne matriceintmatrica[10][10]; // Popunjavanje matrice i ispis elemenatafor (inti = 0; i < 10; i++) { for (intj = 0; j < 10; j++) { // Računanje vrednosti elementainta = 10 * i + (j + 1); matrica[i][j] = a;// Stavljanje vrednosti a u memoriju matrice u i-ti red i j-tu kolonu// Ispis elementa sa dva mesta širineprintf("%4d ", a); } // Novi red nakon svakog reda matriceprintf("\n"); } return0; }
Ukoliko unapred znamo brojeve koje treba staviti u matricu
Npr. ocene iz nekih predmeta za više učenika mogle bi 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} };
Dakle, 3 reda i 8 kolona. Ovde se može zaključiti da je matrica zapravo niz elemenata gde su ti elementi takođe nizovi.
Svaka kolona i red imaju svoj indeks pomoću koga se može pristupiti elementu matrice. U prethodnom primeru redovi su numerisani indeksima 0-2, a kolone indeksima 0-7.
Primer 2: Prosečna ocena svih učenika
Zadatak: Izračunati prosečnu ocenu svih učenika iz prethodno zadatih nizovaDa bi izračunali prosek moramo prethodno sabrati sve elemente matrice i podeliti sa brojem elemenata. Potrebna nam je ugnježdena for petlja:#include<stdio.h>intmain() { // Deklaracija dvodimenzionalnog niza sa ocenamaintocene[3][8] = { {2, 3, 2, 2, 4, 5, 5, 4}, {2, 5, 2, 5, 4, 5, 5, 4}, {2, 4, 4, 2, 4, 3, 5, 4} }; // Deklaracija promenljivih za zbir i ukupan prosekdoubleukupan_zbir = 0; intbroj_ocena = 3 * 8; // Ukupan broj ocena// Petlja za prolazak kroz redove nizafor (inti = 0; i < 3; i++) { // Petlja za prolazak kroz kolone nizafor (intj = 0; j < 8; j++) { // Dodavanje ocene u ukupan zbirukupan_zbir += ocene[i][j]; // Ispis trenutne oceneprintf("%d ", ocene[i][j]); } printf("\\n"); } // Računanje ukupnog prosekadoubleukupan_prosek = ukupan_zbir / broj_ocena; // Ispis ukupnog prosekaprintf("Ukupan prosek ocena: %.2f\\n", ukupan_prosek); return0; // Kraj programa }
Primer 3: Izračunavanje prosečne ocene ponaosob za svakog učenika
Zadatak: Izračunati prosečnu ocenu za svakog učenika ponaosob iz prethodno zadatih nizovaDa 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<stdio.h>intmain() { // Deklaracija dvodimenzionalnog niza sa ocenamaintocene[3][8] = { {2, 3, 2, 2, 4, 5, 5, 4}, {2, 5, 2, 5, 4, 5, 5, 4}, {2, 4, 4, 2, 4, 3, 5, 4} }; // Promenljive za zbir ocena i prosek po učenicimadoublezbir = 0; doubleprosek[3]; // Obrada ocena po učenicimafor (inti = 0; i < 3; i++) { for (intj = 0; j < 8; j++) { // Sabiranje ocena za učenikazbir += ocene[i][j]; // Ispis trenutne oceneprintf("%d ", ocene[i][j]); } // Računanje proseka za učenikaprosek[i] = zbir / 8; // Resetovanje zbiра za sledećeg učenikazbir = 0; // Novi red za ispisprintf("\\n"); } // Ispis proseka za svakog učenikaprintf("Prosek:\n"); for (inti = 0; i < 3; i++) { printf("%d. %.2f\n", i + 1, prosek[i]); } return0; }
Učitavanje matrice
U prethodnom primeru, matrica ocena je bila zadata. Da bi korisnik učitao matricu, prethodno treba da se učita broj redova i kolona.
#include<stdio.h>intmain() { // Deklaracija matrice i dimenzijaintmatrica[10][10]; intm, n; // Unos dimenzija matriceprintf("Unesite broj redova (m) i kolona (n): "); scanf("%d %d", &m, &n); // Provera validnosti dimenzijaif (m > 10 || n > 10) { printf("Greska: Maksimalna dimenzija matrice je 10x10.\\n"); return1; } // Unos elemenata matriceprintf("Unesite elemente matrice (%d x %d):\\n", m, n); for (inti = 0; i < m; i++) { for (intj = 0; j < n; j++) { scanf("%d", &matrica[i][j]); } } // Ispis unete matriceprintf("Uneta matrica je:\\n"); for (inti = 0; i < m; i++) { for (intj = 0; j < n; j++) { printf("%d ", matrica[i][j]); } printf("\\n"); } return0; }
Operacije nad dvodimenzionalnim nizovima u C jeziku
Dvodimenzionalni nizovi predstavljaju matricu elemenata gde su elementi raspoređeni u redovima i kolonama. Da bismo efikasno radili sa matricama, potrebno je razumeti osnovne operacije koje uključuju prolazak kroz elemente, njihovu modifikaciju i primene u stvarnim scenarijima.1. Prolazak kroz matricu
Najčešći način za prolazak kroz sve elemente matrice je korišćenje ugnježdenih petlji. Evo primera:#include<stdio.h>intmain() { intmatrica[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; printf("Elementi matrice su:\n"); for (inti = 0; i < 3; i++) { // Prolazak kroz redovefor (intj = 0; j < 3; j++) { // Prolazak kroz koloneprintf("%d ", matrica[i][j]); } printf("\n"); } return0; }
2. Modifikacija elemenata
Da biste izmenili elemente matrice, jednostavno koristite indekse za pristup određenom elementu. Na primer:matrica[1][1] = 10; // Menja element u drugom redu i drugoj koloni na 10
for (inti = 0; i < 3; i++) { for (intj = 0; j < 3; j++) { if (j > i) { // Elementi iznad glavne dijagonalematrica[i][j] = 0; } } }
Praktične primene
Dvodimenzionalni nizovi se često koriste u realnim aplikacijama:- Matematičke operacije: Kao što su sabiranje, oduzimanje i množenje matrica.
- Igračke aplikacije: Predstavljanje table za igre poput šaha ili sudokua.
- Manipulacija slikama: Svaka tačka slike (piksel) može biti predstavljena kao element dvodimenzionalnog niza.
- Sistemi preporuke: Nizovi se koriste za skladištenje podataka o preferencijama korisnika.
#include<stdio.h>intmain() { intA[2][3] = {{1, 2, 3}, {4, 5, 6}}; intB[3][2] = {{7, 8}, {9, 10}, {11, 12}}; intC[2][2] = {0}; // Rezultujuća matricafor (inti = 0; i < 2; i++) { for (intj = 0; j < 2; j++) { for (intk = 0; k < 3; k++) { C[i][j] += A[i][k] * B[k][j]; } } } printf("Rezultujuća matrica je:\n"); for (inti = 0; i < 2; i++) { for (intj = 0; j < 2; j++) { printf("%d ", C[i][j]); } printf("\n"); } return0; }
Dinamičko alociranje memorije za matrice
Ponekad veličina matrice nije unapred poznata. U takvim slučajevima koristimo dinamičku alokaciju memorije. Primer:#include<stdio.h>#include<stdlib.h>intmain() { introws = 3, cols = 3; int **matrica = (int **)malloc(rows * sizeof(int *)); for (inti = 0; i < rows; i++) { matrica[i] = (int *)malloc(cols * sizeof(int)); } // Inicijalizacijafor (inti = 0; i < rows; i++) { for (intj = 0; j < cols; j++) { matrica[i][j] = i + j; } } // Ispisprintf("Dinamicki alocirana matrica:\n"); for (inti = 0; i < rows; i++) { for (intj = 0; j < cols; j++) { printf("%d ", matrica[i][j]); } printf("\n"); } // Oslobađanje memorijefor (inti = 0; i < rows; i++) { free(matrica[i]); } free(matrica); return0; }
#include<stdio.h>intmain() { // Deklaracija matrice i dimenzijaintm, n; chartabla[9][9]; // Matrica za šahovsku tablu// Unos pozicije skakačaprintf("Unesite poziciju skakača (red i kolona): "); scanf("%d %d", &m, &n); // Popunjavanje šahovske tablefor (inti = 8; i >= 1; i--) { for (intj = 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 } } } // Ispis šahovske tableprintf("Šahovska tabla:\n"); for (inti = 8; i >= 1; i--) { for (intj = 1; j <= 8; j++) { printf("%c ", tabla[i][j]); } printf("\n"); // Novi red nakon svakog reda table } return0; }
Ovaj program simulira šahovsku tablu i poziciju skakača. Skakač se u šahu kreće u obliku slova "L", tj. dva polja u jednom smeru i jedno u drugom. Program omogućava korisniku da unese poziciju skakača, a zatim računa koja polja na tabli skakač može napasti. Evo detaljnog objašnjenja svakog dela koda:
int m, n; char tabla[9][9];
Ovaj deo koda definiše promenljive koje se koriste za skladištenje pozicije skakača na tabli (m za red i n za kolonu) i šahovsku tablu (matricu dimenzija 9x9).
printf("Unesite poziciju skakača (red i kolona): "); scanf("%d %d", &m, &n);
Koristi se funkcija printf za ispis poruke korisniku da unese poziciju skakača, a scanf za unos rednog broja (m) i kolone (n).
for (int i = 8; i >= 1; i--) { for (int j = 1; j <= 8; j++) { if (i == m && j == n) { tabla[i][j] = ' '; } 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'; } else { tabla[i][j] = '*'; } } }
U ovom delu koda kreiramo šahovsku tablu. Ako su pozicije reda i kolone jednake poziciji skakača, polje se označava praznim mestom (' '). Ako je polje napadnuto od strane skakača, označava se sa 'S'. Ostala polja se označavaju sa '*'.
printf("Šahovska tabla:\\n"); for (int i = 8; i >= 1; i--) { for (int j = 1; j <= 8; j++) { printf("%c ", tabla[i][j]); } printf("\\n"); }
Na kraju, koristi se dvostruka petlja za ispisivanje šahovske table. Svako polje se ispisuje, a nakon svakog reda dodaje se novi red.
return0;
Program završava sa return 0;, označavajući uspešan završetak.
Srodne teme:
- Dvodimenzioni nizovi u C - Detaljna objašnjenja i primeri rada sa dvodimenzionalnim nizovima u C jeziku.
- Dvodimenzioni dinamički nizovi - Kako koristiti dinamičko alociranje za rad sa dvodimenzionalnim nizovima u C jeziku.
- Matrice u C - Korišćenje matrica u C jeziku sa primerima za obradu podataka.
- Petlje u C - Osnove petlji u C jeziku za rad sa nizovima i matricama.
- Operacije na nizovima u C - Kako vršiti operacije na jednostrukim i dvostrukim nizovima u C.
| Prethodno |<Nizovi u jeziku C |
Sledeće Dvodimenzioni dinamički nizovi-matrice>| |
Srodni članci
Matrice-primeriNizovi-primeri
Matematički algoritmi
Klase i objekti
Grananje u programu u C/C++



