24.2.3.24011620. Napisati program koji od korisnika traži da unese dimenzije kvadratne matrice n, a zatim da unese dvije matrice formata n  n (pretpostaviti da su elementi matrica realni brojevi). Program nakon toga treba da ispiše zbir dvije unesene matrice. U programu treba da se nalaze sljedeće funkcije: “KreirajMatricu”, “UnesiMatricu”, “SaberiMatrice”, “IspisiMatricu“ i “UnistiMatricu”. Funkcija “KreirajMatricu“ prima kao parametre dvojni pokazivač koji služi za pristup dinamički kreiranoj matrici (u nastavku ćemo ovaj pokazivač prosto zvati dinamička matrica), kao i dimenziju matrice n. Funkcija treba da alocira prostor za matricu formata n  n, i dodijeli adresu alociranog prostora pokazivaču koji se koristi za pristup njenim elementima. Funkcija “UnesiMatricu“ popunjava matricu elementima unesenim sa tastature, a prima kao parametre dinamičku matricu i dimenziju n. Funkcija “SaberiMatrice“ prima kao parametre dvije dinamičke matrice i dimenziju n. Ova funkcija treba da kreira novu dinamičku matricu (pozivom funkcije “KreirajMatricu”), da je popuni zbirom dvije dinamičke matrice koje su joj proslijeđene kao parametri, i da vrati kao rezultat dvojni pokazivač koji služi za pristup elementima novokreirane matrice. Funkcija “IspisiMatricu“ kao parametre prima dinamičku matricu i dimenziju n, a ispisuje elemente matrice na ekran. Konačno, funkcija “UnistiMatricu“ unistava dinamički kreiranu matricu koja joj se prosljeđuje kao parametar (zajedno sa dimenzijom n). Funkcija “KreirajMatricu“ treba da baci izuzetak u slučaju da kreiranje ne uspije. Pri tome, ova funkcija mora da vodi računa da u slučaju da dođe do bacanja izuzetka “počisti iza sebe” sve uspjele alokacije, tako da ne dođe do curenja memorije. Bačeni izuzetak treba hvatati u glavnom programu. Obavezno testirati slučaj kada alokacija ne uspijeva (unosom prevelikog broja n).

Opis rješenja:

Listing programa:

#include <iostream>
#include <conio.h>
using namespace std;
void unistimat(double **p,int n){
    if(p==0)return;
    for(int i=0;i<n;i++){
        delete[] p[i];
    }
    delete[] p;
}
void kreirajmat(double **&p,int n){
try{
p=new double *[n];
for(int i=0;i<n;i++)
    p[i]=new double [n];
}
catch(...){
unistimat(p,n);
throw;
}   
}
void unesimat(double **p,int n){
for(int i=0;i<n;i++){
    for (int j=0;j<n;j++)
        cin>>p[i][j];
    }
}
double **saberimat(double **a,double **b,int n){
double **c=0;
try{
kreirajmat(c,n);
for(int i=0;i<n;i++){
    for (int j=0;j<n;j++)
        c[i][j]=a[i][j]+b[i][j];
    }
}
catch(...){
    unistimat(c,n);
throw;
}

return c;
}
void ispisimat(double **p,int n){
    for(int i=0;i<n;i++){
        for (int j=0;j<n;j++)
            cout<<p[i][j]<<"  ";
        cout<<endl;
    }
}

int main(){
int n;
cin>>n;
double **a=0,**b=0,**c=0;
try{
kreirajmat(a,n);
kreirajmat(b,n);
unesimat(a,n);
unesimat(b,n);
c=saberimat(a,b,n);
ispisimat(c,n);
}
catch(...){
    cout<<"nema dovoljno memorije!";
}
unistimat(a,n);
unistimat(b,n);
unistimat(c,n);
getch();
return 0;
}

Ispis na ekranu:

Riješeni zadaci 2    Index