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

Đề tài: Bài tập về lớp và template

  1. #1
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Mặc định Bài tập về lớp và template

    Code:
    1.	(Lớp Matrix)
    Xây dựng kiểu (lớp) ma trận 2 chiều (mỗi phần tử là một số nguyên) dùng để thay thế cho việc khai báo tĩnh
    int a[r][c] ;
    Áp dụng cho bài toán:
    a) Nhập vào 2 ma trận kích thước I x Y, tính tổng 2 ma trận số nguyên với kích thước và giá trị nhập từ bàn phím.
    b) Nhập vào 2 ma trận kích thước I x Y và Y x K, hãy tính tích 2 ma trận này, kết quả là ma trận I x K.
    Cho trước khai báo lớp ma trận nguyên:
    class Matrix
    {     int **data;
           int nRows, nCols;
    public:
          // Hàm khởi tạo ma trận mặc định.
    Matrix();
    // Hàm khởi tạo kích thước ma trận (bao gồm cấp phát động) với số //hàng bằng r và số cột bằng c.
    Matrix(int r,int c) ;
    // Hàm hủy (bao gồm giải phóng bộ nhớ)
    ~Matrix() ;
    void setAt(int i, int j, int x) ; // Đặt giá trị phần tử (i,j) bằng x.
    int getAt(int i, int j) ; //Lấy giá trị phần tử (i,j) của ma trận
    void display() ; //Hiển thị ma trận ra màn hình.
    void resize(int r, int c); //Đặt lại kích thước ma trận
    // Cộng hai ma trận
    friend Matrix operator+(const Matrix &m1, const Matrix &m2);
    // Nhân hai ma trận
    friend Matrix operator-(const Matrix &m2, const Matrix &m2);
        };
    
    2.	(Template lớp)
    Hãy làm bài 1 với ma trận tổng quát: mỗi phần tử có kiểu là T. Sau đấy áp dụng cho ma trận số thực
    template <class T>
    class Matrix
    {
    T *data ;
    …
    };
    Ví dụ về áp dụng
    Matrix<float> mt(3,5);
    Bài 1 thì mình làm được rồi
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3.  
    4. using namespace std;
    5.  
    6. class Matrix
    7. {
    8.     private:   
    9.         int **data;
    10.         int nRows, nCols;
    11.     public:
    12.         // Ham khoi tao Ma tran mac dinh
    13.         Matrix();
    14.         // Ham khoi tao kich thuoc ma tran (bao gom cap phat dong voi so
    15.         // hang bang r va so cot bang c
    16.         Matrix(int r,int c) ;
    17.         // Ham huy ( bao gom giai phong bo nho )
    18.         ~Matrix() ;
    19.         void Input(int row,int col);
    20.         void setAt(int i, int j, int x) ; // dat gia tri phan tu (i,j) bang x
    21.         int getAt(int i, int j) ; // Lay gia tri phan tu (i,j)
    22.         void display() ; //Hien thi Ma tran ra man hinh
    23.         void resize(int r, int c); //Dat lai kich thuoc ma tran
    24.         // Cong hai ma tran
    25.         friend Matrix operator+(const Matrix &m1, const Matrix &m2);
    26.         // Nhan hai ma tran
    27.         friend Matrix operator-(const Matrix &m2, const Matrix &m2);
    28. };
    29.  
    30. Matrix::Matrix()
    31. {
    32.     nRows=nCols=0;
    33. }
    34. Matrix::Matrix(int r,int c)
    35. {
    36.     nRows=r;
    37.     nCols=c;
    38.     data=new int *[nRows];
    39.     for(int i=0;i<nRows;i++)
    40.         *(data+i)=new int[nCols];  
    41. }
    42. Matrix::~Matrix()
    43. {
    44.     for(int i=0;i<nRows;i++)
    45.         delete[] data[i];
    46.     delete[] data; 
    47. }
    48. void Matrix::Input(int row,int col)
    49. {
    50.     for(int i=0;i<row;i++)
    51.         for(int j=0;j<col;j++)
    52.         {
    53.             cout << "\tPT " << i+1 << j+1 << " : "; cin >> data[i][j];
    54.             setAt(i,j,data[i][j]); 
    55.         }      
    56. }
    57. void Matrix::setAt(int i,int j,int x)
    58. {
    59.     *(*(data+i)+j)=x; // data[i][j]=x  
    60. }
    61. int Matrix::getAt(int i,int j)
    62. {
    63.     return *(*(data+i)+j); 
    64. }
    65. void Matrix::display()
    66. {
    67.     for(int i=0;i<nRows;i++)
    68.     {
    69.         for(int j=0;j<nCols;j++)
    70.             cout << "\t" << *(*(data+i)+j) << setw(5) << "  "; // cout << data[i][j]
    71.         cout << endl << endl ;
    72.     }      
    73. }
    74. void Matrix::resize(int r,int c)
    75. {
    76.     if(r<=nRows)
    77.         nRows=r;
    78.     if(c<=nCols)
    79.         nCols=c;
    80.     if(r>nRows)
    81.     {
    82.         for(int i=nRows;i<r;i++)
    83.             for(int j=0;j<nCols;j++)
    84.             {
    85.                 cout << "PT " << i+1 << j+1 << " : ";
    86.                 cin >> data[i][j]; 
    87.             }
    88.         nRows=r;   
    89.     }
    90.     if(c>nCols)
    91.     {
    92.         for(int i=0;i<nRows;i++)
    93.             for(int j=nCols;j<c;j++)
    94.             {
    95.                 cout << "PT " << i+1 << j+1 << " : ";
    96.                 cin >> data[i][j]; 
    97.             }
    98.         nCols=c;   
    99.     }  
    100.    
    101. }
    102. Matrix::Matrix operator + (const Matrix &m1,const Matrix &m2)
    103. {
    104.     Matrix m(m1.nRows,m1.nCols);
    105.     for(int i=0;i<m1.nRows;i++)
    106.         for(int j=0;j<m1.nCols;j++)
    107.             m.data[i][j]=m1.data[i][j]+m2.data[i][j];  
    108.     return m;      
    109. }
    110. Matrix::Matrix operator - (const Matrix &m1,const Matrix &m2)
    111. {
    112.     Matrix m(m1.nRows,m2.nCols);
    113.     for(int i=0;i<m1.nRows;i++)
    114.         for(int j=0;j<m2.nCols;j++)
    115.         {
    116.             m.data[i][j]=0;
    117.             for(int t=0;t<m2.nRows;t++)
    118.                 m.data[i][j] += m1.data[i][t]*m2.data[t][j];   
    119.         }
    120.     return m;      
    121. }
    122. int main()
    123. {
    124.     int row,col,col1;  
    125.     do
    126.     {
    127.         cout << "Nhap hang cua Ma Tran A : ";   cin >> row;
    128.         cout << "Nhap cot cua Ma Tran A : ";    cin >> col;
    129.     }while(row==1 && col==1);
    130.     Matrix A(row,col),B(row,col);
    131.     cout << "Nhap cac PT cua Ma Tran A : " << endl;
    132.     A.Input(row,col);
    133.     cout << "Ma Tran A la : " << endl;
    134.     A.display();
    135.     cout << "Ma Tran B co so cot , hang nhu Ma Tran A " << endl;
    136.     cout << "Nhap cac PT cua Ma Tran B : " << endl;
    137.     B.Input(row,col);
    138.     cout << "Ma Tran B la : " << endl;
    139.     B.display();
    140.  
    141.     //Tong cua 2 Ma Tran C=A+B
    142.     Matrix C = A + B;
    143.     cout << "Tong cua 2 Ma Tran C = A + B la : " << endl;
    144.     C.display();
    145.    
    146.     //Tich cua hai Ma Tran
    147.     cout << "Ma Tran D co so hang = so cot cua Ma Tran A = " << col;
    148.     cout << endl << "Nhap so cot cua Ma Tran D : ";     cin >> col1;
    149.     Matrix D(col,col1);
    150.     D.Input(col,col1);
    151.     cout << "Ma Tran D la : " << endl;
    152.     D.display();
    153.     Matrix E = A - D;
    154.     cout << "Tich cua 2 Ma Tran E = A * D la : " << endl;
    155.     E.display();
    156.     system("cls");
    157.     //Thay doi kich thuoc Ma Tran A
    158.     cout << "Ma Tran A : " << endl;
    159.     A.display();
    160.     int cot,hang;
    161.     cout << "Nhap hang moi : "; cin >> hang;
    162.     cout << "Nhap cot moi : ";  cin >> cot;
    163.     A.resize(hang,cot);
    164.     cout << "Ma tran A sau khi thay doi : " << endl;
    165.     A.display();   
    166.     system("pause");   
    167. }

    Đọc đến bài 2 ko hiểu chi cả , template thì mình cũng hiểu ít , nhưng sao đề bài 2 mình ko hiểu . Mong mọi người gợi ý cho mình bài 2 cái ( Giải thích giùm về template lớp cho dễ hiểu chút nhé )
    Thank

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Tớ cũng mù mờ vụ này lắm.

    Khai báo thế này:
    template<class T>
    class CMatrix
    {
    ------
    void ex();
    }

    template<class T>
    void Matrix<T>::ex()
    {
    // Code ở đây.
    }

    còn yêu cầu thì như nhau phải ko nhỉ ?

  3. #3
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Bài viết của mình đây , lỗi tùm lum
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3.  
    4. using namespace std;
    5.  
    6. template <class T>
    7. class Matrix
    8. {
    9.     private:   
    10.         T **data;
    11.         int nRows, nCols;
    12.     public:
    13.         // Ham khoi tao Ma tran mac dinh
    14.         Matrix();
    15.         // Ham khoi tao kich thuoc ma tran (bao gom cap phat dong voi so
    16.         // hang bang r va so cot bang c
    17.         Matrix(int r,int c) ;
    18.         // Ham huy ( bao gom giai phong bo nho )
    19.         ~Matrix() ;
    20.         void Input(int row,int col);
    21.         void setAt(int i, int j, T x) ; // dat gia tri phan tu (i,j) bang x
    22.         T getAt(int i, int j) ; // Lay gia tri phan tu (i,j)
    23.         void display() ; //Hien thi Ma tran ra man hinh
    24.         void resize(int r, int c); //Dat lai kich thuoc ma tran
    25.         // Cong hai ma tran
    26. //      friend Matrix operator+(const Matrix &m1, const Matrix &m2);
    27.         // Nhan hai ma tran
    28. //      friend Matrix operator-(const Matrix &m2, const Matrix &m2);
    29. };
    30. template <class T>
    31. Matrix<T>::Matrix()
    32. {
    33.     nRows=nCols=0;
    34. }
    35. template <class T>
    36. Matrix<T>::Matrix(int r,int c)
    37. {
    38.     nRows=r;
    39.     nCols=c;
    40.     data=new T *[nRows];
    41.     for(int i=0;i<nRows;i++)
    42.         *(data+i)=new T[nCols];
    43. }
    44. template <class T>
    45. Matrix<T>::~Matrix()
    46. {
    47.     for(int i=0;i<nRows;i++)
    48.         delete[] data[i];
    49.     delete[] data; 
    50. }
    51. template <class T>
    52. void Matrix<T>::Input(int row,int col)
    53. {
    54.     for(int i=0;i<row;i++)
    55.         for(int j=0;j<col;j++)
    56.         {
    57.             cout << "\tPT " << i+1 << j+1 << " : "; cin >> data[i][j];
    58.             setAt(i,j,data[i][j]); 
    59.         }      
    60. }
    61. template <class T>
    62. void Matrix<T>::setAt(int i,int j,T x)
    63. {
    64.     *(*(data+i)+j)=x; // data[i][j]=x  
    65. }
    66. template <class T>
    67. T Matrix<T>::getAt(int i,int j)
    68. {
    69.     return *(*(data+i)+j); 
    70. }
    71. template <class T>
    72. void Matrix<T>::display()
    73. {
    74.     for(int i=0;i<nRows;i++)
    75.     {
    76.         for(int j=0;j<nCols;j++)
    77.             cout << "\t" << *(*(data+i)+j) << setw(5) << "  "; // cout << data[i][j]
    78.         cout << endl << endl ;
    79.     }      
    80. }
    81. template <class T>
    82. void Matrix<T>::resize(int r,int c)
    83. {
    84.     if(r<=nRows)
    85.         nRows=r;
    86.     if(c<=nCols)
    87.         nCols=c;
    88.     if(r>nRows)
    89.     {
    90.         for(int i=nRows;i<r;i++)
    91.             for(int j=0;j<nCols;j++)
    92.             {
    93.                 cout << "PT " << i+1 << j+1 << " : ";
    94.                 cin >> data[i][j]; 
    95.             }
    96.         nRows=r;   
    97.     }
    98.     if(c>nCols)
    99.     {
    100.         for(int i=0;i<nRows;i++)
    101.             for(int j=nCols;j<c;j++)
    102.             {
    103.                 cout << "PT " << i+1 << j+1 << " : ";
    104.                 cin >> data[i][j]; 
    105.             }
    106.         nCols=c;   
    107.     }  
    108.    
    109. }
    110. Matrix::Matrix operator + (const Matrix &m1,const Matrix &m2)
    111. {
    112.     Matrix m(m1.nRows,m1.nCols);
    113.     for(int i=0;i<m1.nRows;i++)
    114.         for(int j=0;j<m1.nCols;j++)
    115.             m.data[i][j]=m1.data[i][j]+m2.data[i][j];  
    116.     return m;      
    117. }
    118. Matrix::Matrix operator - (const Matrix &m1,const Matrix &m2)
    119. {
    120.     Matrix m(m1.nRows,m2.nCols);
    121.     for(int i=0;i<m1.nRows;i++)
    122.         for(int j=0;j<m2.nCols;j++)
    123.         {
    124.             m.data[i][j]=0;
    125.             for(int t=0;t<m2.nRows;t++)
    126.                 m.data[i][j] += m1.data[i][t]*m2.data[t][j];   
    127.         }
    128.     return m;      
    129. }
    130. int main()
    131. {
    132.     int row,col,col1;  
    133.     do
    134.     {
    135.         cout << "Nhap hang cua Ma Tran A : ";   cin >> row;
    136.         cout << "Nhap cot cua Ma Tran A : ";    cin >> col;
    137.     }while(row==1 && col==1);
    138.     Matrix<T> A(row,col),B(row,col);
    139.     cout << "Nhap cac PT cua Ma Tran A : " << endl;
    140.     A.Input(row,col);
    141.     cout << "Ma Tran A la : " << endl;
    142.     A.display();
    143.     cout << "Ma Tran B co so cot , hang nhu Ma Tran A " << endl;
    144.     cout << "Nhap cac PT cua Ma Tran B : " << endl;
    145.     B.Input(row,col);
    146.     cout << "Ma Tran B la : " << endl;
    147.     B.display();
    148.  
    149.     //Tong cua 2 Ma Tran C=A+B
    150.     Matrix<T> C = A + B;
    151.     cout << "Tong cua 2 Ma Tran C = A + B la : " << endl;
    152.     C.display();
    153.    
    154.     //Tich cua hai Ma Tran
    155.     cout << "Ma Tran D co so hang = so cot cua Ma Tran A = " << col;
    156.     cout << endl << "Nhap so cot cua Ma Tran D : ";     cin >> col1;
    157.     Matrix<T> D(col,col1);
    158.     D.Input(col,col1);
    159.     cout << "Ma Tran D la : " << endl;
    160.     D.display();
    161.     Matrix E = A - D;
    162.     cout << "Tich cua 2 Ma Tran E = A * D la : " << endl;
    163.     E.display();
    164.     system("cls");
    165.     //Thay doi kich thuoc Ma Tran A
    166.     cout << "Ma Tran A : " << endl;
    167.     A.display();
    168.     int cot,hang;
    169.     cout << "Nhap hang moi : "; cin >> hang;
    170.     cout << "Nhap cot moi : ";  cin >> cot;
    171.     A.resize(hang,cot);
    172.     cout << "Ma tran A sau khi thay doi : " << endl;
    173.     A.display();   
    174.     system("pause");   
    175. }
    Các bác coi lỗi giùm mình cái

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

    Bài template bạn làm quá ẩu, sai toàn lỗi cơ bản, bạn cố tình sai thì đúng hơn, lỗi toàn gì không đâu à. Hàm nào không đụng tới resource thì phải cho const liền.
    Còn hàm resize() ? Chẳng hiểu nó là gì, bạn resize cột hàng rùi ko reclaim memory luôn ? Làm pointer mà cứ như mãng vậy à ? Copy constructor đâu, overloand operator "=" ?

    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3.  
    4. using namespace std;
    5.  
    6. template <class T>
    7. class Matrix
    8. {
    9.     private:   
    10.         T **data;
    11.         int nRows, nCols;
    12.     public:
    13.         Matrix();
    14.         Matrix(int r,int c) ;
    15.         ~Matrix() ;
    16.         void Input(int row,int col);
    17.         void setAt(int i, int j, T x) ;
    18.         T getAt(int i, int j);
    19.         void display() const;
    20.         void resize(int r, int c);
    21.         Matrix operator + (const Matrix &right);
    22.        
    23. };
    24.  
    25. template <class T>
    26. Matrix<T>::Matrix()
    27. {
    28.     nRows=nCols=0;
    29. }
    30.  
    31. template <class T>
    32. Matrix<T>::Matrix(int r,int c)
    33. {
    34.     nRows = r;
    35.     nCols = c;
    36.     data = new T*[nRows];
    37.     for(int i=0;i < nRows;i++)
    38.         *(data+i)= new T[nCols];   
    39. }
    40.  
    41. template <class T>
    42. Matrix<T>::~Matrix()
    43. {
    44.     for(int i = 0; i < nRows; i++)
    45.         delete[] data[i];
    46.     delete[] data; 
    47. }
    48.  
    49. template <class T>
    50. void Matrix<T>::Input(int row,int col)
    51. {
    52.     for(int i=0;i<row;i++)
    53.         for(int j=0;j<col;j++)
    54.         {
    55.             cout << "\tPT " << i+1 << j+1 << " : "; cin >> data[i][j];
    56.             setAt(i,j,data[i][j]); 
    57.         }      
    58. }
    59.  
    60. template <class T>
    61. void Matrix<T>::setAt(int i, int j, T x)
    62. {
    63.     data[i][j] = x;    
    64. }
    65.  
    66.  
    67. template <class T>
    68. T Matrix<T>::getAt(int i,int j)
    69. {
    70.     return data[i][j]; 
    71. }
    72.  
    73. template <class T>
    74. void Matrix<T>::display() const
    75. {
    76.     for(int i = 0; i < nRows; i++)
    77.     {
    78.         for(int j = 0; j < nCols;j++)
    79.             cout << "\t" << data[i][j] << '-';
    80.         cout << '\n';
    81.     }      
    82. }
    83.  
    84. template <class T>
    85. Matrix<T> Matrix<T>::operator + (const Matrix<T> &right)
    86. {
    87.     int common_row;
    88.         common_col;
    89.     if(right.nCols > nCols)
    90.         common_col = right.nCols;
    91.     else
    92.         common_col = nCols;
    93.  
    94.     if(right.nRows > nRows)
    95.         common_row = right.nRows;
    96.     else
    97.         common_row = nRows;
    98.  
    99.  
    100.     Matrix sumation(common_row, common_col);
    101.     for(int i = 0; i < common_row; ++i)
    102.         for(int j = 0; j < common_col; ++j)
    103.             sumation.data[i][j] = right.data[i][j] + data[i][j];    
    104.    
    105.     return sumation;       
    106. }
    107.  
    108. int main()
    109. {
    110.     Matrix<int>(5,6);
    111.     return 0;
    112.  
    113. }
    Mình viết lại sơ thôi, tưởng bạn sai lỗi gì, do bạn làm ẩu quá !!

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

  1. Lập trình C++ template là gì? sử dụng template như thế nào?
    Gửi bởi dangvanhoavc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 16-01-2013, 09:11 PM
  2. Kỹ thuật C++ Template Method có liên quan gì đến template trong C++ ko?
    Gửi bởi ten_truycap trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 22-10-2010, 11:26 PM
  3. Cách xây dựng và sử dụng template và mảng template trong C++?
    Gửi bởi nhatnha trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-08-2010, 06:24 PM
  4. template
    Gửi bởi wawa trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 10-01-2009, 07:36 PM
  5. Cho em hỏi về Template
    Gửi bởi piglet trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 23-05-2008, 08:41 AM

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