Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Class ma trận, lỗi câu lệnh if kiểm tra điều kiện nhân 2 ma trận, sửa giúp mình!

  1. #1
    Ngày gia nhập
    11 2011
    Nơi ở
    Viet Nam
    Bài viết
    34

    Wink Class ma trận, lỗi câu lệnh if kiểm tra điều kiện nhân 2 ma trận, sửa giúp mình!

    Như chúng ta đã biết muốn nhân 2 ma trận thì 2 ma trận phải cùng cấp hoặc số cột của ma trận này bằng só hàng của ma trận kia.
    VD: Ma trận cấp mm nhân vs ma trận cấp mm sẽ ra ma trận cấp mm, ma tran cap mn nhân vs ma trận cấp np sẽ ra ma trận cấp mp.
    ở đây chỗ kiểm tra dk nhân 2 ma trận của mình mới đúng dk 1 ý là ma trận cấp mm *mm thì được còn nhâp cấp mn*np thì chưa đúng, các bạn xem sửa giúp với.

    if(m != k.m || n != k.n)
    {
    cout<<"Hai tran phai cung cap moi nhan duoc\n";
    exit(0);
    }
    // matran1.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "stdio.h"
    #include "conio.h"
    #include "iostream"
    #include "math.h"

    using namespace std;

    class matran
    {
    private:
    int m,n;
    int a[10][10];
    public:
    matran();
    matran(int a,int b,int x);
    ~matran();
    void nhapc1();//ham nhap lam cach 1
    void nhapc2();//ham nhap lam cach 2
    void xuat();
    matran operator+(matran &k);//tru 2 ma tran lam tuong tu
    matran operator*(matran &k);
    friend ostream & operator << (ostream &output, matran &k);
    friend istream & operator >> (istream &input, matran &k);
    };

    matran::matran()
    {
    m=n=1;
    a[0][0]=1;
    }

    matran::matran(int m1,int n1,int x)
    {
    m=m1;
    n=n1;
    for(int i=1;i<=m1;i++)
    for(int j=1;j<=n1;j++)
    {
    a[i][j]=x;
    }
    }

    matran::~matran()
    {
    m=n=0;
    }

    void matran::nhapc1()
    {
    cout<<"Nhap so dong:";
    cin>>m;
    cout<<"Nhap so cot: ";
    cin>>n;
    for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
    {
    cout<<"\nNhap phan tu hang "<<i<<" cot "<<j<<" = ";
    cin>>a[i][j];
    }
    }

    void matran::nhapc2()
    {
    do
    {
    cout<<"Nhap so hang:";
    cin>>m;
    cout<<"Nhap so cot:";
    cin>>n;
    }
    while((m<=1||m>=10)&&(n<=1||n>=10));
    for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
    {
    cout<<"\nNhap phan tu hang "<<i<<" cot "<<j<<" = ";
    cin>>a[i][j];
    }
    }

    void matran::xuat()
    {
    for(int i=1;i<=m;i++)
    {
    cout<<"\n";
    for(int j=1;j<=n;j++)
    cout<<a[i][j]<<" ";
    cout<<"\n";
    }
    }
    istream & operator >> (istream &input,matran &k)
    {
    cout<<"Nhap so hang:";
    input>>k.m;
    cout<<"Nhap so cot:";
    input>>k.n;
    for(int i=1;i<=k.m;i++)
    for(int j=1;j<=k.n;j++)
    {
    cout<<"Phan tu hang "<<i<<" cot "<<j<<" :";
    input>>k.a[i][j];
    }
    return input;
    }

    ostream & operator << (ostream &output,matran &k)
    {
    for(int i=1;i<=k.m;i++)
    {
    output<<"\n";
    for(int j=1;j<=k.n;j++)
    output<<k.a[i][j]<<" ";
    output<<"\n";
    }
    return output;
    }

    matran matran::operator+(matran &k)
    {
    matran x;
    if(m!=k.m || n!=k.n)
    {
    cout<<"Hai ma tran phai cung cap moi cong duoc!";
    exit(0);
    }
    else
    {
    x.m = k.m;
    x.n = k.n;
    for(int i=1;i<=x.m;i++)
    for(int j=1;j<=x.n;j++)
    x.a[i][j] = a[i][j]+ k.a[i][j];
    }
    return x;
    }

    matran matran::operator*(matran &k)
    {
    matran x;
    if(m != k.m || n != k.n)
    {
    cout<<"Hai tran phai cung cap moi nhan duoc\n";
    exit(0);
    }
    else
    {
    x.m = k.m;
    x.n = k.n;
    for(int i=1;i<=x.m;i++)
    for(int j=1;j<=x.n;j++)
    {
    x.a[i][j] = 0,0;
    for(int t=1;t<=x.n;t++)
    x.a[i][j] += a[i][t]*k.a[t][j];
    }
    }
    return x;
    }

    void main()
    {
    cout<<"Ham khoi tao ma tran co doi so: ";
    matran x(2,2,1);
    x.xuat();

    cout<<"Nhap ma tran 1\n";
    matran a,b,c,d;
    a.nhapc1();
    cout<<"Xuat ma tran 1:";
    a.xuat();

    cout<<"Nhap ma tran 2\n";
    b.nhapc2();
    cout<<"Xuat ma tran 2:";
    b.xuat();

    cout<<"Hai ma tran cong voi nhau:";
    c=a+b;
    cout<<c;

    cout<<"Hai ma tran nhan voi nhau:";
    d=a*b;
    cout<<d;

    getch();
    }

  2. #2
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    nhân ma trận thì phải phân biệt thứ tự a*b chưa chắc j = b*a.
    bởi dậy phải xét đúng thứ tự
    để ma trận a*b được thì a.n == b.m dậy thôi.
    còn trong điều kiện của bạn bạn thử phủ định lại xem đúng ko nha
    ~(m!=k.m || n!=k.n) <=> m=k.m && n==k.n
    HT117-5277

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Cái mà bạn gọi là "điều kiện 1" thực ra cũng chỉ là trường hợp đặc biệt của "điều kiện 2", vậy nên chỉ cần kiểm tra "điều kiện 2" là đủ:
    if(m != b.n)
    ...

  4. #4
    Ngày gia nhập
    11 2011
    Nơi ở
    Viet Nam
    Bài viết
    34

    Trích dẫn Nguyên bản được gửi bởi treatmaster Xem bài viết
    nhân ma trận thì phải phân biệt thứ tự a*b chưa chắc j = b*a.
    bởi dậy phải xét đúng thứ tự
    để ma trận a*b được thì a.n == b.m dậy thôi.
    còn trong điều kiện của bạn bạn thử phủ định lại xem đúng ko nha
    ~(m!=k.m || n!=k.n) <=> m=k.m && n==k.n
    bạn giải thích khó hiểu quá mình thử làm như bạn thì kết quả ko khả quan hơn mà ngược lại lúc này nhap 2 ma tran cùng cấp thì nó ẽit luôn còn nhập 2 ma trận khác cấp nhưng vẫn thoả điều kiện nhân thì nó ra số quá lớn, nói chung là sai.

    Cái mà bạn gọi là "điều kiện 1" thực ra cũng chỉ là trường hợp đặc biệt của "điều kiện 2", vậy nên chỉ cần kiểm tra "điều kiện 2" là đủ:
    if(m != b.n)
    mình hiểu ý bạn, đã thử theo cách này nhưng sai bạn à.

  5. #5
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Trích dẫn Nguyên bản được gửi bởi code_c Xem bài viết
    mình hiểu ý bạn, đã thử theo cách này nhưng sai bạn à.
    Sai là sai thế nào. Kiểm tra 2 ma trận nhân dc ko thì xem số cột của này có = số hàng của kia ko.
    Chứ bạn xem lại cái điều kiện kiểm tra của bạn ấy. Làm gì có chuyện cột này = cột kia, hàng này = hàng kia ? . Cho bạn cái 2 ma trận [2x3] thêm cái [2x3] nữa xem bạn nhân = cách nào ??

    "ĐÃ HIỂU Ý BẠN". Mà cái Ý ĐÓ LÀ ĐÚNG nhưng chương trình bạn vẫn sai có nghĩa là PHẢI ĐI TÌM CHỖ KHÁC DẪN ĐẾN SAI, chứ ko phải là BIẾN CÁI ĐÚNG ĐẤY THÀNH CÁI KHÁC BẠN TỰ NGHĨ RA để chương trình trở thành ... blah blah

    1 and 1= 1 chứ
    Đang ở trạng thái 0 and 1 = 0
    Thì phải biến sao để về 1 and 1 cho nó = 1 .
    Chứ sao lại chế "0 and 0 để bằng 1 " Làm gì có phép toán này???


    Bạn biết vì sao sai ko ??
    Ma trận kết quả x đâu có dc khởi tạo vùng nhớ ?
    Đã được chỉnh sửa lần cuối bởi clchicken : 23-12-2011 lúc 12:22 PM.
    Um Mani Padme Hum...!!

  6. #6
    Ngày gia nhập
    11 2011
    Nơi ở
    Viet Nam
    Bài viết
    34

    Mặc định Class ma trận, lỗi câu lệnh if kiểm tra điều kiện nhân 2 ma trận, sửa giúp mình!

    Code:
    Sai là sai thế nào. Kiểm tra 2 ma trận nhân dc ko thì xem số cột của này có = số hàng của kia ko.
    Chứ bạn xem lại cái điều kiện kiểm tra của bạn ấy. Làm gì có chuyện cột này = cột kia, hàng này = hàng kia ? . Cho bạn cái 2 ma trận [2x3] thêm cái [2x3] nữa xem bạn nhân = cách nào ?
    bạn nói đúng, nhập 2 ma trận giống y nhau kiểu (2*3) *(2*3) có mà nhân bằng niềm tin
    Bạn biết vì sao sai ko ??
    Ma trận kết quả x đâu có dc khởi tạo vùng nhớ ?
    cái này ko đúng nè, nều thế thì nó đã sai luôn ở phép cộng hay giả sử nhân ma trận (2*2) với (2*2) rồi?

  7. #7
    Ngày gia nhập
    11 2011
    Nơi ở
    Viet Nam
    Bài viết
    34

    Đây là code mới toanh, nhưng tại sao nhập ma trận (2*2)*(2*3) thì hỉ ra ma trận 2*2 còn
    nhập ma trận (2*3) nhân (3*4) thì ra số lớn quá ?

    mà sao cái đoạn này của hàm nhân khó hiểu thế ko biết mình vẽ ra giấy rồi mà vẫn ko hiểu vòng for nó chạy kiểu gì ?
    Code:
    		x.m = n;
    		x.n = k.m;
    		for(int i=1;i<=x.m;i++)
    		for(int j=1;j<=x.n;j++)
    		{
    			x.a[i][j] = 0,0;
    			for(int t=1;t<=x.n;t++)
    			x.a[i][j] += a[i][t]*k.a[i][j];
    		}
    Code:
    #include "stdio.h"
    #include "conio.h"
    #include "iostream"
    #include "math.h"
    
    using namespace std;
    
    class matran
    {
    	private:
    		int m,n;
    		int a[10][10];
    	public:
    		matran();
    		matran(int a,int b,int x);
    		~matran();
    		void nhapc1();//ham nhap lam cach 1
    		void nhapc2();//ham nhap lam cach 2
    		void xuat();
    		matran operator+(matran &k);//tru 2 ma tran lam tuong tu
    		matran operator*(matran &k);
    		friend ostream & operator << (ostream &output, matran &k);
    		friend istream & operator >> (istream &input, matran &k);
    };
    
    matran::matran()
    {
    	m=n=1;
    	a[0][0]=1;
    }
    
    matran::matran(int m1,int n1,int x)
    {
    	m=m1;
    	n=n1;
    	for(int i=1;i<=m1;i++)
    		for(int j=1;j<=n1;j++)
    		{
    			a[i][j]=x;
    		}
    }
    
    matran::~matran()
    {
    	m=n=0;
    }
    
    void matran::nhapc1()
    {
    	cout<<"Nhap so dong:";
    	cin>>m;
    	cout<<"Nhap so cot: ";
    	cin>>n;
    	for(int i=1;i<=m;i++)
    		for(int j=1;j<=n;j++)
    		{
    			cout<<"\nNhap phan tu hang "<<i<<" cot "<<j<<" = ";
    			cin>>a[i][j];
    		}
    }
    
    void matran::nhapc2()
    {
    	do
    	{
    		cout<<"Nhap so hang:";
    		cin>>m;
    		cout<<"Nhap so cot:";
    		cin>>n;
    	}
    	while((m<=1||m>=10)&&(n<=1||n>=10));
    	for(int i=1;i<=m;i++)
    		for(int j=1;j<=n;j++)
    		{
    			cout<<"\nNhap phan tu hang "<<i<<" cot "<<j<<" = ";
    			cin>>a[i][j];
    		}
    }
    
    void matran::xuat()
    {
    	for(int i=1;i<=m;i++)
    	{
    		cout<<"\n";
    		for(int j=1;j<=n;j++)
    			cout<<a[i][j]<<" ";
    			cout<<"\n";
    	}
    }
    istream & operator >> (istream &input,matran &k)
    {
    	cout<<"Nhap so hang:";
    	input>>k.m;
    	cout<<"Nhap so cot:";
    	input>>k.n;
    	for(int i=1;i<=k.m;i++)
    		for(int j=1;j<=k.n;j++)
    		{
    			cout<<"Phan tu hang "<<i<<" cot "<<j<<" :";
    			input>>k.a[i][j];
    		}
    	return input;
    }
    
    ostream & operator << (ostream &output,matran &k)
    {
    	for(int i=1;i<=k.m;i++)
    	{
    		output<<"\n";
    		for(int j=1;j<=k.n;j++)
    			output<<k.a[i][j]<<" ";
    		output<<"\n";
    	}
    	return output;
    }
    
    matran matran::operator+(matran &k)
    {
    	matran x;
    	if(m!=k.m||n!=k.n)
    	{
    		cout<<"Hai ma tran phai cung cap moi cong duoc!";
    		exit(0);
    	}
    	else
    	{
    		x.m = k.m;
    		x.n = k.n;
    		for(int i=1;i<=x.m;i++)
    			for(int j=1;j<=x.n;j++)
    				x.a[i][j] = a[i][j]+ k.a[i][j];
    	}
    	return x;
    }
    
    matran matran::operator*(matran &k)
    {
    	matran x;
    	if(n!=k.m)
    	{
    		cout<<"Hai tran phai cung cap va so hang = so cot hoac so cot ma tran nay = so hang ma tran kia:\n";
    		exit(0);
    	}
    	else
    	{
    		x.m = n;
    		x.n = k.m;
    		for(int i=1;i<=x.m;i++)
    		for(int j=1;j<=x.n;j++)
    		{
    			x.a[i][j] = 0,0;
    			for(int t=1;t<=x.n;t++)
    			x.a[i][j] += a[i][t]*k.a[i][j];
    		}
    	}
    	return x;
    }
    void main()
    {
    	cout<<"Ham khoi tao ma tran co doi so: ";
    	matran x(2,2,1);
    	x.xuat();
    
    	matran e,f,g;
    
    	cout<<"Phep nhan!\n";
    	cout<<"Nhap ma tran 1: \n";
    	e.nhapc1();
    	cout<<"Xuat ma tran  1: ";
    	e.xuat();
    
    	cout<<"Nhap ma tran 2: \n";
    	f.nhapc2();
    	cout<<"Xuat ma tran  2:";
    	f.xuat();
    	cout<<"Hai ma tran nhan voi nhau:";
    	g=e*f;
    	cout<<g;
    
    	getch();
    }

  8. #8
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    Code:
    	x.m = n;
    		x.n = k.m;
    		for(int i=1;i<=x.m;i++)
    		for(int j=1;j<=x.n;j++)
    		{
    			x.a[i][j] = 0,0;
    			for(int t=1;t<=x.n;t++)
    			x.a[i][j] += a[i][t]*k.a[i][j];             // cùng dòng mtrixA này nhân vs cùng dòng mtrixB
    		}
    nhìn dòng nhân là thấy sai rõ ràng
    HT117-5277

  9. #9
    Ngày gia nhập
    11 2011
    Nơi ở
    Viet Nam
    Bài viết
    34

    x.a[i][j] += a[i][t]*k.a[i][j];
    đã fix thành x.a[i][j] += a[i][t]*k.a[t][j]; nhưng vẫn sai bạn à, search gu gồ thấy người khác cũng viết hàm nhân thế này mà sao mình chạy ko dk ta ?

  10. #10
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    2 mtrix A(mxn), B(nxp)
    AxB = C(mxp)

    Code:
    for(int i=0;i<m;i++)
       for(int j=0;j<p;j++)
       {
          C[i][j] = 0 ;
          for(int k=0;k<n;k++)
          {
               C[i][j] += A[i][k]*B[k][i]
          }    
       }
    HT117-5277

Các đề tài tương tự

  1. Nhập khoảng trắng trong Class C++
    Gửi bởi nguyentung2k9 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 4
    Bài viết cuối: 20-12-2011, 04:43 PM
  2. Demo- Sin, cos, e mũ, operator, interface, abs,. class ma trận, phân số, số thực...
    Gửi bởi tesulakata trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 14-11-2011, 03:11 PM
  3. Định dạng lại kiểu trả từ class datetime
    Gửi bởi nhuan07 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 27-08-2011, 08:57 AM
  4. Lỗi khi chạy class ma trận ?
    Gửi bởi tun_tun trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 17-11-2008, 07:23 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn