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
|
|