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ố 11 kết quả

Đề tài: Bài tập về ma trận | Cộng trừ nhân chia ma trận theo con trỏ?

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Wink Bài tập về ma trận | Cộng trừ nhân chia ma trận theo con trỏ?

    Ông thầy em cho đề về nhà cộng trừ nhân hai ma trận theo con trỏ.
    int Nhapmt(int **a,int dong,int cot)
    int Xuatmt(int **a,int dong,int cot)
    int **Cong2mt(int **a,int dongA,int cotA,int **b,int dongB,int cotB)
    Hai hàm Nhập và xuất ma trận em đã là được còn hàm cộng ma trận em biết:
    phương pháp là Cij=Aij+Bij nhưng khai báo hàm như thầy em thì em không hiểu phải trả giá trị về như thế nào và làm sao để sử dụng nó

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

    Đây là ví dụ :
    C++ Code:
    1. #include <iostream>
    2. using std::size_t;
    3.  
    4. int** Add2Matrix(int** matrixA, size_t aRow, size_t aCol,
    5.                         int** matrixB, size_t bRow, size_t bCol)
    6. {
    7.     //cấp phát động cho mãng 2 ở đây, phải khai báo static
    8.     //nếu không compiler sẽ hiểu là local variable, mà như thế
    9.    //thì sau khi hàm kết thúc nó sẽ không còn tác dụng nữa
    10.    //có trả về cũng vô dụng
    11.  
    12.     //cách tạo mãng 2
    13.     static int **addition = new int*[R];
    14.     for(int x = 0; x < R; ++x){
    15.         addition = new int[R];
    16.     }
    17.     ....
    18.     //tính toán gì đó
    19.     return addition; //trả về cái mãng đó ở đây.
    20.  }  
    21.  
    22.  int main(){
    23.     int A[][], B[][]...
    24.     int **arr2D = Add2Matrix(A, B, ....);
    25.     //pass thằng này vào hàm với row và col
    26.     ....
    27.  
    28.     //giải phóng vùng nhớ cho nó
    29.     for(int x = 0; x < R; ++x){
    30.         delete[] arr2D[x];
    31.     }
    32.    
    33.     delete[] arr2D;
    34.     return 0;
    35. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 21-03-2008 lúc 11:51 AM.

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

    Sorry, cái này C++, cậu vào box C tìm sẽ thấy có ví dụ về khai báo mãng 2 trong C, dùng malloc và alloc...
    Nhưng cái thao tác trả về thì nó cũng tương tự như vậy.
    - Sữa lại delete -> free. Nếu vẫn không ra thì tui sẽ cho ví dụ sau !

  4. #4
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Vậy còn cấp phát động và giải phóng bộ nhớ em viết 2 hàm và sử dụng có được không,hay phải viết trong 1 hàm AddMatrix như anh.
    Ví dụ:
    void CapPhat (int **&a,int &rows,int &columns);
    void GiaiPhong (int **a,int rows);
    Như vậy có đúng không anh?(Em không hiểu rõ về cái tham chiếu đó anh,không có dấu & thì không sử dụng được phải không anh)

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

    C++ Code:
    1. void CapPhat (int **&a,int &rows,int &columns);
    Nếu truyền tham chiếu cho hàng và cột thì cũng được, ref hiệu quả hơn chỗ là nó không tạo copy cho biến đó, nhưng nếu không có ý định chỉnh sữa hàng và cột thì truyền const int& row...
    C++ Code:
    1. nt **&a
    Cái này đọc từ phải qua, tham chiếu tới con trỏ tới con trỏ, vấn đề là trả về con trỏ sẽ tiện hơn, không cần tham chiếu làm gì, nếu truyền mãng 2 chiều hay 1 chiều vào : thì bản thân đã là truyền con trỏ rồi. Ví dụ
    [code=cpp] func(int A[]); <-> func(int *A);
    C++ Code:
    1.  func(int A[][col] <-> func(int **A);
    Trả về con trỏ chỗ đó là ok, chỉ nhớ giải phóng vùng nhớ tránh memory leak là được. Nếu trong C++ thì tui sẽ dùng shared_ptr or scoped_ptr, nhưng mấy cái này mới học thì chẳng cần quan tâm. Tập thao tác tay cho quen để hiểu sâu hơn về con trỏ.
    -Tham chiếu thì hiểu thế này :
    Code:
     
    int value;
    int &ref = value;
    ref = 5; //tuơng đuơng với value = 5;
    ref chẳng qua là cái tên thứ 2 của value thôi, khi tui sữa ref thì value cũng thay đổi theo, tui nghĩ cái này cậu hiểu.
    -> vậy khi tui truyền tham chiếu vào hàm thay chẳng qua tui đưa cái nick name vào hàm để tui thay đổi giá trị của nói thôi.
    ->
    C++ Code:
    1. void func(int& ref)
    2. {
    3.     ref = 5; //value cũng = 5;
    4. }
    Vậy func(int** &a)
    thì chỉ là tham chiếu tới con trỏ_tới_con_trỏ để thay đổi nội dung của con_trỏ_tới_con_trỏ, làm thế này thì cũng được nhưng nó không rõ ràng. Vì sa o ? Vì bản chất con trỏ cũng thay đổi được nội dung mà nó trỏ tới, vậy thì con trỏ cũng mang ý nghĩa như ref :
    C++ Code:
    1. int value;
    2. int* ptr = &value;
    3. *ptr = 5; //value cũng bằng 5, chỉ khác syntax màu mè thêm tí thôi.
    Vậy chỉ cần pass int** là đủ, cái tham chiếu đó là ko rõ ràng.

  6. #6
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Mặc định Bài tập về ma trận | Cộng trừ nhân chia ma trận theo con trỏ?

    Anh có thể cho em nick yahoo để tiện cho em hỏi anh được không anh.Chứ anh trả lời kiểu này thì lâu quá!!Mong anh giúp cho em.

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

    Ráng tự đọc và suy nghĩ cho quen, suy nghĩ sao đó rùi post lên đây tui sẽ giải thích. H của tui bên đây đã là 1h sáng, mai tui còn đi làm T_T, với lại dạo này tui không còn xài Yahoo nữa. Cho nên rất hiếm khi tui OL. Cứ đọc theo đó làm thử cái đã rùi post lên đây, học chậm có cái giá của nó, càng suy nghĩ về nó càng nhớ dai và càng hiểu sâu, tập suy nghĩ là 1 thói quen tốt nếu muốn giỏi thực sự. Rùi sau đó nếu vẫn không ra thì tui sẽ giúp, lúc đó hiểu sẽ tốt hơn.

  8. #8
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Thanks anh rất nhiều nha! Có gì em không hiểu nhất định sẽ hỏi anh,nhưng anh phải trả lời cho đúng đấy nha!

  9. #9
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Đây là ví dụ :
    C++ Code:
    1. #include <iostream>
    2. using std::size_t;
    3.  
    4. int** Add2Matrix(int** matrixA, size_t aRow, size_t aCol,
    5.                         int** matrixB, size_t bRow, size_t bCol)
    6. {
    7.     //cấp phát động cho mãng 2 ở đây, phải khai báo static
    8.     //nếu không compiler sẽ hiểu là local variable, mà như thế
    9.    //thì sau khi hàm kết thúc nó sẽ không còn tác dụng nữa
    10.    //có trả về cũng vô dụng
    11.  
    12.     //cách tạo mãng 2
    13.     static int **addition = new int*[R];
    14.     for(int x = 0; x < R; ++x){
    15.         addition = new int[R];
    16.     }
    17.     ....
    18.     //tính toán gì đó
    19.     return addition; //trả về cái mãng đó ở đây.
    20.  }  
    21.  
    22.  int main(){
    23.     int A[][], B[][]...
    24.     int **arr2D = Add2Matrix(A, B, ....);
    25.     //pass thằng này vào hàm với row và col
    26.     ....
    27.  
    28.     //giải phóng vùng nhớ cho nó
    29.     for(int x = 0; x < R; ++x){
    30.         delete arr2D[x];
    31.     }
    32.    
    33.     delete[] arr2D;
    34.     return 0;
    35. }
    Như anh chỉ dẫn ở trên thì phải dùng thêm 1 con trỏ là arr2D
    (int **arr2D = Add2Matrix(A, B, ....); để gán cho con trỏ addition
    (static int **addition = new int*[R];
    int **arr2D = Add2Matrix(A, B, ....);
    vậy có thể khai báo con trỏ int **addition là một biến ngoài.Như vậy thì đỡ mất công khai báo thêm con trỏ int **arr2D.Nhưng làm thế thì giải phóng bộ nhớ có được không anh vì biến ngoài thì tồn tại trong suốt chương trình làm việc.

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

    Thực sự mà nói anh không thích cái kiểu alloc, malloc của C, nhìn quá rắc rối, bên C++ thì chỉ new -> delete. Đây là 1 ví dụ, anh dùng template để cho em có cái nhìn tổng quát hơn, còn em muốn dùng kiểu gì thì chỉ cần nói cho nó biết, ví dụ :
    C++ Code:
    1. int **arr2D = create2DMatrix<int>(r, c);
    2. int **arr2D = create2DMatrix<char>(r, c);
    3. int **arr2D = create2DMatrix<double>(r, c);
    4. int **arr2D = create2DMatrix<string>(r, c);
    5. ....

    Demo :
    C++ Code:
    1. #include <iostream>
    2.  
    3. template <typename T>
    4. T** create2DMatrix(const unsigned& row, const unsigned& col){
    5.     static T** arr2D = new T*[row];
    6.     for(unsigned x = 0; x < row; ++x)
    7.         arr2D[x] = new T[col];
    8.    
    9.     return arr2D;
    10. }
    11.  
    12. /* comment out : a specific type ( int ).
    13. int** create2DMatrix(const unsigned& row, const unsigned& col){
    14.     static int** arr2D = new int*[row];
    15.     for(unsigned x = 0; x < row; ++x)
    16.         arr2D[x] = new int[col];
    17.    
    18.     return arr2D;
    19. }
    20. */
    21.  
    22. int main(){
    23.     const unsigned r = 5;
    24.     const unsigned c = 6;
    25.     int **arr2D = create2DMatrix<int>(r, c);
    26.    
    27.     //reclaim memory is here
    28.     for(int x = 0; x <= r; x++)
    29.         delete[] arr2D[x];
    30.    
    31.     delete[] arr2D;
    32.     return 0;
    33. }

    vậy có thể khai báo con trỏ int **addition là một biến ngoài.Như vậy thì đỡ mất công khai báo thêm con trỏ int **arr2D.Nhưng làm thế thì giải phóng bộ nhớ có được không anh vì biến ngoài thì tồn tại trong suốt chương trình làm việc.
    Global variable is poor style should avoid.
    Thực ra cách trên cũng chỉ tuơng đối, vì nếu dùng với nhiều thằng nữa sẽ sinh ra memory leak, nhưng mấy kĩ thuật này thì không phải newbie, h anh ghi ra thì em chỉ có freak out, chứ chẳng tiếp thu được, cứ từ từ học 1 thời gian sẽ hiểu.

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

  1. [Hỏi] Cách nhân 2 ma trận với các phần tử của ma trận đợc để trong mảng 1 chiều.
    Gửi bởi code_c trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 23-09-2012, 10:24 PM
  2. Xoay ma trận một góc 90 độ ngược chiều kim đồng hồ vối ma trận thường
    Gửi bởi prince7seas 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: 11-07-2012, 10:03 PM
  3. Algorithm Chia ma trận thành các ma trận con bằng nhau như thế nào
    Gửi bởi xinbat trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 30-12-2011, 11:14 PM
  4. sắp xếp ma trận theo tổng tăng dần,tính định thức ma trận
    Gửi bởi hoahoctro207 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-12-2010, 02:23 PM
  5. Sắp xếp ma trận 2 chiều theo cột trên exel
    Gửi bởi pkv trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 13-11-2010, 08:35 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