clase de matrice in C, adunarea si inmultirea matricelor
![]() ![]() ![]() |
clase de matrice in C, adunarea si inmultirea matricelor
free_fiber |
![]()
Post
#1
|
||
![]() Membru autentic Group: Members Posts: 1.555 Joined: 25 October 04 From: Bucuresti ![]() |
|
||
--------------------
Dacia
Logan Laureate 1.5dci 85CP
2008
- B xx XXX
|
|||
hash |
![]()
Post
#2
|
![]() calculatorist Group: Members Posts: 1.388 Joined: 13 September 04 ![]() |
Sesiunea, ai ?
![]() |
--------------------
-
-
-
|
|
ionutm82 |
![]()
Post
#3
|
![]() Membru Group: Members Posts: 187 Joined: 19 February 06 From: Bucuresti ![]() |
QUOTE(free_fiber @ 24 May 2006, 23:19) salutare. am si eu nevoie urgent de niste sfaturi de la un mic programel. am de implementat o clasa de matrice in care sa definesc un vector de 2 dimensiuni si nr de linii si nr de coloane. cu aceste matrice trebuie sa fac operatiile de adunare si inmultire. (adica in main sa am ceva de genu m1+m2). multumesc. Uite un mic cod ca sa-ti faci o idee. Pe scurt ideea este urmatoarea: - definesti o clasa Matrice care va avea ca membri un tablou (mat) si cele doua dimensiuni (lin, col); - initializarea presupune sa asociezi obiectului de tip Matrice cele doua dimensiuni si o matrice propiu-zisa (din comoditate eu am initializat decat elementul (1,1) ![]() - pentru a defini operatiile '+' si '*' trebuie sa supraincarci operatorii + si * a.i sa faca suma si inmultirea asa cum sunt definite operatiile astea pentru matrice. Vezi exemplul pentru '+' pe care ti l-am dat. Ma rog mai trebuie sa verifici daca corespund dimensiunile matricilor ... banuiesc ca sti si tu cum se face suma sau inmultirea matricelor... Sper ca ti-ai facut o idee. CODE #include <iostream> using namespace std; class Matrice{ public: int **mat; int lin, col; void init(int,int); void print(); Matrice operator+(Matrice); }; void Matrice::init(int l, int c){ lin = l; col = c; mat = new int*[l]; for(int i=0; i<l; i++) mat[i] = new int[c]; mat[1][1] = 10; } Matrice Matrice::operator+(Matrice m){ Matrice rez; rez.init(lin,col); for(int i=0; i<lin; i++) for(int j=0; j<col; j++) rez.mat[i][j] = mat[i][j] + m.mat[i][j]; return rez; } void Matrice::print(){ for(int i=0; i<lin; i++){ for(int j=0; j<col; j++) cout<<mat[i][j]<<" "; cout<<endl; } } void main(){ cout<<"matrice"<<endl; Matrice m1, m2, m3; m1.init(3,3); m2.init(3,3); m3 = m1 + m2; m3.print(); cin.get(); } This post has been edited by ionutm82: 25 May 2006, 01:24 |
--------------------
Renault
Megane 3 1.6 16V
Dynamique 2009
- B-yy-XXX
|
|
thegodsglory |
![]()
Post
#4
|
![]() Membru incepator Group: Members Posts: 87 Joined: 31 December 04 From: B ![]() |
brrrrrrrrr!!
on/off/print... si gata |
--------------------
dacia
1310 alb-ruginiu :)
- b14 it's a feature, not a bug.
|
|
Smeagol |
![]()
Post
#5
|
![]() Membru ... Group: Members Posts: 238 Joined: 18 November 05 From: Timisoara ![]() |
Idee de imbunatatire:
Adauga un setter/getter pentru elemente, ca sa faci indexarea. Foloseste un singur vector si aloca acolo toate elementele. Indexarea o vei face in setter/getter. Merge mai simplu contructorul si destructorul si vei avea mai putin overhead in memorie - alocatorul de C++ este facut pentru obiecte medii, de 64 de octeti, asa ca vei fragmenta mult memoria cu un pointer dublu. |
--------------------
Dacia
Logan Ambition
2006, 1.6 MPI
- TM 10 ??? "Ai grija ce-ti doresti. S-ar putea sa capeti."
|
|
free_fiber |
![]()
Post
#6
|
![]() Membru autentic Group: Members Posts: 1.555 Joined: 25 October 04 From: Bucuresti ![]() |
Uite ce am modificat. Am incercat sa citesc de la tastatura elem. matricelor dar se blocheaza. Imi da eroarea aia cu don't send.
CODE #include <iostream> using namespace std; class Matrice{ public: int **mat; int lin, col; void init(int,int); void print(); Matrice operator+(Matrice); }; void Matrice::init(int l, int c){ lin = l; col = c; mat = new int*[l]; for(int i=0; i<l; i++) mat[i] = new int[c]; for (int a=1;a<=l;a++){ for (int b=1;b<=c;b++){ cout<<"Dati un element "<<" "; cout<<a<<" "; cout<<b<<" "; cin>>mat[a][b]; } } } Matrice Matrice::operator+(Matrice m){ Matrice rez; rez.init(lin,col); for(int i=1; i<lin; i++) for(int j=1; j<col; j++) rez.mat[i][j] = mat[i][j] + m.mat[i][j]; return rez; } void Matrice::print(){ for(int i=1; i<lin; i++){ for(int j=1; j<col; j++) cout<<mat[i][j]<<" "; cout<<endl; } } void main(){ cout<<"matrice"<<endl; Matrice m1, m2, m3; m1.init(2,2); m2.init(2,2); m3 = m1 + m2; m3.print(); cin.get(); } Inca ceva: Ce face chestia asta (aceeasi eroare imi dadea si daca stergeam partea asta a scriptului): CODE mat = new int*[l]; for(int i=0; i<l; i++) mat[i] = new int[c]; This post has been edited by free_fiber: 25 May 2006, 14:40 |
--------------------
Dacia
Logan Laureate 1.5dci 85CP
2008
- B xx XXX
|
|
Smeagol |
![]()
Post
#7
|
![]() Membru ... Group: Members Posts: 238 Joined: 18 November 05 From: Timisoara ![]() |
pune o conversie explicita la citire din cin:
cin>>(int)(mat[i][j]); La a doua intrebare: Prima linie aloca un vector de pointeri catre int. Apoi se aloca pentru fiecare pointer un vector de int. This post has been edited by Smeagol: 25 May 2006, 14:41 |
--------------------
Dacia
Logan Ambition
2006, 1.6 MPI
- TM 10 ??? "Ai grija ce-ti doresti. S-ar putea sa capeti."
|
|
stuiberv |
![]()
Post
#8
|
Membru autentic Group: Members Posts: 246 Joined: 8 April 05 From: Iasi ![]() |
Sa ma bag si eu in vorba: am vazut ca titlul este ¨matrice in C¨.
Daca ma duceam la examen in anul I cu ce e mai sus nu il luam ca spuneau ca e cod C++. Asta ca sa nu fie surprize neplacute la examen. |
--------------------
Papuci
marimea 43
3 ani bocanci
- is xx undoitrei “All parts should go together without forcing. You must remember that the parts you
are reassembling were disassembled by you. Therefore, if you can’t get them together again, there must be a reason. By all means, do not use a hammer.” — IBM maintenance manual, 1925 |
|
free_fiber |
![]()
Post
#9
|
![]() Membru autentic Group: Members Posts: 1.555 Joined: 25 October 04 From: Bucuresti ![]() |
Scriptu final este:
CODE #include <iostream> using namespace std; class Matrice{ public: int mat[50][50]; int lin, col; void init(int,int); void print(); Matrice operator+(Matrice); }; void Matrice::init(int l, int c){ lin = l; col = c; for (int a=1;a<=l;a++){ for (int b=1;b<=c;b++){ cout<<"Dati elementul mat["; cout<<a; cout<<"]["; cout<<b; cout<<"]: "; cin>>(int)(mat[a][b]); } } } Matrice Matrice::operator+(Matrice m){ Matrice rez; rez.init(lin,col); for(int i=1; i<lin; i++) for(int j=1; j<col; j++) rez.mat[i][j] = mat[i][j] + m.mat[i][j]; return rez; } void Matrice::print(){ for(int i=1; i<lin; i++){ for(int j=1; j<col; j++) cout<<mat[i][j]<<" "; cout<<endl; } } void main(){ cout<<"matrice"<<endl; Matrice m1, m2, m3; m1.init(2,2); m2.init(2,2); m3 = m1 + m2; m3.print(); cin.get(); } Este creat in Visual C++, am renuntat la alocarea dinamica. Problema este ca imi cere elementele a 3 matrici, in loc de 2; si nu aduna decat m1[1][1]+m2[1][1]. De ce? Verificati-l si voi va rog. |
--------------------
Dacia
Logan Laureate 1.5dci 85CP
2008
- B xx XXX
|
|
Smeagol |
![]()
Post
#10
|
![]() Membru ... Group: Members Posts: 238 Joined: 18 November 05 From: Timisoara ![]() |
Umilele mele cunostiinte imi spun ca in C si C++ sunt vectori cu baza in 0.
Ceea ce faci tu acolo este sa scrii in fericire prin memorie, numa' unde trebe' nu. In axemplul dat, citesti aprox corect (ciclul de la 1 pana la limita inclusiv) dar operezi aiurea (ciclul de la 1 pana la limita exclusiv). Este corect cum se comporta, nu e bine scris. Corecteaza cu remarca de mai sus. This post has been edited by Smeagol: 25 May 2006, 15:17 |
--------------------
Dacia
Logan Ambition
2006, 1.6 MPI
- TM 10 ??? "Ai grija ce-ti doresti. S-ar putea sa capeti."
|
|
ionutm82 |
![]()
Post
#11
|
![]() Membru Group: Members Posts: 187 Joined: 19 February 06 From: Bucuresti ![]() |
QUOTE(free_fiber @ 25 May 2006, 15:36) Uite ce am modificat. Am incercat sa citesc de la tastatura elem. matricelor dar se [B]blocheaza. Imi da eroarea aia cu don't send. CODE ... void Matrice::init(int l, int c){ lin = l; col = c; mat = new int*[l]; for(int i=0; i<l; i++) mat[i] = new int[c]; for (int a=1;a<=l;a++){ for (int b=1;b<=c;b++){ cout<<"Dati un element "<<" "; cout<<a<<" "; cout<<b<<" "; cin>>mat[a][b]; } } } .... Inca ceva: Ce face chestia asta (aceeasi eroare imi dadea si daca stergeam partea asta a scriptului): CODE mat = new int*[l]; for(int i=0; i<l; i++) mat[i] = new int[c]; elementele matricei sunt de la 0..l-1, 0..c-1, deci for-ul este : for(int a=0; a<l; a++). Primele randuri reprezinta alocarea dinamica de memorie pt matrice (poti sa privesti matricea ca pe un vector de vectori). Daca stergi aceste linii o sa dea eroare pentru ca accesezi o zona de memorie nealocata, acelasi lucru care se intampla si atunci cand faceai for-ul de la 1..lin. Daca iti e greu cu alocarea dinamica poti sa faci si alocare statica adica la declararea variablilei mat in loc de **mat pui mat[100][100] insa e ineficient dar pt incepatori merge ![]() bafta! PS: In C nu existau clase, am trecut peste acest aspect. PS2 : Nu e nevoie de cast explicit la cin. operatorul '>>' este supraincarcat si pentru int printre altele. This post has been edited by ionutm82: 25 May 2006, 15:21 |
--------------------
Renault
Megane 3 1.6 16V
Dynamique 2009
- B-yy-XXX
|
|
jinxy |
![]() ![]()
Post
#12
|
Group: Members Posts: 0 Joined: 25 May 06 ![]() |
Problema e k ati uitat sa overloadati =. Normal k nu poate returna ce trebuie. egalul functioneaza pt numere nu pt obiecte(cum e cazul de fata) Alocarea este buna.
|
--------------------
tricicleta
cu 3 roti
|
|
hash |
![]()
Post
#13
|
![]() calculatorist Group: Members Posts: 1.388 Joined: 13 September 04 ![]() |
@free_fiber : cu adunarea nu-mi dau seama, insa procedura de adunare face init la matricea rezultat, si in init se citesc elementele unei matrici.
|
--------------------
-
-
-
|
|
ionutm82 |
![]()
Post
#14
|
![]() Membru Group: Members Posts: 187 Joined: 19 February 06 From: Bucuresti ![]() |
@hash. Corect! Normal ar fi ca citirea sa o faca separat (intr-o alta functie) si apeleaza apoi m.citire() de exemplu.
@jinxy. Atribuirea se poate realiza si la structuri, pointeri nu numai la numere. Merge si la obiecte insa nu avem control asupra atribuirii si prin urmare pot aparea surprize. In cazul nostru (m3=m1+m2) merge si fara supraincarcarea operatorului '='. Daca spre exemplu am face m1=m2 ar putea apara urmatoarele probleme: 1. campul (vechi) mat se pierde (oricum nu ne mai trebuie, dar va ramane memoria folosita degeaba!) 2. atat campul mat din m1 cat si cel din m2 vor pointa catre aceeasi zona de memorie (mat din m2). Daca facem modificari la m2.mat modificarile vor fi si in m1.mat. Daca stergem obiectul m2 (destructor) atunci m1.mat va pointa catre o zona dealocata. |
--------------------
Renault
Megane 3 1.6 16V
Dynamique 2009
- B-yy-XXX
|
|
jinxy |
![]()
Post
#15
|
Group: Members Posts: 0 Joined: 25 May 06 ![]() |
Merci ionutm82, m-ai lamurit si pt alte programe de ce nu e necesar mereu overloadarea =
|
--------------------
tricicleta
cu 3 roti
|
|
jinxy |
![]()
Post
#16
|
Group: Members Posts: 0 Joined: 25 May 06 ![]() |
#include <iostream>
#include <cstdlib> using namespace std; class matrix { private: int** element; void alloc(void); void release(void); public: int rows; int cols; matrix(int, int); matrix(const matrix&); ~matrix(); void print(void); matrix operator+(const matrix&); matrix& operator=(const matrix&); initializare(int, int); }; matrix::matrix(int r, int c) { rows = r; cols = c; alloc(); for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) element[i][j] = 0; } matrix::initializare(int r, int c) { int f; rows = r; cols = c; alloc(); for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) {cout<<"elementul "<<i+1<<" " <<j+1<<" :"; cin>>f; element[i][j] = f; } } matrix::matrix(const matrix& m) { rows = m.rows; cols = m.cols; alloc(); for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) element[i][j] = m.element[i][j]; } matrix::~matrix(void) { release(); } void matrix::alloc(void) { element = new int*[rows]; for (int i = 0; i < rows; i++) element[i] = new int[cols]; } void matrix::release(void) { for (int i = 0; i < rows; i++) delete [] element[i]; delete [] element; } void matrix::print(void) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) cout << element[i][j] << '\t'; cout << endl; } return; } matrix matrix::operator+(const matrix& m) { if (rows != m.rows || cols != m.cols) { cout << "Adunarea nu se poate efectua\n"; return (*this); } matrix temp(rows,cols); for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) temp.element[i][j] = element[i][j] + m.element[i][j]; return temp; } matrix& matrix::operator=(const matrix& m) { for (int i = 0; i < m.rows; i++) for (int j = 0; j < m.cols; j++) element[i][j] = m.element[i][j]; return (*this); } int main(void) { int rows; int cols; cout<<"Cate linii au matricele?"; cin>>rows; cout<<"Cate coloane au matricele?"; cin>>cols; matrix a(rows,cols),b(rows,cols),c(rows,cols); a.initializare(rows,cols); b.initializare(rows,cols); a.print(); cout<<"\n"; b.print(); cout<<"\n"; c = a + b; c.print(); return 0; } Gata, asta e marele program! ![]() |
--------------------
tricicleta
cu 3 roti
|
|
free_fiber |
![]()
Post
#17
|
![]() Membru autentic Group: Members Posts: 1.555 Joined: 25 October 04 From: Bucuresti ![]() |
Multumesc mult colegilor de forum
![]() Totul e OK acum. Se poate inchide topicul. |
--------------------
Dacia
Logan Laureate 1.5dci 85CP
2008
- B xx XXX
|
|
![]() ![]() ![]() |
Lo-Fi Version Harta site Parteneri Jocuri online Curs Valutar HRH Haine din lana merinos | Time is now: 1st May 2025 - 04:56 |