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
Dvodimenzioni dinamički nizovi u C ++ programskom jeziku
U C++ programskom jeziku je uveden operator new koji obezbeđuje dinamičko kreiranje memorije, pa će se pokazivač A kreirati na sledeći način:
int **A;
A = new int*[n];
A = new int*[n];
Kreiranje i učitavanje matrice bi bilo:
int **A;
A = new int*[n]; for(int i=0; i < n; i++)
{
A = new int*[n]; for(int i=0; i < n; i++)
{
A[i] = new int[n];
for(int j=0; j < n; j++)
{
}for(int j=0; j < n; j++)
{
cin >> D[i][j];
}Da bi ispisali tako učitanu matricu potrebno je koristiti ugnježdene for petlje, kao i za učitavanje, a element matrice u i-tom redu i j-toj koloni bi bio A[i][j]. Kod koji ispisuje matricu u m-redova i n-kolona:
Ispisivanje matrica u C i C++
C jezik
printf("Matrica ispisivanje:\n"); for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++)
}{
printf("%3d",A[i][j]);
}printf("\n"); |
C++
cout << "Matrica ispisivanje:" << endl; for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++)
}{
cout << a[i][j] << " ";
}cout << endl; |
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:
C kodint ** copyMatrix(int ** aT,int m,int n) {
int **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++) {
aC[i][j]=aT[i][j];
}return aC; |
C ++ kod
int ** copyMatrix(int ** aT) {
int **aC;
return aC;aC = new int*[n]; for(int i=0; i < n; i++) {
aC[i]=new int[n];
}for(int j=0; j < n; j++) {
aC[i][j] = aT[i][j];
}} |
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 >| |