DVODIMENZIONALNI DINAMIČKI NIZOVI - MATRICE U PROGRAMSKOM JEZIKU C, C++
Dvodimenzionalni nizovi -matrice su objašnjeni u članku Dvodimenzionalni nizovi - matrice , gde memorija rezerviše statički, odnosno dimenzije matrice m*n se ne menjaju u toku programa. U ovom članku će biti opisano kako da se memorija definiše dinamički, upotrebom pokazivača, tako da se kasnije može promeniti.
Pretpostavimo da učitamo matricu celih brojeva dimenzija 4*3, tako da ove dimenzija mogu kasnije da se promene. Ovo se može uraditi pomoću pokazivača na celobrojne podatke(int*), tako da svaki red predstavlja po jedan dinamički niz na koji pokazuje pokazivač na red(int * r), a na skup svih redova, tj na matricu kao celinu, pokazuje pokazivač na pokazivač, npr. (int ** A).
Definisanje ovih pokazivača, pa samim tim dinamičkih nizova i matrica se razlikuje u programskim jezicima C i C++, što će biti pokazano u nastavku.
Pretpostavimo da učitamo matricu celih brojeva dimenzija 4*3, tako da ove dimenzija mogu kasnije da se promene. Ovo se može uraditi pomoću pokazivača na celobrojne podatke(int*), tako da svaki red predstavlja po jedan dinamički niz na koji pokazuje pokazivač na red(int * r), a na skup svih redova, tj na matricu kao celinu, pokazuje pokazivač na pokazivač, npr. (int ** A).
Definisanje ovih pokazivača, pa samim tim dinamičkih nizova i matrica se razlikuje u programskim jezicima C i C++, što će biti pokazano u nastavku.
Dvodimenzioni dinamički nizovi u C programskom jeziku
U programskom jeziku C se posmatrajući prethodni primer može definisati red celih brojeva na sledeći način:
int * r = (int*)malloc(n * sizeof(int));
Funkcija malloc() koja se nalazi u standardnom zaglavlju <stdlib.h> alocira memoriju veličine n*4 bajta, u ovom slučaju, jer operator sizeof(int),daje veličinu int u bajtovima, a to je u ovom slučaju 4, jer int podaci toliko memorije zauzimaju u C jeziku.
Da bi se kreirala matrica veličine m*n uvešćemo pokazivač na pokazivač:
Da bi se kreirala matrica veličine m*n uvešćemo pokazivač na pokazivač:
int ** A = (int**)malloc(m * sizeof(int*));
S obzirom da se matrica kreira kao niz pokazivača, gde su ti pokazivači u stvari pokazivači koji pokazuju na pojedine redove u matrici, onda se ovde operator sizeof(odnosi na pokazivače na celobrojne podatke, pa otuda sizeof(int*). Kompletno kreiranje i učitavanje matrice bi bilo:
int **A;
int m = 4, n = 3;
A = (int**)malloc(n * sizeof(int*));
printf("Matrica?\n");
for(int i = 0; i < n; i++)
{
int m = 4, n = 3;
A = (int**)malloc(n * sizeof(int*));
printf("Matrica?\n");
for(int i = 0; i < n; i++)
{
A[i] = (int*) malloc(n * sizeof(int));
for(int j = 0; j < n; j++)
{
}for(int j = 0; j < n; j++)
{
scanf("%d", &A[i][j]);
}Prvo se dinamički alocira memorija pokazivača "A" na pokazivače koji će pokazivati na redove u matrici. Redovi se kreiraju unutar for petlje kao A[i]. To je pokazivač na tekući red "i". Memorija za podatke u redu A[i] takođe mora da se dinamički alocira, pozivom malloc() funkcije.
Ostale funkcije za dinamičko alociranje memorije iz zaglavlja <stdlib.h>
Pored funkcije malloc() koja rezerviše memoriju, postoje još i funkcije:
realloc()- menja dimenziju prethodno rezervisane memorije sa malloc() funkcijom
free(A)-oslobađa memoriju na koju pokazuje pokazivač A
realloc()- menja dimenziju prethodno rezervisane memorije sa malloc() funkcijom
free(A)-oslobađa memoriju na koju pokazuje pokazivač A
Kreiranje i učitavanje matrice bi bilo:
Ispisivanje matrica u C
printf("Matrica ispisivanje:\n");
for(int i = 0; i < m; i++)
{
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
printf("\n");
}{
printf("%3d", A[i][j]);
}printf("\n");
Posle pokretanja i unosa podataka prikazaće se u konzoli:
Kopiranje matrice u C i C++ jeziku
Da bi kopirali elemente dinamičke matrice, napravićemo posebnu metodu za to i proslediti pokazivač matrice kao parametar, a takođe i dimenziju n. Prosleđivanjem pokazivača na matricu, obezbeđuje se da se bilo koja promena koja se odradi nad matricom unutar funkcije, odrazi na originalnu. Kopiranje, je zapravo prepisivanje podataka u novu matricu, koja se onda kao povratna vrednost vraća iz funkcije. Metoda je prikazana u nastavku:
int ** copyMatrix(int ** aT, int m, int n)
{
int **aC;
aC = (int**) malloc(m * sizeof(int*));
for(int i = 0; i < m; i++)
{
return aC;
}aC = (int**) malloc(m * sizeof(int*));
for(int i = 0; i < m; i++)
{
aC[i] = (int*) malloc(n * sizeof(int));
for(int j = 0; j < n; j++)
{
}for(int j = 0; j < n; j++)
{
aC[i][j] = aT[i][j];
}return aC;
S obzirom da se matrica ispisuje više puta, kreiraćemo metodu za ispisivanje, koja će za parametre prihvatiti pokazivač na pokazivač, tj. pokazivač na matricu A i dimenzije matrice m i n. Metoda je prikazana u nastavku:
C kod
void ispisatiMatricu( int ** a,int n) {
for(int i=0; i < n; i++)
}{
for(int j=0; j < n; j++)
}{
printf("%d ",a[i][j]);
}printf("\n"); |
C ++ kod
void ispisatiMatricu( int ** a) {
for(int i=0; i < m; i++)
}{
for(int j=0; j < n; j++)
}{
cout << a[i][j] << " ";
}cout << endl; |
Kod koji iz glavne (main) metode kreira novu matricu i poziva metodu za kopiranje, a zatim metodu za ispisivanje izgleda:
int **b;
b=copyMatrix(A,m,n);
ispisatiMatricu(b,m,n);
b=copyMatrix(A,m,n);
ispisatiMatricu(b,m,n);
Ako sada pokrenemo aplikaciju prikazaće se:
Ovde je kod na početku izmenjen tako da omogućava da korisnik unese broj redova i kolona.
Transponovana matrica
Transponovanu matricu ćemo dobiti, kad polaznoj matrici zamenimo redove i kolone. Transponovana matrica se određuje u sklopu određivanja inverzne matrice.
Transponovana matrica AT
Inverzna matrica A-1
Inverzna matrica A-1
Transponovanu matricu možemo odrediti u posebnoj funkciji, kako je prikazano u nastavku:
C kod
void transponovana(int ** a, int n) {
for(int i=0; i < m; i++)
}{
for(int j=i; j < n; j++)
}{
/*zamena*/
}int b=a[i][j]; a[i][j]=a[j][i]; a[j][i]=b; |
C ++ kod
void transponovana(int ** a) {
for(int i=0; i < n; i++)
}{
for(int j=i; j < n; j++)
}{
/*zamena*/
}int b=a[i][j]; a[i][j]=a[j][i]; a[j][i]=b; cout << endl; |
U unutrašnjoj tj. ugnježdenoj for petlji vrši se zamena elementa u i-tom redu i j-toj koloni sa elementom u j-redu i i-toj koloni. Unutrašnja pretlja ne počinje sa j=0, već sa j=i, jer je u kolonama sa j<=i, zamena već bila izvršena.
Poziv funkcije transponovana() se vrši u main() funkciji:
Poziv funkcije transponovana() se vrši u main() funkciji:
C kod
int main(){ {
/* ... prethodni kod*/
}
transponovana(A,n);//poziv funkcije transponovana printf("Transponovana matrica\n"); ispisatiMatricu(A,n); |
C++ kod
int main(){ {
/* ... prethodni kod*/
}
transponovana(A,n);//poziv funkcije transponovana cout << "Transponovana matrica << endl; ispisatiMatricu(A,n); |
Računanje determinante kvadratne matrice
Posmatrajmo sledeći primer:
Učinati n, a zatim učitati elemente matrice dimenzija n*n. Napraviti funkciju koja računa determinantu matrice A, reda n*n, a zatim izračunati determinantu učitane matrice i rezultat prikazati na ekranu.
Primer:
Ulaz
3
3 5 6
2 -6 3
0 1 7
Izlaz
-193
Primer:
Ulaz
3
3 5 6
2 -6 3
0 1 7
Izlaz
-193
Sledeće
Stringovi u C/C++ jeziku >| |