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

Đề tài: Truyền mảng hai chiều cho hàm

  1. #1
    Ngày gia nhập
    12 2012
    Bài viết
    8

    Mặc định Truyền mảng hai chiều cho hàm

    Mình chép code truyền mảng hai chiều cho hàm giống trong ví dụ của sách để in và tìm giá trị bé nhất của mảng hai chiều nhưng không hiểu sao các giá trị truyền vào hàm từ dòng thứ 2 của mảng trở đi đều nhận giá trị là 0 hết à. Ai biết tại sao giải thích dùm mình với. Cảm ơn.

    C++ Code:
    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <iomanip>
    4.  
    5. using namespace std;
    6.  
    7. void minmt(float *x, int m, int n)
    8. {
    9.      float min=*x;
    10.      int k, kmin;
    11.      for (k=1; k<m*n; k++)
    12.      if (min>*(x+k))
    13.      {
    14.                     min=*(x+k);
    15.                     kmin=k;            
    16.      }
    17.      cout<<"Gia tri min la: "<<min<<" tai dong "<<k/n<<" cot "<<k%n;
    18. }
    19.  
    20. void inmt(float *x, int m, int n)
    21. {
    22.      int i,j;
    23.      for (i=0; i<m; i++)
    24.      {
    25.          for (j=0; j<n; j++)
    26.          cout<<setw(4)<<*(x+i*n+j)<<"  ";
    27.          cout<<endl;
    28.      }
    29. }
    30.  
    31. int main(int argc, char *argv[])
    32. {
    33.     float a[100][100];
    34.     int i,j,m,n;
    35.     cout<<"Nhap so dong cua ma tran: "; cin>>m;
    36.     cout<<"Nhap so cot cua ma tran: ";  cin>>n;
    37.    
    38.     for (i=0; i<m; i++)
    39.     for (j=0; j<n; j++)
    40.     {
    41.         cout<<"A["<<i<<"]["<<j<<"]=";   cin>>a[i][j];
    42.     }
    43.    
    44.     inmt((float*)a,m,n);
    45.    
    46.     minmt((float*)a,m,n);
    47.     cout<<endl;
    48.      
    49.     system("PAUSE");
    50.     return EXIT_SUCCESS;
    51. }
    Attached Thumbnails Attached Thumbnails manhinhkq.jpg  

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

    Mình tưởng là *x là tuơng ứng với một mảng 1 chiều còn **x thì mới là mảng 2 chiều.
    Bạn sửa lại hàm nhận tham số là mảng 2 chiều đi là ok.

  3. #3
    Ngày gia nhập
    12 2012
    Bài viết
    8

    Vậy sửa như nào hà bạn... mình thử chuyển hết *x sang **x nhưng vẫn không được... thậm chí sửa vậy nó chạy xong còn lỗi hơn... mình đọc ví dụ trong sách nó truyền mảng 2 chiều vào hàm vậy mà...

  4. #4
    Ngày gia nhập
    02 2012
    Nơi ở
    hà nội
    Bài viết
    58

    Trích dẫn Nguyên bản được gửi bởi bogia94 Xem bài viết
    Mình chép code truyền mảng hai chiều cho hàm giống trong ví dụ của sách để in và tìm giá trị bé nhất của mảng hai chiều nhưng không hiểu sao các giá trị truyền vào hàm từ dòng thứ 2 của mảng trở đi đều nhận giá trị là 0 hết à. Ai biết tại sao giải thích dùm mình với. Cảm ơn.

    C++ Code:
    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <iomanip>
    4.  
    5. using namespace std;
    6.  
    7. void minmt(float *x, int m, int n)
    8. {
    9.      float min=*x;
    10.      int k, kmin;
    11.      for (k=1; k<m*n; k++)
    12.      if (min>*(x+k))
    13.      {
    14.                     min=*(x+k);
    15.                     kmin=k;            
    16.      }
    17.      cout<<"Gia tri min la: "<<min<<" tai dong "<<k/n<<" cot "<<k%n;
    18. }
    19.  
    20. void inmt(float *x, int m, int n)
    21. {
    22.      int i,j;
    23.      for (i=0; i<m; i++)
    24.      {
    25.          for (j=0; j<n; j++)
    26.          cout<<setw(4)<<*(x+i*n+j)<<"  ";
    27.          cout<<endl;
    28.      }
    29. }
    30.  
    31. int main(int argc, char *argv[])
    32. {
    33.     float a[100][100];
    34.     int i,j,m,n;
    35.     cout<<"Nhap so dong cua ma tran: "; cin>>m;
    36.     cout<<"Nhap so cot cua ma tran: ";  cin>>n;
    37.    
    38.     for (i=0; i<m; i++)
    39.     for (j=0; j<n; j++)
    40.     {
    41.         cout<<"A["<<i<<"]["<<j<<"]=";   cin>>a[i][j];
    42.     }
    43.    
    44.     inmt((float*)a,m,n);
    45.    
    46.     minmt((float*)a,m,n);
    47.     cout<<endl;
    48.      
    49.     system("PAUSE");
    50.     return EXIT_SUCCESS;
    51. }
    a[][] khai báo thế này tuơng ứng như a là 1 con trỏ hằng. nên ko thể truyền vào hàm hàm khai báo con trỏ như thể kia đc. sai là phải.

    cách1: khai báo float a[100][100] thi khi viết hàm cũng cần khai báo void minmt(float a[][100], int m, int n)
    C++ Code:
    1. void minmt(float x[][100], int m, int n)
    2. {
    3.      cout<<"Gia tri min la: ";
    4. }
    5.  
    6. void inmt(float x[][100], int m, int n)
    7. {
    8.      int i,j;
    9.      for (i=0; i<m; i++)
    10.      {
    11.          for (j=0; j<n; j++)
    12.          cout<<setw(4)<<x[i][j]<<"  ";
    13.          cout<<endl;
    14.      }
    15. }
    16.  
    17. int main(int argc, char *argv[])
    18. {
    19.     float a[100][100];
    20.     int i,j,m,n;
    21.     cout<<"Nhap so dong cua ma tran: "; cin>>m;
    22.     cout<<"Nhap so cot cua ma tran: ";  cin>>n;
    23.    
    24.     for (i=0; i<m; i++)
    25.     for (j=0; j<n; j++)
    26.     {
    27.         cout<<"A["<<i<<"]["<<j<<"]=";   cin>>a[i][j];
    28.     }
    29.    
    30.     inmt(a,m,n);
    31.    
    32.     minmt(a,m,n);
    33.     cout<<endl;
    34.      
    35.     system("PAUSE");
    36.     return EXIT_SUCCESS;
    37. }
    cách2: khai báo float *a=new a[100]; cấp phát động c++, mảng một chiều.
    C++ Code:
    1.  
    2. void inmt(float *x, int m, int n)
    3. {
    4.      int i,j;
    5.      for (i=0; i<m; i++)
    6.      {
    7.          for (j=0; j<n; j++)
    8.          cout<<setw(4)<<*(x+i*m+j)<<"  ";
    9.          cout<<endl;
    10.      }
    11. }
    12.  
    13. int main(int argc, char *argv[])
    14. {
    15.     float *a;
    16.     int i,j,m,n;
    17.     cout<<"Nhap so dong cua ma tran: "; cin>>m;
    18.     cout<<"Nhap so cot cua ma tran: ";  cin>>n;
    19.     a= new float [m*n];
    20.     for (i=0; i<m; i++)
    21.     for (j=0; j<n; j++)
    22.     {
    23.         cout<<"A["<<i<<"]["<<j<<"]=";   cin>>*(a+i*m+j);
    24.     }
    25.    
    26.     inmt(a,m,n);
    27.     cout<<endl;
    28.      
    29.     system("PAUSE");
    30.     return EXIT_SUCCESS;
    31. }
    cách 3: khai báo float **a cũng cấp phát động con trỏ 2 chiều.
    C++ Code:
    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <iomanip>
    4.  
    5. using namespace std;
    6.  
    7. void inmt(float **x, int m, int n)
    8. {
    9.      int i,j;
    10.      for (i=0; i<m; i++)
    11.      {
    12.          for (j=0; j<n; j++)
    13.          cout<<setw(4)<<x[i][j]<<"  ";
    14.          cout<<endl;
    15.      }
    16. }
    17.  
    18. int main(int argc, char *argv[])
    19. {
    20.     int i,j,m,n;
    21.     cout<<"Nhap so dong cua ma tran: "; cin>>m;
    22.     cout<<"Nhap so cot cua ma tran: ";  cin>>n;
    23.     float **a= new float*[m];
    24.     for (i=0; i<m; i++)
    25.     a[i]=new float [n];
    26.     for (i=0; i<m; i++)
    27.     for (j=0; j<n; j++)
    28.     {
    29.         cout<<"A["<<i<<"]["<<j<<"]=";   cin>>a[i][j];
    30.     }
    31.     inmt(a,m,n);
    32.     cout<<endl;
    33.     system("PAUSE");
    34.     return EXIT_SUCCESS;
    35. }
    Đã được chỉnh sửa lần cuối bởi kienquach : 18-01-2013 lúc 02:13 AM.
    + Quách Việt Kiên
    + Yahoo: Kaka_8x_vn
    + skype: kiencuongno1
    + Gmail: kiencuongno1@gmail.com
    Ai có thể free cho mình 50k thẻ điện thoại ko.

  5. #5
    Ngày gia nhập
    11 2012
    Bài viết
    136

    @kienuach Cách 2 là mảng một chiều bài của bạn không liên quan bài này, còn đối số thế là ok rồi . Nhưng bạn thử chuyển sang mấy cách trên dùng** hay là (*x)[100] trên của bạn kienquach xem dễ dàng hơn đó. Ở đấy mình nghĩ là bạn nhập các phần tử của a[i][j] ở trong hàm main nhưng lại truy cập theo kiểu con trỏ cấp 1 và ép kiểu như trên có thể các địa chỉ từ hàng 2 trở đi của các phần tử sẽ bị khác đi do vậy là sẽ là ngẫu nhiên, bạn thử chuyển việc nhập sang hàm xem vẫn kiểu truy nhập cũ như thế này

    C Code:
    1. void nhap(float *a, int dong, int cot)
    2. {
    3.     for(int i=0; i<dong; ++i)
    4.         for(int j=0; j<cot; ++j)
    5.         {
    6.             cout<<"a["<<i<<","<<j<<"]=";
    7.             cin>>*(a+i*cot+j);
    8.         }
    9.     return;
    10.  
    11. int main()
    12. {
    13. // da khai bao so dong so cot, các biến
    14.    nhap((float*)a, dong, cot);
    15. }
    16. }
    Đã được chỉnh sửa lần cuối bởi kimcy1992 : 19-01-2013 lúc 09:28 AM.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

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

  1. truyền giá trị cho mảng 1-2 chiều
    Gửi bởi edconan93 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 27-01-2013, 11:32 AM
  2. thugian5s.com :: Truyện cười, ảnh số, truyện tranh, chuyên mục chia sẻ kinh nghiệm lập nghiệp
    Gửi bởi thecao24_napthe trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 14-01-2013, 04:19 PM
  3. Cách truyền mang 1 chiều cho hàm bài con trỏ và mảng một chiều ai có thể giải thích giúp mình
    Gửi bởi biencute trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 21-03-2012, 09:00 AM
  4. Truyền mảng 2 chiều vào hàm
    Gửi bởi thanh4890 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: 21-08-2010, 03:13 PM
  5. Vấn đề truyền vào hàm 1 mảng động 2 chiều!
    Gửi bởi phuocnh 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: 06-04-2010, 11:08 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