Gửi Thông Điệp Yêu Thương vanbinh_bt nhắn với all: thi sao rồi mấy đồ...[Mr]-Boom nhắn với All K4: Chúc mọi người có 1 kỳ thi thật tốt !!lặng lẽ yêu nhắn với nguyễn ngọc huy: chúc mi có một kỳ thi tốt nha. vẫn nhớ mingocthongcctm05f nhắn với QNGAI: hãy sát cánh bên nhau.....hi.......trinhvh91 nhắn với TM03B: TM03B đoàn kết đi chơi cuối khóa nghenNgười vô cảm nhắn với nguyenlu: Ai vậy? T vẫn bước đi trong yêu thương mà ^^381 nhắn với neyugn: mong rằng chúng ta sẽ đi đến cái đích cuối cùng !nguyenlu nhắn với Người vô cảm: Hãy bước đi trong sự yêu thươnglenguyen_alone nhắn với Young Bin: tại sao nhok lại iu bin chứ nhỉ???hp thành công nhá!!binhcaolinh nhắn với Đen Trần: Cố gắng học chăm chỉ nhé em! Gửi Thông Điệp Yêu Thương


BẢNG GIÁ QUẢNG CÁO TẠI DIỄN ĐÀN 2MIT.ORG 2012

Hiện kết quả từ 1 tới 6 của 6

Chủ đề: CTDL: tìm lỗi logic.

  1. #1
    Tham gia ngày
    Sep 2009
    Đến từ
    LT3C Co., Ltd
    Tuổi
    21
    Bài gửi
    1,636
    Cảm ơn
    1,170
    Được cảm ơn 1,246/500 bài viết
    Blog Entries
    10
    8
    MASTER
     
     
    Số lần cộng|trừ: 3 lần

    Default CTDL: tìm lỗi logic.

    bài dưới đây là 1 lỗi thường gặp khi các bạn làm bt CTDL. các bạn xem tại sao không xóa được các số nhỏ hơn 10 ?. cùng thảo luận và rút kinh nghiệm.
    Code:
    /*##### LT03C - VietHanIT ######*/
    #include<stdio.h>
    #define max 20
    typedef struct{
        int ds[max];
        int ptcuoi;
    }danhsach;
    
    int kiemtra(danhsach D,int x)
    {
        for(int i=0;i<D.ptcuoi;)
        {
            if(D.ds[i]==x)
                return i;
            else
                i++;
        }
        return -1;
    }
    //xoa 1 so
    void xoa(danhsach &D,int x)
    {
        int i;
        for(i=0;i<D.ptcuoi;i++)
            if(D.ds[i]==x)
            {
                for(int j=i;j<=D.ptcuoi;j++)
                D.ds[j]=D.ds[j+1];
            }D.ptcuoi--;
    }
    //chen
    void chen(danhsach &D,int so,int vt)
    {
        int i;
        for(i=D.ptcuoi;i>=vt;i--)
        {
            D.ds[i+1]=D.ds[i];
        }
        D.ptcuoi++;
        D.ds[vt]=so;
    
    }
    //tim min
    int min(danhsach D)
    {
        int min=D.ds[0];
        for(int i=0;i<D.ptcuoi;i++)
            if(D.ds[i]<min)
                min=D.ds[i];
        return min;
    }
    int daytang(danhsach D)
    {
            for(int i=0;i<D.ptcuoi;)
            if(D.ds[i]>D.ds[i+1])
            return 1;
            else
            i++;
            return 0;
    }
    
    void inds(danhsach D)
    {
        for(int i=0;i<D.ptcuoi;i++)
        printf("%d ",D.ds[i]);
        printf("\n");
    }
    main()
    {
        int i,int_n,int_x;
        danhsach D;
        //tao ds
        D.ptcuoi=0;
        //nhap ds
        printf("\nNhap so phan tu ds: ");
        scanf("%d",&int_n);
        for(i=0;i<int_n;i++)
            {
                printf("\nNhap %d: ",i+1);
                scanf("%d",&D.ds[i]);
                D.ptcuoi++;
            }
        inds(D);
        //kiem tra tang giam cua day
        if(daytang(D)==1)
            printf("\nDay khong tang!");
        else
            printf("\nDay tang!");
        //min
        printf("\nPhan tu nho nhat: %d",min(D));
    
        //nhap so nguyen x, kiem tra co thuoc day hay khong
        printf("\nNhap X: ");
        scanf("%d",&int_x);
        if(kiemtra(D,int_x)==-1)
            printf("\nX Khong thuoc day!");
        else
            printf("\nvi tri cua x: %d ",kiemtra(D,int_x)+1);
    
    
        //xoa
        int int_xoa,int_vt;
        printf("\nNhap so can xoa: ");
        scanf("%d",&int_xoa);
            if(kiemtra(D,int_xoa)==-1)
                printf("\n\aVi tri khong hop le!\n");
            else
                xoa(D,int_xoa);
        inds(D);
    
        //chen so vao vi tri
        int int_chen,int_vtchen;
    
        printf("\nNhap so can chen: ");
        scanf("%d",&int_chen);
        printf("\nVi tri can chen: ");
        scanf("%d",&int_vtchen);
        int_vtchen-=1;
        chen(D,int_chen,int_vtchen);
        inds(D);
        //xoa so nho hon 10
        printf("\nXoa cac so nho hon 10\n");
        for(i=0;i<D.ptcuoi;i++)
            {
                for(int j=i;j<=D.ptcuoi;j++)
                if(D.ds[j]<10)
                xoa(D,D.ds[j]);
            }
        inds(D);
    
    }

    --------------------------------------------------
    Xem các chủ đề cùng chuyên mục:



  2. #2
    Tham gia ngày
    Aug 2009
    Bài gửi
    356
    Cảm ơn
    6
    Được cảm ơn 53/46 bài viết
    2
    Normal
     
     
    Số lần cộng|trừ: 0 lần

    Default

    mắc lỗi này có lẽ là nhiều bạn dùng hàm for .. mà biến i của hàm for khi xóa sẽ khác vs vị trí các phần tử (khi xóa thì vị trí các pt trong ds sẽ bị thay đổi) còn biến i trong for thì ko ..

    mình hiểu thế .. viết ra chắc hơi khó hiểu


  3. Thành viên đã cảm ơn hoekaka trong bài viết này là :

    integer (04-10-2010)

  4. #3
    Tham gia ngày
    Sep 2009
    Đến từ
    LT3C Co., Ltd
    Tuổi
    21
    Bài gửi
    1,636
    Cảm ơn
    1,170
    Được cảm ơn 1,246/500 bài viết
    Blog Entries
    10
    8
    MASTER
     
     
    Số lần cộng|trừ: 3 lần

    Default

    mình cũng nghĩ thế, hàm xóa dùng để xóa giá trị. còn khi xóa các số nhỏ hơn 10 ta lại truyền cho nó vị trí.
    bạn để ý cái này không:
    Code:
        //xoa
        int int_xoa,int_vt;
        printf("\nNhap so can xoa: ");
        scanf("%d",&int_xoa);
            if(kiemtra(D,int_xoa)==-1)
                printf("\n\aVi tri khong hop le!\n");
            else
                xoa(D,int_xoa);
        inds(D);


  5. #4
    Tham gia ngày
    May 2009
    Đến từ
    Bình Định
    Tuổi
    21
    Bài gửi
    79
    Cảm ơn
    8
    Được cảm ơn 48/28 bài viết
    1
    Beginner
     
     
    Số lần cộng|trừ: 0 lần

    Default

    Hơ! nếu thảo luận về cách xóa những phần tử <= x thì nên post đoạn mã xử lý thôi chứ làm nguyên sơ ri thế này đọc mỏi mắt quá. Góp ý nè:
    for(i=0;i<n
    {
    if(a[i]<x)
    xóa;
    else
    i++;
    }
    Nếu xóa thì không tăng i còn không xóa thì tăng lên để duyệt phần tử tiếp theo

    Khi nào ta sẽ chết? Khi mắc phải căn bệnh hiểm nghèo? KHÔNG!!!
    Hay khi một viên đạn bay thẳng vào đầu? KHÔNG!!!
    Hay ta bị hỏa thiêu thành tro? KHÔNG!!! Vậy khi nào ta mới chết?
    KHI BỊ MỌI NGƯỜI LÃNG QUÊN, LÚC ĐÓ TA SẼ CHẾT

  6. Thành viên đã cảm ơn LieuKyThien trong bài viết này là :

    sunboy (09-10-2010)

  7. #5
    Tham gia ngày
    May 2009
    Bài gửi
    488
    Cảm ơn
    175
    Được cảm ơn 192/118 bài viết
    4
    Advanced
     
     
    Số lần cộng|trừ: 0 lần

    Default

    Đơn giản là thế này
    for(i=0;i<D.ptcuoi;i++)
    if(D.ds[i]==x)
    {
    for(int j=i;j<=D.ptcuoi;j++)
    D.ds[j]=D.ds[j+1];
    }D.ptcuoi--;
    Ở đây 1 lần gọi hàm là một lần
    D.ptcuoi--;
    Vì thế chỉ xóa được một lần thoai.
    Xem lai dễ...
    Còn việc đặt thêm vòng lặp j=i là hoàn toàn phung phí.
    Cái này có thể rút gọn lại cho i và i+1

    Chưa có em Game là tất cả
    Có em roài tất cả vẫn là Game.

  8. #6
    Tham gia ngày
    Sep 2009
    Đến từ
    LT3C Co., Ltd
    Tuổi
    21
    Bài gửi
    1,636
    Cảm ơn
    1,170
    Được cảm ơn 1,246/500 bài viết
    Blog Entries
    10
    8
    MASTER
     
     
    Số lần cộng|trừ: 3 lần

    Default

    Đơn giản là thế này
    for(i=0;i<D.ptcuoi;i++)
    if(D.ds[i]==x)
    {
    for(int j=i;j<=D.ptcuoi;j++)
    D.ds[j]=D.ds[j+1];
    }D.ptcuoi--;
    Ở đây 1 lần gọi hàm là một lần
    D.ptcuoi--;
    Vì thế chỉ xóa được một lần thoai.
    Xem lai dễ...
    Còn việc đặt thêm vòng lặp j=i là hoàn toàn phung phí.
    Cái này có thể rút gọn lại cho i và i+1
    uhm, chỗ này thừa 1 chút, ban đầu lấy ra từ thuật toán sắp xếp, mình quên đổi lại.
    ai biết disasm ra như thế nào không.

    Hãy nghĩ tới những điều tốt đẹp

Thông tin về chủ đề này

Users Browsing this Thread

Hiện giờ đang có 1 người xem chủ đề này. (0 thành viên 1 khách)

     

508
Lượt xem

Share