Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Nhờ tìm lỗi bài lớp Matran thừa kế từ lớp dãy số

  1. #1
    Ngày gia nhập
    06 2007
    Bài viết
    2

    Mặc định Nhờ tìm lỗi bài lớp Matran thừa kế từ lớp dãy số

    Yêu cầu của đề bài là xây dựng lớp ma trận thừa kế từ lớp dãy số:
    Bài này tôi làm và đang có trục trặc như sau:
    khai báo:
    Matrix M,N;
    khi nhập M --> ok
    Nhập xong N thì nội dung của M bị thay đổi
    tìm mãi chẳng hiểu sai chỗ nào nên nhờ các bác tìm lỗi giúp
    Code:
    #include <iostream.h>
    #include <conio.h>
    
    class Array
    {
    	protected:
    		int num;
    		double *a;
    	public:
    		Array() {
    			num =0;
    			a = NULL;
    		}
    		Array(int n) {
    			num = n;
    			a = new double(n);
    		}
    		~Array() {
    			num =0;
    			delete [] a;
    		}
    		friend ostream& operator <<(ostream& os, const Array &X);
    		friend istream& operator >>(istream& is, Array &X);
    };
    ostream& operator<<(ostream& os, const Array &X)
    {
    	for(int i=0; i<X.num; i++)
    		os<<X.a[i]<<"   ";
    	return os;
    }
    istream & operator >>(istream& is, Array &X)
    {
    	if(X.a != NULL)
    		delete X.a;
    	cout<<endl<<"Nhap day so"<<endl<<"So phan tu: ";
    	is>>X.num;
    	X.a = new double(X.num);
    	cout<<endl;
    	for(int i=0; i<X.num; i++) {
    		cout<<"ptu "<<i<<": ";
    		is>>X.a[i];
    	}
    	return is;
    }
    /*		Class Matrix
    */
    class Matrix: protected Array
    {
    	protected:
    		int col;
    	public:
    		Matrix():Array() {
    			col =0;
    		}
    		Matrix(int _row, int _col):Array(_row*_col) {
    			col = _col;
    		}
    		Matrix(Matrix &M) {
    			num = M.num;
    			col = M.col;
    			a = new double(num);
    			for(int i=0; i<num; i++)
    				a[i] = M.a[i];
    		}
    		friend istream& operator >>(istream& is, Matrix &M);
    		friend ostream& operator<< (ostream& os, const Matrix &M);
    		//Matrix operator= (const Matrix &M);
    		Matrix operator- ();
    		Matrix operator+ (const Matrix &M);
    		Matrix operator- (const Matrix &M);
    		Matrix operator* (const Matrix &M);
    
    };
    istream& operator >>(istream& is, Matrix &M)
    {
    	if(M.a != NULL)
    		delete M.a;
    	cout<<endl<<"Nhap mot ma tran"<<endl;
    	cout<<"Cap ma tran (MxN): ";
    	int m,n;
    	is>>m>>n;
    	M.num = m*n;
    	M.a = new double(M.num);
    	M.col = n;
    	for (int i =0; i<m; i++)
    		for(int j=0; j<n; j++) {
    			cout<<"("<<i<<","<<j<<"): ";
    			is>>M.a[i*n +j];
    		}
    	return is;
    }
    ostream& operator<< (ostream& os, const Matrix &M)
    {
    	if (M.col ==0)
       	return os;
    	int m,n;
    	m = M.num/M.col;
    	n = M.col;
    	for (int i=0; i<m; i++) {
    		os<<endl;
    		for (int j=0; j<n; j++)
    			os<<M.a[i*n +j]<<"   ";
    	}
    	return os;
    }
    Matrix Matrix::operator + (const Matrix &M)
    {
    	if(num!= M.num || col!= M.col)
    		return Matrix();
    	int m,n;
    	m = num/col;
    	n = col;
    	Matrix Result(m,n);
    	for(int i=0; i<m; i++)
    		for(int j=0; j<n; j++)
    			Result.a[i*n + j] = a[i*n +j] + M.a[i*n + j];
    	return Result;
    }
    void main()
    {
    	Matrix M,N,X
    	cin>>M;
    	cin>>N;
    	X = M1 + N1;
    	cout<<X;
    }

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Code có con trỏ mà không có toán tử gán, gán cái ầm vậy hả cậu :
    C++ Code:
    1. X = M1 + N1;
    C++ Code:
    1. class Matrix: protected Array
    Tại sao kế thừa protected chỗ này vậy ?

  3. #3
    Ngày gia nhập
    06 2007
    Bài viết
    2

    Tớ debug bài này thì thấy như thế này:
    Nhập M thì được
    sau đó nhập N thì nội dung của M bị thay đổi
    chưa chạy đến phần gán đấy
    mới test đến đấy, tìm không ra lỗi nên không viết tiếp toán tử gán, và mấy cái cộng trừ nhân kia
    Cái thừa kế protected thì có ảnh hưởng gì đâu. vì trong lớp Matrix chỉ dùng các thuộc tính con trỏ int* a thôi mà

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Có phải cậu đang muốn dùng mãng 2 chiều cho thằng Matrix ? Nếu vậy thì làm cách nested class sẽ hay hơn.
    sữa lại dòng :
    C Code:
    1. M.a = new double[M.num];
    Tui dùng g++ thì chưa nhập xong cái M nó đã corrupt rùi.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Đây là 1 cách để tạo ma trận cấp 2 bằng cách dùng nested class, cậu có thích thì dùng :
    C++ Code:
    1. #include <iostream>
    2. #include <vector>
    3. #include <iomanip>
    4.  
    5. class matrix{
    6. private :
    7.   unsigned m_row, m_col;
    8.   std::vector<double> grid;
    9. public:
    10.   matrix():m_row(0), m_col(0){
    11.   }
    12.   matrix(unsigned m_row, unsigned m_col)
    13.     :m_row(m_row), m_col(m_col), grid(m_row*m_col, 0.0){
    14.   }
    15.   double& indices(unsigned dx, unsigned dy){
    16.     return grid[m_row*dx + dy];
    17.   }
    18.   class nested{
    19.   public :
    20.     matrix& ref;
    21.     unsigned index;
    22.     nested(matrix &ref, unsigned index)
    23.       :ref(ref), index(index){
    24.     }
    25.     double& operator[](unsigned inner_ref){
    26.       return ref.indices(index, inner_ref);
    27.     }
    28.   };
    29.   nested operator[](unsigned outer_ref){
    30.     return nested(*this, outer_ref);
    31.   }
    32.   friend
    33.   std::istream& operator >> (std::istream& iss, matrix& rhs){
    34.     unsigned row, col;
    35.     std::cout << "-> [row] [col] : ";
    36.     iss >> row >> col;
    37.     matrix mm(row, col);
    38.     rhs = mm;
    39.     for(unsigned x = 0; x < row; ++x){
    40.       for(unsigned y = 0; y < col; ++y){
    41.         std::cout << '[' << x << ']'
    42.                   << '[' << y << ']';
    43.         iss >> rhs[x][y];
    44.         std::cout << '\n';
    45.       }
    46.     }
    47.     return iss;
    48.   }
    49.   friend
    50.   std::ostream& operator << (std::ostream& oss, matrix& rhs){
    51.     for(unsigned x = 0; x < rhs.m_row; ++x){
    52.       for(unsigned y = 0; y < rhs.m_col; ++y){
    53.         oss << rhs[x][y] << std::setw(5);
    54.       }
    55.       oss << "\n";
    56.     }
    57.     return oss;
    58.   }
    59.  
    60. };
    61.  
    62. int main(){
    63.   matrix M;
    64.   std::cin >> M;
    65.   std::cout << M;
    66. }

  6. #6
    Ngày gia nhập
    06 2007
    Bài viết
    2

    Mặc định Nhờ tìm lỗi bài lớp Matran thừa kế từ lớp dãy số

    @: r_r
    Mã bác viết là trên VC à? mình chưa nghiên cứu về cái này. đọc bài bạn viết thì cũng thấy cái ý tưởng của bài cũng là truy cập dãy số thông qua mảng 2 chiều. Tuy nhiên cái em muốn là tìm ra lỗi của cái bài dãy số kia. Không hiểu là sai ở đâu, có thể là ở mấy cái phần khởi dựng, hàm tạo sao chép, phương thức gán hay hàm hủy gì đó thôi.

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    M.a = new double[M.num];
    Tui sữa lại dòng này và code chạy tốt với compiler của tui. Check kĩ hơn thì tui chưa có thời gian, có thể sinh bug khác, tui sẽ coi lại sau.
    Còn code tui đưa cậu là C++ không có 1 tí gì Window trong đó hết, cậu cứ yên tâm.

  8. #8
    Ngày gia nhập
    06 2007
    Bài viết
    2

    Cám ơn bác r_r!
    đúng là lỗi ở chỗ đấy thật. Tui sửa lại và chạy ngon lành. giở sách của bác PV.Ất ra thì đúng là mình cấp phát bộ nhớ sai. Mà sao mình ghi M.a = new double(M.num) mà nó ko báo lỗi gì nhỉ?
    À quên bác r_r dùng compile gì vậy. thấy cái code bác viết có sử dụng thư viện nào đấy là lạ. Theo bác thì nên dùng gì compile gì thì tốt?

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Visual C++ 2008 (Bộ debugging rất tốt), Code::Block 8.2 : dùng compiler gcc và g++ -> tui dùng 2 thằng này hầu hết thời gian.
    Mà sao mình ghi M.a = new double(M.num)
    Nó sẽ nghĩ là cấp báo cho 1 biến đơn chứ không phải mãng có độ dài M.num.

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

  1. Viết code tạo Matran tính định thưc.
    Gửi bởi ĐạiBàng trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 21-02-2012, 10:19 AM
  2. [C++] Matran
    Gửi bởi khoale trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 05-06-2007, 11:10 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