You are on page 1of 4

10/27/2010 Lập trình C/C++ trên Linux

Trường ðại học


Công nghệ
Giảng viên: TS. Nguyễn Trí Thành
Email: ntthanh@vnu.edu.vn

ðỀ THI GIỮA KỲ
ðề bài | Thiết kế

ðỀ BÀI

Viết chương trình quản lý cơ sở dữ liệu các giao dịch bán hàng ñơn giản bằng C++, mỗi một giao dịch sẽ bao gồm các thông tin: số hiệu giao dịch
(số tăng tự ñộng theo ñúng thứ tự), số lượng mặt hàng và ñơn giá:
nhập thêm một giao dịch mới, chỉ cần nhập số lượng mặt hàng và ñơn giá, còn số hiệu giao dịch thì chương trình phải tự ñộng tăng
truy vấn giao dịch có số hiệu n
tính tổng tiền của tất cả các giao dịch có trong cơ sở dữ liệu
viết chương trình dưới dạng khách-chủ (client-server) sử dụng socket và giao thức TCP/IP
sử dụng MySQL ñể lưu dữ liệu
viết chương trình dưới dạng thư viện và viết Makefile ñể biên dịch chương trình

THIẾT KẾ CỦA CHƯƠNG TRÌNH NHƯ SAU

cơ sở dữ liệu

CREATE TABLE transaction(


id int(11) NOT NULL auto_increment,
quantity int(30),
price decimal(18,2),
PRIMARY KEY (id)
);
tên DB: thuchanhlinux
tên user: linux
mật khẩu: linuxpass

lớp CTransaction
tên file Transaction.h và Transaction.cpp
mục ñích là quản lý một giao dịch
chứa các thành viên: số hiệu giao dịch (shgd), số lượng (sl), ñơn giá (dg)
chứa các phương thức

/*
Chuyển dữ liệu ñầu vào dạng
"I 200 30 " -> sl=200; dg=30;
"Q 14 " -> shgd=14;
Các chuỗi không ñúng ñịnh dạng trên thì trả về false
*/
bool convertFromText(const char *str);

/*
Trả về con trỏ ñến chuỗi dạng "shgd sl dg"
Ví dụ
shgd=14; sl=200; dg=30; thì chuỗi ñầu ra sẽ là "14 200 30 "
*/
const char* convertToText();

/*
ðặt giá trị cho các biến

D:/study/Coltech/…/MidtermProject.html 1/4
10/27/2010 Lập trình C/C++ trên Linux
sl=quantity; dg=price;
shgd=id;
Hàm trả về giá trị true nếu việc gán dữ liệu thành công, ngược lại trả về false
*/
bool set(const char *id, const char *quantity, const char *price);

lớp CMyDB
tên file MyDB.h và MyDB.cpp
mục ñích là thao tác với MySQL
các thành viên: tùy người lập trình
chứa các phương thức

//Xóa toàn bộ dữ liệu trong


bool clearAllTransaction();

/*
Lấy tổng số tiền của tất cả các giao dịch, trong
ñó tiền của một giao dịch sẽ bằng so_luong * don_gia
Chú ý là lấy 2 số thập phân sau dấu phảy
*/
double getTotal();

//Lấy thông tin của một giao dịch có shgd chứa trong ñối tượng tran
bool getTransaction(CTransaction &tran);

//Chèn thêm một giao dịch tran vào trong bảng transaction
unsigned insertTransaction(CTransaction &tran);

/*
Hủy kết nối với MySQL
Trả về true nếu gọi hợp lệ, ngược lại trả về false
*/
bool disconnect();

//Tạo kết nối với MySQL


bool connect(const char *host,const char *db, const char *user, const char *pwd);

lớp CServer
tên file Server.h và Server.cpp
mục ñích là quản lý và ñiều phối kết nối từ máy khách
chứa các thành viên: tùy người lập trình
chứa các phương thức

/*
Khởi tạo kết nối với MySQL và khởi tạo socket, tạo tiến trình chủ
*/
bool initialize(const char *host,const char*db,const char*user,const char*pwd,int port);
/*
Phục vụ các yêu cầu từ máy khách
*/
void serve();
//Dọn dẹp tài nguyên, ñóng socket
bool clean();

nội dung của thủ tục serve() phục vụ ñược các yêu cầu sau

Yêu cầu:
I 20 345.6
Thì chèn vào bảng transaction và trả lại số hiệu giao dịch cho máy khách
Nếu không thành công thì trả về "Insertion error"

Yêu cầu:
Q 14
Truy nhập cơ sở dữ liệu và trả về transaction có shgd=14
14 20 345.6
Nếu không có thì trả về "Not found"

Yêu cầu:
T
Truy nhập cơ sở dữ liệu và trả về tổng số tiền của tất cả các giao dịch trong CSDL
23456.34

D:/study/Coltech/…/MidtermProject.html 2/4
10/27/2010 Lập trình C/C++ trên Linux
Yêu cầu:
C
Xóa toàn bộ các giao dịch trong CSDL và trả về "Transactions are cleared"
Nếu không thành công có thì trả về "Clear action error"

Yêu cầu:
E
Trả về "Transactions are cleared" và thoát khỏi thủ tục

các trường hợp còn lại ñều trả về "Failed to parse the query"

các file Transaction.o MyDB.o và Server.o sẽ ñược tạo thành thư viện liên kết ñộng (shared objects)
chương trình sẽ ñược chấm bằng máy, do ñó tên file, tên lớp, tên các phương thức phải tuân theo các ñặc tả ở trên
viết Makefile ñể biên dịch chương trình
chương trình main() cho chương trình chủ và khách cũng như chương trình kiểm tra ñều ñược cung cấp, sinh viên thay ñổi thông tin về CSDL ñể
chạy. Sinh viên tạo một target test trong Makefile ñể biên dịch với phần test này.
File testcase.cpp dùng ñể test cục bộ hai lớp CTransaction và CMyDB, kết quả chạy thử của nó có dạng

./testcase
Passed test 1 (tran.set() passes)
Passed test 2 (tran.set() passes)
Passed test 3 (tran.set() passes)
Passed test 4 (tran.set() passes)
Passed test 5 (tran.set() passes)
Invalid data
Passed test 6 (tran.convertFromText() passes)
Invalid data
Passed test 7 (tran.convertFromText() passes)
Quantity 234, price 345.6
Passed test 8 (tran.convertFromText() passes)
Invalid data
Passed test 9 (tran.convertFromText() passes)
Transaction 24
Passed test 10 (tran.convertFromText() passes)
Passed test 11 (tran.convertToText() passes)
Passed test 12 (mydb.disconnect() passes)
Passed test 13 (mydb.disconnect() passes)
Passed test 14 (mydb.connect() passes)
Passed test 15 (mydb.connect() passes)
Passed test 16 (mydb.disconnect() passes)
Passed test 17 (mydb.disconnect() passes)
Passed test 18 (tran.set() passes)
Passed test 19 (mydb.insertTransaction() passes)
Passed test 20 (mydb.getTotal() passes)
Passed test 21 (mydb.getTransaction() passes)
Passed test 22 (mydb.clearAllTransaction() passes)
Passed test 23 (tran.set() passes)
Passed test 24 (mydb.connect() passes)
Passed test 25 (mydb.clearAllTransaction() passes)
Passed test 26 (mydb.insertTransaction() passes)
Transaction 12
Passed test 27 (tran.convertFromText() passes)
Passed test 28 (mydb.getTransaction() passes)
Passed test 29 (tran.convertToText() passes)
Passed test 30 (mydb.getTotal() passes)
Passed test 31 (mydb.disconnect() passes)
Passed test 32 (server.initialize() passes)
Passed test 33 (server.clean() passes)
Passed test 34 (server.initialize() passes)
Passed test 35 (server.initialize() passes)
Passed test 36 (server.clean() passes)

Your modules have passed 36 of 36 tests

Congratulations!!! Your modules are ready for submission

file Transactionclient.cpp và TranSactionMN.cpp dùng ñể kiểm tra lớp CServer và kiểm tra giao tiếp từ client. Kết quả chạy thử chương trình như
sau:

[thanhnt@u assignment]$ ./transerver &

D:/study/Coltech/…/MidtermProject.html 3/4
10/27/2010 Lập trình C/C++ trên Linux
[1] 1991
server waiting
[thanhnt@u assignment]$ ./tranclient
Passed test 1 (server.serve() connection passes)
I 20 34.6
Quantity 20, price 34.6
server waiting
Transaction id from server = 20
Passed test 2 (server.serve() passes)
Q 20
Transaction 20
server waiting
Query result from server = 20 20 34.60
Passed test 3 (server.serve() passes)
T
server waiting
Total money from server = 692.00
Passed test 4 (server.serve() passes)
C 1
server waiting
Clear all transaction result from server = Transactions are cleared
Passed test 5 (server.serve() passes)
X 1
server waiting
Clear all transaction result from server = Failed to parse the query
Passed test 6 (server.serve() passes)
E
Reply for quiting from server = Bye
Passed test 7 (server.serve() passes)

Your server have passed 7 of 7 tests

Congratulations!!! Your code is ready for submission

chương trình chứa hàm main() cho server và client sinh viên tự viết

Về ñầu trang

D:/study/Coltech/…/MidtermProject.html 4/4