Tổng quan về giáo trình

Giáo trình "Hướng Dẫn Thuật Toán C++: Từ Cơ Bản Đến Nâng Cao" (tên phụ: Algorithm with C++) do tác giả Nguyễn Đức Toàn (tmathcoding) biên soạn. Đây là tập mở đầu — Quyển Hạ — trong bộ sách ba tập mang tên “Tìm hiểu lập trình thi đấu” (bao gồm ba phần: Quyển Hạ, Quyển Trung và Quyển Thượng). Trong cấu trúc chương trình đào tạo Tin học và Khoa học máy tính, tài liệu này đóng vai trò là giáo trình cơ sở cho các học phần Nhập môn lập trình, Cơ sở lập trình C++, và Nhập môn thuật toán cho học sinh trung học phổ thông, học sinh chuyên Tin cũng như sinh viên đại cương khối ngành kỹ thuật.

Mục tiêu học tập (learning outcomes) của giáo trình tập trung vào việc hình thành các chuẩn đầu ra cụ thể:

  1. Kiến thức cú pháp và môi trường: Nắm vững cấu trúc chương trình C++, cơ chế biên dịch với GNU Compiler Collection (GCC), sử dụng môi trường phát triển tích hợp CodeBlocks 20.03 và các kiểu dữ liệu nguyên thủy.
  2. Kỹ thuật điều khiển luồng: Sử dụng chính xác cấu trúc rẽ nhánh (if, if-else, switch-case) và các cấu trúc lặp (for, while, do-while).
  3. Cấu trúc dữ liệu cơ bản: Khai báo, thao tác và xử lý mảng một chiều, mảng hai chiều (ma trận), xâu ký tự (string), tệp văn bản (fstream), và kiểu dữ liệu có cấu trúc (struct).
  4. Tư duy thuật toán: Ứng dụng các thuật toán số học cơ bản (ƯCLN, BCNN, kiểm tra và sàng số nguyên tố, đồng dư thức) và kỹ thuật đệ quy trong bài toán tổ hợp, sinh cấu hình.

Cấu trúc giáo trình được thiết kế theo phương pháp diễn dịch có hệ thống: mỗi chương bắt đầu bằng phần tóm tắt lý thuyết lý thuyết cốt lõi ("Kiến thức ghi nhớ"), minh họa bằng các đoạn mã nguồn hoàn chỉnh ("Ví dụ mẫu"), và kết thúc bằng hệ thống "Bài tập áp dụng". Điểm đặc thù của tài liệu là toàn bộ bài tập được mã hóa theo mã định danh chuẩn (ví dụ: N0101A, N0421D, N1012E) và phân loại chặt chẽ theo 5 cấp độ nhận thức của thang đo Bloom (2001), liên kết trực tiếp với hệ thống chấm bài tự động trực tuyến (Web JUDGE tại địa chỉ http://laptrinhphothong.vn và nền tảng NTU Coder).


Nội dung kiến thức cốt lõi

                    ┌────────────────────────────────────────────────────────┐
                    │               CHƯƠNG 0: MÔI TRƯỜNG & C++               │
                    │         (CodeBlocks 20.03, Trình biên dịch GCC)        │
                    └───────────────────────────┬────────────────────────────┘
                                                │
                                                ▼
                    ┌────────────────────────────────────────────────────────┐
                    │            CHƯƠNG 1 - 3: CÚ PHÁP & ĐIỀU KHIỂN          │
                    │  Kiểu dữ liệu, Vào/Ra, Ép kiểu, If/Switch, Vòng lặp   │
                    └───────────────────────────┬────────────────────────────┘
                                                │
                                                ▼
                    ┌────────────────────────────────────────────────────────┐
                    │             CHƯƠNG 4 - 6: CẤU TRÚC DỮ LIỆU             │
                    │        Mảng 1D, Mảng 2D (Ma trận), Xâu ký tự          │
                    └───────────────────────────┬────────────────────────────┘
                                                │
                                                ▼
                    ┌────────────────────────────────────────────────────────┐
                    │            CHƯƠNG 7 - 9: MÔ-ĐUN & DỮ LIỆU TỰ TẠO       │
                    │           Tệp văn bản, Hàm (Tham trị/biến), Struct     │
                    └───────────────────────────┬────────────────────────────┘
                                                │
                                                ▼
                    ┌────────────────────────────────────────────────────────┐
                    │           CHƯƠNG 10 - 11: THUẬT TOÁN & ĐỆ QUY          │
                    │    Số học (Sàng nguyên tố, Đồng dư), Đệ quy tổ hợp    │
                    └────────────────────────────────────────────────────────┘

Các chương và chủ đề chính

Nội dung giáo trình gồm 12 chương (từ Chương 0 đến Chương 11), dẫn dắt người học theo tiến trình từ cài đặt môi trường cơ bản đến các giải thuật chuyên biệt:

  • Chương 0 – Giới thiệu CodeBlocks và C++: Giới thiệu khái niệm phần mềm, phần cứng, mã máy, trình biên dịch (Compiler) GCC, công cụ soạn thảo và môi trường phát triển tích hợp (IDE). Hướng dẫn cài đặt CodeBlocks phiên bản 20.03 trên các hệ điều hành (Windows, Linux, macOS), quy trình biên dịch và thực thi chương trình Test.cpp bằng phím tắt F9, cũng như giới thiệu các IDE thay thế (Dev-C++, Sublime Text, VS Code, Ideone, OneCompiler).
  • Chương 1 – Các khái niệm cơ bản của C++: Cung cấp khung chương trình chuẩn (#include <bits/stdc++.h>, using namespace std;, int main()), phân loại câu lệnh đơn, câu lệnh ghép, khoảng trắng, chú thích (//). Bảng đặc tả miền giá trị các kiểu dữ liệu chuẩn trên kiến trúc 32-bit: char (1 byte: -128 đến 127), unsigned char (1 byte: 0 đến 255), int (4 byte), long long (8 byte), float (4 byte, độ chính xác 7 chữ số), double (8 byte, độ chính xác 15 chữ số), long double (16 byte), bool (1 byte). Cú pháp biến, hằng số const, phép toán số học (+, -, *, /, %), lệnh vào ra cin/cout, cơ chế ép kiểu tường minh (float)a, (long long)b, int(ch) và định dạng xuất số thực với setprecision, fixed.
  • Chương 2 – Cấu trúc rẽ nhánh: Cú pháp và nguyên lý hoạt động của cấu trúc điều kiện if, if...else, switch...case...default và các toán tử logic. Các bài toán ứng dụng bao gồm: phân loại chẵn lẻ, kiểm tra năm nhuận, kiểm tra số chính phương bằng hàm sqrt, giải và biện luận phương trình bậc hai $ax^2+bx+c=0$ dựa trên biệt thức $\Delta = b^2 - 4ac$, kiểm tra ba điểm thẳng hàng trên hệ tọa độ Descartes và thuật toán xác định thứ trong tuần theo ngày sinh.
  • Chương 3 – Cấu trúc vòng lặp: Trình bày ba cấu trúc lặp for, whiledo...while. Hướng dẫn giải quyết các bài toán tính tổng chuỗi, tính giai thừa $n!$, sinh dãy nhị phân độ dài $n$, tìm số hạng thứ $n$ của dãy Fibonacci ($u_1=u_2=1, u_n=u_{n-1}+u_{n-2}$), xử lý kỹ thuật chia dư theo modulo $10^9+7$ đối với các kết quả có giá trị lớn và kỹ thuật đọc luồng dữ liệu không xác định trước số lượng phần tử.
  • Chương 4 – Kiểu dữ liệu mảng một chiều: Cú pháp khai báo int a[100], cơ chế chỉ số hóa từ 0, kỹ thuật duyệt mảng bằng vòng lặp. Nội dung bao gồm các thuật toán cơ bản: tìm giá trị nhỏ nhất/lớn nhất, tính tổng theo điều kiện (tổng số lẻ, tổng giá trị tuyệt đối), đếm cặp nghịch thế ($i < j$ và $a[i] > a[j]$), thuật toán sắp xếp nổi bọt (Bubble Sort), sắp xếp nhanh bằng hàm thư viện std::sort với độ phức tạp thời gian $O(n \log n)$, thao tác xóa phần tử trên mảng, kỹ thuật trộn hai mảng và thuật toán xác định phần tử trung vị của tập dữ liệu có kích thước $2n$ hoặc $2n+1$.
  • Chương 5 – Kiểu dữ liệu mảng hai chiều: Định nghĩa ma trận toán học cỡ $m \times n$, vector hàng, vector cột, ma trận vuông cấp $n$ và ma trận ký tự. Cú pháp khai báo int a[100][100], kỹ thuật lồng ghép hai vòng lặp để nhập, xuất và xử lý dữ liệu. Các thuật toán triển khai gồm: tính tổng ma trận, tìm hàng/cột có tổng lớn nhất, tìm giá trị chẵn lớn nhất, tính tổng trên đường chéo chính ($i = j$), đường chéo phụ ($i + j = n + 1$), tính tổng các phần tử trên biên ma trận, phép cộng và nhân hai ma trận.
  • Chương 6 – Kiểu dữ liệu xâu ký tự: Phân biệt hai kiểu xâu trong C++ (xâu ký tự kiểu C và đối tượng std::string), các hàm thành viên, phép toán nối chuỗi và so sánh. Bài tập ứng dụng: kiểm tra xâu đối xứng (palindrome), đếm số từ trong câu, tính tổng các chữ số trong chuỗi, loại bỏ ký tự số và đếm số ký tự phân biệt.
  • Chương 7 – Kiểu dữ liệu tệp văn bản: Kỹ thuật vào/ra dữ liệu qua tệp với thư viện <fstream>, lệnh chuyển hướng luồng dữ liệu chuẩn (freopen). Các thuật toán: phân tách dữ liệu min/max ra hai tệp riêng biệt, thuật toán sắp xếp ngoài và đọc tệp không biết trước số lượng phần tử.
  • Chương 8 – Hàm và cấu trúc hàm: Định nghĩa chương trình con, cú pháp khai báo hàm, phạm vi của biến cục bộ và biến toàn cục. Phân tích cơ chế truyền đối số theo giá trị (tham trị) và truyền đối số theo địa chỉ/tham chiếu (tham biến). Ứng dụng viết hàm giải quyết các bài toán số học: ước chung lớn nhất (ƯCLN), bội chung nhỏ nhất (BCNN), phân tích thừa số nguyên tố.
  • Chương 9 – Kiểu dữ liệu Struct: Khái niệm bản ghi, cú pháp định nghĩa kiểu dữ liệu cấu trúc struct. Ứng dụng biểu diễn các đối tượng hình học (điểm, hình bình hành, tính diện tích đa giác lồi) và các cấu trúc dữ liệu quản lý thực thể (danh sách học sinh, quản lý danh sách cầu thủ bóng đá).
  • Chương 10 – Một số thuật toán số học cơ bản: Trình bày các thuật toán nền tảng trong lý thuyết số: thuật toán Euclid tìm ƯCLN và BCNN, các giải thuật kiểm tra số nguyên tố (độ phức tạp $O(\sqrt{n})$), giải thuật sàng nguyên tố Eratosthenes, các tính chất của đồng dư thức. Các dạng bài tập nâng cao: số siêu nguyên tố, số nguyên tố Fibonacci, thừa số nguyên tố.
  • Chương 11 – Đệ quy: Định nghĩa đệ quy, điều kiện cơ sở (base case) và bước đệ quy. Ứng dụng đệ quy và kỹ thuật quay lui (backtracking) để sinh các cấu hình tổ hợp: liệt kê tập con, sinh chuỗi nhị phân, chuỗi tam phân, liệt kê chỉnh hợp, tổ hợp chập $k$ của $n$ phần tử, sinh xâu ký tự hợp lệ và liệt kê toàn bộ xâu con.

Kiến thức nền tảng được xây dựng

Giáo trình thiết lập hệ thống nền tảng vững chắc về khoa học tính toán:

  • Kiến trúc dữ liệu và bộ nhớ: Giúp người học hiểu rõ cách máy tính cấp phát bộ nhớ (1 byte, 4 byte, 8 byte) cho từng kiểu dữ liệu nguyên thủy, hiện tượng tràn số nguyên khi tính toán vượt ngưỡng $2^{31}-1$ và sự cần thiết của kiểu long long trong các bài toán tổ hợp hay giai thừa.
  • Tư duy cấu trúc điều khiển: Xây dựng logic rẽ nhánh có điều kiện và logic lặp tuần tự hoặc lặp theo điều kiện dừng, xử lý các trường hợp ngoại lệ toán học (như phép chia cho 0, phương trình bậc hai vô nghiệm).
  • Cấu trúc lưu trữ dữ liệu tuyến tính và bảng số: Thiết lập mô hình hóa các bài toán thực tế thông qua mảng một chiều (dãy số), mảng hai chiều (bảng số, lưới tọa độ ma trận) và cấu trúc bản ghi (struct).

Kỹ năng phát triển

  • Kỹ năng lập trình thực hành: Viết mã nguồn C++ theo chuẩn cấu trúc, biên dịch, bắt lỗi cú pháp và gỡ lỗi (debug) trên IDE CodeBlocks.
  • Kỹ năng giải quyết bài toán thuật toán: Khả năng phân tích một yêu cầu toán học (như tìm phần tử trung vị, sàng số nguyên tố, sinh tổ hợp) thành các bước tính toán tuần tự và tối ưu hóa thời gian chạy (chẳng hạn áp dụng $O(n \log n)$ của std::sort thay vì $O(n^2)$ của Bubble Sort).
  • Kỹ năng kiểm thử tự động: Kỹ năng đọc hiểu đặc tả dữ liệu đầu vào (Input), định dạng đầu ra (Output), xử lý các ràng buộc giới hạn dữ liệu ($n \le 10^5, n \le 10^{18}$) và nạp mã nguồn lên hệ thống chấm tự động Online Judge.

Phương pháp giảng dạy và học tập

  LÝ THUYẾT NỀN TẢNG          MINH HỌA MÃ NGUỒN          THỰC HÀNH PHÂN BẬC
 ┌───────────────────┐      ┌───────────────────┐      ┌───────────────────┐
 │                   │      │                   │      │  Thang Bloom 2001 │
 │ Kiến Thức Ghi Nhớ │ ───► │   Ví Dụ Mẫu C++   │ ───► │  A: Nhớ           │
 │ (Cú pháp, Định lý)│      │  (Mã lệnh chuẩn)  │      │  B: Hiểu          │
 │                   │      │                   │      │  C: Vận dụng      │
 └───────────────────┘      └───────────────────┘      │  D: Phân tích     │
                                                       │  E: Đánh giá      │
                                                       └─────────┬─────────┘
                                                                 │
                                                                 ▼
                                                       ┌───────────────────┐
                                                       │  KIỂM THỬ TỰ ĐỘNG │
                                                       │    (Web JUDGE/    │
                                                       │     NTU Coder)    │
                                                       └───────────────────┘

Giáo trình áp dụng phương pháp sư phạm tiếp cận theo năng lực thực hành kết hợp chặt chẽ với thang đo nhận thức Bloom (phiên bản cập nhật năm 2001 của Anderson & Krathwohl). Phương pháp này giúp phân hóa chi tiết mức độ nhận thức của người học qua 5 mức ký hiệu chữ cái:

Mức độ Bloom Ký hiệu mã bài Đặc điểm yêu cầu trong giáo trình Ví dụ bài tập tiêu biểu
Nhớ A Tái hiện cú pháp, nhập xuất dữ liệu, tính toán biểu thức trực tiếp theo công thức có sẵn. N0101A (Nhập xuất), N0201A (Chẵn lẻ), N0401A (Giá trị nhỏ nhất), N0501A (In ma trận)
Hiểu B Hiểu bản chất điều kiện lồng nhau, kiểm tra tính chất số học, cấu trúc lặp cơ bản. N0203B (Năm nhuận), N0310C/N0313B (Tổng mũ ba), N0410B (Số chính phương), N0605B (Xâu đối xứng)
Vận dụng C Áp dụng công thức tổ hợp, chỉnh hợp, giải thuật số học với phép chia dư modulo $10^9+7$. N0115C (Tổ hợp), N0117C (Chỉnh hợp), N0316C (Số Fibonacci), N1105C (Liệt kê chỉnh hợp tập A)
Phân tích D Phân tích bài toán đa trường hợp, xử lý biên ma trận, xác định thứ theo lịch, tìm phần tử trung vị. N0216D (Ngày sinh), N0421D (Phần tử trung vị), N1109D (Liệt kê xâu hợp lệ)
Đánh giá E Tối ưu hóa giải thuật, liệt kê các cấu hình số phức tạp (siêu nguyên tố, xâu con). N1012E (Liệt kê số siêu nguyên tố), N1013E (Tổng phần nguyên), N1110E (Liệt kê xâu con)

Về phương diện đánh giá, giáo trình sử dụng hệ thống bài tập thực hành độc lập với dữ liệu kiểm thử (test cases) chuẩn hóa. Người học tự kiểm tra tính đúng đắn của thuật toán thông qua hệ thống Web JUDGE (http://laptrinhphothong.vn) được xây dựng trên nền tảng kỹ thuật của NTU Coder (do thầy Trần Minh Văn quản trị). Quá trình chấm bài tự động sẽ phản hồi ngay lập tức kết quả chạy chương trình (Accepted, Wrong Answer, Time Limit Exceeded, Runtime Error), rèn luyện cho người học khả năng tối ưu hóa mã nguồn và giải quyết triệt để các trường hợp biên.


Điểm nổi bật và cập nhật

  1. Bộ tài liệu chuẩn hóa 3 cấp độ: Giáo trình này là Quyển Hạ — tập mở đầu đóng vai trò nền tảng trong bộ sách "Tìm hiểu lập trình thi đấu" gồm 3 quyển (Hạ – Trung – Thượng). Thiết kế này giúp người học xây dựng lộ trình tiếp cận từ cơ bản đến nâng cao một cách bài bản, tránh hiện tượng học ngắt quãng hoặc thiếu hụt kiến thức cơ sở.
  2. Chuẩn hóa công cụ thực hành và trình biên dịch: Tài liệu hướng dẫn sử dụng phiên bản IDE CodeBlocks 20.03 tích hợp bộ biên dịch GCC, chuẩn hóa phần mở rộng tệp .cpp, phím tắt biên dịch F9, đồng thời cung cấp các giải pháp thay thế linh hoạt như trình soạn thảo hiện đại (VS Code, Sublime Text, Notepad++) và các nền tảng IDE trực tuyến (Ideone, OneCompiler).
  3. Mã hóa bài tập và chuẩn hóa thang đo: Việc phân loại toàn bộ bài tập theo 5 mức độ A-B-C-D-E gắn liền với thang đo Bloom (2001) giúp người học và giáo viên dễ dàng theo dõi tiến độ học tập, định lượng chính xác năng lực tư duy của học sinh qua từng chuyên đề.
  4. Tích hợp chặt chẽ với toán học rời rạc và thuật toán số học: Các bài toán trong giáo trình không chỉ dừng lại ở cú pháp thuần túy mà được gắn kết với các khái niệm toán học: tính tổng chuỗi bằng quy nạp $S = n(n+1)/2$, giải phương trình bậc hai, tọa độ ba điểm thẳng hàng, số Fibonacci, sàng nguyên tố Eratosthenes, tính chất đồng dư thức, và các bài toán tổ hợp, chỉnh hợp, số giao điểm của đường thẳng và đường tròn.

Đối tượng sử dụng giáo trình

  • Học sinh trung học cơ sở và trung học phổ thông: Học sinh bắt đầu tiếp cận môn Tin học, học sinh có định hướng học nghề sớm hoặc tham gia đội tuyển học sinh giỏi Tin học, các kỳ thi lập trình thi đấu (Competitive Programming).
  • Sinh viên các trường đại học, cao đẳng: Sinh viên năm thứ nhất thuộc các khối ngành Công nghệ thông tin, Kỹ thuật phần mềm, Khoa học dữ liệu, Toán - Tin ứng dụng hoặc các ngành kỹ thuật cần hoàn thành học phần Nhập môn lập trình / Kỹ thuật lập trình C++.
  • Giáo viên và giảng viên Tin học: Tài liệu tham khảo giảng dạy, cung cấp ngân hàng bài tập thực hành được phân bậc rõ ràng theo chuẩn nhận thức, hỗ trợ việc thiết kế giáo án và đề thi đánh giá năng lực.
  • Yêu cầu tiên quyết (Prerequisites): Người học chỉ cần trang bị kiến thức Toán học bậc Trung học cơ sở cơ bản (các phép tính số học, phương trình bậc nhất, bậc hai, tọa độ Descartes và hình học phẳng cơ bản) và kỹ năng thao tác máy tính cơ bản.

Câu hỏi thường gặp

1. Giáo trình này phù hợp với đối tượng nào nhất?

Giáo trình được thiết kế dành cho người mới bắt đầu học lập trình C++, bao gồm học sinh phổ thông đại trà, học sinh lớp chuyên Tin và sinh viên các học phần cơ sở ngành công nghệ thông tin.

2. Cần chuẩn bị kiến thức nền tảng nào trước khi học?

Người học không yêu cầu phải biết lập trình từ trước. Kiến thức nền tảng duy nhất cần có là kiến thức Toán học phổ thông cơ bản (số học, đại số, hình học cơ bản) và khả năng thao tác trên máy tính cá nhân.

3. Giáo trình này có điểm gì khác biệt so với các tài liệu C++ khác?

Tài liệu được cấu trúc chuyên biệt cho lập trình thuật toán và lập trình thi đấu (Competitive Programming). Toàn bộ hệ thống bài tập đều có mã định danh chuẩn và phân loại theo 5 cấp độ Bloom (A-B-C-D-E), gắn liền với hệ thống chấm bài tự động Online Judge.

4. Phương pháp tự học giáo trình này như thế nào để đạt hiệu quả cao?

Người học cần đọc kỹ phần "Kiến thức ghi nhớ", gõ và chạy thử toàn bộ "Ví dụ mẫu" trên CodeBlocks, sau đó giải quyết tuần tự các bài tập từ mức A (Nhớ), B (Hiểu) đến C (Vận dụng), D (Phân tích) và E (Đánh giá), rồi nạp mã nguồn lên trang Web JUDGE để kiểm thử tính chính xác.

5. Có hệ thống bài tập trực tuyến hỗ trợ kèm theo giáo trình không?

Có. Hệ thống bài tập trong giáo trình được liên kết trực tiếp với nền tảng chấm bài tự động trực tuyến tại địa chỉ http://laptrinhphothong.vn (được xây dựng trên nền tảng kỹ thuật NTU Coder của thầy Trần Minh Văn).


Kết luận

Giáo trình "Hướng Dẫn Thuật Toán C++: Từ Cơ Bản Đến Nâng Cao" (Quyển Hạ) của tác giả Nguyễn Đức Toàn là tài liệu học thuật cơ sở về ngôn ngữ lập trình C++ và tư duy thuật toán. Bằng việc kết cấu chặt chẽ giữa lý thuyết cú pháp, ví dụ mẫu và ngân hàng bài tập thực hành phân cấp theo thang đo Bloom 2001, tài liệu cung cấp lộ trình học tập từ việc làm quen môi trường IDE đến các giải thuật đệ quy và số học chuyên sâu. Sau khi hoàn thành nội dung Quyển Hạ, người học có đầy đủ kiến thức nền tảng để tiếp tục chuyển tiếp lên các tập nâng cao hơn gồm Quyển Trung và Quyển Thượng trong bộ sách “Tìm hiểu lập trình thi đấu”. Mọi thông tin góp ý và trao đổi học thuật về giáo trình được tiếp nhận qua địa chỉ thư điện tử của tác giả: nguyenductoandhv@gmail.com.