Bài Tp Ln 2: H THNG QUN LÝ SN XUT KINH DOANH
Phiên bn 2.0
1. Gii thiu
Mt công ty chuyên sn xut cung ng các mt hàng ra th trường. Công ty cn phi qun lượng sn
xut được, đơn đt hàng t khách hàng cũng như các tính toán thng cn thiết. Gi định rng, ch
các sn phm được lưu vào trong h thng. mi ca trc, ng ty cn ghi nhn li toàn b quá tnh sn
xut, kinh doanh.
2. Yêu cu
Trong bài tp ln này, sinh viên s được cung cp mt file cha d liu nhp, bao gm thông tin v các s
kin đến h thng. Mt s kin th là mt lnh nhp kho v mt sn phm va mi đưc sn xut ra, hoc
xut kho cho mt đơn đặt hàng v mt sn phm ca ng ty, hoc là mt yêu cu tính toán thng kê ... Sau
khi kết thúc công vic, chương trình s xut ra màn hình hin trng d liu ca h thng.
Các s kin mà sinh viên phi x được biu din dưới dng danh sách liên kết (linked list). D liu lưu tr
xut là cây nh phân. Chi tiết c thng vic sinh viên phi làm s mô t trong phn 4.
3. D liu nhp
D liu nhp ca chương trình được cha trong file mang tên input.txt. File y s cha các thông tin
v các s kin gp phi trong ca trc. Lưu ý các s liu tn nếu s được đưa vào thông qua c s kin
nhp kho. Mi s kin s được mô t bng mt giá tr s, gi s kin. Ý nghĩa tương ng ca tng s
kin được mô t trong Bng 1. S s kin là không c định, có th thay đổi tu theo test case, và ti đa là 2100
s kin. Mt s kin có th xy ra nhiu ln. Các s kin th trìnhy thành nhiu dòng.
Bng 1 – Các s kin xy ra trong ca trc
s kin
Ý nghĩa
0
1XXXY
2XXXY
3
4
5XXXY
6Z
9
Ca trc chm dt đột ngt
Nhp kho Y sn phm XXX
Mt s lượng Y ca sn phm XXX đã được khách hàng đặt ng
Yêu cu cu trúc li s kho theo AVL theo cách đơn gin
Yêu cu cu trúc li s kho theo AVL theo cách phc tp
Yêu cu nhp kho đặc bit
Yêu cu loi b các sn phm dư tha
S kin bonus
Ví d 1: Vi d liu nhp là
11113 21112
t các s kin sau:
S kin 1: nhp kho 3 sn phm 111.
S kin 2: 2 sn phm 111 được đặt hàng.
4. Hin thc chương trình
Sinh viên s hin thc mt hàm storageBin prototype như sau:
notesTree* storageBin(eventList* pEvent)
Thông s pEvent là mt con tr tr đến danh sách liên kết ca các s kin được đọc t file input, được định
nghĩa như sau:
struct eventList {
int nEventCode;
eventList* pNext;
}
S kho notesTree là cu trúc cây nh phân lưu tr toàn b d liu tn kho, có cu trúc như sau:
struct notesTree {
int nProdID; // ID ca sn phm
int nQuan; // s lượng sn phm, có giá tr t 0 đến 99
int balance; // ch dùng trong cây AVL và s đưc b qua trong các trường hp khác
notesTree* pLeftChild; // nhánh con trái
notesTree* pRightChild; // nhánh con phi
}
Như vy, mi nút trên cây lưu tr v tình trng tn sn phm. Thông tin v mt nút bao gm sn phm
(nProdID) khóa tìm kiếms lượng (nQuan). Giá tr ca nProdID nm trong khong [0-999], giá tr ca
nQuan nm trong khong [0-99].
Chú ý: Nếu nQuan vượt quá 99, nQuan s được gán li bng (nQuan modulo 100).
Chú ý: Trong trường hp y mt AVL, mi nút trên cây bao gm thêm thông tin v mc cân
bng ca nó (giá tr balance). Theo định nghĩa trong bài ging,
balance = HLHR
trong đó, HL HR ln lượt là chiu cao ca cây conn trái và cây con bên phi ca nút đó.
Như vy:
balance = 1: nhánh trái cao hơn nhánh phi (left_higher)
balance = 0: nhánh trái và nhánh phi bng nhau (equal_height)
balance = -1: nhánh phi cao hơn nhánh trái (right_higher)
Định nghĩa 1:
- NI (NoteInfo) ca mt phn t trong s kho là mt chui s nguyên 5 ch s được to thành bng ch
ghép các ch s mã sn phm (3 ch s), s lượng (2 ch s).
- NsI (NotesInfo) ca mt s kho là mt chui biu din cây nh phân gm các NI theo cách ng du ngoc
đơn. NsI dùng để biu din s kho và in ra kết qu khi kết thúc chương trình.
d 2: Nếu hai sn phm trong s kho, sn phm v trí nút gc 3 sn phm 111, sn phm th hai
đứng v trí nút con bên phi ca ghi cđầu, là 2 sn phm 222; tNsI ca y (11103 (N 22202)). N
viết tt cho NULL, tc nút gc không có nút con bên trái
5. Xây dng cây nh phân kết qu
Cây nh pn kết qu ca hàm storageBin s được xây dng theo các nguyên tc sau:
S1) S kho là mt cây nh phân tìm kiếm (Binary search tree - BST). Nếu sau mt s kin o đó, cây nh
phân không còn tn ti nút nào thì hàm storageBin chm dt ngay lp tc và tr v kết qu là NULL.
S2) Nếu gp s kin 0, hàm kết thúc và s kho được tr v.
Ví d 3: Vi d liu nhp là
0
t gp s kin 0, hàm tr v cây hin ti là NULL.
S3) Nếu gp s kin 1XXXY, chương trình s tìm trong s kho sn phm XXX. Nếu tìm thy s cng dn s
lượng Y vào s lượng hin ti ca nút tìm thy. Nếu không tìm thy, mt nút mi vi c s liu tương ng
s được thêm vào (cây) s kho theo nguyên tc cay BST.
Ví d 4: Vi d liu nhp là
17234 19343 12246 17236
Sau 3 s kin nhp kho đầu tiên, s kho là (72304 (22406 93403)). Khi gp s kin th tư, s lượng tn ca
sn phm 723 s được cp nht thành 10. Cây nh phân kết qu s là (72310 (22406 93403)).
S4) Khi gp s kin 2XXXY, sn phm ABC o “gn” trùng vi XXX nht s được la chn để giao hàng.
Khi đó, s lượng tn sn phm này trong s kho s được tr đi mt lưng Y. Nếu sau khi tr đi, s lưng tn
nh hơn hoc bng 0, sn phm này s b loi khi s kho. Nguyên tc loi b 1 nút trên cây BST là in-order
successor (nút cc trái ca cây con phi, xem thêm ti http://en.wikipedia.org/wiki/Binary_search_tree).
Định nghĩa 2. Nút có sn phm ABC được xem là gn vi XXX nht trên toàn cây nh phân nếu |ABC-XXX|
nh nht so vi các nút khác. Nếu có hai nút có cùng giá tr gn nht như vy, s ưu tiên cho nút có mã sn
phm nh hơn.
Ví d 5: Vi d liu nhp là
17234 17243 17259 27242
Khi gp lnh đặt ng, giá tr ca s kho (72304 (N 72403 (N 72509))); do đó sn phm giao hàng mã
724 (chính là sn phm đặt hàng). Khi đó s kho kết qu là (72304 (N 72401 (N 72509)))
Ví d 6: Vi d liu nhp là
17234 17253 27233
Sn phm giao hàng smã là 723. Khi đó s kho kết qu là (72301 (N 72503)).
Ví d 7: Vi d liu nhp là
17234 17253 17211 27234
Trước khi gp lnh đặt hàng, s kho (72304 (72101 72503)). Sn phm giao hàng s mã là 723. Do sn
phm 723 ch 4 đơn v lnh đặt hàng cũng 4 đơn v n sau khi giao hàng xong, sn phm này s b
loi khi s kho. Khi đó, nút cc trái ca cây con phi (72503) s được đem thay cho nút gc. S kho kết
qu là (72503 (72101 N)).
S5) Khi gp s kin 3, s kho s được cu trúc li thành mt AVL-BST theo cách sau:
- Duyt s kho theo LNR vào mt danh sách
- Xóa s kho hin hành
- Bt đầu xây dng mt s kho AVL-BST vi đầu vào là danh sách nói trên
o Ly phn t “gia” 1 ca danh sách làm nút gc
o Xây dng AVL-BST cho danh sách t đầu đến trước phn t gia (đệ qui), gn vào nhánh trái
o Xây dng AVL-BST cho danh sách t sau phn t gia đến cui (đệ qui), gn vào nhánh phi
Sau khi to thành AVL-BST, s kho vn được vn hành như mt BST bình thường (không cn cân bng li
khi mt cân bng).
1 Phn t gia ca 1 đon danh sách có ch s t low đến high(low+high) div 2 (chia nguyên)
Ví d 8: Vi d liu nhp là
17234 17253 17291 17324 17419 3
Trước khi gp s kin 3, s kho (72304 (N 72503 (N 72901 (N 73204 (N 74109))))). Khi gp s kin 3,
danh sách được duyt thành [72304, 72503, 72901, 73204, 74109]. Khi đó cây AVL-BST được xây dng
bng cách đưa 72901 thành nút gc, nhánh trái mt AVL-BST xây dng t danh sách [72304, 72503],
nhánh phi mt AVL-BST xây dng t danh sách [73204, 74109].
S kho kết qu là (72901 (72304 (N 72503) 73204 (N 74109))).
S6) Khi gp s kin 4, s kho s được cu trúc li thành mt AVL-BST theo cách sau:
- Duyt s kho theo NRL vào mt danh sách
- Xóa s kho hin hành
- Bt đầu xây dng mt s kho AVL-BST bng cách ln lượt thêm 1 phn t t danh sách đã nói vào
trong AVL-BST và cân bng nếu cn.
Sau khi to thành AVL-BST, s kho vn được vn hành như mt BST bình thường (không cn cân bng li
khi mt cân bng).
Ví d 9: Vi d liu nhp là
17234 17253 17291 17324 17419 4
Trước khi gp s kin 4, s kho (72304 (N 72503 (N 72901 (N 73204 (N 74109))))). Khi gp s kin 4,
danh sách được duyt thành [72304, 72503, 72901, 73204, 74109]. Khi đó cây AVL-BST được xây dng
bng cách ln lưt đưa 72304, 72503, … vào mt AVL-BST rng ban đầu:
(72304)
(72304 (N 72503))
(72304 (N 72503 (N 72901))) == right rotate ==> (72503 (72304 72901))
(72503 (72304 72901 (N 73204)))
(72503 (72304 72901 (N 73204 (N 74109)))) == right rotate ==> (72503 (72304 73204 (72901 74109)))
S kho kết qu là (72503 (72304 73204 (72901 74109))).
S7) Khi gp s kin 5XXXY, s kho s được xây dng li theo cách sau:
- Duyt s kho theo RLN vào mt danh sách
- Xóa s kho hin hành
- Gi ZZ là lượng tn sn phm XXX trong danh ch RLN va được to ra. Loi phn t XXXZZ ra
khi danh sách đã nói. Nếu không có sn phm XXX trong danh sách, t ZZ=0.
- Mt phn t mi XXXWW được thêm vào nút gc ca s kho. WW=ZZ+Y.
- Ln lượt thêm vào s kho các sn phm còn li trong danh sách RLN, t phn t đầu tiên đến cui. Chú
ý: cách thc thêm vào như là thêm vào cây BST bình thường.
Ví d 10: Vi d liu nhp là
17234 17253 17291 17324 17419 57298
Trước khi gp s kin 57298, s kho (72304 (N 72503 (N 72901 (N 73204 (N 74109))))). Khi gp s kin
57298, danh ch được duyt thành [74109, 73204, 72901, 72503, 72304]. Tn kho ca sn phm 729 đang
1 => Tn kho mi s là 1+8 = 9. Khi đó s kho mi được xây dng :
(7299)
(7299 (N 74109))
(7299 (N 74109 (73204 N)))
(7299 (72503 74109 (73204 N)))
(7299 (72503 (72304 N) 74109 (73204 N)))
S8) Khi gp s kin 6Z, tt c các sn phm độu ln hơn hoc bng Z s b xóa s kho.
Định nghĩa 3: Độ sâu (depth) ca mt nút s bng khong cách t nút đó đến nút gc cng thêm 1. Như vy,
độ sâu ca nút gc s là 1.
Ví d 11: Vi d liu nhp là
17234 17253 17291 17324 17419 57298 63
Tương t như d 10, trước khi gp s kin 63, s kho (7299 (72503 (72304 N) 74109 (73204 N))). Khi
đó, tt c các phn t độ sâu ln hơn hoc bng 3 đều b xóa b. S kho còn li là (7299 (72503 74109)).
S9) (Bonus – Câu này ch được tính đim nếu bài làm vượt qua được ít nht 80% các testcase)
Định nghĩa 4: MaxPath mt danh sách các sn phm trên đường đi i nht t nút gc đến mt nút
trong cây. Mt cây th có nhiu MaxPath.
d 12: Vi s kho là (72503 (72304 73204 (72901 74109))) t 2 MaxPath danh sách {725,732,
729} và danh sách {725,732,741}.
Khi gp s kin bonus, nếu s kho tn ti mt MaxPath mt dãy tăng dn, thì hàm kết thúc tr v mt
s kho kết qu vi s lượng tn các sn phm trong MaxPath tăng dn đó được n bng 0. Nếu không tn
ti mt MaxPath nào như vy, hàm cũng kết thúc và tr v s kho hin hành.
Ví d 13: Vi d liu nhp là
17234 17253 17291 17324 17419 4 9
Trước khi gp s kin 9, s kho là (72503 (72304 73204 (72901 74109))). Khi đó, s kho này 1 MaxPath
tăng dn là {725, 732, 741}. S kho kết qu là (72500 (72304 73200 (72901 74100))).
6. Cách dch và thc thi chương trình
Sinh viên download file Assignment2.zip t trang Web ca môn hc. Khi gii nén file này, s được các
file sau:
input.txt
Mt file input ví d.
main.cpp
Chương trình chính
storebin.cpp Chương trình hin thc bi sinh viên
defs.h File định nghĩa các cu trúc và hàmng chung
Assignment2.pdf File mô t ni dung bài tp ln
File input.txt là mt file nhp mu như được mô t phn 3. File main.cpp là chương trình khi to,
bao gm các hàm viết sn như sau:
- main(): chương tnh chính s thc thi
- readFile(): hàm đọc file input
- display() : hàm xut d liu ra màn hình.
Lưu ý rng sinh viên không được phép thay đổi file main.cpp defs.h khi hin thc chương trình
cũng như không được include bt k thư vin nào khác (tt c các thư vin cn thiết đều đã được
include trong file defs.h). Ngoài ra, các hàm do sinh viên viết không được xut bt k d liu nào ra màn
hình khi thc thi.