Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 21 kết quả

Đề tài: Một bài tập về mảng

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

    Angry Một bài tập về mảng

    mình lấy đề trên cộng đồng việt :
    đề bài ;
    mình đang có bài tập về mãng nhưng chỉ làm đc câu a các bạn có chỉ mình 2 câu b và c.
    Cho dãy n số nguyên a0,a1,…,an-1.
    a.Đếm xem trong dãy có bao nhiêu số bằng 0.
    b.Tìm độ dài của dãy con dài nhất gồm các phần tử liên tiếp toàn số 0.
    c.Tìm số lần xuất hiện của các số.
    Ví dụ:
    6 13 0 0 13 0 0 0 6 0 0 0 13 5 0 0 0 0 5
    Kết quả câu a là 12. Kết quả câu b là 4 Kết quả câu c là: số 6 xuất hiện 2 lần, số 13 xuất hiện 3 lần, số 0 xuất hiện 12 lần, số 5 xuất hiện 2 lần.
    Mình mới làm được câu c:nhưng ko bị sai mong mọi người chỉ bảo:
    code câu c:
    Code:
    #include <stdio.h>
    # include <conio.h>
    main()
    { int A[100];
      int n,i,j,t;
      int dem=0;
      clrscr();
      printf ("\n hay nhap n:");
      scanf("%d",&n);
      for (i=1;i<=n;i++)
    {printf ("\n nhap A[%d]:",i);
      scanf ("%d",&A[i]);
    }
      for (i=1;i<n;i++)
      for (j=i+1;j<=n;j++)
      if (A[i]>A[j])
      { t=A[i];
       A[i]=A[j];
        A[j]=t;
        }
        for (i=1;i<=n;i++)
        printf ("\n day sau khi sap xep la %d",A[i]);
        for (i=1;i<n;i++)
    {  dem=0;
        for (j=i+1;j<=n;j++)
        { if(A[i]==A[j])
          dem++;
        
        }
     printf ("\n so %d xuat hien la %d" ,A[i],dem);
    }
      getch();
      }
    Nhớ chỉ vì sao lại làm như vây để mình rút kinh nghiêm lần sau
    Đã được chỉnh sửa lần cuối bởi Alviss : 16-01-2008 lúc 01:04 PM. Lý do: vì chưa đóng văn bản

  2. #2
    Ngày gia nhập
    12 2007
    Bài viết
    224

    mình gợi ý cho bạn cách đếm số lần xuất hiện của các phần tử trong mảng a như sau : bạn tạo 2 mảng mới với chiều dài = n ( gọi là b và c nhé ) . Sau đó cho tất cả các phần tử của 2 mảng này = 0 . Thêm 1 biến đếm số phần tử khác nhau trong mảng ban đầu nữa nhé . Lần lượt duyệt mảng ban đầu từ trái sang phải . Mỗi bước lặp bạn thực hiện công việc sau : Kiểm tra xem mảng b có phần tử nào trùng với phần tử đang xét chưa . Nếu ko có thì tăng biến đếm lên 1 và đưa phần tử đang xét ấy vào trong mảng b ( tăng chiều dài mảng b lên 1 ) và tăng giá trị của phần tử của mảng c tại vị trí ấy lên 1 . Nếu có thì ko tăng biến đếm lên và ko đưa phần tử đang xét ấy vào mảng b mà chỉ tăng giá trị của phần tử của mảng c tương ứng lên 1 . Sau cùng bạn in 2 mảng b và c ra .

    code :
    Code:
    #include <stdio.h>
    #include <conio.h>
    void main()
    {
     clrscr();
     int a[20],b[20],c[20];
     int n,dem=0,i,x,j;
    
     printf("nhap n:");
     scanf("%d",&n);
    
     for(i=0;i<n;i++)
     scanf("%d",&a[i]);
    
     for(i=0;i<n;i++)
     printf("%d",a[i]);
    
     for(i=0;i<n;i++)
     b[i]=c[i]=0;
    
     for(i=0;i<n;i++)
     {
      x=a[i];
      for(j=0;j<i;j++)
      if(b[j]==x) {
    	       c[j]++;
    	       break;
    	      }
      if(j==i)
      {
       b[dem]=x;
       c[dem++]++;
      }
     }
    
     for(i=0;i<dem;i++)
     printf("gia tri %d xuat hien %d lan\n",b[i],c[i]);
    
     getch();
    }

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

    mình thấy hướng giải của cậu thì đúng rồi nhưng code hình như có vấn đề .
    có thể viết lại code cho mình tham khảo 1 chút ko
    thank you very much .

  4. #4
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mình chạy thử và thấy ko sao mà . Bạn chạy thử và thấy sai chỗ nào xin post kết quả lên cho mình sửa lại .

  5. #5
    Ngày gia nhập
    12 2007
    Bài viết
    54

    Code:
    for(i=0;i<n;i++)
     scanf("%d",&a[i]);
    mình ko hiểu cậu nhập chỗ này
    Code:
    printf("gia tri %d xuat hien %d lan\n",b[i],c[i]);
    sao lại in ra C[i];
    cho mình hỏi biến j của cậu có tác dụng gì ?
    Mong được sự giúp dỡ mọi người
    Đã được chỉnh sửa lần cuối bởi comeonbaby : 29-01-2008 lúc 07:40 PM. Lý do: đưa code vào tag code

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định Một bài tập về mảng

    scanf("%d",&a[i]);
    mình ko hiểu cậu nhập chỗ này
    Nhập phần tử của mảng thui mà .

    printf("gia tri %d xuat hien %d lan\n",b[i],c[i]);
    sao lại in ra C[i];
    mảng c chứa số lần xuất hiện của các phần tử mảng b .

    cho mình hỏi biến j của cậu có tác dụng gì ?
    tác dụng của nó là chạy mảng b để kiểm tra xem mảng b đã có phần tử nào mới của a chưa , chưa thì thêm vào .

  7. #7
    Ngày gia nhập
    01 2008
    Bài viết
    4

    hix...ông thangit hỏi gì tui biết chết liền á (lúc làm được câu này, lúc làm được câu kia)
    +++Câu b được giải bình thường:
    ______ Giả sử đầu tiên kô có số 0 (biến 'demmax' = 0)
    ______ Khi thấy số 0 thì bắt đầu 'đếm' tới khi gặp số khác 0 thì ngưng (đã thu được biến 'đếm' và so sánh biến 'đếm' này với 'demmax')

    Code:
    #include <stdio.h>
    #include <conio.h>
    
    void NhapMang (int A[100], int &n)
    {
    	printf("Nhap so luong phan tu: ");
    	scanf("%d", &n);
    
    	printf("\n");
    
    	for (int i = 0; i < n; i++)
    	{
    		printf("Nhap phan tu thu %d: ", i + 1);
    		scanf("%d", &A[i]);
    	}
    
    	printf("\n");
    }
    
    void XuatMang (int A[100], int n)
    {
    	for (int i = 0; i < n; i++)
    	{
    		printf("%4d", A[i]);
    	}
    
    	printf("\n");
    }
    
    int MaxDemSo0LienTiep (int A[100], int n)
    {
    	int dem0;
    	int maxdem0 = 0;
    
    	for (int i = 0; i < n; i++)
    	{
    		if (A[i] == 0)
    		{
    			dem0 = 1;
    			i++;
    			
    			while (A[i] == 0)
    			{
    				dem0++;
    				i++;
    			}
    			
    			if (dem0 > maxdem0)
    			{
    				maxdem0 = dem0;
    			}
    		}
    	}
    	
    	return maxdem0;
    }
    
    void main ()
    {
    	int A[100];
    	int n;
    
    	NhapMang (A, n);
    	XuatMang (A, n);
    
    	int k = MaxDemSo0LienTiep (A, n);
    	printf("\nSo luong so 0 trong day dai nhat: %d\n", k);
    	getch();
    }
    +++Câu c nếu như bình thường (dở)thì giải như sau:

    Code:
    #include <stdio.h>
    #include <conio.h>
    
    void NhapMang(int A[100],int &n)
    {
    	printf("Nhap so luong phan tu : ");
    	scanf("%d",&n);
    
    	printf("\n");
    	
    	for(int i=0;i<n;i++)
    	{
    		printf("Nhap phan tu thu %d :  ",i+1);
    		scanf("%d",&A[i]);
    	}
    
    	printf("\n");
    }
    
    int KiemTraTrung(int c,int m[100])
    {
    	for(int i=0;i<100;i++)
    	{
    		if(m[i]==c)
    		{	
    			return 0;
    		}
    	}
    	
    	return 1;
    }
    
    int demSPT(int m,int n,int A[100])
    {
    	int dem=0;
    	
    	for(int i=0;i<n;i++)
    	{
    		if(A[i]==m)
    		{
    			dem=dem+1;
    		}
    	}
    	
    	return dem;
    }
    
    
    void Xuat(int A[],int n)
    {
    	int k;
    	int dem=0;
    	int m[100];
    	
    	for(int i=0;i<n;i++)
    	{
    		if(KiemTraTrung(A[i],m)==1)
    		{
    			k=demSPT(A[i],n,A);
    			printf("So %3d  Xuat Hien %3d  lan\n",A[i],k);
    			
    			m[dem]=A[i];
    			dem=dem+1;
    		}
    	}
    }
    
    
    void main()
    {
    	int A[100],n;
    	
    	NhapMang(A,n);
    	Xuat(A,n);
    	getch();
    
    }
    Câu c*******Còn 1 cách là mình sẽ duyệt các phần tử trong mảng và khi duyệt wa những phần tử nào thì nó sẽ được đánh dấu là số đó đã duyệt hay chưa, nếu duyệt rồi thì mình sẽ cho wa (nếu kô có cái này sẽ phát sinh th trùng)

    Code:
    #include<stdio.h>
    #include<conio.h>
    
    void NhapMang(int A[100],int &n)
    {
    	printf("Nhap so phan tu cua mang: ");
    	scanf("%d",&n);
    
    	printf("\n");
    
    	for(int i=0;i<n;i++)
    	{
    		printf("Nhap vao so thu %d: ",i+1,i);
    		scanf("%d",&A[i]);
    	}
    
    	printf("\n");
    }
    void ThongKeSoLanXuatHienCacPT(int A[100],int n)
    {
    	int B[100];
    	int i;
    	int dem;
    
    	for(i=0;i<n;i++)
    	{
    		B[i]=0;
    	}
    
    	for(i=0;i<n;i++)
    	{
    		if(B[i]==0)
    		{
    			dem=1;
    			B[i]=1;
    
    			for(int j=i+1;j<n;j++)
    			{
    				if(A[i]==A[j])
    				{
    					dem++;
    					B[j]=1;
    				}
    			}
    
    			printf("So %3d  Xuat Hien %3d  lan\n",A[i],dem);
    		}
    	}
    }
    
    void main()
    {
    	int A[100],n;
    
    	NhapMang(A,n);
    	ThongKeSoLanXuatHienCacPT(A,n);
    	getch();
    }
    Đã được chỉnh sửa lần cuối bởi º┴¶† HACK †¶┴º : 29-01-2008 lúc 11:45 PM.

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

    int KiemTraTrung(int c,int m[100])
    mình ko hiểu hàm này kiểm tra gì


    giải thích họ mình hướng giải và các vai trò của các biến trong bài

  9. #9
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    ừm,ông sieuphuong ghi code trên c++ thì phải,phải đặt clrscr(); sau khi khai báo biến chứ,TC3.0 không hiểu cái này thi phải....
    mình code lại nè
    Code:
    #include <stdio.h>
    #include <conio.h>
    void main()
    {
    
     int a[20],b[20],c[20];
     int n,dem=0,i,x,j; clrscr();
    
     printf("nhap n:");
     scanf("%d",&n);
    
     for(i=1;i<=n;i++)
     printf("phan tu thu %d",i);
     scanf("%d",&a[i]);
    
     for(i=1;i<=n;i++)
     printf("%d",a[i]);
    
     for(i=0;i<n;i++)
     b[i]=c[i]=0;
    
     for(i=0;i<n;i++)
         {
           x=a[i];
           for(j=1;j<i;j++)
           if(b[j]==x)
                 {
    	        c[j]++;
    	        break;
    	     }
     if(j==i)
         {
           b[dem]=x;
           c[dem++]++;
         }
         }
    
     for(i=1;i<=dem;i++)
     printf("gia tri %d xuat hien %d lan\n",b[i],c[i]);
    
     getch();
    }

  10. #10
    Ngày gia nhập
    01 2008
    Bài viết
    4

    Trích dẫn:
    int KiemTraTrung(int c,int m[100])

    mình ko hiểu hàm này kiểm tra gì
    Cho bạn ví dụ: 1 1 2 3 2
    _Nếu kô có hàm này thì nó in ra:
    __số 1 xuất hiện 2 lần
    __số 1 xuất hiện 2 lần
    __số 2 xuất hiện 2 lần
    __số 3 xuất hiện 1 lần
    __số 2 xuất hiện 2 lần
    ==>tự nhận xét đi nhé
    giải thích họ mình hướng giải và các vai trò của các biến trong bài
    sr bạn nhé, bạn nên tự làm đi, nhìn vào code ngay mà chưa làm thì khó khăn lắm

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