DVODIMENZIONALNI NIZOVI - MATRICE U PROGRAMSKOM JEZIKU C
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> int main() { // Deklaracija dvodimenzionalne matrice int matrica[10][10]; // Popunjavanje matrice i ispis elemenata for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { // Računanje vrednosti elementa int a = 10 * i + (j + 1); matrica[i][j] = a; // Ispis elementa sa dva mesta širine printf("%2d ", a); } // Novi red nakon svakog reda matrice printf("\\n"); } return 0; }
Npr. ocene iz nekih predmeta za više učenika mogle bi se smestiti u matricu:
int ocene[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: Prosečna ocena svih učenika
#include <stdio.h> int main() { // Deklaracija dvodimenzionalnog niza sa ocenama int ocene[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 prosek double zbir = 0; double prosek[3]; // Petlja za prolazak kroz redove niza for (int i = 0; i < 3; i++) { // Petlja za prolazak kroz kolone niza for (int j = 0; j < 8; j++) { // Dodavanje ocene u zbir zbir += ocene[i][j]; // Ispis trenutne ocene printf("%d ", ocene[i][j]); } // Računanje proseka za red prosek[i] = zbir / 8; zbir = 0; // Resetovanje zbira za sledeći red printf("\\n"); } // Ispis proseka za svaki red printf("Prosek:\\n"); for (int i = 0; i < 3; i++) { printf("%d. %.2f\\n", i + 1, prosek[i]); } return 0; // Kraj programa }
Primer 2: Izračunavanje prosečne ocene ponaosob za svakog učenika
#include <stdio.h> int main() { // Deklaracija dvodimenzionalnog niza sa ocenama int ocene[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čenicima double zbir = 0; double prosek[3]; // Obrada ocena po učenicima for (int i = 0; i < 3; i++) { for (int j = 0; j < 8; j++) { // Sabiranje ocena za učenika zbir += ocene[i][j]; // Ispis trenutne ocene printf("%d ", ocene[i][j]); } // Računanje proseka za učenika prosek[i] = zbir / 8; // Resetovanje zbiра za sledećeg učenika zbir = 0; // Novi red za ispis printf("\\n"); } // Ispis proseka za svakog učenika printf("Prosek:\\n"); for (int i = 0; i < 3; i++) { printf("%d. %.2f\\n", i + 1, prosek[i]); } return 0; }
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> int main() { // Deklaracija matrice i dimenzija int matrica[10][10]; int m, n; // Unos dimenzija matrice printf("Unesite broj redova (m) i kolona (n): "); scanf("%d %d", &m, &n); // Provera validnosti dimenzija if (m > 10 || n > 10) { printf("Greska: Maksimalna dimenzija matrice je 10x10.\\n"); return 1; } // Unos elemenata matrice printf("Unesite elemente matrice (%d x %d):\\n", m, n); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%d", &matrica[i][j]); } } // Ispis unete matrice printf("Uneta matrica je:\\n"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%d ", matrica[i][j]); } printf("\\n"); } return 0; }
Operacije nad dvodimenzionalnim nizovima u C jeziku
1. Prolazak kroz matricu
#include <stdio.h> int main() { int matrica[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; printf("Elementi matrice su:\n"); for (int i = 0; i < 3; i++) { // Prolazak kroz redove for (int j = 0; j < 3; j++) { // Prolazak kroz kolone printf("%d ", matrica[i][j]); } printf("\n"); } return 0; }
2. Modifikacija elemenata
matrica[1][1] = 10; // Menja element u drugom redu i drugoj koloni na 10
for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (j > i) { // Elementi iznad glavne dijagonale matrica[i][j] = 0; } } }
Praktične primene
- 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> int main() { int A[2][3] = {{1, 2, 3}, {4, 5, 6}}; int B[3][2] = {{7, 8}, {9, 10}, {11, 12}}; int C[2][2] = {0}; // Rezultujuća matrica for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 3; k++) { C[i][j] += A[i][k] * B[k][j]; } } } printf("Rezultujuća matrica je:\n"); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { printf("%d ", C[i][j]); } printf("\n"); } return 0; }
Dinamičko alociranje memorije za matrice
#include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 3; int **matrica = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { matrica[i] = (int *)malloc(cols * sizeof(int)); } // Inicijalizacija for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { matrica[i][j] = i + j; } } // Ispis printf("Dinamicki alocirana matrica:\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", matrica[i][j]); } printf("\n"); } // Oslobađanje memorije for (int i = 0; i < rows; i++) { free(matrica[i]); } free(matrica); return 0; }
Primer: 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 |
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 |
#include <stdio.h> int main() { // Deklaracija matrice i dimenzija int m, n; char tabla[9][9]; // Matrica za šahovsku tablu // Unos pozicije skakača printf("Unesite poziciju skakača (red i kolona): "); scanf("%d %d", &m, &n); // Popunjavanje šahovske table 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 } } } // Ispis šahovske table 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"); // Novi red nakon svakog reda table } return 0; }
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.
return 0;
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
|< Stringovi u C/C++ jeziku |
Sledeće
Dvodimenzioni dinamički nizovi-matrice >| |