Tổng quan về giáo trình
Tài liệu "Bài Tập Minh Họa Học Phần Nhập Môn Lập Trình" thuộc môn học Tin học Cơ sở A1, do Bộ môn Tin học Cơ sở – Khoa Công nghệ Thông tin, Trường Đại học Khoa học Tự nhiên (Đại học Quốc gia TP.HCM) biên soạn và ban hành. Trong chương trình đào tạo bậc đại học khối ngành Công nghệ Thông tin và Khoa học Máy tính, đây là học phần cơ sở mở đầu, giữ vai trò thiết lập nền tảng tư duy thuật toán và kỹ năng lập trình cấu trúc cho người học.
Mục tiêu đào tạo (learning outcomes) của tài liệu tập trung vào việc trang bị cho sinh viên:
- Cú pháp và các quy tắc cơ bản của ngôn ngữ lập trình C/C++.
- Cơ chế thực thi của chương trình và quy trình biên dịch, sửa lỗi trên môi trường phát triển tích hợp (IDE Visual C++).
- Kỹ thuật điều khiển luồng thực thi thông qua các cấu trúc rẽ nhánh và vòng lặp.
- Phương pháp phân rã module chương trình bằng việc thiết kế và sử dụng hàm (chương trình con).
- Kỹ thuật thao tác trên các cấu trúc dữ liệu cơ sở như mảng một chiều, mảng hai chiều (ma trận), chuỗi ký tự (
string/char array) và thuật giải đệ quy.
Cấu trúc tài liệu được tổ chức theo tiến trình giảng dạy 13 tuần học (từ Tuần 3 đến Tuần 13). Cách tiếp cận của giáo trình đi từ việc phân tích cú pháp, giải thích các đoạn mã nguồn mẫu, quan sát lỗi biên dịch thực tế, đến việc cung cấp hệ thống bài tập thực hành được phân cấp độ rõ ràng: bài tập cơ bản, bài tập có độ khó trung bình và bài tập có độ khó cao. Điểm đặc thù của tài liệu là chú trọng phân tích cơ chế vận hành của mã nguồn thông qua bài tập dự đoán kết quả đầu ra, các biến thể cú pháp và kỹ thuật tối ưu hóa thuật toán không sử dụng vùng nhớ phụ.
Nội dung kiến thức cốt lõi
Các chương/chủ đề chính
Nội dung giáo trình được phân bổ theo chuỗi chuyên đề tuần tự, đảm bảo tính liên kết và lũy tiến về độ phức tạp của thuật toán:
Tuần 3: Khái niệm cơ bản & Cú pháp C
Tuần 4: Cấu trúc chọn (if-else, switch-case)
Tuần 5 & 6: Cấu trúc lặp (while, do-while, for)
Tuần 7: Chương trình con & Phân rã hàm
Tuần 9 & 10: Mảng 1 chiều, Tìm kiếm & Sắp xếp
Tuần 11: Mảng 2 chiều (Ma trận)
Tuần 12 & 13: Chuỗi ký tự & Giải thuật Đệ quy
- Tuần 3 – Các khái niệm cơ bản về kỹ thuật lập trình: Giới thiệu cấu trúc khung của một chương trình C, hàm
main(), quy tắc phân biệt chữ hoa – chữ thường, khối lệnh đóng mở ngoặc{ }, dấu chấm phẩy kết thúc lệnh;. Giới thiệu cách dùng tiền xử lý#define, các kiểu dữ liệu cơ bản (int,float,char), toán tử số học, phép chia lấy dư%, định dạng xuất dữ liệuprintfvà nhậpscanf. Cung cấp phương pháp theo dõi thông báo lỗi biên dịch bằng phímF7và nhảy đến vị trí lỗi bằng phímF4trên Visual C++. - Tuần 4 – Các cấu trúc lập trình - Cấu trúc chọn: Khảo sát câu lệnh điều kiện
if,if...elselồng nhau và cấu trúc rẽ nhánh đa trường hợpswitch...case. Các bài toán tiêu biểu gồm: giải phương trình bậc nhất $ax + b = 0$, bậc hai $ax^2 + bx + c = 0$, xác định số ngày trong tháng kết hợp thuật toán kiểm tra năm nhuận((nam%400 == 0) || (nam%4 == 0 && nam%100 != 0)), tính cước phí taxi theo các bậc khoảng cách và thuật toán xác định ngày kế tiếp / ngày trước đó (ngayke,ngaytruoc). - Tuần 5 & Tuần 6 – Vòng lặp
while,do...whilevàfor: Xây dựng cấu trúc lặp với số lần chưa biết trước (while,do...while) và số lần lặp xác định (for). Khảo sát các biến thể cú pháp củafor(khuyết thành phần điều kiện, bước nhảy, câu lệnh lặp vô hạnfor(;;), thân vòng lặp rỗng). Ứng dụng giải quyết các bài toán số học: tính tổng dãy số $S = \sum i$, kiểm tra và in số nguyên tố, phân tích thừa số nguyên tố, tìm ước số chung lớn nhất (USCLN), bội số chung nhỏ nhất (BSCNN), đảo ngược số nguyên dương và sinh số Fibonacci ($f_k = f_{k-1} + f_{k-2}$). - Tuần 7 – Chương trình con (Hàm): Khái niệm hàm, tham số hình thức, tham số thực sự, tầm vực của biến, giá trị trả về và khai báo mẫu hàm (prototype). Các bài toán thực hành gồm: tính tổ hợp $C(n, k) = \frac{n!}{k!(n-k)!}$, vẽ tam giác Pascal, chuyển đổi cơ số 10 sang cơ số 16, bài toán hình học phẳng Descartes (tính khoảng cách hai điểm, viết phương trình đường thẳng $y = ax + b$, tọa độ trọng tâm tam giác và kiểm tra vị trí tương đối của một điểm nằm trong tam giác).
- Tuần 9 & Tuần 10 – Mảng một chiều, Kỹ thuật Tìm kiếm và Sắp xếp: Khai báo, khởi tạo và quản lý bộ nhớ mảng một chiều; kỹ thuật sinh số ngẫu nhiên bằng
srand((unsigned int)time(NULL))vàrand(). Các thao tác xử lý mảng gồm: tính tổng, đếm phần tử thỏa điều kiện, chèn/xóa phần tử (Xoa1PhanTusử dụng truyền tham chiếuint &n), trộn hai mảng xen kẽ (Tron2Mang). Cài đặt thuật toán tìm kiếm tuần tự (TimKiem), tìm kiếm nhị phân, thuật toán đổi chỗ trực tiếp / sắp xếp chọn (SapXepkết hợp hàmHoanVi(int &a, int &b)), sắp xếp phân đoạn chẵn lẻ/dương âm và nhân hai đa thức thông qua mảng hệ số. - Tuần 11 – Mảng hai chiều (Ma trận): Tổ chức dữ liệu dạng bảng $m \times n$. Thao tác tìm giá trị lớn nhất, nhỏ nhất kèm tọa độ $(i, j)$; thuật toán sắp xếp ma trận theo 2 hướng tiếp cận (trực tiếp không dùng mảng phụ và chuyển đổi sang mảng một chiều trung gian). Tìm điểm yên ngựa (phần tử nhỏ nhất trên dòng và lớn nhất trên cột), xây dựng ma trận đếm số lượng phần tử dương lân cận (tối đa 8 vị trí xung quanh) và sắp xếp ma trận dựa theo tổng giá trị trên từng dòng.
- Tuần 12 – Kiểu ký tự và Kiểu chuỗi: Mảng ký tự kết thúc bằng ký tự null
\0, các hàm trong thư viện chuẩn<string.h>(strlen,strlwr,strrev,strcat) và thư viện<stdlib.h>(itoa). Cài đặt thuật toán kiểm tra chuỗi đối xứng (LaChuoiDoiXung), tìm ký tự có tần suất xuất hiện cao nhất (KyTuXuatHienNhieuNhat), chuẩn hóa chuỗi họ tên (xóa khoảng trắng thừa ở đầu, cuối, giữa và viết hoa chữ cái đầu từ), cộng hai số nguyên lớn biểu diễn dưới dạng chuỗi ký tự và chuyển đổi chữ số La Mã. - Tuần 13 – Đệ quy: Bản chất của giải thuật đệ quy, mối quan hệ giữa hàm tự gọi lại chính nó và điểm thoát (điều kiện dừng). Cài đặt hàm tính giai thừa $n!$ (
GiaiThua(n)) và hàm sinh dãy Fibonacci (Fibonacy(n)). Phân tích giới hạn kích thước lưu trữ của kiểu dữ liệuintvà hiện tượng tràn số khi tính toán với giá trị $n$ lớn.
Kiến thức nền tảng được xây dựng
Tài liệu cung cấp nền tảng lý thuyết và nguyên lý lập trình cấu trúc:
- Mô hình lập trình thủ tục / cấu trúc (Procedural/Structured Programming): Chia nhỏ chương trình thành các khối chức năng độc lập thông qua chương trình con, kiểm soát luồng điều khiển đơn luồng bằng các cấu trúc chuẩn (tuần tự, chọn lọc, lặp).
- Cơ chế quản lý bộ nhớ và kiểu dữ liệu: Hiểu rõ giới hạn kích thước bit/byte của các kiểu dữ liệu nguyên thủy (
int,long,float,double,char), cơ chế ép kiểu tự động và biểu diễn ký tự qua bảng mã ASCII (khoảng cách 32 đơn vị giữa chữ hoa và chữ thường). - Phân tích độ phức tạp và tối ưu hóa tài nguyên: Phân biệt phương pháp giải thuật sử dụng thêm bộ nhớ phụ ($O(N)$ không gian) và phương pháp biến đổi trực tiếp tại chỗ (in-place modification), ví dụ như bài toán đảo mảng hoặc phân chia mảng không dùng mảng phụ.
Kỹ năng phát triển
- Kỹ năng kỹ thuật (Technical skills): Thành thạo cú pháp ngôn ngữ C/C++, cấu hình và thao tác gỡ lỗi trên Visual C++, sử dụng phím tắt môi trường phát triển, đọc thông điệp lỗi biên dịch và tra cứu thư viện chuẩn MSDN.
- Kỹ năng phân tích (Analytical skills): Phân tích bài toán thực tế thành các biểu thức toán học và logic điều kiện; dự đoán kết quả đầu ra dựa trên việc theo dõi giá trị biến qua từng bước lặp (trace code); phát hiện các trường hợp biên (biên ngày tháng năm, giá trị mảng rỗng, tràn số).
- Kỹ năng thực hành (Practical competencies): Xây dựng các hàm xử lý dữ liệu chuẩn hóa, cài đặt các thuật toán sắp xếp và tìm kiếm cơ bản, xử lý các thao tác chuỗi và mảng nhiều chiều mà không phụ thuộc hoàn toàn vào các hàm có sẵn.
Phương pháp giảng dạy và học tập
Giáo trình triển khai phương pháp giảng dạy quy nạp thực hành (practical-inductive approach), kết hợp giữa quan sát mã nguồn mẫu và tự giải quyết bài tập theo cấp độ.
- Cấu trúc phân tầng bài tập:
- Bài tập cơ bản: Cung cấp sẵn mã nguồn hoàn chỉnh hoặc đoạn mã định hướng kèm chú thích chi tiết cho từng dòng lệnh (như cách dùng
strlen(str), quy ước biến cờ hiệuFlag, định nghĩa prototype trướcmain()). Sinh viên chạy thử nghiệm, quan sát kết quả và sửa lỗi biên dịch có chủ ý. - Bài tập có độ khó trung bình: Đặt ra yêu cầu giải thuật yêu cầu sinh viên tự thiết kế lại các hàm mà không dùng hàm có sẵn, áp dụng trực tiếp cấu trúc điều khiển đã học ở mức cơ bản để mở rộng bài toán.
- Bài tập có độ khó cao: Đòi hỏi sinh viên xử lý các ràng buộc phức tạp như: không dùng mảng phụ khi hoán vị đoạn mảng, xử lý số lớn vượt giới hạn lưu trữ của kiểu số nguyên (
BigIntdạng chuỗi), các bài toán tổ hợp, hình học tọa độ và xử lý chuỗi ký tự nâng cao.
- Bài tập cơ bản: Cung cấp sẵn mã nguồn hoàn chỉnh hoặc đoạn mã định hướng kèm chú thích chi tiết cho từng dòng lệnh (như cách dùng
- Phương pháp dự đoán kết quả (Dry-run / Tracing): Tài liệu yêu cầu người học phải phân tích mã nguồn bằng tay, ghi chú dự đoán kết quả đầu ra trước khi thực thi trên máy tính (như Bài tập 4, 5, 6 Tuần 3). Nếu kết quả thực tế khác với dự đoán, sinh viên phải phân tích từng bước thực thi để hiểu rõ thứ tự ưu tiên của toán tử và cơ chế tiền xử lý macro.
- Đánh giá và Tự học: Hệ thống bài tập có tính tự kiểm chứng cao thông qua các bộ dữ liệu mẫu (Input/Output ví dụ cụ thể cho từng bài toán chuỗi, ngày tháng, mảng), giúp sinh viên tự đánh giá tính chính xác của chương trình trong quá trình tự học.
Điểm nổi bật và tính ứng dụng
- Quy chuẩn mã nguồn học thuật: Tài liệu áp dụng nghiêm ngặt các quy ước viết mã chuẩn trong lập trình C/C++: sử dụng hằng số định nghĩa kích thước tối đa (
#define MAX 100,#define max_dong 50), luôn khai báo nguyên mẫu hàm (function prototype) phía trên hàmmain(), quy định rõ đầu vào (Input) và đầu ra (Output) trong phần chú thích của mỗi hàm. - Trình bày đa dạng phương án giải thuật: Đối với cùng một bài toán, giáo trình đưa ra nhiều cách tiếp cận khác nhau để người học so sánh:
- Bài toán đảo ngược mảng một chiều (Tuần 6) được minh họa bằng 4 cách viết vòng lặp
forkhác nhau (dùng hai biến chạy, câu lệnhforthân rỗng,for(;;)vô tận và thay đổi quan hệ kiểm tra điều kiện). - Bài toán sắp xếp ma trận (Tuần 11) được hiện thực bằng cả hai cách: sắp xếp trực tiếp trên chỉ số dòng/cột và ánh xạ dữ liệu qua mảng một chiều trung gian.
- Bài toán cộng hai số nguyên lớn (Tuần 12) được xử lý bằng cả giải pháp chèn số 0 vào chuỗi ngắn hơn và giải pháp dùng toán tử ba ngôi để bù giá trị 0 trực tiếp trong vòng lặp.
- Bài toán đảo ngược mảng một chiều (Tuần 6) được minh họa bằng 4 cách viết vòng lặp
- Tính thực tế trong xây dựng bài toán: Các bài tập không chỉ dừng lại ở lý thuyết số học trừu tượng mà gắn liền với các bài toán xử lý dữ liệu thường gặp: định dạng số nguyên có dấu phẩy phân tách hàng nghìn (
123,456,789), chuẩn hóa chuỗi họ tên người dùng, tính cước phí dịch vụ taxi đa tầng, thuật toán kiểm tra tính hợp lệ của lịch biểu ngày tháng năm.
Đối tượng sử dụng giáo trình
| Nhóm đối tượng | Mục đích & Cách thức sử dụng | Yêu cầu tiên quyết (Prerequisites) |
|---|---|---|
| Sinh viên năm nhất | Tài liệu thực hành chính khóa cho học phần Nhập môn Lập trình / Tin học Cơ sở A1 ngành CNTT, Kỹ thuật Phần mềm, Khoa học Máy tính. | Kiến thức toán học phổ thông, thao tác máy tính cơ bản; không yêu cầu đã biết lập trình trước. |
| Giảng viên / Trợ giảng | Ngân hàng đề bài thực hành phòng máy, khung phân phối nội dung giảng dạy theo tuần, cơ sở ra đề kiểm tra thực hành. | Thành thạo C/C++, cấu trúc dữ liệu và giải thuật cơ sở. |
| Người tự học lập trình | Lộ trình tự học kỹ thuật lập trình C từ căn bản, rèn luyện kỹ năng viết mã sạch, tư duy giải thuật cấu trúc. | Khả năng tự đọc hiểu mã nguồn và tự cài đặt môi trường lập trình. |
Câu hỏi thường gặp
1. Tài liệu này phù hợp với đối tượng nào?
Tài liệu được thiết kế cho sinh viên năm thứ nhất các ngành Công nghệ Thông tin, Khoa học Máy tính và các ngành kỹ thuật liên quan bắt đầu tiếp cận môn lập trình đầu tiên, cũng như người học cần tài liệu thực hành C/C++ có cấu trúc chặt chẽ.
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 chỉ cần kiến thức toán học trung học phổ thông (đại số, logic, hình học phẳng cơ bản) và kỹ năng sử dụng máy tính cơ bản. Giáo trình bắt đầu từ những cú pháp căn bản nhất nên không yêu cầu kiến thức lập trình từ trước.
3. Điểm khác biệt của tài liệu so với các sách bài tập lập trình khác là gì?
Tài liệu phân chia bài tập theo cấu trúc tuần học tương ứng với tiến độ giảng dạy đại học, kết hợp giữa bài tập dự đoán kết quả, giải thích lỗi biên dịch trực tiếp và phân tầng 3 mức độ bài tập (cơ bản có lời giải mẫu, trung bình, nâng cao). Nhiều bài toán được trình bày bằng 2 đến 4 giải pháp lập trình khác nhau để đối chiếu.
4. Làm thế nào để tự học hiệu quả với tài liệu này?
Người học nên thực hiện theo quy trình:
- Đọc và gõ lại mã nguồn mẫu của các bài tập cơ bản vào IDE, biên dịch và ghi chú lại thông báo lỗi nếu có.
- Tự phân tích, dự đoán kết quả các bài tập dạng trace code trước khi chạy chương trình.
- Hoàn thành toàn bộ bài tập mức độ trung bình.
- Tự cài đặt các bài tập nâng cao với các ràng buộc tối ưu (như không dùng mảng phụ, xử lý số lớn).
5. Môi trường phát triển và thư viện nào được sử dụng trong giáo trình?
Giáo trình sử dụng ngôn ngữ C/C++ trên môi trường Microsoft Visual C++ (với các phím tắt biên dịch F7, duyệt lỗi F4), sử dụng các thư viện chuẩn gồm <stdio.h>, <stdlib.h>, <string.h>, <ctype.h>, <time.h>, <math.h> và thư viện trợ giúp MSDN.
Kết luận
Tài liệu "Bài Tập Minh Họa Học Phần Nhập Môn Lập Trình" của Khoa Công nghệ Thông tin – Trường ĐH Khoa học Tự nhiên (ĐHQG TP.HCM) là tài liệu học tập thực hành có tính hệ thống cao, phản ánh chuẩn mực đào tạo kỹ thuật lập trình cấu trúc bậc đại học.
Lộ trình học tập khuyến nghị đi tuần tự từ việc làm quen cú pháp và môi trường biên dịch (Tuần 3), nắm vững các cấu trúc rẽ nhánh và vòng lặp (Tuần 4–6), làm chủ kỹ thuật phân rã hàm (Tuần 7), thành thạo thao tác trên cấu trúc mảng và ma trận (Tuần 9–11), đến xử lý chuỗi văn bản nâng cao và thuật giải đệ quy (Tuần 12–13). Tài liệu bổ trợ cần thiết cho người học bao gồm bộ tài liệu tra cứu MSDN và các tài liệu chuẩn về cấu trúc dữ liệu và giải thuật cơ sở.