kết quả từ 1 tới 4 trên 4

Bài tập cấu trúc dữ liệu quản lý kho hàng

  1. #1
    Ðến Từ
    Tiền Giang
    Thành Viên Thứ: 370625
    Giới tính: Nam
    Bài gửi
    3
    Quick reply to this message Trả lời       


  2. #2
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    874

    Reply: Bài tập cấu trúc dữ liệu quản lý kho hàng

    Bài này để bạn làm quen với sử dụng pointers, bạn đã viết đc những gì rồi?

    PS: Đề đúng chứ bạn? Ví dụ như câu đầu, Kho k mà không phải Kho &k?
    LCD: 13.3" 1920x1080 IPS
    CPU: Intel i7 - 4700MQ (2.4 GHz - 3.4 GHz)
    GPU: Nvidia GTX 765m with GDDR5 2GB
    RAM: 2x8GB G.Skill 2133
    HDD: Samsung SSD 850 Pro 512 GB
    2 kg.

  3. Đã cảm ơn tengiday:

    pepper 

  4. #3
    Ðến Từ
    Tiền Giang
    Thành Viên Thứ: 370625
    Giới tính: Nam
    Bài gửi
    3

    Reply: Bài tập cấu trúc dữ liệu quản lý kho hàng

    Xin lỗi vì bây giờ mình mới trả lời!
    Kho &k á bạn!
    Mình làm câu đầu như thế này không biết có đúng k, do k biết viết chương trình hoàn chỉnh thế nào nên chỉ viết hàm của câu a. Hai câu còn lại mình suy nghĩ mãi mà k ra, nhờ bạn chỉ giáo mình với:
    Hanghoa *ThemHH(Kho &k, Hanghoa h)
    {
    Kho p=(Kho)malloc(sizeof(Hanghoa));
    p.pHead=h;
    if((k==NULL)||((k!=NULL )&&k.pHead->MaHH<h.MaHH)
    {
    p.pHead->pNext=k.pHead;
    k.pHead=p.pHead;
    return k.pHead;
    }
    else
    {
    Kho q=k.pHead;
    while((q.pHead->pNext!=NULL )&&(q.pHead->pNext->MaHH<h.MaHH)
    {
    p.pHead->pNext=q.pHead->pNext;
    q.pHead->pNext=p.pHead
    }
    return p.pHead;
    }
    }

  5. Đã cảm ơn pepper:


  6. #4
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    874

    Reply: Bài tập cấu trúc dữ liệu quản lý kho hàng

    1) Bạn nên sửa lại "HangHoa" cho đúng với đề.
    2) Chỉ có 1 cái kho k thôi, bạn cần thêm vào k.pHead, ko cần tạo kho mới.
    3) p.pHead là pointer, h là object, cho nên không thể gán "p.pHead = h" đc.
    Mã:
    HangHoa * ThemHH(Kho &k, HangHoa h)
    {
        HangHoa *ph = new HangHoa;
        *ph = h;
        if (!k.pHead || (k.pHead && ph->MaHH.compare(k.pHead->MaHH) < 0)) {
            ph->pNext = k.pHead;
            k.pHead = ph;
        }
        else {
            HangHoa *i = k.pHead;
            for (; i->pNext && i->pNext->MaHH.compare(ph->MaHH) < 0; i = i->pNext);
            ph->pNext = i->pNext;
            i->pNext = ph;
        }
        return ph;
    }


    Câu b:
    Bạn quét từng node, kiểm tra xem 'Giatri' >= 'GiaTriTinhThue'. Nếu có thì thêm vào kết quả là 'pHead'.
    Mã:
    void LocHangHoaTinhThue(Kho k, HangHoa *&pHead, double GiaTriTinhThue) {
        for (HangHoa *i = k.pHead; i; i = i->pNext)
            if (i->Giatri >= GiaTriTinhThue) {
                HangHoa * t = new HangHoa;
                t->MaHH = i->MaHH;
                t->TenHH = i->TenHH;
                t->NgayNhap = i->NgayNhap;
                t->Giatri = i->Giatri;
                t->pNext = 0;
                if (!pHead)
                    pHead = t;
                else {
                    t->pNext = pHead;
                    pHead = t;
                }
            }
    }


    Câu c:
    Khi xuất kho thì tìm ngày nhỏ nhất, sau đó bỏ nó ra khỏi kho. Vì viết cho dễ hiểu nên mình làm 2 thao tác duyệt; nếu optimize code thì có thể duyệt một lần rồi xóa cũng đc.
    Mã:
    bool lessDate(Date d1, Date d2) {
        return (d1.y < d2.y) ||
            (d1.y == d2.y && d1.m < d2.m) ||
            (d1.y == d2.y && d1.m == d2.m && d1.d < d2.d);
    }
    
    HangHoa XuatKho(Kho &k) {
        if (!k.pHead)
            return HangHoa();
        // find the minimum date
        HangHoa *pMin = k.pHead;
        for (HangHoa *i = k.pHead; i; i = i->pNext)
            if (lessDate(i->NgayNhap, pMin->NgayNhap))
                pMin = i;
        // extract pMin from the list
        if (pMin == k.pHead) 
            k.pHead = k.pHead->pNext;
        else
            for (HangHoa *i = k.pHead; i->pNext; i = i->pNext)
                if (i->pNext == pMin) {
                    i->pNext = pMin->pNext;
                    break;
                }
        pMin->pNext = 0;
        return *pMin;
    }


    Câu "Xuất kho n lần":
    Mã:
    void XuatKho(Kho &k, int n) {
        if (k.pHead && n > 0) {
            for (int i = 0; i < n && k.pHead; ++i) {
                HangHoa h = XuatKho(k);
                printf("%d : %s\n", i + 1, h.TenHH.c_str());
            }
        }
    }


    Còn đây là 'main' để test:
    Mã:
    void printHH(HangHoa *head) {
        for (HangHoa *i = head; i; i = i->pNext)
            printf("%s\n  %d %d %d\n  %.1f\n", i->MaHH.c_str(), i->NgayNhap.d, i->NgayNhap.m, i->NgayNhap.y, i->Giatri);
    }
    
    int main() {
        Kho k;
        k.pHead = 0;
    
        HangHoa h1;
        h1.MaHH = "005";
        h1.TenHH = h1.MaHH;
        h1.NgayNhap.d = 2;
        h1.NgayNhap.m = 3;
        h1.NgayNhap.y = 2005;
        h1.Giatri = 10;
    
        HangHoa h2;
        h2.MaHH = "015";
        h2.TenHH = h2.MaHH;
        h2.NgayNhap.d = 7;
        h2.NgayNhap.m = 8;
        h2.NgayNhap.y = 2008;
        h2.Giatri = 15;
    
        HangHoa h3;
        h3.MaHH = "010";
        h3.TenHH = h3.MaHH;
        h3.NgayNhap.d = 7;
        h3.NgayNhap.m = 8;
        h3.NgayNhap.y = 2009;
        h3.Giatri = 18;
    
        HangHoa h4;
        h4.MaHH = "007";
        h4.TenHH = h4.MaHH;
        h4.NgayNhap.d = 10;
        h4.NgayNhap.m = 11;
        h4.NgayNhap.y = 2004;
        h4.Giatri = 4;
    
        // Cau a
        HangHoa *result = ThemHH(k, h1);
        result = ThemHH(k, h2);
        result = ThemHH(k, h3);
        result = ThemHH(k, h4);
        printHH(k.pHead);
    
        // Cau b
        double tax = 12;
        printf("\nTax: %.1f\n", tax);
    
        result = 0;
        LocHangHoaTinhThue(k, result, tax);
        printHH(result);
    
        // Cau c
        printf("\nXuat kho:\n");
        HangHoa hhh = XuatKho(k);
        printf("%s %d %d %d\n", hhh.MaHH.c_str(), hhh.NgayNhap.d, hhh.NgayNhap.m, hhh.NgayNhap.y);
        printf("Kho con lai:\n");
        printHH(k.pHead);
    
        // Cau d
        int n = 2;
        printf("\nXuat kho %d lan:\n", n);
        XuatKho(k, n);
        printf("Kho con lai:\n");
        printHH(k.pHead);
    
        delete result;
        result = 0;
    }

  7. Đã cảm ơn tengiday:

    pepper