30/09/2018, 16:07

Xin nhận xét về bài lập trình hướng đối tượng trong C++

Thầy giáo ra bài tập lớn lập trình các phép toán trên ma trận theo kiểu lập trình hướng đối tượng, e làm như này không biết đã đúng kiểu lập trình hướng đối tượng chưa ạ? và tối ưu nữa?
Các a cho e xin nhận xét với.
E cảm ơn ạ.


    #include <iomanip>
    #include <complex>
    #include <iostream>
    using namespace std;
    
    class MATRAN
    {
    	private:
    		int soHang=10,soCot=10;
    		float det=0;
    		float **mt=new float*[soHang];
    	public:
    		MATRAN(int m, int n):soHang(m),soCot(n){
    			for(int i=0;i<this->soHang;i++)
    				this->mt[i]=new float[this->soCot];
    			cout<<fixed;
    			cout<<setiosflags(ios::showpoint)<<setprecision(1);
    		}
    		
    		void thaoTac(int tt);
    		void inMaTran();
    		void nhapMaTran();
    		void chuyenVi();
    		bool dinhThuc();
    		float phuHop(int hangXoa, int cotXoa);
    		void nghichDao();
    		int hang();
    		void xoaHang();
    		void xoaCot();
    		void congMaTran();
    		void truMaTran();
    		void nhanMT_So();
    		void nhanMT_MT();
    		
    		~MATRAN(){
    			for(int i=0;i<this->soHang;i++) delete[] this->mt[i];
    			delete[] this->mt;
    			this->soHang=0; this->det=0; this->soCot=0;
    		}
    };
    
    void MATRAN::thaoTac(int tt){
    	if(tt==0){
    		cout<<"
+ Danh sach thao tac:
";
    		cout<<"	Chuyen vi:	1|";
    		cout<<"	Dinh thuc:	2|";
    		cout<<"	Nghich dao:	3|";
    		cout<<"
	Hang:		4|";
    		cout<<"	Xoa hang:	5|";
    		cout<<"	Xoa cot:	6|";
    		cout<<"
	Cong ma tran:	7|";
    		cout<<"	Tru ma tran:	8|";
    		cout<<"
	Ma tran x So:	9|";
    		cout<<"	Ma tran x Ma tran:	10|";
    		cout<<"
	Ket thuc phien lam viec:	0";
    		cout<<"

+ Chon thao tac ma ban muon thuc hien: ";
    		cin>>tt;
    		cout<<endl;
    	}
    	switch(tt){
    		case 1: chuyenVi(); break;
    		case 2: if(this->dinhThuc()) cout<<"	Dinh thuc cua ma tran A la: det(A) = "<<this->det<<endl;
    				else cout<<"	Ma tran khong hop le!
";
    				thaoTac(0); break;
    		case 3: nghichDao(); break;
    		case 4: cout<<"	Hang cua ma tran A la: "<<this->hang()<<endl;
    				thaoTac(0); break;
    		case 5: xoaHang(); break;
    		case 6: xoaCot(); break;
    		case 7: congMaTran(); break;
    		case 8: truMaTran(); break;
    		case 9: nhanMT_So(); break;
    		case 10: nhanMT_MT(); break;
    		default: break; 
    	}
    }
    
    void MATRAN::inMaTran(){
    	for(int i=0;i<this->soHang;i++){
    		cout<<"
	";
    		for(int j=0;j<this->soCot;j++) cout<<setw(5)<<this->mt[i][j]<<" ";
    	}
    	cout<<endl;
    }
    
    void MATRAN::nhapMaTran(){
    	for(int i=0;i<this->soHang;i++)
    		for(int j=0;j<this->soCot;j++){
    			cout<<"	Phan tu ["<<i+1<<","<<j+1<<"] = ";
    			cin>>this->mt[i][j];
    		}
    	cout<<"Ma tran ban vua nhap la:";
    	this->inMaTran();
    }
    
    void MATRAN::chuyenVi(){
    	MATRAN cv(this->soCot,this->soHang);
    	for(int i=0;i<cv.soHang;i++)
    		for(int j=0;j<cv.soCot;j++)
    			cv.mt[i][j]=this->mt[j][i];
    	cout<<"Ma tran chuyen vi cua ma tran A la:";
    	cv.inMaTran();
    	thaoTac(0);
    }
    
    bool MATRAN::dinhThuc(){
    	if(this->soHang==this->soCot){
    		int i=0,d=0;
    		float dt=1.0;
    		//Tao ma tran B lay gia tri cua ma tran A
    		MATRAN b(this->soHang,this->soCot);
    		for(int i=0;i<b.soHang;i++)
    			for(int j=0;j<b.soCot;j++)
    				b.mt[i][j]=this->mt[j][i];
    		//Dua ma tran ve ma tran tam giac tren
    		for(i=0;i<b.soHang-1;i++){
    			if(b.mt[i][i]==0)
    				for(int k=i+1;k<b.soHang;k++){
    					bool c=0;
    					if(b.mt[k][i]!=0){
    						for(int j=0;j<b.soCot;j++){
    							float t=b.mt[i][j];
    							b.mt[i][j]=b.mt[k][j];
    							b.mt[k][j]=t;
    						}
    						d++;
    						c=1;
    						break;
    					}
    					if(c) break;
    				}
    			for(int k=i+1;k<b.soHang;k++){
    				float tl=b.mt[k][i]/b.mt[i][i];
    				for(int j=0;j<soCot;j++)
    					b.mt[k][j]-=b.mt[i][j]*tl;
    			}
    		}
    		//Tinh dinh thuc bang tich cac phan tu tren duong cheo chinh
    		for(i=0;i<b.soCot;i++) dt*=b.mt[i][i];
    		if(dt!=0) dt*=pow(-1,d);
    		this->det=dt;
    		return 1;
    	} else{
    		return 0;
    	}
    }
    
    float MATRAN::phuHop(int hangXoa, int cotXoa){
    	MATRAN ph(this->soHang-1,this->soCot-1);
    	for(int i=0;i<hangXoa;i++){
    		for(int j=0;j<cotXoa;j++)
    			ph.mt[i][j]=this->mt[i][j];
    		for(int j=cotXoa;j<ph.soCot;j++)
    			ph.mt[i][j]=this->mt[i][j+1];
    	}
    	for(int i=hangXoa;i<ph.soHang;i++){
    		for(int j=0;j<cotXoa;j++)
    			ph.mt[i][j]=this->mt[i+1][j];
    		for(int j=cotXoa;j<ph.soCot;j++)
    			ph.mt[i][j]=this->mt[i+1][j+1];
    	}
    	ph.dinhThuc();
    	float pTu=(float) ph.det/this->det;
    	if(pTu!=0)
    		pTu*=pow(-1,hangXoa+cotXoa);
    	return pTu;
    }
    
    void MATRAN::nghichDao(){
    	if(this->dinhThuc()==0 || this->det==0) cout<<"	Ma Tran A khong kha nghich
";
    	else{
    		//Tao ma tran chuyen vi cua ma tran A
    		MATRAN cv(this->soCot,this->soHang);
    		for(int i=0;i<cv.soHang;i++)
    			for(int j=0;j<cv.soCot;j++)
    				cv.mt[i][j]=this->mt[j][i];
    		//Tao ma tran B co cac phan tu la ma tran phu hop cua ma tran chuyen vi
    		MATRAN b(this->soHang,this->soCot);
    		cv.det=this->det;
    		for(int i=0;i<b.soHang;i++)
    			for(int j=0;j<b.soCot;j++)
    				b.mt[i][j]=cv.phuHop(i,j);
    		cout<<"Ma tran nghich dao cua ma tran A la:";
    		b.inMaTran();
    	}
    	thaoTac(0);
    }
    
    int MATRAN::hang(){
    	//Tao ma tran B lay gia tri cua ma tran A
    	MATRAN b(this->soHang,this->soCot);
    	for(int i=0;i<b.soHang;i++)
    		for(int j=0;j<b.soCot;j++)
    			b.mt[i][j]=this->mt[i][j];
    	//Dua ma tran ve ma tran tam giac tren
    	for(int i=0;i<b.soHang-1;i++){
    		for(int j=i;j<b.soCot;j++){
    			if(b.mt[i][j]==0)
    				for(int k=i+1;k<b.soHang;k++)
    					if(b.mt[k][j]!=0)
    						for(int u=0;u<b.soCot;u++){
    							float t=b.mt[i][u];
    							b.mt[i][u]=b.mt[k][u];
    							b.mt[k][u]=t;
    						}
    			if(b.mt[i][j]!=0){
    				for(int k=i+1;k<b.soHang;k++){
    					float tl=b.mt[k][i]/b.mt[i][j];
    					for(int u=0;u<b.soCot;u++)
    						b.mt[k][u]-=b.mt[i][u]*tl;
    				}
    				break;
    			}
    		}
    	}
    	//Tim hang
    	int r=0;
    	for(int i=b.soHang-1;i>=0;i--){
    		for(int j=0;j<b.soCot;j++)
    			if(b.mt[i][j]!=0){
    				r=i+1;
    				break;
    			}
    		if(r>0) break;
    	}
    	return r;
    }
    
    void MATRAN::xoaHang(){
    	int x=0;
    	do{
    		cout<<"Nhap vao hang thu x (0<x<"<<this->soHang+1<<") ban muon xoa: ";
    		cin>>x;
    	} while(x<1 || x>this->soHang);
    	MATRAN b(this->soHang-1,this->soCot);
    	x--;
    	for(int j=0;j<b.soCot;j++){
    		for(int i=0;i<x;i++)
    			b.mt[i][j]=this->mt[i][j];
    		for(int i=x;i<b.soHang;i++)
    			b.mt[i][j]=this->mt[i+1][j];
    	}
    	cout<<"Ma tran A sau khi xoa hang thu "<<x+1<<" la:";
    	b.inMaTran();
    	thaoTac(0);
    }
    
    void MATRAN::xoaCot(){
    	int x=0;
    	do{
    		cout<<"Nhap vao cot thu x (0<x<"<<this->soCot+1<<") ban muon xoa: ";
    		cin>>x;
    	} while(x<1 || x>this->soCot);
    	MATRAN b(this->soHang,this->soCot-1);
    	x--;
    	for(int i=0;i<b.soHang;i++){
    		for(int j=0;j<x;j++)
    			b.mt[i][j]=this->mt[i][j];
    		for(int j=x;j<b.soCot;j++)
    			b.mt[i][j]=this->mt[i][j+1];
    	}
    	cout<<"Ma tran A sau khi xoa cot thu "<<x+1<<" la:";
    	b.inMaTran();
    	thaoTac(0);
    }
    
    void MATRAN::congMaTran(){
    	MATRAN b(this->soHang,this->soCot);
    	cout<<"Nhap ma tran B:
";
    	b.nhapMaTran();
    	for(int i=0;i<b.soHang;i++)
    		for(int j=0;j<b.soCot;j++){
    			b.mt[i][j]+=this->mt[i][j];
    		}
    	cout<<"Tong cua 2 ma tran A va B la:";
    	b.inMaTran();
    	thaoTac(0);
    }
    
    void MATRAN::truMaTran(){
    	MATRAN b(this->soHang,this->soCot);
    	cout<<"Nhap ma tran B:
";
    	b.nhapMaTran();
    	for(int i=0;i<b.soHang;i++)
    		for(int j=0;j<b.soCot;j++){
    			b.mt[i][j]=this->mt[i][j]-b.mt[i][j];
    		}
    	cout<<"Hieu cua 2 ma tran A va B la:";
    	b.inMaTran();
    	thaoTac(0);
    }
    
    void MATRAN::nhanMT_So(){
    	float x=1;
    	MATRAN b(this->soHang,this->soCot);
    	cout<<"Nhap vao so x: ";
    	cin>>x;
    	for(int i=0;i<b.soHang;i++)
    		for(int j=0;j<b.soCot;j++)
    			b.mt[i][j]=x*this->mt[i][j];
    	cout<<"Tich cua "<<x<<" voi ma tran A la:";
    	b.inMaTran();
    	thaoTac(0);
    }
    
    void MATRAN::nhanMT_MT(){
    	int cotB=10;
    	cout<<"Nhap so cot cua ma tran B: ";
    	cin>>cotB;
    	MATRAN b(this->soCot,cotB);
    	cout<<"
Nhap ma tran B:
";
    	b.nhapMaTran();
    	MATRAN c(this->soHang,b.soCot);
    	for(int i=0;i<c.soHang;i++)
    		for(int j=0;j<c.soCot;j++){
    			c.mt[i][j]=0;
    			for(int k=0;k<this->soCot;k++)
    				c.mt[i][j]+=this->mt[i][k]*b.mt[k][j];
    		}
    	cout<<"Tich cua ma tran A va ma tran B la:";
    	c.inMaTran();
    	thaoTac(0);
    }
    
    int main(){
    	int m,n;
    	cout<<"Nhap so hang cua ma tran A: ";
    	cin>>m;
    	cout<<"Nhap so cot cua ma tran A: ";
    	cin>>n;
    	MATRAN a(m,n);
    	cout<<"
Nhap ma tran A:
";
    	a.nhapMaTran();
    	a.thaoTac(0);
    	return 0;
    }
Phạm Hoàng Tuấn viết 18:10 ngày 30/09/2018

mình nghĩ mấy hàm cộng trừ, nhập xuất ma trận bạn nên làm operator. Sẽ thuật tiện hơn trong việc sử dụng.

Nếu chưa làm quen về operator, bạn có thể tham khảo bài này:

Continuing the discussion from Tổng Hợp C,C++: Hỗ trợ giải tất cả các bài tập C & C++: Tạm thời post thế này đã, có gì sửa sau. @oanh Có gì thắc mắc cứ hỏi ở đây, tối a có thời gian sẽ lên giải thích. Giờ bận tí. #include <iostream> template<class T> class Number { private: T m_data; public: Number(void) : m_data( T() ) {} Number(const T value) : m_data ( value ) {} ~Number(void) {} Number<T>& operator =(const Number<T> & value) { m_data = value…
Sáng Béo viết 18:13 ngày 30/09/2018

bài ở top kia chỉ có mỗi code.
e ko hiểu lắm ạ.
cái operator e search google xem cũng thấy nó khó hiểu kiểu gì ấy ạ.

Sáng Béo viết 18:16 ngày 30/09/2018

a @ltd nhận xét cho e với ạ

Đỗ Trung Quân viết 18:11 ngày 30/09/2018

Trước tiên bạn phải hiểu thế nào là hướng đối tượng OOP.

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

@htwap em không hiểu chỗ nào, hàm nào. Nói cho anh biết cụ thể anh sẽ giải thích cho em nhé.

P/S: Em không nên tạo 2 posts như trên, nên gom lại một post cho nó ngắn gọn và đầy đủ.

bài ở top kia chỉ có mỗi code. e ko hiểu lắm ạ. frowning cái operator e search google xem cũng thấy nó khó hiểu kiểu gì ấy ạ. frowning

a @ltd nhận xét cho e với ạ

Vì diễn đàn chưa có tính năng gom 2 hay nhiều post lại thành một post nên anh phải nhắc mọi người như thế để tránh post nhiều post lẻ tẻ không có nhiều ý nghĩa

Sáng Béo viết 18:16 ngày 30/09/2018

e nghĩ đó là làm việc với đối tượng thông các phương thức và thuộc tính.
bọn e chưa được học, mới tìm tài liệu đọc qua nên chưa hiểu sâu.
mong a chỉ bảo cho e với ạ

Sáng Béo viết 18:18 ngày 30/09/2018

bài này là e tự làm ạ.
e chỉ muốn hỏi là e trình bày code như thế kia thì đã là hướng đối tượng chưa ạ?
có ổn không ạ?

2 post đó e post cách nhau 1 tiếng mà a.
lần sau e sẽ sửa bổ sung ở post trước ạ.

Đỗ Trung Quân viết 18:14 ngày 30/09/2018

e nghĩ đó là làm việc với đối tượng thông các phương thức và thuộc tính.

Lập trình hướng đối tượng là lập trình có các thuộc tính
Tính trừu tượng (abstraction) // chưa có
Tính đóng gói (encapsulation) và che giấu thông tin (information hiding) // đã có
Tính đa hình (polymorphism) // chưa có
Tính kế thừa (inheritance) // chưa có,

Với bài tập này của bạn chỉ 1 class có lẽ thầy giáo yêu cầu như code bạn làm là đủ.

Sáng Béo viết 18:09 ngày 30/09/2018

mấy cái thuộc tính đó e đọc qua google mà không hiểu.
a có thể cho e xin ví dụ và chỉ rõ từng thuộc tính được không ạ?

Đỗ Trung Quân viết 18:13 ngày 30/09/2018

Cái này nói rất khó hiểu, xem ví dụ là dễ nhất. Để mình lập topic riêng rồi tìm thông tin cho bạn.

Sáng Béo viết 18:22 ngày 30/09/2018

@Is2IT @ltd @tranhuanltv … bài của e e tạo đối tượng ngay trong class có sao không ạ?

Nguyễn Minh Dũng viết 18:08 ngày 30/09/2018

tạo đối tượng ngay trong class

Để anh làm rõ cái này một tí

class = lớp
object = đối tượng

Ví dụ về class:

class diễn đàn {
}; 

Ví dụ về object:(đối tượng)

diễn đàn object_dnh;

Ở đây việc khai báo object cũng giống như em khai báo biến

int x;

Nên việc em tạo đối tượng trong class là hoàn toàn bình thường.

Đỗ Trung Quân viết 18:16 ngày 30/09/2018

Được bạn. Bạn cứ nghĩ class là 1 định nghĩa trìu tượng của 1 thực thể. Còn đối tượng hay object chính là 1 thể hiện (instance) của lớp. Vì vậy có class rồi thì bạn tạo object trong class là điều bình thường.

Tran Huan viết 18:13 ngày 30/09/2018

Mình góp ý một tí, bạn nên đưa thao tác xuất nhập mảng qua một lớp khác, việc này làm có lớp ma trận có ý nghĩa hơn vì nó chỉ có nhiệm vụ là lưu giữ và xử lý các thao tác tính toán trên ma trận. Đây cũng là một nguyên tắc của OOP (Tham khảo thêm Single Responsibility)

Cách đặt tên class thì nên đặt là MaTran hay Matrix tránh đặt chữ hoa như vậy, các biến private nên move xuống cuối cùng không nên để đầu class vì khi sử dụng người ta sẽ không quan tâm các hiện thực bên dưới của bạn, chỉ quan tâm lớp của bạn cung cấp tính năng gì và gọi đúng tên nó và mong muốn kết quả trả về chính xác thôi

Sau khi sửa xong, clean lại code rồi post lên cho mọi người tiếp tục góp ý

Sáng Béo viết 18:12 ngày 30/09/2018

vâng. để e sửa rồi post lên ạ

Sáng Béo viết 18:11 ngày 30/09/2018

e vẫn chưa hiểu chỗ tách class ra lắm, hôm qua e cũng nghĩ thử tách nhưng không biết tách như nào cả.

Tran Huan viết 18:12 ngày 30/09/2018

thử

Thử tạo một class MatrixIO xem, nó sẽ nhận vào con trỏ của Matrix nó sẽ thao tác
VD:
Matrix a;
MatrixIO io(&a);
io.input();
io.printMatrix();

Bài liên quan
0