Professional Documents
Culture Documents
HCM
Khoa Khoa học & Kỹ thuật Máy tính
1. Giới thiệu
Bạn tỉnh dậy và phát hiện mình bị nhốt trong căn phòng Nhập môn lập trình. Một âm thanh
từ loa phát ra yêu cầu bạn phải thoát khỏi căn phòng trước khi kỳ thi cuối kỳ diễn ra. Bạn được
cung cấp cho một chiếc máy tính và các câu đố được rải rác xung quanh căn phòng. Đồng hành
cùng bên bạn là một chú robot BiKi giúp bạn giải thích các câu đố. Nhiệm vụ của bạn là phải
tìm ra được đáp án của các câu đố, thu thập các mảnh mật mã để thoát khỏi căn phòng và tiến
đến kỳ thi cuối kỳ.
2. Yêu cầu
Trong BTL này, sinh viên cần hiện thực một chương trình giả tưởng trên ngôn ngữ C để
mô phỏng lại quá trình giải đố để thoát khỏi căn phòng thông qua các nhiệm vụ được mô tả
bên dưới. Chương trình sẽ nhận thông tin đầu vào do người dùng nhập từ bàn phím có format
được mô tả ở mục 3. Sau đó, chương trình sẽ xử lý và in ra màn hình kết quả thu được sau quá
trình thực hiện.
3. Mô tả chương trình
Dữ liệu đầu vào được người dùng nhập vào sẽ gồm nhiều dòng mà trong đó có dòng đầu
tiên dùng để xác định chức năng và các dòng kế tiếp là các giá trị được nhập để xử lí.
Format của dòng đầu tiên sẽ như sau:
Menu_code
<Dòng 2>
…
Thông số Menu_code dùng để xác định các chức năng của chương trình giả tưởng để vượt
qua các nhiệm vụ trong escape room, cụ thể là:
Nếu là 1: Nhiệm vụ 1
Nếu là 2: Nhiệm vụ 2
Nếu là 3: Nhiệm vụ 3
Nếu là 4: Nhiệm vụ 4
1
<N>
Lưu ý:
- Nếu dữ liệu đầu vào không hợp lệ, chương trình in ra: “Invalid request”.
- Nếu không tìm được số tự nhiên phù hợp, chương trình in ra: “-1”
Input 1
2
Output -1
Ví dụ 2
Input 1
25
Output 22
Ví dụ 3
Input 1
256
Output 254
Giải thích Danh sách các ước của 254: 1, 2, 127, 254
Ví dụ 4
Input 1
0
2
<Mã hình> <Kích thước 1> <Kích thước 2>
Lưu ý:
- Kích thước 2 chỉ cần nhập nếu hình được chọn là hình thang cân rỗng ruột
- Nếu dữ liệu đầu vào không hợp lệ, chương trình in ra: “Invalid request”.
Input 2
13
Output ***
**
*
Ví dụ 6
Input 2
16
Output ******
*****
****
***
**
*
Ví dụ 7
Input 2
24
Output *
***
*****
*******
Ví dụ 8
Input 2
27
Output *
***
*****
*******
*********
***********
*************
Ví dụ 9
Input 2
354
Output ****
* *
* *
* *
************
Ví dụ 10
Input 2
3 6 10
Output **********
* *
* *
* *
* *
********************
6.2. Mô tả nhiệm vụ
Trong nhiệm vụ này, bạn cần viết một hàm cho phép người dùng nhập vào từ dữ liệu đầu
vào được mô tả ở mục 6.3. Hàm này cần phải thực hiện các công việc:
- Xác định cột có tổng nhỏ nhất của ma trận là số chẵn hay lẻ. Từ đó, xác định đường
chéo cần khám phá là đường chéo chính hay phụ.
- In ra màn hình tổng của N – 1 số bất kì trên đường chéo và 1 số bất kì trên ma trận (số
này có thể nằm trên đường chéo và có thể lặp lại) sao cho tổng này là tổng lớn nhất.
6.3. Dữ liệu đầu vào
Dữ liệu đầu vào gồm có:
1. Dòng đầu tiên là N: Là số nguyên lớn hơn 1, xác định kích thước của ma trận vuông.
2. Dòng thứ hai trở đi đến dòng thứ N + 1 là các phần tử của ma trận do người dùng nhập
vào.
Dữ liệu đầu vào có format như sau:
3
N
a0,0 a0,1 … a0,N-1
a1,0 a1,1 … a1,N-1
.
.
.
aN-1,0 aN-1,1 … aN-1,N-1
Trong đó:
ai,j: Giá trị của phần tử dòng thứ i, cột thứ j của ma trận.
Lưu ý:
- Nếu dữ liệu đầu vào không hợp lệ, chương trình in ra: “Invalid request”.
6.4. Dữ liệu xuất ra
Dữ liệu xuất ra là một số nguyên thể hiện tổng N – 1 số bất kì trên đường chéo và 1 số trên
ma trận sao cho tổng này là tổng lớn nhất.
Input 3
3
123
456
789
Output 23
Giải thích Cột có tổng nhỏ nhất của ma trận là cột 1 với tổng = 12 và là một số chẵn.
=> Mật mã nằm trên đường chéo chính của ma trận.
Tổng lớn nhất = (N – 1 phần tử của đường chéo chính) + phần tử bất kì của ma trận = (5
+ 9) + 9 = 23
Ví dụ 12
Input 3
4
8 -5 6 8
4 7 -1 9
5 6 10 8
15 1 8 1
Output 44
Giải thích Cột có tổng nhỏ nhất của ma trận là cột 2 với tổng = 9 và là một số lẻ.
=> Mật mã nằm trên đường chéo phụ của ma trận.
Tổng lớn nhất = (N – 1 phần tử của đường chéo phụ) + phần tử lớn nhất của ma trận =
(8 + 6 + 15) + 15 = 44
Ví dụ 13
Input 3
2
43
21
Output 8
Giải thích Cột có tổng nhỏ nhất của ma trận là cột 2 với tổng = 4 và là một số chẵn.
=> Mật mã nằm trên đường chéo chính của ma trận.
Tổng lớn nhất = (N – 1 phần tử của đường chéo chính) + phần tử lớn nhất của ma trận =
(4) + 4 = 8
H O C N H A
P M O N L A
P T R I N H
T H A T V U
I - - - - -
Hình 1. Mặt phẳng trên cây gậy sau khi quấn dải băng
Thật bất ngờ!!! Sau khi bạn quấn dải băng xoắn ốc xung quanh cây gậy thì những dòng
chữ bắt đầu có ý nghĩa. Khi bạn đọc từ trái sang phải, các kí tự trở thành:
“HOCNHAPMONLAPTRINHTHATVUI”
“Chưa đâu, nếu bạn tách các kí tự này ra thành từng tự với độ dài theo dãy số bên dưới mỗi
dòng thì sẽ ra một câu có nghĩa”, Biki nói tiếp.
Tuy nhiên, bạn đã sử dụng hết dải băng mất rồi!!! Hãy viết một chương trình mô phỏng lại
quá trình giải mã mật mã trên mà không phải sử dụng dải băng.
7.2. Mô tả nhiệm vụ
Trong nhiệm vụ này, bạn cần viết một hàm cho phép người dùng nhập vào từ dữ liệu đầu
vào được mô tả ở mục 7.3. Hàm này cần phải thực hiện các công việc:
- Giải mã mật mã sử dụng cây gậy và đoạn văn bản cho trước, cụ thể:
o Mô phỏng hành động quấn dải băng quanh cây gậy với một kích thước dải băng
cho trước. Kích thước dải băng sẽ xác định số lượng kí tự tối đa có thể xuất hiện
trên một dòng ngang khi quấn gậy.
o Kí tự đầu tiên của đoạn mã luôn ở vị trí đầu tiên của dải băng khi quấn.
o Kí tự trống được biểu thị bởi một dấu gạch ngang (-).
o Giải mã bằng cách đọc kết quả từ trái qua phải và trên xuống dưới, các kí tự
trống (-) sẽ bị bỏ đi ở kết quả cuối cùng.
o Ví dụ với Hình 1, kích thước dải băng = 6 và đoạn mã gốc = “HPPTIOMTH-
CORA-NNIT-HLNV-AAHU-”, ta thu được dòng chữ
“HOCNHAPMONLAPTRINHTHATVUI” sau khi đọc từ trái qua phải và trên
xuống dưới và bỏ đi các dấu gạch ngang.
- Tiếp tục giải mã đoạn văn bản sử dụng dãy số được miêu tả ở mục 7.3.
o Chương trình tiếp tục đọc vào một mảng N phần tử tương ứng với N từ trong
câu. Mỗi phần tử xác định số lượng kí tự của 1 từ trong câu. Chương trình thực
hiện việc thêm khoảng trắng để câu trở thành có nghĩa. Ví dụ, với N = 7, mảng
là {3, 4, 3, 3, 5, 4, 3} và đoạn mã hiện tại ta có là
“HOCNHAPMONLAPTRINHTHATVUI”, ta giải mã đoạn trên thành “HOC
NHAP MON LAP TRINH THAT VUI”
4
<Kích thước dải băng>
<Đoạn mã>
<N>
a0 a1 … aN-1
Trong đó:
- ai: Số kí tự của một từ trong đoạn mã
Lưu ý:
- Nếu dữ liệu đầu vào không hợp lệ, chương trình in ra: “Invalid request”.
7.4. Dữ liệu xuất ra
Dữ liệu xuất ra là một chuỗi thể hiện kết quả cuối cùng sau khi giải mã.
7.5. Một số ví dụ tham khảo
Ví dụ 14
Input 4
5
CUIBCUNDIOUGATNCTNAGHOGN-
7
3534234
Giải thích Với kích thước dải băng = 5, kết quả sau khi quấn gậy:
CUUCHUNGTOIDANGBITANCONG
Với mảng đưa vào, kết quả sau khi tách từ:
CUU CHUNG TOI DANG BI TAN CONG
Ví dụ 15
Input 4
6
HPPTIOMTH-CORA-NNIT-HLNV-AAHU-
7
3433543
Giải thích Với kích thước dải băng = 6, kết quả sau khi quấn gậy:
HOCNHAPMONLAPTRINHTHATVUI
Với mảng đưa vào, kết quả sau khi tách từ:
HOC NHAP MON LAP TRINH THAT VUI
Ví dụ 16
Input 4
7
BSOICMKA-IP-VE-AR-EO-
4
4264
Giải thích Với kích thước dải băng = 7, kết quả sau khi quấn gậy:
BIKIVAESCAPEROOM
Với mảng đưa vào, kết quả sau khi tách từ:
BIKI VA ESCAPE ROOM
8. Nộp bài
Sinh viên download file NMLT_assigment.zip từ trang Web của môn học. Khi giải nén file
này, sẽ có được các file sau:
File escapeRoom.c là mã nguồn khởi tạo. Sinh viên được khuyến khích sử dụng mã
nguồn này để viết tiếp.
Khi nộp bài, sinh viên nộp bài trên site e-Learning của môn học. Sinh viên điền code bài
tập lớn giống như các bài thực hành khác. Sinh viên được cung cấp 5 nơi nộp bài:
- Bài tập lớn – Nhiệm vụ 1: Sinh viên nộp bài làm và được chấm trên 20 testcases để
kiểm tra các trường hợp liên quan đến Nhiệm vụ 1.
- Bài tập lớn – Nhiệm vụ 2: Sinh viên nộp bài làm và được chấm trên 20 testcases đề
kiểm tra các trường hợp liên quan đến Nhiệm vụ 2.
- Bài tập lớn – Nhiệm vụ 3: Sinh viên nộp bài làm và được chấm trên 20 testcases đề
kiểm tra các trường hợp liên quan đến Nhiệm vụ 3.
- Bài tập lớn – Nhiệm vụ 4: Sinh viên nộp bài làm và được chấm trên 20 testcases đề
kiểm tra các trường hợp liên quan đến Nhiệm vụ 4.
- Bài tập lớn – Tổng hợp: Phần này gồm có 20 testcases kiểm tra cả 4 phần trên, trong
đó có một vài testcases khó. Sinh viên cần đạt tối thiểu 7 điểm ở cả 4 phần trên mới
có thể được nộp bài vào Phần Tổng hợp. Sinh viên nếu không nộp bài vào Phần Tổng
hợp sẽ được tính là 0 điểm chỉ cho phần này.
Trong mỗi phần trên, sinh viên có tối đa 10 lần làm bài. Đối với mỗi lần làm bài, sinh viên
có 10 phút để nộp code và kiểm tra. Chỉ có lần nhấn "Kiểm tra" đầu tiên là được tính điểm,
các lần sau sẽ không được lấy điểm. Kết quả bài làm chỉ hiển thị sau khi bạn nhấn nút "Hoàn
thành bài làm". Điểm cao nhất trong các lần làm bài sẽ được lấy làm điểm cho phần đó.
Điểm bài tập lớn của sinh viên được tính theo công thức sau:
mình viết. Trong trường hợp không hiểu rõ mã nguồn của nơi mình tham khảo, sinh
viên được đặc biệt cảnh báo là không được sử dụng mã nguồn này; thay vào đó nên sử
dụng những gì đã được học để viết chương trình.
Trong trường hợp bị kết luận là gian lận, sinh viên sẽ bị điểm 0 cho toàn bộ môn học (không
chỉ bài tập lớn).
KHÔNG CHẤP NHẬN BẤT KỲ GIẢI THÍCH NÀO VÀ KHÔNG CÓ BẤT KỲ
NGOẠI LỆ NÀO!
Sau mỗi bài tập lớn được nộp, sẽ có một số sinh viên được gọi phỏng vấn ngẫu nhiên để
chứng minh rằng bài tập lớn vừa được nộp là do chính mình làm.
9. Changelog
-HẾT-