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

Đề tài: Bài tập C| Bài tập về mảng

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

    Mặc định Bài tập C| Bài tập về mảng

    Có bài khó quá nhờ các bạn giúp đỡ với:
    Nhập dãy số thực a và số nguyên dương k
    a) Xét xem trog dãy có k số dương đứng cạnh nhau?
    b)Với k>=3, xét xem trong dãy có k số đứng cạnh nhau lập thành cấp số cộng hay ko ?
    Ai giúp mình với

  2. #2
    Ngày gia nhập
    03 2008
    Nơi ở
    Hồ chí minh
    Bài viết
    134

    Nhập dãy số thực a và số nguyên dương k:bạn tự làm cái này,
    *a) Xét xem trog dãy có k số dương đứng cạnh nhau?=>có đúng đề không bạn?
    vậy nếu cái mảng như thế này:1 2 4 6 2 7 8=>xuẩt ra sao đây?,bạn nói rõ ràng chỗ này để mọi người giúp,còn theo mình nghĩ bài này yêu cầu xuất ra các mảng con các số duơng đứng cạnh nhau mới đúng.
    b)Với k>=3, xét xem trong dãy có k số đứng cạnh nhau lập thành cấp số cộng hay ko
    C Code:
    1. int capsocong(int a[],int n)//với a[] là mảng truyền vào,n >2
    2. {
    3.        int d,i,j,kq=1;
    4.        d=a[1]=a[0];
    5.        for(i=2;i<n;i++)
    6.               if((a[i]-a[i-1])!=d)
    7.                     {
    8.                          kq=0;
    9.                          break;
    10.                      }
    11.      return kq;
    12. }
    Every step I'm taking
    Every move I make
    Feels lost with no direction
    My faith is shaking
    But I gotta keep trying.

  3. #3
    Ngày gia nhập
    04 2009
    Bài viết
    0

    Mình cũg ko biết, đề bài thầy giao thế nào mình đánh lại nguyên si mà, thế mình mới hỏi các bạn
    Nếu bạn cho mảng như vậy thì mình nghĩ sẽ in ra là k =0
    Đã được chỉnh sửa lần cuối bởi dungle89 : 21-04-2009 lúc 04:53 PM.

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

    mình nghĩ là cứ đếm tất cả các số dương đứng cạnh nhau cho đến khi gặp 1 số <=0 thì xét,nếu biến đếm >=k thì dừng còn ko thì cho biến đếm =0 rồi đếm tiếp,sau khi đếm hết mảng ta xét 1 lần nũa là xong.
    Đã được chỉnh sửa lần cuối bởi kimduquan : 21-04-2009 lúc 07:41 PM.

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

    Cuối cùng thì cũng đã làm xong, nhưng code không tối ưu lắm (bạn xem kĩ sẽ thấy!)
    Ai vẽ giùm tớ cái lưu đồ với, vô cùng cảm kích. Khổ, code được mà vẽ lưu đồ không được, đúng là nực cười.

    PHP Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    #include<malloc.h>
    #include<stdlib.h>
    int main()
    {
        
    int *mang,n,k=0;
        do
        {
            
    printf("Nhap so luong phan tu: ");
            
    scanf("%d",&n);
            if(
    n<2)
            { 
                
    system("cls");
                
    printf("Ban phai nhap vao mot so lon hon 1\n");
            }
        }while(
    n<2);
        
    mang=(int*)malloc(n*sizeof(int));
        for(
    int i=0;i<n;i++)
        {
            
    printf("Nhap vao phan tu thu %d: ",i+1);
            
    scanf("%d",&mang[i]);    
            
        }
        do
        {
            
    printf("Nhap vao so k: ");
            
    scanf("%d",&k);
            if(
    k<1)
            { 
                
    system("cls");
                
    printf("Ban phai nhap vao mot so lon hon 1\n");
            }
        }while(
    k<1);
        
    int *mangphu1, *mangphu2phu1=0,phu2=0;
        
    mangphu1=(int*)malloc(n*sizeof(int));
        
    mangphu2=(int*)malloc(n*sizeof(int));
        
    //XET K SO DUNG CANH NHAU;
        
    for(int i=0;i<n+1-k;i++)
        {
           
    int dem=0;
           
    int j=i+1;
                 if(
    mang[i]>0)
                   {
                  do
                     {
                        
                        if(
    mang[j]>0)
                           {
                               
    dem++;
                               if(
    dem==k-1)
                               {
                                   
    mangphu1[phu1]=i;
                                       
    phu1++;
                                   
    mangphu2[phu2]=j;
                                       
    phu2++;
                               }
                          }
                        
                   }while(
    dem<k-1&&j++-i<k-1);
                    
                }
        }
        
        for(
    int i=0;i<phu1;i++)
            
    printf("\n%d::::%d",mangphu1[i],mangphu2[i]);
        if(
    phu1==0)
            
    printf("\nKhong co day %d phan tu duong ke nhau.\n",k);
        else
        {
            
    printf("\nCac mang co %d so la: \n",k);
            for(
    int i=0;i<phu1;i++)
            {
                
    int j=mangphu1[i];
                
    int dem=0;
                do
                {
                    
    printf("%d ",mang[j]);    
                    
    dem++;
                    
    j++;
                }while(
    dem<k);
                
    printf("\n");
            }

            
    int *mangphu3phu3=0;
            
    mangphu3=(int*)malloc(n*sizeof(int));
            for(
    int i=0;i<phu1;i++)
            {
                
    int j=mangphu1[i],flag=1;
                
    int congboi=mang[j+1]-mang[j];
                for(
    int k=j+2;k<=mangphu2[i];k++)
                {
                    if(
    mang[k]-mang[k-1]!=congboi)
                        
    flag=0;
                }
                if(
    flag)
                    
    mangphu3[phu3++]=j;
            }
            
    printf("\nDay so nguyen duong lap thanh cap so cong: \n");
            for(
    int i=0;i<phu3;i++)
            {
                
    int j=mangphu3[i];
                
    int dem=0;
                do
                {
                    
    printf("%d ",mang[j]);    
                    
    dem++;
                    
    j++;
                }while(
    dem<k);
                
    printf("\n");
            }
            
         }
        
    getch();
        return 
    0;

    Cái code mình nó ngu ở nhiều chỗ:
    Thứ nhất: Dùng quá nhiều mảng phụ. Nếu khéo léo, bạn chỉ cần dùng một mảng phụ là đủ. Do mình thức cả đêm nên cái đầu nó đau và ngu người quá, không thể cải tiến được. Tuy nhiên, để nhiều mảng phụ có thể làm bạn dễ hiểu hơn.
    Thứ 2: Vòng lặp xét K số cạnh nhau cũng ngu nốt vì nó chạy thừa ở một số chỗ không cần thiết:

    Ví dụ: mảng sau: 1 3 4 -5 6 7 8 9 5 và K=4;
    i=0 thì:
    j=1, mang[j]=1>3, thỏa đk nên j++;
    j=2, mang[j]=4>0, thỏa đk nên j++;
    j=3, mang[j]=-5<0, không thỏa thỏa đk nên thoát j ngay chỗ này.
    Đến đây, phải cho i nhảy đến vị trí 4 tức là giá trị mang[4]=6 và xét lại như trên nhưng mình không biết viết thế nào (vẽ cái lưu đồ hì hục mãi mà không được) nên đành phải chấp nhận cho i chạy ngu vài lần.

    Đoạn này, mình có ý tưởng cải tiến rất hay nhưng không biết code thế nào. Nhờ các bạn giúp tớ cải tiến với.
    Cám ơn nhiều!
    Nhớ vẽ giúp tớ cái lưu đồ cho cái đoạn kiểm tra các số liền nhau nhé!
    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 27-04-2009 lúc 06:30 PM.
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Mặc định Bài tập C| Bài tập về mảng

    Đây là lưu đồ theo ý tưởng của mình (giống 80% code). Các bạn xem trong lưu đồ có gì sai sót thì nhắc nhở mình sửa với nha!
    Sửa giúp mình càng tốt.
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 22-04-2009 lúc 06:13 AM.
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

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

    nhìn code dài quá nên hơi nản nhưng dù sao đúng là được rồi,còn nếu là mình mình sẽ ko tạo thêm mảng phụ làm gì vì đây chỉ là 1 bài tập đếm bình thường thui .

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

    Bạn có thể post code cho mình được mở mang tầm mắt không? Mình dùng hàng tá mảng phụ mà xem chừng công việc vẫn rất khó khăn. Mình nghĩ, mình chỉ có thể xài ít nhất hai mảng phụ. Còn nếu không xài mảng phụ nào thì mình chịu thua, không liệt kê hết được các trường hợp.

    Mình sẽ rất cảm kích nếu bạn post code đấy!
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  9. #9
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Hỏi một chút, có phải ý của kimduquan là dùng vòng for không có khởi tạo không?
    Minh đã đoán được ý của kimduquan như vậy không biết đúng không?
    Mình có thể code theo ý mà mình cho là của kimduquan.
    Code:
    int i=0;
    while(1)
    {int t=0;
    for(;i<n;i++)
           {
            if(a[i]<0) 
              {
               i++;break;
              }
           b[t]=a[i];
           t++;
           }
    if((t>=k)||(i==n)) break;
    }
    Dùng cách này có được không?
    mình chưa test. sau đó xét mảng b xem có là cấp số công không.
    Còn kiểm tra cấp số cộng thì khó đầy vì cách lưu trữ số thực trong máy tính!
    Đã được chỉnh sửa lần cuối bởi trungkien45 : 28-04-2009 lúc 04:13 PM. Lý do: Code sai 1 chỗ

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