Lập trình cơ sở với Python
Tác giả: TS. Nguyễn Quốc Long · Đà Nẵng, 2026 Giáo trình nhập môn lập trình cho sinh viên năm thứ nhất và người tự học, kể cả người chưa từng viết một dòng mã nào. Trang này giới thiệu cuốn sách và hệ thống chấm đi kèm: sách dạy gì, bài tập được chấm ra sao và nên học thế nào cho hiệu quả.
Lời tác giả
Có một khoảnh khắc mà người học lập trình nào cũng nhớ: lần đầu chương trình của mình chạy đúng. Màn hình chỉ hiện một dòng chữ ngắn, vậy mà cảm giác như vừa mở được một cánh cửa. Cuốn sách này được viết để các bạn đi tới khoảnh khắc ấy sớm hơn, và quan trọng hơn, để biết vì sao cánh cửa đã mở.
Hơn mười năm đứng lớp và ôn luyện đội tuyển, tôi nhận ra người mới học hiếm khi vấp vì quên cú pháp. Cú pháp tra được trong một phút. Cái khó nằm ở trước và sau dòng mã: đọc đề cho ra dữ liệu vào là gì và phải in ra thế nào, sắp các bước xử lý đúng thứ tự, và tự kiểm tra được chương trình của mình đúng hay sai. Đó là tư duy, và tư duy không học thuộc được; nó chỉ lớn lên qua từng bài tự tay làm.
Vì vậy, tôi mong các bạn đừng dừng lại ở câu hỏi “viết thế nào”, mà đi tiếp tới “vì sao lại như thế”. Vì sao 0.1 + 0.2
không bằng 0.3? Vì sao xếp loại trước khi làm tròn lại cho ra điểm F thay vì D? Vì sao vòng lặp này chạy mãi không dừng?
Mỗi câu hỏi như vậy, nếu chịu đào đến tận gốc, sẽ dạy các bạn nhiều hơn mười trang lý thuyết. Hãy tò mò, hãy thử, hãy cố ý làm sai
một chỗ để xem máy nói gì. Máy tính không bao giờ mắng ai; nó chỉ trả lời đúng điều ta hỏi.
Cũng vì thế, mỗi khái niệm trong sách chỉ xuất hiện khi có một bài toán cần đến nó, mỗi chương có bảng lỗi thường gặp, và mọi bài tập có mã đều nộp được lên đây để nhận kết quả sau vài giây. Xin hãy coi một lần Wrong Answer là một người thầy kiệm lời chứ không phải ngõ cụt: nó không nói bạn sai ở đâu, nhưng nó buộc bạn đọc lại đề, nghĩ thêm một ca biên, và hiểu bài toán sâu hơn một chút. Lập trình được học bằng tay, qua từng lần như thế.
Với tôi, dạy học trước hết là niềm vui được đồng hành. Tôi không mong các bạn học để thi, càng không mong các bạn học trong áp lực. Tôi chỉ mong một ngày, khi gặp một bài toán chưa từng thấy, các bạn bình tĩnh mở trình soạn thảo, chia nhỏ nó ra và bắt tay vào làm. Nếu cuốn sách giúp được các bạn điều đó, nó đã làm xong việc của mình.
Chúc các bạn tìm thấy niềm vui khi chương trình đầu tiên được chấm Accepted, và giữ được niềm vui ấy rất lâu về sau.
TS. Nguyễn Quốc Long
Đà Nẵng, tháng 10 năm 2026
Hiểu bản chất
Đừng chép một lời giải chạy được rồi đi tiếp. Hãy lập bảng vết, theo từng biến qua từng dòng, cho đến khi tự giải thích được vì sao chương trình in ra đúng kết quả ấy.
Tò mò và tìm tòi
Đổi dữ liệu thử, đặt câu hỏi “nếu thế này thì sao”, đọc thông báo lỗi đến dòng cuối. Người lập trình giỏi là người không ngại hỏi máy, và không ngại hỏi chính mình.
Kiên nhẫn với cái sai
Mỗi lần sai là một lần biết thêm một ca mình chưa nghĩ tới. Sửa, nộp lại, và ghi lại điều vừa học. Kỹ năng gỡ lỗi chính là kỹ năng lập trình.
Về tác giả
TS. Nguyễn Quốc Long
Giảng viên Trường Khoa học Máy tính, Đại học Duy Tân, Đà Nẵng
Tốt nghiệp ngành Tin học quản lý tại Trường Đại học Kinh tế, Đại học Đà Nẵng năm 2012, thầy chọn bục giảng thay vì nghề kỹ sư phần mềm, rồi theo đuổi con đường ấy đến nay. Thầy giảng dạy các học phần lập trình cơ sở, cấu trúc dữ liệu và giải thuật, hệ thống thông tin quản lý. Thời sinh viên, thầy từng đạt giải ba Olympic Tin học khối không chuyên và giải nhì ACM/ICPC quốc gia khối không chuyên.
Từ năm 2012, thầy hướng dẫn và ôn luyện các đội tuyển Olympic Tin học sinh viên và ICPC của trường. Phương pháp của thầy là thực hành với đề bài bám sát thực tế, đồng hành cùng sinh viên cả trong học tập lẫn cuộc sống, và không đặt nặng chuyện giải thưởng: điều thầy muốn là sinh viên vận dụng kiến thức linh hoạt và lớn lên về tư duy. Thầy được Hội Tin học Việt Nam tặng bằng khen vì thành tích bồi dưỡng sinh viên tại Olympic Tin học sinh viên Việt Nam 2020.
“Dạy học chính là đam mê lớn nhất” là lời thầy chia sẻ với báo Tuổi Trẻ năm 2022. Cuốn sách này là cách thầy gửi niềm đam mê ấy đến những sinh viên chưa có dịp ngồi trong lớp của mình.
Sách dạy gì
Một chương trình tính đúng điểm nhưng in ra Diem hoc phan: 7.8 vẫn bị hệ thống chấm đánh trượt, vì đề chỉ yêu cầu in 7.8.
Chi tiết nhỏ ấy tóm gọn tinh thần của cuốn sách: viết chương trình không chỉ là gõ đúng cú pháp mà là làm đúng điều đề bài yêu cầu, đến từng ký tự.
Sách luyện ba kỹ năng nền tảng: phân tích đề, tổ chức các bước xử lý và tự kiểm thử chương trình.
Python được chọn vì cú pháp gọn, dễ đọc, để người học dồn sức vào bài toán thay vì vào khai báo và dấu ngoặc. Chín chương đầu đi từ thuật toán, biến và nhập xuất, qua rẽ nhánh, vòng lặp và hàm, tới danh sách, chuỗi, từ điển, tệp và ngoại lệ. Chương 10 ghép tất cả thành một chương trình quản lý điểm sinh viên chỉ dùng hàm, danh sách, từ điển và tệp; lập trình hướng đối tượng dành cho cuốn sau.
Mọi chương trình trong sách đã được chạy kiểm trên Python 3.12, 3.13 và 3.14; kết quả và thông báo lỗi in trong sách là kết quả chạy thật, không phải gõ tay.
Bộ test chấm bài
Hệ thống chấm chỉ tốt bằng bộ test của nó. Một bộ test yếu để lọt chương trình sai, khiến người học tưởng mình đã đúng; một bộ test tốt chỉ ra chính xác chỗ cần sửa. Vì vậy mỗi bài trên hệ thống được đóng gói kỹ hơn nhiều so với ví dụ in trong sách: test chia thành năm nhóm có tên rõ ràng, và trước khi đưa lên, mỗi bộ test đều được thử với nhiều lời giải cố ý viết sai theo đúng những lỗi người mới hay mắc. Lời giải sai nào lọt qua thì bổ sung test cho đến khi bị bắt.
Ví dụ của đề01_mau
Đúng các ví dụ in trong đề, để bạn đối chiếu ngay.
Tổng quát02_tong_quat
Dữ liệu thông thường, nhiều dạng khác nhau, kể cả dữ liệu lớn.
Biên03_bien
Giá trị nhỏ nhất, lớn nhất, ngay tại mốc so sánh, danh sách một phần tử.
Đặc biệt04_dac_biet
Số 0, số âm, số rất lớn, chuỗi rỗng, dữ liệu trùng nhau.
Bẫy05_bay
Dựng riêng để bắt lỗi quen thuộc: lệch một, làm tròn sai lúc, so chuỗi thay vì so số.
Con số cuối quan trọng không kém: bộ test không được bắt bẻ những cách giải đúng nhưng khác lời giải mẫu. Mã bài trên hệ thống trùng mã trong sách;
sách in đề rút gọn và một ví dụ, còn đề đầy đủ, ràng buộc, giải thích ví dụ và bộ test nằm ở đây. Mức bài: (*) nhận biết,
(**) cơ bản, (***) vận dụng, (****) nâng cao nhẹ.
Bài toán xuyên suốt: điểm học phần
Các chương cùng phục vụ một bài toán: tính điểm học phần từ 40% điểm quá trình và 60% điểm cuối kỳ, làm tròn một chữ số thập phân, rồi xếp loại theo điểm đã làm tròn: A từ 8,5; B từ 7,0; C từ 5,5; D từ 4,0; F dưới 4,0. Ở Chương 1, bài toán chỉ là vài dòng mã giả và sáu ca kiểm thử tính tay; mỗi chương sau cho nó thêm một khả năng. Đặc tả không đổi, nên người học thấy rõ mỗi kiến thức mới giải quyết thêm được việc gì. Hãy giữ bài làm của từng phần, vì phần sau dùng lại hàm của phần trước.
| Phần | Mục | Làm được thêm |
|---|---|---|
| XS-01, XS-02 | 2.7, 3.4 | Tính điểm học phần một sinh viên; xếp loại A–F |
| XS-03 | 4.7 | Đọc n sinh viên; đếm đạt, không đạt; điểm cao nhất |
| XS-04 | 5.7 | Tách hàm tinh_diem_hp, xep_loai; kiểm thử bằng assert |
| XS-05, XS-06 | 6.9, 7.7 | Xếp hạng, in top k; đọc dòng có họ tên, chuẩn hóa tên, kiểm tra mã |
| XS-07, XS-08 | 8.6, 9.7 | Mỗi sinh viên một dict, tìm và thống kê; lưu, đọc lại tệp CSV |
| Chương 10 | 10.1–10.5 | Chương trình menu hai tệp; bản đọc lệnh để nộp chấm |
Hai ca biên được nhắc nhiều lần: QT 8,0 và CK 8,8 cho 8,48, làm tròn thành 8,5, loại A; QT 3,9 và CK 4,0 cho 3,96, làm tròn thành 4,0, loại D. Xếp loại trước khi làm tròn sẽ ra B và F, sai. Bộ test của XS-02 trên hệ thống có cả hai ca này.
Cấu trúc một chương
Chương 1 đến Chương 9 có cùng một khung, để người học biết mỗi phần dùng vào việc gì và quay lại đúng chỗ khi cần:
- Mở đầu: ba việc làm được sau chương.
- Nội dung có ví dụ chạy được và bảng vết từng bước.
- Bài toán xuyên suốt XS-k (từ Chương 2).
- Lỗi thường gặp: bảng lỗi, ví dụ, cách sửa và hệ thống chấm sẽ báo gì.
- Tóm tắt và tự kiểm tra: năm câu trắc nghiệm, đáp án ở Phụ lục C.
- Bài tập: 13 đến 17 bài (Chương 1 có 9 bài); bài cuối là bài tìm lỗi, nộp bản đã sửa.
Mục lục 10 chương
1Bài toán, thuật toán và chương trình Python đầu tiên
- Bài toán, thuật toán và chương trình
- Chạy chương trình Python đầu tiên
- Những dòng lệnh đầu tiên
- Đọc thông báo lỗi
2Biến, kiểu dữ liệu, biểu thức và nhập xuất
- Biến và phép gán
- Kiểu dữ liệu cơ bản
- Toán tử và biểu thức
- Nhập dữ liệu theo quy ước hệ thống chấm
- Xuất dữ liệu, f-string
- Hàm chuẩn và module math
- Bài toán xuyên suốt XS-01: Tính điểm học phần (mục 2.7)
3Cấu trúc rẽ nhánh
- if, if...else, if...elif...else
- Biểu thức điều kiện, rẽ nhánh lồng nhau
- Bài toán mẫu: năm nhuận, tam giác, phương trình bậc hai
- Bài toán xuyên suốt XS-02: Xếp loại (mục 3.4)
4Vòng lặp
- Vòng lặp while và ba mẫu tích lũy
- for và range()
- Đọc dữ liệu lặp theo đề
- break, continue, vòng lặp lồng nhau
- Số nguyên tố, ƯCLN, tách chữ số
- Bài toán xuyên suốt XS-03: Thống kê cả lớp (mục 4.7)
5Hàm
- Định nghĩa và gọi hàm
- Giá trị trả về
- Phạm vi của biến
- Chia nhỏ chương trình, kiểm thử bằng assert
- Giới thiệu đệ quy
- Bài toán xuyên suốt XS-04: Tách thành hàm (mục 5.7)
6Danh sách và tuple
- Danh sách, chỉ số, cắt lát
- Thêm, sửa, xóa, sắp xếp
- Nhập và in danh sách theo quy ước chấm
- Tham chiếu và sao chép
- Danh sách hai chiều
- Tuple
- Bài toán xuyên suốt XS-05: Bảng điểm và xếp hạng (mục 6.9)
7Chuỗi ký tự
- Chỉ số, cắt lát, tính bất biến
- Duyệt chuỗi, kiểm tra loại ký tự
- split, join và các phương thức
- Chuẩn hóa họ tên, chuỗi đối xứng
- Tiếng Việt và Unicode
- Bài toán xuyên suốt XS-06: Đọc dòng có họ tên (mục 7.7)
8Từ điển và tập hợp
- Từ điển: khóa và giá trị
- Đếm tần suất, gom nhóm
- Sắp xếp theo thứ tự đề yêu cầu
- Danh sách từ điển
- Tập hợp set
- Bài toán xuyên suốt XS-07: Mỗi sinh viên là một dict (mục 8.6)
9Tập tin, ngoại lệ và module
- Đọc và ghi tệp với with open()
- Xử lý dữ liệu từ tệp
- Ngoại lệ và try...except
- Module
- Gỡ lỗi khi Wrong Answer
- Bài toán xuyên suốt XS-08: Lưu bảng điểm ra tệp CSV và đọc lại (mục 9.7)
10Bài tập lớn: quản lý điểm sinh viên (không dùng lớp)
- Yêu cầu và thiết kế
- Các hàm thêm, tìm, sửa, xóa, thống kê
- Lưu và đọc tệp CSV
- Menu dòng lệnh, chuyển sang đọc lệnh
- Hoàn thiện và kiểm thử
Cuối sách có bốn phụ lục: A cài Python, VS Code và dùng trình gỡ lỗi; B bảng tra cú pháp, hàm và phương thức; C mười lăm thông báo lỗi thường gặp và đáp án tự kiểm tra; D quy ước nhập/xuất cho hệ thống chấm và danh mục mã bài.
Đọc sách thế nào
Chưa lập trình bao giờ
Cài theo Phụ lục A, chạy chương trình đầu tiên ở mục 1.2.2, rồi đọc tuần tự. Mỗi chương làm ít nhất các bài (*),
(**) và bài tìm lỗi.
Đã biết một ngôn ngữ khác
Lướt Chương 1–4, dừng kỹ ở nhập/xuất (2.4, 2.5, 4.3) và các bảng Lỗi thường gặp; dành sức cho bài (***),
(****).
Ôn trước khi thi
Làm lại năm câu tự kiểm tra mỗi chương, rồi dò Phụ lục B (cú pháp, mẫu thuật toán) và Phụ lục D (mẫu đọc, mẫu in).
Giảng viên
Có thể giao bài theo mã, theo dõi bài nộp của lớp trên hệ thống và dùng Chương 10 làm bài tập lớn. Góp ý về đề và bộ test xin gửi qua nút “Báo lỗi”.
Hỏi đáp
Chương trình chạy đúng trên máy tôi, sao vẫn bị Wrong Answer?
input("..."), in thêm nhãn như Ket qua:, sai số chữ số thập phân hoặc
thừa dòng. Cũng có thể chương trình đúng với ví dụ nhưng sai ở ca biên hay ca đặc biệt; hãy đọc lại phần Ràng buộc và thử với giá trị nhỏ nhất,
lớn nhất, số 0, số âm. Xem bảng kết quả chấm.Tôi có xem được test mà mình làm sai không?
Nộp sai nhiều lần có bị trừ điểm không?
Hệ thống chấm bằng phiên bản Python nào?
Tôi phát hiện đề hoặc bộ test có vấn đề thì báo ở đâu?
Lời cảm ơn
Xin cảm ơn các bạn sinh viên và bạn đọc đã chọn cuốn sách này. Mỗi bài các bạn nộp, mỗi lỗi các bạn báo lại đều giúp bộ đề và bộ test tốt hơn cho những người học đi sau.
Xin cảm ơn các đồng nghiệp ở Trường Khoa học Máy tính, Đại học Duy Tân, và các thầy cô đã đọc, góp ý, dùng giáo trình trong giảng dạy. Xin cảm ơn các thế hệ sinh viên đội tuyển Olympic Tin học và ICPC: những buổi ôn luyện cùng các em đã dạy tác giả rằng một bài giải hay luôn bắt đầu từ việc hiểu đề thật kỹ. Những câu hỏi từ lớp học là nguồn gốc của nhiều bài tập và nhiều dòng trong các bảng lỗi thường gặp.
Hệ thống chấm này xây dựng trên VNOJ, nền tảng chấm bài mã nguồn mở do cộng đồng VNOI phát triển từ dự án DMOJ. Xin cảm ơn những người đã đóng góp cho các dự án ấy, và cộng đồng Python với bộ tài liệu chính thức tuyệt vời.
Cuối cùng, cảm ơn gia đình đã luôn ở bên trong suốt thời gian viết sách. Mọi thiếu sót còn lại là của tác giả; rất mong nhận được góp ý để cuốn sách ngày một hoàn thiện.
Sẵn sàng rồi thì bắt đầu thôi: chọn một bài (*) của chương đang học, tính tay ví dụ, viết, chạy thử và nộp.
Hướng dẫn nộp bài · Danh sách bài tập