|
| toán tử trong C++ | |
| | Tác giả | Thông điệp |
---|
mrmax
Tổng số bài gửi : 59 Points : 5286 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: toán tử trong C++ Wed Sep 01, 2010 7:02 am | |
| Đây là một bài tập về ma trận có xây dựng các toán tử.mọi người vào debug hộ mình với .kho hiểu sai ở đâu
#include<conio.h> #include<iostream.h> class MT { private: int row,col; int **a; public: MT(); ~MT(); void nhap(); void in(); MT operator+(const MT &x,const MT &y); MT operator-(const MT &x,const MT &y); MT operator*(const MT &x,const MT &y); }; MT::MT() { a=new int * [row+1]; for(int i=1;i<=row;i++) a[i]=new int[col+1]; } MT::~MT() { if(a!=NULL){ delete[] a[0]; delete[] a;} } void MT::nhap() { cout<<"nhap ma tran \n"; cout<<"nhap so dong row="; cin>>row; cout<<"nhap so cot col="; cin>>col; for(int i=1;i<=row;i++) for(int j=1;j<=col;j++) { cout<<"phan tu hang "<<i<<" cot "<<j<<':'; cin>>a[i][j]; } } void MT::in() { for(int i=1;i<=row;i++) { cout<<"\n"; for(int j=1;j<=col;j++) { cout<<a[i][j]; } } } MT MT::operator+(const MT &x,const MT &y) { MT z; if(x.row==y.row&&x.col==y.col) { for(int i=1;i<=x.row;i++) for(int j=1;j<=x.col;j++) z.a[i][j]=x.a[i][j]+y.a[i][j]; return z; } else{ cout<<"khong the thuc hien"; getch(); return x,y; } } MT MT::operator-(const MT &x,const MT &y) { MT z; if(x.row==y.row&&x.col==y.col) { for(int i=1;i<=x.row;i++) for(int j=1;j<=x.col;j++) z.a[i][j]=x.a[i][j]-y.a[i][j]; return z; } else{ cout<<"khong the thuc hien"; getch(); return x,y; } } MT MT::operator*(const MT &x,const MT &y) { MT z; if(x.row==y.col&&x.col==y.row){ for(int i=1;i<=x.row;i++) for(int j=1;j<=y.col;j++) for(int k=1;k<=x.col;k++) z.a[i][j]+=x.a[i][k]*y.a[k][j]; return z; } else{ cout<<"khong the thuc hien"; getch(); return x,y; } } int main() { MT a,b,c; a.nhap(); b.nhap(); cout<<"ma tran a:\n"; a.in(); cout<<"ma tran b:\n"; b.in(); c=a+b; cout<<"ma tran tong:\n"; c.in(); c=a-b; cout<<"ma tran hieu:\n"; c.in(); c=a*b; cout<<"ma tran tich:\n"; c.in(); getch(); }
| |
| | | iShinichj
Tổng số bài gửi : 46 Points : 5246 Reputation : 0 Join date : 01/09/2010 Age : 34 Đến từ : HUT
| Tiêu đề: Re: toán tử trong C++ Sun Sep 05, 2010 8:26 am | |
| Sai sót: +MT(); //Không thấy sử dụng ~MT(); +MT operator+(const MT &x,const MT &y); MT operator-(const MT &x,const MT &y); MT operator*(const MT &x,const MT &y); ->Chỉ đc khai báo 1 ma trận thôi vì là hàm phương thức Sửa: MT operator+(const MT &y); //phương thức của đối x ẩn(ứng với con trỏ this) hoặc: friend MT operator+(const MT &x,const MT &y); //Hàm bạn +Ma trận nhập và các ma trận z trả về của hàm (+,-,*) chưa đc cấp phát bộ nhớ
Bài làm,chưa hoàn chỉnh lắm mong mọi người góp ý, sửa chữa: #include<iostream.h> #include<conio.h> #include<iomanip.h> //using namespace std;
class MT { private: int m,n; float **a; public: /*Ở đây có thêm hàm cấp phát bộ nhớ động thì tốt hơn, mong mọi người giúp dùm chỗ này*/ friend ostream& operator<<(ostream& os,const MT &x); friend istream& operator>>(istream& is,MT &x); MT operator+(const MT &x2); MT operator-(const MT &x2); MT operator*(const MT &x2); }; //Hien thi ma tran ostream& operator<<(ostream& os,const MT &x) { os<<setiosflags(ios::fixed)<<setprecision(2);//Hien thi 2 chu so phan thap phan for(int i=1;i<=x.m;i++) for(int j=1;j<=x.n;j++) { if(j==1) os<<"\n"; os<<setw( 8 ) <<x.a[i][j]; } return os; } //Nhap ma tran istream& operator>>(istream& is,MT &x) { cout<<"\n So hang cua ma tran: m= "; is>>x.m; cout<<" So cot cua ma tran: n= "; is>>x.n; x.a=new float*[x.m+1]; for(int i=1;i<=x.m;i++) x.a[i]=new float[x.n+1]; //tạo hàm cấp nó báo lỗi nên phải làm trực tiếp chỗ này for(int i=1;i<=x.m;i++) for(int j=1;j<=x.n;j++) { cout<<"a["<<i<<"]["<<j<<"]= "; is>>x.a[i][j]; } return is; } //Cong hai ma tran MT MT::operator+(const MT &x2) { MT x; if((m!=x2.m)||(n!=x2.n)) { cout<<"\n +Khong thuc hien duoc phep cong"; getch(); return x2; } else { int h,c; h=x.m=m; c=x.n=n; x.a=new float*[h+1]; for(int i=1;i<=h;i++) x.a[i]=new float[c+1]; for(int i=1;i<=h;i++) for(int j=1;j<=c;j++) x.a[i][j]=a[i][j]+x2.a[i][j]; return x; } } //Hieu hai ma tran MT MT::operator-(const MT &x2) { MT x; if((m!=x2.m)||(n!=x2.n)) { cout<<"\n +Khong tru duoc hai ma tran"; getch(); return x2; } else { int h,c; h=x.m=m; c=x.n=n; x.a=new float*[h+1]; for(int i=1;i<=h;i++) x.a[i]=new float[c+1]; for(int i=1;i<=h;i++) for(int j=1;j<=c;j++) x.a[i][j]=a[i][j]-x2.a[i][j]; return x; } } //Nhan hai ma tran MT MT::operator *(const MT &x2) { MT x; if(n!=x2.m) { cout<<"\n +Khong the thuc hien phep nhan"; getch(); return x2; } else { int h,c; h=x.m=m; c=x.n=x2.n; x.a=new float*[h+1]; for(int i=1;i<=h;i++) x.a[i]=new float[c+1]; for(int i=1;i<=h;i++) for(int j=1;j<=c;j++) { x.a[i][j]=0; for(int k=1;k<=n;k++) x.a[i][j]+=a[i][k]*x2.a[k][j]; } return x; } } int main() { MT x1,x2,x,y,z; cout<<"\n Nhap ma tran x1: "; cin>>x1; cout<<"\n Nhap ma tran x2: "; cin>>x2; x=x1+x2; cout<<"\n Tong hai ma tran: "<<x; y=x1-x2; cout<<"\n Hieu hai ma tran: "<<y; z=x1*x2; cout<<"\n Tich hai ma tran: "<<z; getch(); }
| |
| | | mrmax
Tổng số bài gửi : 59 Points : 5286 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: toán tử trong C++ Sun Sep 05, 2010 8:53 am | |
| ở đây các bạn thử xem phần khai báo toán tử ở tr.78 sách thầy ất cũng khai báo toán tử như mình đó thôi) con con trỏ this là có sẵn nếu dùng cũng dc không dùng cũng dc(họ chỉ khuyên là nên dùng thôi) hàm tạo,và hàm hủy buộc phải sử dụng do có khai báo con trỏ.(không nên cấp phát bộ nhớ như hưng vừa nói mà nên dùng hàm tạo bởi sẽ rất lôi thôi) việc gọi hàm tạo không đối thì dùng suốt đấy thôi. MT x; //thực chất là gọi tới hàm tạo không đối mình chỉ băn khoăn là có nên viết thêm hàm tạo có đối hay không còn phương thức nhập và in thì cái nào cũng được(cái này là do thói quen mỗi người) còn về hàm hủy thì khi nào kết thúc chương trình trình biên dịch sẽ gọi hàm hủy thay vì hàm hủy mặc định để giải phóng bộ nhớ | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5286 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: toán tử trong C++ Sun Sep 05, 2010 9:54 am | |
| Đây là bản sửa lỗi tạm thời của mình theo góp í của hưng tuy chay dc nhung ko chinh xac.có lẽ là do hàm tạo.cái hàm tạo của mình không thể bỏ đc chỉ là nó khai báo chưa đúng thôi.mong nhận được đóng góp í kiến của mọi người
#include<conio.h> #include<iostream.h> class MT { private: int row,col; int **a; public: MT(); MT(int row1,int col1); ~MT(); MT operator+(const MT &x); MT operator-(const MT &x); MT operator*(const MT &x); friend ostream& operator<<(ostream& os,const MT &x); friend istream& operator>>(istream& is,MT &x); }; // ham tao khong doi MT::MT() { this->row=this->col=0; this->a=NULL; } //ham tao co doi MT::MT(int row1,int col1) { this->row=row1; this->col=col1; this->a=new int * [row1+1]; for(int i=1;i<=row1;i++) a=new int[col1+1]; } //ham huy MT::~MT() { if(a!=NULL) { delete[] a[0]; delete[] a; } a=NULL; } //toan tu xuat ostream& operator<<(ostream& os,const MT &x) { for(int i=1;i<=x.row;i++) for(int j=1;j<=x.col;j++) { if(j==1) os<<"\n\n"; os<<<" "; } return os; } //toan tu nhap istream& operator>>(istream& is,MT &x) { cout<<"\n"<<"So hang cua ma tran: m= "; is>>x.row; cout<<"So cot cua ma tran: n= "; is>>x.col;
x.a=new int*[x.row+1]; for(int i=1;i<=x.row;i++) x.a[i]=new int[x.col+1];
for(int i=1;i<=x.row;i++) for(int j=1;j<=x.col;j++) { cout<<"a["<<<"]["<<<"]= "; is>>x.a[i][j]; } return is; } //toan tu cong MT MT::operator+(const MT &x) { MT z(row,col); if(x.row==row && x.col==col) { for(int i=1;i<=row;++i) for(int j=1;j<=col;++j) z.a[i][j] = x.a[i][j] + a[i][j]; return z; } else{ cout<<"khong the thuc hien"; getch(); return x; } } //toan tu tru MT MT::operator-(const MT &x) { MT z(row,col); if(x.row==row && x.col==col) { for(int i=1;i<=row;i++) for(int j=1;j<=col;j++) z.a[i][j] =a[i][j] - x.a[i][j] ; return z; } else{ cout<<"khong the thuc hien"; getch(); return x; } } //toan tu nhan MT MT::operator*(const MT &x) { MT z(row,row); if(x.row==col && x.col==row){ for(int i=1;i<=row;i++) for(int j=1;j<=x.col;j++) for(int k=1;k<=col;k++) z.a[i][j] += x.a[i][k] * a[k][j]; return z; } else{ cout<<"khong the thuc hien"; getch(); return x; } }
int main() { MT a,b,c; cout<<"nhap ma tran a"; cin>>a; cout<<"nhap ma tran b"; cin>>b; cout<<"ma tran a:"; cout< cout<<"\n"<<"ma tran b:"; cout< c=a+b; cout<<"\n"<<"ma tran tong:"; cout< c=a-b; cout<<"\n"<<"ma tran hieu:"; cout< c=a*b; cout<<"\n"<<"ma tran tich:"; cout< getch(); }
Được sửa bởi mrmax ngày Mon Sep 06, 2010 7:21 am; sửa lần 3. | |
| | | iShinichj
Tổng số bài gửi : 46 Points : 5246 Reputation : 0 Join date : 01/09/2010 Age : 34 Đến từ : HUT
| Tiêu đề: Re: toán tử trong C++ Sun Sep 05, 2010 10:01 am | |
| Mình chưa đọc tới phần hàm tạo, hàm hủy nên chưa có kinh nghiệm lắm. Để xem xét kĩ lại rồi sẽ quay trở lại giải quyết bài này | |
| | | iShinichj
Tổng số bài gửi : 46 Points : 5246 Reputation : 0 Join date : 01/09/2010 Age : 34 Đến từ : HUT
| Tiêu đề: Re: toán tử trong C++ Mon Sep 06, 2010 10:07 pm | |
| Hình như hàm hủy của Thành có vấn đề Tôi không cho hàm hủy vào thì chạy đc | |
| | | Admin Admin
Tổng số bài gửi : 35 Points : 5256 Reputation : 0 Join date : 31/08/2010
| Tiêu đề: Re: toán tử trong C++ Tue Sep 07, 2010 6:55 am | |
| Mình vừa tranh thủ code một cách khác của bài ma trận, mọi người xem thử:
////////////////////////////////// /// Bai toan tren ma tran /// Bui Dinh Cuong /// 07-09-2010 #include<iostream.h> #include<stdlib.h> #include<stdio.h> #include<iomanip.h> #include<conio.h>
void Cap_Phat_Bo_Nho(int **ipMatrix, int iHang, int iCot); void Nhap_Gia_Tri(int *iMatrix, int iHang, int iCot); void Cong(int *iMatrixC, int *iMatrixA, int *iMatrixB, int iHangC, int iCotC); void Nhan(int *iMatrixD, int *iMatrixA, int *iMatrixB, int iHangD, int iCotD,int iCotA); void Hien_Thi(int *iMatrix, int iHang, int iCot); void Giai_Phong_Bo_Nho(int *iMatrix);
int main() { int *iMatrixA = NULL, *iMatrixB = NULL, *iMatrixC = NULL, *iMatrixD = NULL; int iHangA, iCotA, iHangB, iCotB; int iHangC, iCotC, iHangD, iCotD; do {
cout<<"\n So hang cua ma tran A: "; cin>>iHangA; cout<<"\n So cot cua ma tran A: "; cin>>iCotA; if(iHangA<=0||iCotA<=0) { cout<<"\n Hay nhap lai."; } }while(iHangA<=0||iCotA<=0); do {
cout<<"\n So hang cua ma tran B: "; cin>>iHangB; cout<<"\n So cot cua ma tran B: "; cin>>iCotB; if(iHangB<=0||iCotB<=0) { cout<<"\n Hay nhap lai."; } }while(iHangB<=0||iCotB<=0); if((iHangA!=iHangB&&iCotA!=iCotB)&&(iCotA!=iHangB)) { cout<<"\n Hai ma tran khong the thuc hien cong hoac nhan"; return 0; } ///////////////////////////////////// /// Cap phat bo nho, Nhap gia tri Cap_Phat_Bo_Nho(&iMatrixA,iHangA,iCotA); Nhap_Gia_Tri(iMatrixA,iHangA,iCotA); Cap_Phat_Bo_Nho(&iMatrixB,iHangB,iCotB); Nhap_Gia_Tri(iMatrixB,iHangB,iCotB); //Hien tri hai ma tran A,B cout<<"\n\n Ma tran A:\n\n"; Hien_Thi(iMatrixA, iHangA, iCotA); cout<<"\n\n Ma tran B:\n\n"; Hien_Thi(iMatrixB, iHangB, iCotB); /////////////////////////////////////// //// Tinh toan ///// Cong hai ma tran A,B if( (iHangA!=iHangB) || (iCotA!=iCotB) ) { cout<<"\n Khong the cong hai ma tran nay."; } else { iHangC = iHangA; iCotC = iCotA; Cap_Phat_Bo_Nho(&iMatrixC,iHangC,iCotC); Cong(iMatrixC, iMatrixA, iMatrixB, iHangC, iCotC); cout<<"\n\n Ma tran tong:\n\n"; Hien_Thi(iMatrixC, iHangC, iCotC); } /// Nhan hia ma tran A,B if(iCotA!=iHangB) { cout<<"\n Khong the nhan hai ma tran nay."; } else { iHangD = iHangA; iCotD = iCotB; Cap_Phat_Bo_Nho(&iMatrixD,iHangD,iCotD); Nhan(iMatrixD, iMatrixA, iMatrixB, iHangD, iCotD, iCotA); cout<<"\n\n Ma tran tich:\n\n"; Hien_Thi(iMatrixD, iHangD, iCotD); } ////////////////////////////////// /////// Giai phong bo nho Giai_Phong_Bo_Nho(iMatrixA); Giai_Phong_Bo_Nho(iMatrixB); Giai_Phong_Bo_Nho(iMatrixC); Giai_Phong_Bo_Nho(iMatrixD); cout<<"\n\n An mot phim de ket thuc chuong trinh..."; getch(); return 0; }
////////////////////////////// // Xay dung cac ham
/////////////////////////// //// Ham cap phat bo nho void Cap_Phat_Bo_Nho(int **ipMatrix, int iHang, int iCot) { *ipMatrix = new int [iHang*iCot]; if(*ipMatrix == NULL) { cout<<"\n Khong du bo nho."; return ; } }
//////////////////////// /// Ham nhap gia tri void Nhap_Gia_Tri(int *iMatrix, int iHang, int iCot) { int i,j; for(i=0;i<iHang;i++) { for(j=0;j<iCot;j++) { iMatrix[i*iCot+j] = rand()%10 + 2; } } } ///////////////////////////// /// HAM CONG HAI MA TRAN void Cong(int *iMatrixC, int *iMatrixA, int *iMatrixB, int iHangC, int iCotC) { int i,j; for(i=0;i<iHangC;i++) { for(j=0;j<iCotC;j++) { iMatrixC[i*iCotC+j] = iMatrixA[i*iCotC+j] + iMatrixB[i*iCotC+j]; } } } ////////////////////////////// //// Ham nhan hai ma tran void Nhan(int *iMatrixD, int *iMatrixA, int *iMatrixB, int iHangD, int iCotD, int iCotA) { int i,j,k; for(i=0; i < iHangD; i++) { for(j=0; j < iCotD; j++) { iMatrixD[i*iCotD + j] = 0; for(k=0; k < iCotA; k++) { iMatrixD[i*iCotD + j] = iMatrixD[i*iCotD + j] + iMatrixA[j*iCotA+k] * iMatrixB[k*iCotD+i]; } } } } //////////////////////// // Ham hien thi void Hien_Thi(int *iMatrix, int iHang, int iCot) { int i,j; for(i=0;i<iHang;i++) { cout<<"\n"; for(j=0;j<iCot;j++) { cout<<setw(7); cout<<iMatrix[i*iCot+j]; } } }
////////////////////////////// /// Ham giai phong bo nho
void Giai_Phong_Bo_Nho(int *iMatrix) { if(iMatrix != NULL) { delete [] iMatrix; } }
Do your best, the rest will come!! | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5286 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: toán tử trong C++ Tue Sep 07, 2010 7:38 am | |
| Thưa các bác sau một hồi vật lộn, em đã cho ra sản phẩm cuối cùng.đảm báo chạy êm #include<conio.h> #include<iostream.h> class MT { private: int row,col; int **a; public: MT(); MT(int row1,int col1); ~MT(); MT operator+(const MT &x); MT operator-(const MT &x); MT operator*(const MT &x); friend ostream& operator<<(ostream& os,const MT &x); friend istream& operator>>(istream& is,MT &x); }; // ham tao khong doi MT::MT() { this->row=this->col=0; this->a=NULL; } //ham tao co doi MT::MT(int row1,int col1) { this->row=row1; this->col=col1; this->a=new int * [row1+1]; for(int i=1;i<=row1;i++) a[i]=new int[col1+1]; } //ham huy MT::~MT() { if(a!=NULL) a=NULL; } //toan tu xuat ostream& operator<<(ostream& os,const MT &x) { for(int i=1;i<=x.row;i++) for(int j=1;j<=x.col;j++) { if(j==1) os<<"\n\n"; os<<x.a[i][j]<<" "; } return os; } //toan tu nhap istream& operator>>(istream& is,MT &x) { cout<<"\n"<<"So hang cua ma tran: m= "; is>>x.row; cout<<"So cot cua ma tran: n= "; is>>x.col;
x.a=new int*[x.row+1]; for(int i=1;i<=x.row;i++) x.a[i]=new int[x.col+1];
for(int i=1;i<=x.row;i++) for(int j=1;j<=x.col;j++) { cout<<"a["<<i<<"]["<<j<<"]= "; is>>x.a[i][j]; } return is; } //toan tu cong MT MT::operator+(const MT &x) { MT z(row,col); if(x.row==row && x.col==col) { for(int i=1;i<=row;++i) for(int j=1;j<=col;++j) z.a[i][j] = x.a[i][j] + a[i][j]; return z; } else{ cout<<"khong the thuc hien"; getch(); return x; } } //toan tu tru MT MT::operator-(const MT &x) { MT z(row,col); if(x.row==row && x.col==col) { for(int i=1;i<=row;i++) for(int j=1;j<=col;j++) z.a[i][j] =a[i][j] - x.a[i][j] ; return z; } else{ cout<<"khong the thuc hien"; getch(); return x; } } //toan tu nhan MT MT::operator*(const MT &x) { MT z(row,row); if(x.row==col && x.col==row){ for(int i=1;i<=row;i++) for(int j=1;j<=row;j++) { z.a[i][j]=0; for(int k=1;k<=col;k++) z.a[i][j] += a[i][k] * x.a[k][j]; } return z; } else{ cout<<"khong the thuc hien"; getch(); return x; } } int main() { MT a,b,c; cout<<"nhap ma tran a"; cin>>a; cout<<"nhap ma tran b"; cin>>b; cout<<"ma tran a:"; cout<<a; cout<<"\n"<<"ma tran b:"; cout<<b; c=a+b; cout<<"\n"<<"ma tran tong:"; cout<<c; c=a-b; cout<<"\n"<<"ma tran hieu:"; cout<<c; c=a*b; cout<<"\n"<<"ma tran tich:"; cout<<c; getch(); }
| |
| | | iShinichj
Tổng số bài gửi : 46 Points : 5246 Reputation : 0 Join date : 01/09/2010 Age : 34 Đến từ : HUT
| Tiêu đề: Re: toán tử trong C++ Wed Sep 08, 2010 6:50 am | |
| Tối ưu hóa cái (thầy vừa dạy) //toan tu nhan MT MT::operator*(const MT &x) { MT z(row,row); if(x.row==col && x.col==row){ for(int i=1;i<=row;i++) for(int j=1;j<=row;j++) { int s=0; for(int k=1;k<=col;k++) s+= a[i][k] * x.a[k][j]; z.a[i][j]=s; } return z; } Nếu để z.a[i][j] trong vòng lặp thì tốn thời gian truy nhập vào phần tử z.a[i][j] Hình như là ~2.n^3
| |
| | | Sponsored content
| Tiêu đề: Re: toán tử trong C++ | |
| |
| | | | toán tử trong C++ | |
|
Trang 1 trong tổng số 1 trang | |
Similar topics | |
|
| Permissions in this forum: | Bạn không có quyền trả lời bài viết
| |
| |
| |