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

Mọi người giúp mình làm bài này với:

zVVFQI.png

NC5bsW.png
 

tengiday

Happy life
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?
 
Sửa lần cuối:
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;
}
}
 

tengiday

Happy life
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.
[ah]
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;
}
[/ah]

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'.
[ah]
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;
            }
        }
}
[/ah]

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.
[ah]
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;
}
[/ah]

Câu "Xuất kho n lần":
[ah]
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());
        }
    }
}
[/ah]

Còn đây là 'main' để test:
[ah]
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;
}
[/ah]
 
Top