Giúp em với,C+ bài tập về mảng 2 chiều

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi buitrungthanh, 24/11/06.

  1. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    nếu muốn mỗi lần chạy nó tạo 1 mảng b khác thì đưa cái câu khai báo mảng vào vòng lặp xem.(thực sự ko hiểu câu hỏi lắm,chỉ trả lời theo suy nghĩ thôi :)))
    Bạn muốn giải bài này àh?
     
  2. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    hix., anh giải giúp em hai bài 1 và 3 đi. Em thua rồi :((
     
  3. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Đây là bài phát sinh ma trận vuông của jupiter
    PHP:
    void nhap(int *a[],int n)
    {
        
    int k,i=0,j=0,kiemtra=0,chantren=0,chanduoi=n-1,chanphai=n-1,chantrai=0;
        for (
    k=1;k<=n*n;k++)
        {
            
    a[i][j]=k;
            if (
    kiemtra==0)
            {
                if (
    j<chanphaij++;
                else 
                {
                    
    kiemtra=1;
                    
    chantren++;
                    
    i++;
                }
            }
            else if (
    kiemtra==1)
            {
                if (
    i<chanduoii++;
                else
                {
                    
    kiemtra=2;
                    
    chanphai--;
                    
    j--;
                }
            }
            else if (
    kiemtra==2)
            {
                if (
    j>chantraij--;
                else 
                {
                    
    kiemtra=3;
                    
    chanduoi--;
                    
    i--;
                }
            }
            else if (
    kiemtra==3)
            {
                if (
    i>chantreni--;
                else 
                {
                    
    kiemtra=0;
                    
    chantrai++;
                    
    j++;
                }
            }
        }
    }

    void xuat(int *a[],int n)
    {
        for (
    int i=0;i<n;i++)
        {
            for (
    int j=0;j<n;j++)
                
    printf("%d ",a[i][j]);
            
    printf("\n");
        }
    }
    void main()
    {
         
    int n;
         
    int **param;    
         
    printf(" - Nhap vao kich thuoc mang: ");
         
    scanf("%d",&n);
         
    param=new int* [n] ;
         for (
    int i=0;i<n;i++)
             
    param[i]=new int [n];
         
    nhap(param,n);
         
    xuat(param,n);
    }
    @chan_doi: bạn thử dùng 1 mảng lưu trữ số lần xuất hiện của mỗi phần tử trong mảng rồi xử lý thử xem.
     
  4. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    :(( thì em làm ở trên rồi đó, lấy một mảng mới để lưu trữ số lần xuất hiện của mỗi phần tữ trong mảng. Nhưng nó chỉ chạy đúng ở lần chạy đầu hà, các lần chạy tiếp theo đều sai hết :(( .

    Bài của jupiter em cũng làm thử rồi nhưng phải chạy 4 vòng lặp , hix ::(

    PHP:
    #include <conio.h>
    #include <stdio.h>
    #include <math.h>




    main()
    {
        
    int n,a[100][100];
        
    printf("Nhap n: ");scanf("%d",&n);

        
    int k=1,i,j;
        for (
    i=1;i<=n;i++) { a[1][i]=k;k++; }
        
    int b=1,c=1,d=1,e=1;
        while (
    i<=n*n)
         {
           for (
    i=b+1;i<=n-b+1;i++) { a[i][n-b+1]=k;k++; }
           
    b++;

           for (
    i=n-c;i>=c;i--) { a[n-c+1][i]=k;k++; }
           
    c++;

           for (
    i=n-d;i>=d+1;i--) { a[i][d]=k;k++; }
           
    d++;

           for (
    i=e+1;i<=n-e;i++) { a[e+1][i]=k;k++; }
           
    e++;
         }

       for (
    i=1;i<=n;i++)
       {
          
    printf("\n");
          for (
    j=1;j<=n;j++) printf("%3d",a[i][j]);
       }




        
    getch();
    }

    em mới học mảng hai chiều, nên chưa quen dùng hàm thông cảm cho em nha ::(
     
  5. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Đây là câu 3, còn câu 1 chắc cũng tương tự vậy
    PHP:
    void check20(int *a,int n)
    {
        for (
    int i=0;i<n;i++)
        {
            
    int j;
            for (
    j=i+1;j<n;j++)
                if (
    a[j]==a[i])    break;
            if (
    j==n
            {
                
    int dem=1;
                for (
    int k=0;k<i;k++)
                    if (
    a[k]==a[i]) dem++;
                
    printf("\nSo %d xuat hien %d lan",a[i],dem);
            }
        }            
    }
     
  6. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    hix, anh giỏi quá ::(

    em chắc cần phải train nhiều hơn. Anh cho bài giúp em tập làm thêm nha ::(
     
  7. jupiter0402

    jupiter0402 Legend of Zelda

    Tham gia ngày:
    6/6/05
    Bài viết:
    950
    Nơi ở:
    Hệ mặt trời
    Đây là bài tui làm theo suy nghĩ...hix ko bít sai chỗ nào mong huunhon giúp hộ:D


    PHP:
    #include<stdio.h>
    #include<conio.h>
    void phatsinhMT(int a[][100],int n);
    void xuat(int a[][100],int n);
    void main()
    {
       
    int n;
       
    int a[100][100];
       
    printf("Nhap N:");
       
    scanf("%d",&n);
       
    phatsinhMT(a,n);
       
    xuat(a,n);
    }
    void phatsinhMT(int a[][100],int n)
    {
       
    int i=0,j=0,k=1;
       
    int chantren=0,chanduoi=n-1,chantrai=0,chanphai=n-1;
       while(
    k<=n*n)
       {
           if(
    j<=chanphai)
           {
           for(
    j;j<=chanphai;j++)
           {
               
    a[i][j]=k;
               
    k++;
           }
           
    j--;
           
    chanphai--;
           }
           if(
    i<=chanduoi)
           {
           for(
    i;i<=chanduoi;i++)
           {
               
    a[i][j]=k;
               
    k++;
           }
           
    i--;
           
    chanduoi--;
           }
           if(
    j>chantrai)
           {
           for(
    j;j>chantrai;j--)
           {
               
    a[i][j]=k;
               
    k++;
           }
           
    j++;
           
    chantrai++;
           }
           if(
    i>chantren)
           {
           for(
    i;i>chantren;i++)
           {
               
    a[i][j]=k;
               
    k++;
           }
           
    i++;
           
    chantren++;
           }
       }
    }
    void xuat(int a[][100],int n)
    {
       
    printf("Ma tran vuong phat sinh ;");
       for(
    int i=0;i<n;i++)
       {
           
    printf("\n");
           for(
    int j=0;j<n;j++)
           
    printf("%4d",a[i][j]);
       }
    }
    Mong huunhon đừng xài biến con trỏ,vì tui vừa học hơn 1 th thầy chưa cho phép xài:D
     
  8. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    biến con trỏ :-/

    anh huunhon giải thích giùm em đi ::(
     
  9. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Bài mình sửa giúp cho jupiter, bạn tự xem lại chỗ sai nha
    @chan_doi: ý của jupiter nói về việc tạo mảng động thay vì khai báo trước kích thước. Bạn đọc hàm main của jupiter và của mình xem phần khai báo mảng sẽ hiểu.
    PHP:
    #include<stdio.h> 
    #include<conio.h> 
    void phatsinhMT(int a[][100],int n); 
    void xuat(int a[][100],int n); 
    void main() 

       
    int n
       
    int a[100][100]; 
       
    printf("Nhap N:"); 
       
    scanf("%d",&n); 
       
    phatsinhMT(a,n); 
       
    xuat(a,n); 

    void phatsinhMT(int a[][100],int n

       
    int i=0,j=0,k=1
       
    int chantren=0,chanduoi=n-1,chantrai=0,chanphai=n-1
       while(
    k<=n*n
       { 
           if(
    j<=chanphai && k<=n*n
           { 
                for(
    j;j<=chanphai;j++) 
                { 
                    
    a[i][j]=k
                    
    k++; 
                } 
                
    j--; 
                
    i++;
                
    chantren++; 
           } 
           if(
    i<=chanduoi && k<=n*n
           { 
                for(
    i;i<=chanduoi;i++) 
                { 
                    
    a[i][j]=k
                    
    k++; 
                } 
                
    i--;
                
    j--;
                
    chanphai--; 
           } 
           if(
    j>chantrai&& k<=n*n
           { 
                for(
    j;j>=chantrai;j--) 
                { 
                    
    a[i][j]=k
                    
    k++; 
                } 
                
    j++; 
                
    i--;
                
    chanduoi--; 
           } 
           if(
    i>chantren&& k<=n*n
           { 
                for(
    i;i>=chantren;i--) 
                { 
                    
    a[i][j]=k
                    
    k++; 
                } 
                
    i++; 
                
    j++;
                
    chantrai++; 
           } 
       } 

    void xuat(int a[][100],int n

       
    printf("Ma tran vuong phat sinh ;"); 
       for(
    int i=0;i<n;i++) 
       { 
           
    printf("\n"); 
           for(
    int j=0;j<n;j++) 
           
    printf("%4d",a[i][j]); 
       } 
     
  10. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    :D em hiểu rồi , thx

    ( sao box này vắng hoe vậy :| ) (=.=)
     
  11. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Bài tập mảng 1 chiều:
    Nhập 2 dãy số nguyên A (m phần tử) và B (n phần tử)
    a.Tìm những số có trong A ko có trong B.
    b.Sắp xếp A tăng dần, B tăng dần. Sau đó trộn lại để được mảng C tăng dần.
     
  12. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    bài 1
    PHP:
     int kiemtra(int *b,int m,int a)
          {
        
    int j;
        for (
    j=0;j<m;j++)
          if (
    a==b[j]) return 0;
        return 
    1;
          }


         
    void check(int *a,int n,int *b,int m)
          {
        
    int i,j;
        for (
    i=0;i<n;i++)
          if (
    kiemtra(b,m,a[i])==1printf("\n%3d",a[i]);
          }
    bài 2

    PHP:
       void sapxep(int *a,int n)
          {
        
    int i,j;
        for (
    i=0;i<n;i++)
          for (
    j=i+1;j<n;j++)
            if (
    a[i]>a[j]) doicho(a[i],a[j]);
          }
     
    void check(int *a,int n,int *b,int m,int *c)
           {
         
    int i,j=0,k=0;

         for (
    i=0;i<n+m;i++)
           if (
    a[j]>b[k]) { c[i]=b[k];k++; }
           else { 
    c[i]=a[j];j++; }
           }
    em sắp xếp dãy a,b trước rồi mới gán vô mảng c ::)
     
  13. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    bài 2 chạy ko đúng rồi. dãy a 1 2 3, dãy b 1 2 3 kết quả 1 1 2 2 3 -8374823
     
  14. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    PHP:
          void check2(int *a,int n)
          {
        
    int i,j;
        for (
    i=0;i<n;i++)
          for (
    j=i+1;j<n;j++)
            if (
    a[i]>a[j]) doicho(a[i],a[j]);
          } 
      
    void check(int *a,int n,int *b,int m,int *c)
           {
         
    int i,j=0,k=0;

         for (
    i=0;i<n+m;i++)
           if (
    a[j]>b[k]) { c[i]=b[k];k++; }
           else { 
    c[i]=a[j];j++; }
           }

    main()
    {
         
    int n,m;
         
    clrscr();scanf("%d",&n);

         
    int *a= new int[n];
          
    in(a,n);

          
    scanf("%d",&m);
         
    int *b= new int[m];

         
    in(b,m);

         
    check2(a,n);
         
    check2(b,m);

         
    int *c= new int[n+m];

         
    check(a,n,b,m,c);

         
    out(a,n);
         
    out(b,m);
         
    out(c,n+m);

         
    getch();
         return 
    0;
    }
    em chạy thử 3 lần với dãy a 1,2,3 dãy b 1,2,3 kết quả ra là 1 1 2 2 3 3

    có sai đâu :-/
     
  15. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Định đưa ví dụ để bạn tự tìm chỗ sai mà máy bạn chạy ko sai. Thôi thì mình nói về cái sai của bài giải đó luôn. Giả sử dãy a 1 2 3 , dãy b 1 2 3. Dãy c sẽ là 1 1 2 2 3, đến đây thì bài giải sẽ phát sinh lỗi, giả sử giá trị 3 cuối cùng là b[2], vậy thì máy sẽ lấy b[2] so sánh với số nào? nó so sánh với a[3] mà a[3] giá trị của nó là random,vì nó ko nằm tầm quản lý mảng của mình.
     
  16. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    PHP:
    void check(int *a,int n,int *b,int m,int *c)
           {
         
    int i,j=0,k=0;

         for (
    i=0;i<n+m;i++)
          {
                      if (
    a[j]>b[k]) { c[i]=b[k];k++; }
               else { 
    c[i]=a[j];j++; }
             if (
    j==n&&k<m) { c[i]=b[k];k++;}
             if (
    k==m&&j<n) { c[i]=a[j];j++; }
                   }  
           }
    em hiểu ý của anh rồi, vậy em thêm dòng này vào thì có ổn không vậy :-/
     
  17. babyrock88

    babyrock88 C O N T R A Lão Làng GVN

    Tham gia ngày:
    27/7/06
    Bài viết:
    1,719
    anh nào biết làm bài mà khi chạy nó cho ra các ký tự * và tạo thành 1 tam giác giống kiểu cây thông noel ấy em chỉ làm cho nó ra được hình tam giác vuông chứ không làm seo cho ra hình tam giác cân kiểu cây noel cả ai giúp em với

    Mã:
    #include<stdio.h>
    #include<conio.h>
    void main()
    {
    		int i, j, k;
    		clrscr();
    		i = 0;
    		printf("\nNhap vao mot so: ");
    		scanf("%d", &i);
    		printf("\n");
    		for (j = 0 ; j < i; j++)
    		{
    				printf("\n");
    				for (k = 1; k <= j; k++)
    						printf("*");
    		}
    		getch();
    }
    khi chạy nó cho mình nhập số VD ở đây em nhập số 5 thì nó ra:
    *
    **
    ***
    ****
    *****

    giờ em muốn làm kiểu cây thông thì làm thế nào help em cái thanks mấy bro nha
     
  18. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    mình sửa lại bài của chan_doi theo hướng làm của bạn
    PHP:
    void check(int *a,int n,int *b,int m,int *c

         
    int i,j=0,k=0
         for (
    i=0;i<n+m;i++) 
         { 
             if (
    a[j]>b[k] && j<&& k<m
             { 
                 
    c[i]=b[k];
                 
    k++; 
             } 
             else if (
    a[j]<=b[k] && j<&& k<m)
             { 
                 
    c[i]=a[j];
                 
    j++; 
             } 
         }   
         if (
    j<n)
         {
             for (
    int x=j;x<n;x++)
                 
    c[i-1]=a[j];
         }
         if (
    k<m)
         {
             for (
    int x=k;x<m;x++)
                 
    c[i-1]=b[k];
         }
    }
    Còn cái này là bài in hình tam giác cân của babyrock88
    PHP:
    void main()
    {
        
    int ijkm=1,n;
        
    0;
        
    printf("\nNhap vao mot so: ");
        
    scanf("%d", &n);
        
    printf("\n");
        for (
    <= ni++)
        {
            
    k=n-i;
            for (
    j=0;j<k;j++)
                
    printf(" ");
            for (
    j=0;j<m;j++)
                
    printf("*");
            
    m=m+2;
            
    printf("\n");
        }
        
    getch();
    }
     
  19. jupiter0402

    jupiter0402 Legend of Zelda

    Tham gia ngày:
    6/6/05
    Bài viết:
    950
    Nơi ở:
    Hệ mặt trời
    Thx huuhon mình đã làm lại bài rùi ,làm như sau:D
    PHP:
    #include<stdio.h>
    #include<conio.h>
    void taoMTVint a[][100],int n);
    void xuat(int a[][100],int n);
    void main()
    {
       
    int a[100][100];
       
    int n;
       do
       {
           
    printf("Nhap n:");
           
    scanf("%d",&n);
       }while(
    n<=0||n>100);
       
    taoMTV(a,n);
       
    printf("Ma tran vuong phat sinh : \n");
       
    xuat(a,n);
       
    getch();
    }
    void taoMTV(int a[][100],int n)
    {
       
    int t=0;
       
    int p=n-1;
       
    int k=1;
       while(
    p>=t)
       {
       
    //Vien tren
        
    for(int j=t;j<=p;j++)
           {
            
    a[t][j]=k;
            
    k++;
           }
       
    //Vien phai
           
    for(int i=t+1;i<=p;i++)
           {
            
    a[i][p]=k;
            
    k++;
           }
       
    //Vien duoi
           
    for(j=p-1;j>=t;j--)
           {
            
    a[p][j]=k;
            
    k++;
           }
       
    //Vien trai
           
    for(i=p-1;i>t;i--)
           {
            
    a[i][t]=k;
            
    k++;
           }
           
    t++;
           
    p--;
       }
    }
    void xuat(int a[][100],int n)
    {
       for(
    int i=0;i<n;i++)
       {
           for(
    int j=0;j<n;j++)
           
    printf("%4d",a[i][j]);
           
    printf("\n");
       }
    }
    Còn đây là cách mà mình làm bài trộn 2 mảng tăng thành 1 mảng tăng
    PHP:
    void tronmang(float a[],float b[],float c[],int&m,int n,int l)
    {
       
    int vtb=0,vtc=0;
       
    int i=0;
       while(
    vtb<n&&vtc<l)
       {
           if(
    b[vtb]<=c[vtc])
           {
           
    a[i]=b[vtb];
           
    i++;
           
    vtb++;
           }
           else
           {
           
    a[i]=c[vtc];
           
    i++;
           
    vtc++;
           }
       }
       if(
    vtb<n)
           for(
    vtb;vtb<n;vtb++)
           {
           
    a[i]=b[vtb];
           
    i++;
           }
       else
           for(
    vtc;vtc<l;vtc++)
           {
           
    a[i]=c[vtc];
           
    i++;
           }
       
    m=i;
    }

    Bài sắp mảng tăng dần mình còn làm thêm 1 cách:
    PHP:
    void saptang(float a[],int n)
    {
       for(
    int i=0;i<n-1;i++)
       {
           
    int vt=i;
           for(
    int j=i+1;j<n;j++)
           if(
    a[j]<a[vt])
               
    vt=j;
           
    float temp=a[i];
           
    a[i]=a[vt];
           
    a[vt]=temp;

       }
    }
     
  20. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Bài xử lý 2 mảng tăng thành 1 mảng tăng của bạn cũng tương tự như của bạn chan_doi :).
    Còn về cách sắp xếp dãy tăng thì cũng cải thiện được 1 chút vì ko phải đổi chỗ 2 phần tử mảng nhiều lần :)). Nhưng nói chung mình chưa bàn về các giải thuật sắp xếp bây giờ vì sợ các bạn rối. Chỉ cần các bạn biết 1 điều là việc sắp xếp = cách chạy 2 vòng lặp chồng lên là cách sắp xếp tệ nhất và cũng là cách đơn giản nhất.

    @ Ko nghĩ ra được bài nào về mảng 1 chiều nữa rồi. Thôi chuyển sang mảng 2 chiều nha bà con :). Nếu ai thấy bài nào về mảng 1 chiều hay hay thì post lên mọi người cùng nghiên cứu.

    Bài tập về mảng
    Cho ma trận n x n số nguyên.
    1) tạo ngẫu nhiên các giá trị từ 0 -> n đưa vào ma trận.
    2) tính tổng các phần tử của mỗi hàng, mỗi cột và đường chéo chính.

    2 câu để làm quen trước :))
     

Chia sẻ trang này