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

Đề tài: Sắp xếp ma trận tăng dần từ trên xuống dùng con trỏ đa cấp?

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    13

    Angry Sắp xếp ma trận tăng dần từ trên xuống dùng con trỏ đa cấp?

    xin mọi người giúp minh debug cái chương trình này.Mình đang làm bài sắp xếp ma trận tăng dần từ trên xuống mà chỉ dùng đến con trỏ,mà là con trỏ đa cấp.
    giả sử có ma trận
    truoc khi sap xếp:
    8 2 3 9
    5 6 1 12
    4 7 10 11
    sau khi sắp xếp:

    1 2 3 4
    5 6 7 8
    9 10 11 12

    Mình đã làm dc bài này =con trỏ đơn cấp và đang thử làm trên con trỏ đa cấp.nhưng làm hoài vẩn ko dc.Mong mọi người giup mình sữa hộ.thaks

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

    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<alloc.h>
    void nhapmatran(int **a,int n,int m);
    void xuatmatran(int **a,int n,int m);
    void sapxep(int **a,int n,int m);
    
    void main()
    {  int **a;
       int n,m;
            a=(int**)calloc(m*n,sizeof(int));
           printf("nhap so hang:");
           scanf("%d",&n);
           printf("nhap so cot:");
           scanf("%d",&m);
           nhapmatran(a,n,m);
    
           xuatmatran(a,n,m);
           printf("--------------------------------\n");
           sapxep(a,n,m);
    
    	xuatmatran(a,n,m);
    
     getch();
     clrscr();
    }
    void nhapmatran(int **a,int n,int m)
    {
      int i,j;
    		    randomize();
    
    		   for(i=0;i<n;i++)
    		   {
    		     for(j=0;j<m;j++)
    		     {
    		    //   printf("a[%d][%d]=",i,j);
    		    //   scanf("%d",&a[i][j]);
    		    **(a+i*m+j)=random(20);
    		      }
    		    }
    }
    void xuatmatran(int **a,int n,int m)
    {
     int i,j;
    	       for(i=0;i<n;i++)
    	       {
    		 for(j=0;j<m;j++)
    		 {
    		   printf("%4d",**(a+i*m+j));
    		  }
    		  printf("\n");
    	       }
    }
    
    
    void sapxep(int **a,int n,int m)
    {
    
    int i,j,x,y;
    
    	      for(i=0;i<n;i++)
    
    
    	       for(j=0;j<m;j++)
    
    
    		   for(x=i+j/(m-1);x<n;x++)
    		   for(y=0;y<m;y++)
    		   {
    		   if((y<=j)&&(x==i))
    		    continue;
    		    if(**(a+i*m+j)>**(a+x*m+y))
                **(a+i*m+j)^=**(a+x*m+y)^= **(a+i*m+j)^=**(a+x*m+y);
    		   }
    
    
    }

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình đã sửa rồi đây :

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<stdlib.h>
    4. #include<alloc.h>
    5.  
    6. void nhapmatran(int **a,int n,int m);
    7. void xuatmatran(int **a,int n,int m);
    8. void sapxep(int **a,int n,int m);
    9.  
    10. void main()
    11. {  int **a;
    12.     int n,m;
    13.  
    14.     clrscr();
    15.     printf("nhap so hang:");
    16.     scanf("%d",&n);
    17.     printf("nhap so cot:");
    18.     scanf("%d",&m);
    19.  
    20.     a=(int**)calloc(n,sizeof(int *));
    21.     for (int i=0;i<n;i++)
    22.         a[i]=(int*)calloc(m,sizeof(int));
    23.  
    24.     nhapmatran(a,n,m);
    25.     xuatmatran(a,n,m);
    26.     printf("--------------------------------\n");
    27.     sapxep(a,n,m);
    28.     xuatmatran(a,n,m);
    29.  
    30.     getch();
    31. }
    32.  
    33. void nhapmatran(int **a,int n,int m)
    34. {
    35.     int i,j;
    36.     randomize();
    37.  
    38.     for(i=0;i<n;i++)
    39.     {
    40.         for(j=0;j<m;j++)
    41.         {
    42.             //printf("a[%d][%d]=",i,j);
    43.             //scanf("%d",&a[i][j]);
    44.             a[i][j] = random(20);
    45.         }
    46.     }
    47. }
    48.  
    49. void xuatmatran(int **a,int n,int m)
    50. {
    51.     int i,j;
    52.  
    53.     for(i=0;i<n;i++)
    54.     {
    55.         for(j=0;j<m;j++)
    56.         {
    57.             printf("%4d ",a[i][j]);
    58.         }
    59.  
    60.         printf("\n");
    61.     }
    62. }
    63.  
    64.  
    65. void sapxep(int **a,int n,int m)
    66. {
    67.     int i,j,k;
    68.  
    69.     for(j=0;j<m;j++)
    70.         for(i=0;i<n;i++)
    71.             for(k=i+1;k<n;k++)
    72.                 if (a[i][j] > a[k][j])
    73.                     a[i][j] ^= a[k][j] ^= a[i][j] ^= a[k][j];
    74. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

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

    cảm ơn bạn.Ban ơi bạn có thể giải thích giùm minh dòng này luôn dc ko
    a[i]=(int*)calloc(m,sizeof(int));
    Tại sao mình đã cấp phát
    a=(int**)calloc(n,sizeof(int *));rồi mà bạn phải cấp phát lại kiểu a[i]=(int*)calloc(m,sizeof(int)); nay nữa .mong bạn giải thích giùm mình nhé.Mình chờ

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Đây là con trỏ 2 chiều, tức là một mảng các con trỏ, mỗi con trỏ lại to3 tới một mảng.

    Cấp phát mảng a để lưu n biến con trỏ
    C Code:
    1. a=(int**)calloc(n,sizeof(int *))

    Bây giờ mới thực sự cấp phát cho từng con trỏ.
    C Code:
    1. a[i]=(int*)calloc(m,sizeof(int));
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    03 2009
    Bài viết
    13

    Mặc định Sắp xếp ma trận tăng dần từ trên xuống dùng con trỏ đa cấp?

    cảm ơn bạn nhiều.Bạn cho mình hỏi thêm 1 vấn đề nữa
    đoạn này
    **(a+i*m+j):tức là nội dung ma con trỏ a trỏ tới (a[i][j]).mà sao máy lai báo lỗi.nếu*(a+i*m+j) thì là địa chỉ(do con trỏ a la con trỏ đa cấp).Mình ko hiểu **(a+i*m+j)là 1 giá tri mà sao máy lại báo lồi

  7. #7
    Ngày gia nhập
    11 2008
    Nơi ở
    Hà Nội
    Bài viết
    70

    Sao em chạy code của anh mèo không đúng nhỉ ???
    Dân thường sống đẹp đè bẹp dân chơi.
    Hi [you]

  8. #8
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    À, đó là vì khi bạn xin cấp phát thì toàn bộ khối bạn được cấp phát không nhất thiết phải là một vùng liên tục. Ý mình là, cái chỗ này này:
    C Code:
    1. for (int i=0;i<n;i++)
    2.         a[i]=(int*)calloc(m,sizeof(int));
    Các ô nhớ a[i] là một khối liên tục trên bộ nhớ, khi bạn xin cấp phát thêm một khối nhớ liên tục kích thước m nữa nó không nhất thiết nằm liền ngay dưới a[i](chẳng hạn vậy) mà nó sẽ ở một vị trí tùy ý trong bộ nhớ. Tóm lại nó nằm ở đâu thì mình chịu chỉ biết truy tới nó qua con trỏ thôi
    Vì vậy nếu bạn lấy giá trị kiểu như thế này
    C Code:
    1. **(a+i*m+j)
    nói chung nó sẽ truy nhập tớ một ô nhớ chưa được cấp phát và đương nhiên là có lỗi rồi.
    Khác với trường hợp mảng a[m][n], các ô nhớ được cấp phát liên tiếp nhau nên bạn có thể truy nhập tới a[i][j] như trên.
    I don't wanna waste another day

  9. #9
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    @xongvaoday : developer nói đúng rồi đó bạn, chắc mình ko cần giải thích thêm.

    @zodjac1990 : nó báo lỗi gì nhỉ ?
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  10. #10
    Ngày gia nhập
    03 2009
    Bài viết
    13

    thanks bạn nhiều,mình hiểu rồi

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

  1. Bảo vệ services trên windows, không cho người dùng thay đổi trạng thái?
    Gửi bởi gianghotinhyeu trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 27-04-2011, 05:12 PM
  2. Xin thuật toán sắp xếp ma trận tăng(giảm) không dùng mảng phụ.
    Gửi bởi PTL_PTL2008 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 22-03-2011, 08:11 PM
  3. Bài tập C sắp xếp ma trận sao cho tăng dần trên cột và giảm dần trên dòng.
    Gửi bởi detective009 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: 08-01-2011, 11:31 AM
  4. Lập trình C | Sắp xếp tăng dần trên C chỉ dùng cấu trúc rẽ nhánh?
    Gửi bởi danangsecurity 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: 09-06-2009, 11:49 PM
  5. Câu lệnh switch, case trên C, trắc nghiệm không dùng máy tính????
    Gửi bởi nguoingu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 17-05-2009, 01:00 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