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

Đề tài: Viết hàm nhập ma trận được cấp phát động như thế nào

  1. #1
    Ngày gia nhập
    10 2010
    Nơi ở
    Đại học Bách Khoa Hà Nội
    Bài viết
    45

    Mặc định Viết hàm nhập ma trận được cấp phát động như thế nào

    Mình đang viết một hàm nhập ma trận được cấp phát động nhưng chưa rành lắm về con trỏ. Đoạn code này sửa thế nào để chương trình chạy được??

    C++ Code:
    1. #include <stdio.h>
    2. #include <iostream>
    3. #include <stdlib.h>
    4. using namespace std;
    5. void nhapMT(int **p, int h, int c)
    6. {
    7.     for (int i = 0; i<h; i++)
    8.         for (int j=0; j<c; j++)
    9.         {
    10.             printf("a[%d][%d] = ", i, j);
    11.             cin >> p[i][j];
    12.         }
    13. }
    14. int main()
    15. {
    16.     cout << "Nhap so hang va cot ma tran: ";
    17.     int h, c;
    18.     cin >> h >> c;
    19.     //Cap phat dong cho ma tran
    20.     typedef int Array[c];
    21.     Array *p = new Array[h];
    22.    
    23.     nhapMT(p, h, c);
    24.     return 0;
    25. }
    Chẳng biết mình muốn cái gì nữa :v

  2. #2
    Ngày gia nhập
    03 2011
    Bài viết
    44

    Mặc định Gởi bạn đoạn code tham khảo!

    C++ Code:
    1. #include <stdio.h>
    2. #include <iostream>
    3. #include <stdlib.h>
    4. using namespace std;
    5.  
    6. void NhapMT(int **p, int h, int c)
    7. {
    8.     for (int i = 0; i<h; i++)
    9.     for (int j=0; j<c; j++)
    10.     {
    11.         printf("Nhap a[%d][%d] = ", i, j);
    12.         cin >> p[i][j];
    13.     }
    14. }
    15. void XuatMT(int **p,int h, int c)
    16. {
    17.      for(int i=0;i<h;i++)
    18.      {
    19.          for(int j=0;j<c;j++)cout<<p[i][j]<<" ";
    20.          cout<<endl;
    21.      }
    22. }
    23. int main()
    24. {    
    25.     int h, c;
    26.     int **p;
    27.    
    28.     cout << "Nhap so hang: ";
    29.     cin >> h;
    30.     cout << "Nhap so cot: ";
    31.     cin >> c;
    32.    
    33.     for(int i=0;i<h;i++)p[i] =  new int [c];    
    34.     NhapMT(p, h, c);
    35.     XuatMT(p, h, c);
    36.    
    37.    
    38.     system("pause");
    39.     return 0;
    40. }
    Chúc may mắn.

  3. #3
    Ngày gia nhập
    10 2010
    Nơi ở
    Đại học Bách Khoa Hà Nội
    Bài viết
    45

    Trích dẫn Nguyên bản được gửi bởi phuchaontu Xem bài viết
    C++ Code:
    1. #include <stdio.h>
    2. #include <iostream>
    3. #include <stdlib.h>
    4. using namespace std;
    5.  
    6. void NhapMT(int **p, int h, int c)
    7. {
    8.     for (int i = 0; i<h; i++)
    9.     for (int j=0; j<c; j++)
    10.     {
    11.         printf("Nhap a[%d][%d] = ", i, j);
    12.         cin >> p[i][j];
    13.     }
    14. }
    15. void XuatMT(int **p,int h, int c)
    16. {
    17.      for(int i=0;i<h;i++)
    18.      {
    19.          for(int j=0;j<c;j++)cout<<p[i][j]<<" ";
    20.          cout<<endl;
    21.      }
    22. }
    23. int main()
    24. {    
    25.     int h, c;
    26.     int **p;
    27.    
    28.     cout << "Nhap so hang: ";
    29.     cin >> h;
    30.     cout << "Nhap so cot: ";
    31.     cin >> c;
    32.    
    33.     for(int i=0;i<h;i++)p[i] =  new int [c];    
    34.     NhapMT(p, h, c);
    35.     XuatMT(p, h, c);
    36.    
    37.    
    38.     system("pause");
    39.     return 0;
    40. }
    Chúc may mắn.
    không hiểu sao chương trình này chạy trên ubuntu linux bị lỗi:
    Code:
    Nhap so hang: 3
    Nhap so cot: 2
    Segmentation fault
    dùng g++ để dịch nhé

    Ý mình là viết hàm sử dụng khái niệm cấp phát động cơ (dùng new ấy)
    Chẳng biết mình muốn cái gì nữa :v

  4. #4
    Ngày gia nhập
    03 2011
    Bài viết
    44

    Mặc định Chào bạn,

    Cái này mình chạy trên DEVC và trên nền window.

  5. #5
    Ngày gia nhập
    10 2010
    Nơi ở
    Đại học Bách Khoa Hà Nội
    Bài viết
    45

    Trích dẫn Nguyên bản được gửi bởi phuchaontu Xem bài viết
    Cái này mình chạy trên DEVC và trên nền window.
    có lẽ do DevC++ dùng gcc cũ, hóng cao thủ vậy
    Chẳng biết mình muốn cái gì nữa :v

  6. #6
    Ngày gia nhập
    08 2011
    Bài viết
    117

    Mặc định Viết hàm nhập ma trận được cấp phát động như thế nào

    Edit chút. ( chưa check nhé )
    C Code:
    1. #include <stdio.h>
    2. #include <iostream>
    3. #include <stdlib.h>
    4. using namespace std;
    5.  
    6. void NhapMT(int **p, int h, int c)
    7. {
    8.     for (int i = 0; i<h; i++)
    9.     for (int j=0; j<c; j++)
    10.     {
    11.         printf("Nhap a[%d][%d] = ", i, j);
    12.         cin >> p[i][j];
    13.     }
    14. }
    15. void XuatMT(int **p,int h, int c)
    16. {
    17.      for(int i=0;i<h;i++)
    18.      {
    19.          for(int j=0;j<c;j++)cout<<p[i][j]<<" ";
    20.          cout<<endl;
    21.      }
    22. }
    23. int main()
    24. {    
    25.     int h, c;
    26.     int **p;
    27.    
    28.     cout << "Nhap so hang: ";
    29.     cin >> h;
    30.     cout << "Nhap so cot: ";
    31.     cin >> c;
    32.  
    33.     p = new int *[h];
    34.    
    35.     for(int i=0;i<h;i++)p[i] =  new int [c];    
    36.     NhapMT(p, h, c);
    37.     XuatMT(p, h, c);
    38.     for( int i = 0 ; i < h ; i++ )
    39.         delete [] p[i] ;
    40.     delete [] p;
    41.     return 0;
    42. }

  7. #7
    Ngày gia nhập
    10 2010
    Nơi ở
    Đại học Bách Khoa Hà Nội
    Bài viết
    45

    Chạy được rồi, cảm ơn bạn CIMinuv nhé
    Chẳng biết mình muốn cái gì nữa :v

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

    Cấp phát động nhiều mảng một chiều liên tục nhiều lần như mấy bạn kia dễ sinh ra phân mảnh bộ nhớ, tức là các phần tử của ma trận không liên tục nhau, do đó xác suất cache hit là thấp, hiệu năng chương trình thấp. Ngoài ra thì cấp phát động nhiều lần như vậy thì khả năng không còn bộ nhớ để cấp phát được cũng cao hơn (kinh nghiệm là vậy, không rõ tại sao).
    Để ý thì thấy mảng động 2 chiều bản chất cũng chỉ là mảng động một chiều. Do vậy ta có thể cấp phát một vùng nhớ A kích thước h x c sẵn rồi gán cho các con trỏ p[i] giá trị A+n*i. Như vậy đảm bảo là các phần tử của ma trận sẽ liên tiếp nhau.

    Nếu dùng C, và trình dịch hỗ trợ C99 thì mọi việc cực kỳ đơn giản với Variable Length Array:
    C Code:
    1. p[h][c]; // khai báo mảng động h x c

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

  1. Viết hàm trả về GridControl (devExpress) như thế nào cho không bị lỗii
    Gửi bởi Rongcon.com.vn trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 12-06-2012, 04:34 PM
  2. Làm thế nào viết hàm C# trả về nhiều tham số?
    Gửi bởi voicewithin trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 11-09-2011, 05:24 PM
  3. Viết hàm xuất nhập ma trận bằng FILE như thế nào?
    Gửi bởi secret1512 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 20-11-2010, 09:43 AM
  4. viết hàm tìm dòn có tổng lớn nhất trong ma trận số thực
    Gửi bởi thangit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 18-08-2008, 09:40 PM
  5. Viết hàm phần tử lớn nhất trong ma trận các số nguyên??
    Gửi bởi atiso trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 18
    Bài viết cuối: 11-04-2008, 09:39 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