Tải bản đầy đủ (.pdf) (45 trang)

Tn14 th btth

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (8.57 MB, 45 trang )

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
KHOA CÔNG NGHỆ THƠNG TIN
HỆ CHÍNH QUI – LỚP CỬ NHÂN TÀI NĂNG 2014
MƠN: NHẬP MƠN LẬP TRÌNH

BÀI TẬP TỔNG HỢP

ĐẶNG HỒNG HẢI
ĐỖ NGUYÊN KHA

TP.HCM, ngày 21 tháng 12 năm 2014


{dhhai, dnkha}@fit.hcmus.edu.vn

1 Tính tốn cơ bản
1. Viết hàm tính tổng 𝑆 𝑛 = 𝑥 + 𝑥 ! + 𝑥 ! + ⋯ + 𝑥 !
2. Viết hàm tính tổng 𝑆 𝑛 = 𝑥 +

!!
!!!

+

!!
!!!!!

!!

+ ⋯+


!!!!!!⋯!!

3. Viết hàm tính xấp xỉ 𝑒 ! bằng khai triển Taylor như sau (𝑥 là số thực):
𝑥! 𝑥!
𝑒 =1+𝑥+ + +⋯=
2! 3!

!

!

!!!

𝑥!
𝑛!

Hãy tính 𝑒 ! xấp xỉ với số lũy thừa 𝑛 = 5, 𝑛 = 10, 𝑛 = 20, 𝑛 = 50 v.v. Xuất kết quả
ra ít nhất 10 chữ số thập phân để thấy độ chính xác của xấp xỉ.
4. Viết hàm tính xấp xỉ sin 𝑥 bằng khai triển Taylor như sau (𝑥 là số thực tính bằng
radian):
𝑥! 𝑥! 𝑥! 𝑥!
sin 𝑥 = 𝑥 − + − + − ⋯ =
3! 5! 7! 9!

!

−1
!!!

!


𝑥 !!!!
(2𝑛 + 1)!

Hãy tính sin 𝑥 xấp xỉ với số lũy thừa 𝑛 = 5, 𝑛 = 10, 𝑛 = 20, 𝑛 = 50 v.v. Xuất kết
quả ra ít nhất 10 chữ số thập phân để thấy độ chính xác của xấp xỉ.
5. Hãy xác định khai triển Taylor của cos 𝑥 và tính xấp xỉ.
6. Viết hàm tính tổng tất cả các ước số nguyên dương của số nguyên dương n.
7. Viết hàm tính tích tất cả các ước số nguyên dương của số nguyên dương n.

3


{dhhai, dnkha}@fit.hcmus.edu.vn
8. Viết hàm kiểm tra số nguyên dương n có phải là số hồn hảo (perfect number) hay
khơng. Số hoàn hảo là số bằng đúng tổng tất các ước số dương của nó trừ chính
nó.
Ví dụ số 6 là số hồn hảo: 6 = 1 + 2 + 3
Ví dụ số 28 là số hoàn hảo: 28 = 1 + 2 + 4 + 7 + 14
9. Số hoàn hảo chẵn: Euclid chứng minh được rằng 2!!! (2! − 1) là một số hoàn hảo
chẵn khi 2! − 1 là một số nguyên tố. Để 2! − 1 là số nguyên tố (số nguyên tố
Mersenne), thì bản thân 𝑝 cũng phải là số nguyên tố:
2! − 1 nguyên tố ⇒ 𝑝 nguyên tố
Điều ngược lại không đúng: 𝑝 nguyên tố ⇏ 2! − 1 nguyên tố.
Ví dụ:
𝑝 = 2: 2! 2! − 1 = 6
𝑝 = 3: 2! 2! − 1 = 28
𝑝 = 5: 2! 2! − 1 = 496
Dựa vào kết quả của Euclid, hãy đề xuất thuật tốn hiệu quả kiểm tra một số có
phải là số hồn hảo chẵn hay khơng.

10. Viết hàm đếm tần số của các chữ số thập phân của số nguyên n. Ví dụ:
123456789 có các tần số là: 0:0, 1:1, 2:1, 3:1, 4:1, 5:1, 6:1, 7:1, 8:1, 9:1
1996 có các tần số là: 0:0, 1:1, 2:0, 3:0, 4:0, 5:0, 6:1, 7:0, 8:0, 9:2
11. Viết hàm tính tổng bù khơng q 10 của các chữ số thập phân của số nguyên n. Ví
dụ: 123456789 => 45 => 9.
4


{dhhai, dnkha}@fit.hcmus.edu.vn
12. Viết hàm tính ước chung lớn nhất của 2 số nguyên dương a, b.
13. Viết hàm tính bội chung nhỏ nhất của 2 số nguyên dương a, b.
14. Viết hàm cài đặt thuật toán hiệu quả để kiểm tra số tự nhiên n có phải là số lũy
thừa hồn hảo (perfect power) hay khơng. n là số lũy thừa hồn hảo nếu có dạng n
= a^b với a, b là số tự nhiên >1.
15. Viết hàm đếm số bit của một số nguyên n.

Phương pháp Newton
Phương pháp Newton là phương pháp tìm nghiệm thực của phương trình 𝑓 𝑥 = 0,
bằng cách cải thiện các xấp xỉ của nghiệm 𝑥 qua từng bước lặp. Cụ thể như sau:
Cho trước hàm 𝑓(𝑥) xác định trên ℝ, có đạo hàm 𝑓 ! , ta bắt đầu với 𝑥! là dự đoán
(guess) nghiệm 𝑥 của 𝑓 𝑥 = 0. Ta cải thiện xấp xỉ nghiệm 𝑥 bằng 𝑥! , với

𝑥! = 𝑥! −

𝑓 𝑥!
𝑓 ! 𝑥!

Quá trình cải thiện này được lặp như sau:

𝑥!!! = 𝑥! −


𝑓 𝑥!
𝑓 ! 𝑥!

với n đủ lớn cho tới khi đạt được độ chính xác mong muốn.

5


{dhhai, dnkha}@fit.hcmus.edu.vn
16. Viết hàm tính căn bậc 2 (square root) dựa trên phương pháp Newton.
Hàm tính

𝑆 thực chất là hàm tìm nghiệm của phương trình 𝑓 𝑥 = 𝑥 ! − 𝑆 = 0.

Khởi động với 𝑥! = 1, sử dụng phương pháp Newton hãy tính xấp xỉ căn bậc 2 của một
số thực dương 𝑆, với số lần lặp cải tiến xấp xỉ là 𝑛 = 5, 𝑛 = 10, 𝑛 = 20, 𝑛 = 50 v.v.
Xuất kết quả ra ít nhất 10 chữ số thập phân để thấy độ chính xác của xấp xỉ.
17. Mở rộng hàm tính căn bậc 2 với mức xấp xỉ (sai số) 𝜀. Tức là dừng vòng lặp cải
tiến xấp xỉ khi thấy sai số giữa 𝑥! và 𝑥!!! nhỏ hơn 𝜀: 𝑥! − 𝑥!!! < 𝜀. Thử
nghiệm và đếm số vòng lặp cần thực hiện với các giá trị khác nhau của 𝜀.
18. Thay đổi hàm tính căn bậc 2 với giá trị khởi tạo ban đầu 𝑥! tốt hơn. Nếu giá trị
khởi tạo ban đầu ở khá xa so với giá trị thực, tốc độ của hàm tính căn sẽ bị giảm
thiểu. Ta cần chọn một giá trị ban đầu 𝑥! gần với giá trị thực để tăng tốc thuật
toán. Nếu biểu diễn nhị phân của 𝑆 có dạng 𝑎×2!! , với 0.1! ≤ 𝑎 < 10! ,
𝑆 = 𝑎×2! , ta có thể xấp xỉ thơ 𝑆 ≈ 2! , tức khởi động 𝑥! = 2! .
19. Hãy viết hàm cài đặt thuật tốn tính căn bậc 3 (cube root - ∛) bằng phương pháp
Newton.
20. Xét cơng thức tính trung bình như sau:
!!!


𝐴𝑣𝑒𝑟𝑎𝑔𝑒 =

!!!

𝑎! − 𝑀𝑎𝑥
!!!

!

+

𝑎! − 𝑀𝑖𝑛
!!!

!

+

𝑛
𝑀𝑎𝑥 − 𝑀𝑖𝑛
2

!

6


{dhhai, dnkha}@fit.hcmus.edu.vn
Trong đó 𝑀𝑎𝑥, 𝑀𝑖𝑛 lần lượt là giá trị lớn nhất, nhỏ nhất của 𝑛 số thực

𝑎! , 𝑎! , 𝑎! , … , 𝑎!!! . Hãy viết hàm tính 𝐴𝑣𝑒𝑟𝑎𝑔𝑒 mà khơng dùng mảng để lưu trữ các
phần tử. Các phần tử sẽ được truyền vào liên tục bằng cách đọc từ nhập chuẩn/tập tin.

2 Thao tác trên mảng
21. Viết hàm tìm số âm lớn nhất trong mảng một chiều các số thực. Trả về 0 nếu
không thấy số âm.
22. Viết hàm tìm số nguyên tố lớn nhất trong mảng một chiều các số nguyên. Trả về 0
nếu khơng tìm thấy số ngun tố.
23. Viết hàm tìm trong mảng một chiều các số thực số xa x nhất (x cho trước).
24. Viết hàm tìm ước chung lớn nhất của tất cả các số trong mảng một chiều các số
nguyên dương.
25. Viết hàm tìm bội chung nhỏ nhất của tất cả các số trong mảng một chiều các số
nguyên dương.
26. Viết hàm phát sinh ngẫu nhiên một mảng n số nguyên trong khoảng [a, b].
27. Viết hàm đếm tần suất xuất hiện của giá trị x trong mảng một chiều các số thực.
28. Viết hàm đếm tần suất xuất hiện của các số trong mảng một chiều các số nguyên.
Sắp kết quả tần suất theo giá trị của các số với thứ tự tăng dần.
29. Viết hàm dịch phải xoay vòng k lần các phần tử trong mảng
30. Viết hàm tính khoảng cách trung bình giữa các giá trị trong mảng một chiều các số
thực. Khoảng cách giữa 2 số tính bằng giá trị tuyệt đối.

7


{dhhai, dnkha}@fit.hcmus.edu.vn
31. Viết hàm tính vector n chiều là tổng 2 vector n chiều số thực cho trước. Mỗi vector
n chiều là 1 mảng n phần tử, với mỗi phần tử đại diện cho một chiều i. Vector
𝐯 = (𝑣! , 𝑣! , … , 𝑣! , … , 𝑣!!! , 𝑣! )
Phép cộng 2 vector n chiều thực hiện bằng cách cộng giá trị theo từng chiều.
32. Viết hàm tính tích vơ hướng của 2 vector n chiều số thực cho trước. Tích vơ

hướng 𝐯 ∙ 𝐯 ! =

!
!
!!! 𝑣! 𝑣!
!
!
!!! 𝑣! .

33. Viết hàm tính độ lớn của vector n chiều số thực. Độ lớn 𝐯 =
34. Viết hàm tính góc 𝜃 giữa 2 vector n chiều số thực, tính theo radian.
Biết cos 𝜃 =

cos

!!

 𝐯∙𝐯 !
𝐯

𝐯!

và biết khai triển Taylor của hàm ngược cos !! 𝑥 với 𝑥 ≤ 1 là

1
1 𝑥! 1 3 𝑥! 1 3 5 𝑥!
1
𝑥= 𝜋− 𝑥+
+
+

+ ⋯   = 𝜋 −
2
2 3 24 5 246 7
2

!

!!!

(2𝑛)! 𝑥 !!!!
4! 𝑛! ! 2𝑛 + 1

35. Cho trước 2 mảng số thực một chiều sắp tăng dần có kích thước n và m. Viết hàm
trộn 2 mảng ban đầu thành một mảng một chiều mới có kích thước n+m, có phần
tử là các phần tử của 2 mảng ban đầu và vẫn sắp tăng dần (Merge sort).
36. Tìm phần tử lớn thứ k trong mảng. Cho một mảng một chiều n số thực, hãy viết
hàm tìm phần tử lớn thứ k trong mảng, tức là phần tử lớn hơn hoặc bằng k-1 số
trong mảng, và nhỏ hơn hoặc bằng n-k số còn lại.
37. Phân hoạch mảng một chiều (Quicksort partition). Cho một mảng một chiều n số
thực, hãy phân hoạch lại mảng (sắp lại các phần tử trong mảng) để đồng thời thỏa
tất cả các điều kiện sau:

8


{dhhai, dnkha}@fit.hcmus.edu.vn
• Phần tử lớn thứ n/2 nằm ở vị trí n/2 trong mảng (vị trí đếm từ 1)
• Các phần tử nhỏ hơn hoặc bằng phần tử lớn thứ n/2 nằm trước phần tử
n/2 trong mảng (bên trái mảng) . Thứ tự của các phần tử này khơng quan
trọng.

• Các phần tử lớn hơn hoặc bằng phần tử lớn thứ n/2 nằm sau phần tử n/2
trong mảng (bên phải mảng). Thứ tự của các phần tử này không quan
trọng.
38. Một ma trận nxm (n dịng, m cột) có thể được biểu diễn bằng mảng 2 chiều nxm.
Hãy viết hàm tính ma trận tổng C của 2 ma trận nxm A và B: C = A + B. Ma trận
tổng C cũng là một ma trận nxm với mỗi phần tử C(i,j) = A(i,j) + B(i,j)
39. Hãy viết hàm tính ma trận hiệu C = A – B: C(i,j) = A(i,j) – B(i,j).
40. Viết hàm tính tích hai ma trận. Hai ma trận chỉ có thể nhân được với nhau nếu số
cột của ma trận trước bằng số dòng của ma trận sau. Tích của ma trận A nxp với
ma trận B pxm là ma trận C nxm, với
C(i,j) = tích vơ hướng của dịng i của A với cột j của B
41. Viết hàm tìm điểm yên ngựa trên ma trận. Điểm yên ngựa là điểm có giá trị nhỏ
nhất trên hàng nhưng lớn nhất trên cột, hoặc là điểm có giá trị lớn nhất trên hàng
nhưng nhỏ nhất trên cột.

9


{dhhai, dnkha}@fit.hcmus.edu.vn

3 Cấu trúc
42. Viết cấu trúc Phân số, trong đó tử là một số nguyên, mẫu là một số nguyên dương.
Viết các hàm tính tổng, hiệu, tích, thương của 2 phân số. Viết hàm rút gọn phân
số. Viết hàm in phân số, có thể in ra dạng hỗn số.
43. Viết cấu trúc Số phức, với số phức c có dạng c = a + bi, với a, b là số thực, a là
phần thực, b là phần ảo. Viết các hàm tính tổng, hiệu, tích, thương của 2 số phức,
biết i^2 = -1. Viết hàm tính lũy thừa bậc n của một số phức.
44. Viết hàm tính khoảng cách trung bình giữa các phần tử trong mảng một chiều các
điểm 2D (2 chiều tọa độ x, y) theo khoảng cách Euclid.
45. Viết hàm tính khoảng cách trung bình giữa các phần tử trong mảng một chiều các

điểm 2D (2 chiều tọa độ x, y) theo khoảng cách Manhattan.
46. (Closest pair) Viết hàm tìm 2 điểm gần nhau nhất trong một mảng các điểm 2D.
Khoảng cách tính theo khoảng cách Euclid.
47. Viết hàm tính khoảng cách trung bình giữa các phần tử trong mảng một chiều các
điểm 3D (3 chiều tọa độ x, y, z) theo khoảng cách Euclid.
48. Viết cấu trúc Đơn thức biểu diễn đơn thức dạng 𝑃(𝑥) = 𝑎𝑥 ! , với a là hệ số và n là
số mũ. Viết các hàm tính giá trị của 𝑃(𝑥) với giá trị cụ thể của 𝑥, hàm tính tích,
thương của các đơn thức.
49. Viết cấu trúc Đa thức biểu diễn đa thức dạng 𝑃 𝑥 = 𝑎! 𝑥 ! + 𝑎!!! 𝑥 !!! + ⋯ +
𝑎! 𝑥! + 𝑎! . Viết các hàm tính giá trị đa thức với giá trị cụ thể của biến 𝑥, hàm tính
tổng, hiệu, tích, thương, phần dư các đa thức.

10


{dhhai, dnkha}@fit.hcmus.edu.vn
50. Viết cấu trúc Ngày giờ (datetime) biểu diễn thời gian, gồm thông tin
ngày/tháng/năm giờ/phút/giây. Viết các hàm nhận vào datetime và:
• Kiểm tra năm nhuận
• Xác định ngày thứ mấy trong năm
• Xác định ngày thứ mấy trong tuần
• Xác định giây thứ mấy trong năm
• Xác định khoảng cách giữa 2 thời điểm datetime tính bằng
giây/phút/giờ/ngày/tháng/năm
51. Viết cấu trúc Tam giác trong không gian 2 chiều gồm tọa độ 3 đỉnh của tam giác.
Viết hàm:
• Kiểm tra 3 đỉnh có tạo thành tam giác khơng
• Tính chu vi, diện tích tam giác
• Tính tọa độ trọng tâm tam giác
• Phân loại tam giác: đều, vng, vng cân, cân, thường

52. Đường trịn trong khơng gian 2D được biểu diễn bằng tọa độ tâm và bán kính. Cho
một mảng các đường trịn 2D, hãy viết hàm tìm xem có đường tròn nào bao hết tất
cả các đường tròn khác trong mảng hay không.
53. Xây dựng cấu trúc vé xem phim dựa trên một vé xem phim thực tế như sau:

11


{dhhai, dnkha}@fit.hcmus.edu.vn

4 Chuỗi kí tự và tập tin
54. Viết hàm đếm số kí tự của một chuỗi kí tự kết thúc bằng kí tự rỗng ‘\0’.
55. Viết hàm đếm số dòng của một tập tin văn bản.
56. Viết hàm đếm số kí tự khơng khoảng trắng (khơng phải kí tự khoảng trắng, tab \t,
xuống dòng \n) của một tập tin văn bản.
57. Viết hàm đếm số từ (từ phân tách bởi khoảng trắng) của một chuỗi kí tự.
58. Viết hàm đếm số từ của một tập tin văn bản.
59. Viết hàm tách từ của một chuỗi kí tự.
60. Viết hàm chuyển một chuỗi kí tự số thành giá trị số nguyên.
61. Viết hàm chuyển một chuỗi kí tự số thành giá trị số thực.
12


{dhhai, dnkha}@fit.hcmus.edu.vn
62. Viết hàm sao chép một tập tin văn bản ra một tập tin văn bản khác.
63. Viết hàm thống kê tần suất xuất hiện của các từ trong một tập tin văn bản.
64. Viết hàm xử lý cắt dòng cho một tập tin văn bản sao cho mỗi dịng có khơng q n
kí tự.
65. Viết hàm đảo ngược chuỗi.


5 Bài tập tổng hợp
66. THỜI KHÓA BIỂU
Cấu trúc hoạt động: mô tả thông tin
của một hoạt động, bao gồm một
đoạn văn bản mô tả, thời gian bắt
đầu, thời gian kết thúc.

struct
 Activity
 {
 

 

char
 info[MAXSIZE];
 //
 Mô
 tả
 hoạt
 động
 


 

Time
 start;
 //
 Thời

 gian
 bắt
 đầu
 


 

Time
 end;
 

//
 Thời
 gian
 kết
 thúc
 

};
 

• Viết hàm tính thời lượng của một hoạt động (Activity)
• Viết hàm in ra thơng tin một hoạt động
• Viết cấu trúc thời khóa biểu TimeTable (danh sách các hoạt động trong 1 tuần)
• Viết hàm in tồn bộ thời khóa biểu ra màn hình, phân theo ngày, sắp thứ tự tăng
dần theo thời gian bắt đầu
• Viết hàm tìm trên thời khóa biểu in ra các hoạt động bắt đầu và kết thúc trong buổi
sáng (từ 6h đến 12h)
• Viết hàm tìm trên thời khóa biểu thời gian rảnh (thời gian bắt đầu – thời gian kết

thúc) vào các buổi sáng trong tuần (từ 6h đến 12h)
13


{dhhai, dnkha}@fit.hcmus.edu.vn
• Viết chương trình chính:
-

Đọc thời khóa biểu của 2 học sinh A và B từ 2 tập tin văn bản

-

Tìm thời gian rảnh vào các buổi sáng của từng học sinh A và B

-

Tìm thời gian rảnh vào các buổi sáng của cả A và B (cả 2 cùng rảnh)

-

Gán hoạt động "Hoc nhom" vào một khoảng thời gian rảnh chung của cả A và B
vào thời khóa biểu của A và B

-

Lưu thời khóa biểu mới của A và B ra 2 tập tin văn bản mới

67. MÃ HĨA VÀ GIẢI MÃ
Bạn cần viết một chương trình giải mã một chuỗi các kí tự thành một văn bản hợp lệ.
Chương trình của bạn sẽ đọc một chuỗi các kí tự đã mã hóa và in ra chuỗi kí tự thực sự

ẩn chứa bên dưới.
Cơ chế mã hóa dựa theo mã hóa Caesar: văn bản mã được tạo ra bằng cách thay thế
mỗi chữ cái trong văn bản bằng một chữ cái cách nó một đoạn cho trước. Đoạn cho trước
này được gọi là khóa của hệ mã. Chương trình của bạn sẽ ln giả sử khóa là 7.
INPUT Dữ liệu nhập gồm nhiều dòng, kết thúc bằng EOF. Mỗi dịng chứa một chuỗi đã
mã hóa có chiều dài tối đa là 255 kí tự. Các kí tự sau khi mã hóa thuộc phần hiển thị được
của bảng mã ASCII (có mã thập phân từ 32 đến 126).
OUTPUT Chương trình cần in ra chuỗi giải mã tương ứng, mỗi chuỗi một dịng, với
khóa là 7.

14


{dhhai, dnkha}@fit.hcmus.edu.vn
INPUT MẪU

OUTPUT MẪU

Rovh'Jveun'Unole5'[oveun'[pu'KO'RO[U

Khoa Co^ng Nghe^. Tho^ng Tin DH KHTN

_pu'johgv'jh.j'ih5u

Xin cha`o ca'c ba.n

Jo|.j'ih5u'th`'th/.u

Chu'c ba.n maY ma('n


68. 3N+1
Các bài toán trong Khoa học máy tính thường được phân loại vào một nhóm bài tốn cụ
thể, như nhóm bài tốn NP, Khơng giải được hay Đệ quy. Trong bài toán dưới đây, bạn
sẽ khảo sát một thuật tốn khơng thể phân nhóm được.
BÀI TOÁN
Xem mã giả sau đây:
1. nhập số nguyên 𝑛
2. in ra 𝑛
3. nếu 𝑛   ==  1 thì dừng
4.

nếu n là số lẻ thì gán 𝑛   =  3𝑛   + 1

5.

ngược lại gán 𝑛   =  𝑛/2

6. quay lại bước 2
Với 𝑛   =  30, thuật toán sẽ in ra chuỗi sau
30  15  46  23  70  35  106  53  160  80  40  20  10  5  16  8  4  2  1  

15


{dhhai, dnkha}@fit.hcmus.edu.vn
Các nhà khoa học dự đoán rằng thuật toán trên sẽ dừng (khi gặp 𝑛   =  1) với mọi số
nguyên 𝑛. Mặc dù thuật toán khá đơn giản, nhưng hiện vẫn chưa biết được dự đốn đó có
đúng hay khơng. Tuy nhiên, thuật tốn đã được kiểm chứng là sẽ dừng với mọi số nguyên
𝑛 thỏa 0   <  𝑛   <  1  000  000.
Với mỗi số nguyên 𝑛, ta gọi số con số được in ra bởi thuật toán là chiều dài chu kỳ của

𝑛. Trong ví dụ trên, chiều dài chu kỳ của 𝑛   =  30 là 19.
YÊU CẦU Bạn cần xác định chiều dài chu kỳ lớn nhất của các số nguyên trong khoảng
giữa 𝑖 và 𝑗, với 𝑖, 𝑗 cho trước.
INPUT Input bao gồm nhiều cặp các số nguyên 𝑖 và 𝑗, mỗi cặp trên một dòng. Các số
nguyên nằm trong khoảng [0, 1  000  000]. Bạn cần xử lý tất cả các cặp số nguyên, và tìm
chiều dài chu kỳ lớn nhất của các số nguyên trong khoảng giữa 𝑖 và 𝑗.
OUTPUT Với mỗi cặp số nguyên 𝑖 và 𝑗, in ra 𝑖, 𝑗 và chiều dài chu kỳ lớn nhất của các số
nguyên trong khoảng từ 𝑖 đến 𝑗, mỗi số cách nhau bằng một khoảng trắng và viết trên
cùng một dòng.
INPUT MẪU

OUTPUT MẪU

1 50

1 50 112

10 20

10 20 21

305 399

305 399 144

1089 2012

1089 2012 182

2012 10012


2012 10012 262

999999 999990

999999 999990 259

16


{dhhai, dnkha}@fit.hcmus.edu.vn
69. THƯ VIỆN
Thành phố Y mới mở 2 thư viện lớn, có rất nhiều sách để cho mượn. Thành phố muốn
bạn xây dựng một hệ thống phần mềm quản lý cho mượn sách mới, vì phần mềm cũ
khơng cịn chạy được trên hệ thống máy tính mới. Hệ thống phần mềm cần giúp người
đọc của thư viện in ra danh sách những cuốn sách có thể mượn, cho người đọc mượn và
trả sách. Chương trình cần quản lý 2 đối tượng thơng tin, đó là thư viện và sách.
INPUT và OUTPUT
Dữ liệu nhập gồm nhiều dòng là một chuỗi lệnh. Mỗi lệnh là một kí tự in hoa ở đầu dịng.
Mỗi lệnh có thể có tham số, và có thể gồm nhiều dòng. Tên thư viện và tên sách là chuỗi
kí tự có chiều dài khơng q 50. Có tối đa 10 thư viện, mỗi thư viện có tối đa 50 cuốn
sách. Chương trình hỗ trợ các lệnh sau:
N LibraryName

Tạo một thư viện mới có tên là LibraryName.
Nếu thành công, báo
LibraryName created

Nếu trong danh sách thư viện hiện tại đã có thư viện trùng tên,
khơng tạo mới và báo lỗi:

LibraryName already exists

Nếu vượt quá số thư viện có thể quản lý (10 thư viện) báo lỗi
Library list is full

L

Liệt kê danh sách tên các thư viện hiện có, mỗi thư viện một dòng,

17


{dhhai, dnkha}@fit.hcmus.edu.vn
có đánh số
Available Libraries:
1. LibraryName1
2. LibraryName2

Nếu khơng có thư viện nào, in ra
No libraries available

L LibraryName

Liệt kê toàn bộ danh sách sách có trong thư viện có tên
LibraryName, mỗi sách trên một dịng, có đánh số thứ tự (khơng
cần sắp xếp), cho biết trạng thái của sách. Có 2 trạng thái: đã cho
mượn (R), hoặc có thể mượn (A).
Books in LibraryName catalog
1. [A]BookName1
2. [R]BookName2


Nếu thư viện LibraryName không tồn tại, báo lỗi
LibraryName does not exist

Nếu thư viện khơng có sách nào, in ra
No books in LibraryName

A LibraryName

Thêm sách vào thư viện có tên LibraryName. Tên của các cuốn

B Book1

sách được nhập trên từng dòng trong các dòng tiếp theo, bắt đầu

B Book2

bằng chữ B.
Nếu thêm sách thành công, báo
Book1 added

Nếu thư viện LibraryName không tồn tại, bỏ qua các dòng nhập

18


{dhhai, dnkha}@fit.hcmus.edu.vn
sách tiếp theo, báo lỗi
LibraryName does not exist


Nếu có sách trùng tên sẵn trong thư viện, bỏ qua và báo
Book1 already exists, skip

Nếu vượt quá số sách thư viện có thể quản lý (50 sách) báo lỗi, và
bỏ qua các sách còn lại
LibraryName is full, skip all remaining book(s)

Sau khi thêm sách, báo kết quả, cho biết số sách đã thêm và số sách
đã bỏ qua.
5 book(s) added, 0 book(s) skipped

R LibraryName

Mượn sách từ thư viện có tên LibraryName. Tên của các cuốn sách

B Book1

được nhập trên từng dòng trong các dòng tiếp theo, bắt đầu bằng

B Book2

chữ B.
Nếu mượn sách thành công, báo
Book1 rented

Nếu thư viện LibraryName không tồn tại, bỏ qua các dòng tiếp
theo, báo lỗi
LibraryName does not exist

Nếu sách đã được mượn trước bởi người khác, bỏ qua và báo

Book1 already rented, skip

Nếu sách không tồn tại trong thư viện, bỏ qua và báo
Book1 does not exist, skip

19


{dhhai, dnkha}@fit.hcmus.edu.vn
Sau khi thực hiện, báo kết quả, cho biết số sách mượn và số sách đã
bỏ qua.
5 book(s) rented, 0 book(s) skipped

S LibraryName

Trả sách lại cho thư viện có tên LibraryName. Tên của các cuốn

B Book1

sách được nhập trên từng dòng trong các dòng tiếp theo, bắt đầu

B Book2

bằng chữ B.
Nếu trả sách thành công, báo
Book1 returned

Nếu thư viện LibraryName khơng tồn tại, bỏ qua các dịng tiếp
theo, báo lỗi
LibraryName does not exist


Nếu sách không tồn tại trong thư viện, bỏ qua và báo
Book1 does not exist, skip

Sau khi thực hiện, báo kết quả, cho biết số sách đã trả và số sách đã
bỏ qua.
5 book(s) returned, 0 book(s) skipped

X

Kết thúc chuỗi lệnh. Chương trình kết thúc xử lý.

INPUT MẪU

OUTPUT MẪU

L

No libraries available

N Kitty

Kitty created

A Kitty

20


{dhhai, dnkha}@fit.hcmus.edu.vn

B A Memory of Light

A Memory of Light added

B Spice and Wolf

Spice and Wolf added
2 book(s) added, 0 book(s) skipped

L

Available Libraries:
1. Kitty

A Snoopy

Snoopy does not exist

B Spider Man

0 book(s) added, 1 book(s) skipped

R Kitty
B A Memory of Light

A Memory of Light rented

B A Memory of Light

A Memory of Light already rented, skip


B Spiderman

Spiderman does not exist, Skip
1 book(s) rented, 2 book(s) skipped

L Kitty

Books in Kitty catalog
1. [R]A Memory of Light
2. [A]Spice and Wolf

S Kitty
B A Memory of Light

A Memory of Light returned

B Spiderman

Spiderman does not exist, skip
1 book(s) returned, 1 book(s) skipped

X

HƯỚNG DẪN
Bạn được cung cấp sẵn các tập tin mã nguồn khung để viết chương trình này:
thuvien.cpp
data.h

lib.cpp

lib.h

inout.cpp
inout.h

21


{dhhai, dnkha}@fit.hcmus.edu.vn
Bạn cần viết bổ sung mã nguồn vào các đoạn có ghi BỔ SUNG. Bạn có thể viết thêm các
hàm và các biến nếu cần thiết. Bạn cần giữ nguyên cấu trúc các tập tin mã nguồn, cũng
như khai báo của các hàm được cung cấp sẵn.
• data.h chứa khai báo các struct lưu trữ dữ liệu và các hằng số
• lib.h và lib.cpp chứa khai báo và cài đặt của các hàm làm nhiệm vụ xử lý các
thao tác thư viện
• inout.h và inout.cpp chứa khai báo và cài đặt của các hàm nhập xuất
• thuvien.cpp chứa cài đặt của chương trình chính.
Hãy đọc kĩ các hướng dẫn bổ sung trong các tập tin mã nguồn được cung cấp.
data.h
#ifndef __DATA__
#define __DATA__
#define MAXLIB

10

#define MAXBOOK

50

#define MAXNAME


50

// Định nghĩa các mã lỗi cho các thao tác
// Mã OK 0: thực hiện thành cơng
// Mã NOTFOUND -1: khơng tìm thấy
// Mã DUPLICATE -2: bị trùng lắp, không thực hiện được
// Mã FULL -3: mảng đầy, không thể thêm
#define FULL

-3

#define DUPLICATE -2
#define NOTFOUND

-1

#define OK

0

22


{dhhai, dnkha}@fit.hcmus.edu.vn
// Struct quản lý các thuộc tính của sách
struct Book {
// BỔ SUNG khai báo cấu trúc sách
};
// Struct quản lý các thuộc tính của thư viện

struct Library {
char name[MAXNAME];
// BỔ SUNG khai báo cấu trúc cho thư viện
};
// Struct quản lý danh sách các thư viện
struct LibraryList {
Library libs[MAXLIB];
int numLibs;

// Có tối đa 10 thư viện
// Số thư viện đang quản lý

};
#endif
lib.h
#ifndef __LIB__
#define __LIB__
#include "data.h"
// Hàm tìm thư viện theo tên trong danh sách thư viện
// Trả về chỉ số mảng. Trả về NOTFOUND nếu khơng tìm thấy
int getLibraryIndex(const LibraryList& libList, char libName[]);
// Hàm tìm sách trong thư viện
// Trả về chỉ số mảng. Trả về NOTFOUND nếu khơng tìm thấy
int getBookIndex(const Library& lib, char bookName[]);
// Hàm tạo thư viện có tên là libName và đưa vào libList
// Trả về lỗi thông qua giá trị trả về.
int createLibrary(LibraryList& libList, char libName[]);
// Hàm thêm sách vào thư viện
// Trả về lỗi thông qua giá trị trả về.
int addBook(Library& lib, char bookName[]);


23


{dhhai, dnkha}@fit.hcmus.edu.vn

// Hàm mượn sách từ thư viện
// Trả về lỗi thông qua giá trị trả về.
int rentBook(Library& lib, char bookName[]);
// Hàm trả sách cho thư viện
// Trả về lỗi thông qua giá trị trả về.
int returnBook(Library& lib, char bookName[]);
#endif
lib.cpp
#include "lib.h"
/* Hàm tìm thư viện theo tên trong danh sách thư viện
Trả về chỉ số mảng
Trả về NOTFOUND nếu không tìm thấy
*/
int getLibraryIndex(const LibraryList& libList, char libName[]){
// BỔ SUNG mã nguồn
}
/* Hàm tìm sách trong thư viện
Trả về chỉ số mảng
Trả về NOTFOUND nếu khơng tìm thấy
*/
int getBookIndex(const Library& lib, char bookName[]){
// BỔ SUNG mã nguồn
}
/* Hàm tạo thư viện có tên là libName và đưa vào libList

Trả về DUPLICATE nếu đã có thư viện trùng tên
Trả về FULL nếu danh sách đã đầy
*/
int createLibrary(LibraryList& libList, char libName[]){
// Kiểm tra xem danh sách đã đầy chưa?
if (libList.numLibs >= MAXLIB)
return FULL;
// Kiểm tra xem đã tồn tại thư viện libName chưa
if (getLibraryIndex(libList, libName) != NOTFOUND)
return DUPLICATE;

24


{dhhai, dnkha}@fit.hcmus.edu.vn

// Khởi tạo thư viện temp
Library temp;
// BỔ SUNG mã khởi tạo dựa trên libName
// Thêm vào libList
libList[listList.numLibs] = temp;
// Tăng số lượng thư viện
libList.numLibs++;
// Trả về thành công
return OK;
}
/* Hàm thêm sách vào thư viện
Trả về lỗi thông qua giá trị trả về.
Trả về DUPLICATE nếu đã có sách trùng tên
Trả về FULL nếu thư viện đã đầy

*/
int addBook(Library& lib, char bookName[]){
// BỔ SUNG mã nguồn
}
/* Hàm mượn sách từ thư viện
Trả về lỗi thông qua giá trị trả về.
Trả về DUPLICATE nếu sách đã mượn
Trả về NOTFOUND nếu khơng tìm thấy sách
*/
int rentBook(Library& lib, char bookName[]){
// BỔ SUNG mã nguồn
}
/* Hàm trả sách cho thư viện
Trả về lỗi thông qua giá trị trả về.
Trả về NOTFOUND nếu khơng tìm thấy sách
*/
int returnBook(Library& lib, char bookName[]){
// BỔ SUNG mã nguồn
}

25


{dhhai, dnkha}@fit.hcmus.edu.vn
inout.h
#ifndef __INOUT__
#define __INOUT__
#include "data.h"
// Hàm in danh sách thư viện ra màn hình (stdout)
void listLibraries(LibraryList& libList);

// Hàm in danh sách sách và trạng thái của sách trong thư viện ra màn hình
void listBooks(Library& lib);
// in kết quả của hàm createLibrary
void printCreateLibraryResult(int returnValue, char libName[]);
// in kết quả của hàm addBook
void printAddBookResult(int returnValue, char libName[], char bookName[]);
// in kết quả của hàm rentBook
void printRentBookResult(int returnValue, char libName[], char bookName[]);
// in kết quả của hàm returnBook
void printReturnBookResult(int returnValue, char libName[], char bookName[]);
#endif
inout.cpp
#include "inout.h"
#include <stdio.h>
// in kết quả của hàm addBook
void printAddBookResult(int returnValue, char libName[], char bookName[]) {
switch (returnValue){
case FULL:
printf("%s is full, skip all remaining book(s)\n", libName);
break;
case DUPLICATE:
printf("%s already exists, skip\n", bookName);
break;

26


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×