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

Học phần Lập trình C++ (CO1011 - Mã học phần: 501127), cụ thể là nội dung Cơ sở các cấu trúc điều khiển (Phần 2) - Fundamentals of Control Structures (part 2), được biên soạn bởi giảng viên Nguyễn Đức Dũng (Duc Dung Nguyen) thuộc Khoa Khoa học và Kỹ thuật Máy tính (Faculty of Computer Science and Engineering) – Trường Đại học Bách Khoa TP.HCM (Hochiminh City University of Technology). Học phần có thời lượng định mức 4 tín chỉ (4 credits), giữ vị trí môn học cơ sở cốt lõi trong chương trình đào tạo kỹ sư các ngành Khoa học Máy tính và Kỹ thuật Phần mềm. Giáo trình cung cấp kiến thức nền tảng về các kiểu dữ liệu có cấu trúc và cơ chế điều khiển luồng thực thi trong chương trình máy tính.

Chuẩn đầu ra (Learning Outcomes) của tài liệu tập trung vào bốn mục tiêu cụ thể:

  1. Sử dụng thành thạo mảng (array), chuỗi ký tự (string) và các kiểu dữ liệu có cấu trúc (structured data types).
  2. Giải quyết bài toán kỹ thuật thông qua việc áp dụng các cấu trúc lặp (loop structures).
  3. Hiện thực hóa chương trình bằng các câu lệnh lặp chuẩn trong ngôn ngữ C/C++, bao gồm while, for, và do-while.
  4. Hiểu rõ vai trò của giải thuật (algorithm) trong quy trình phân tích và giải quyết bài toán kỹ thuật.

Cấu trúc giáo trình được thiết kế theo trình tự tuyến tính: từ việc mở rộng không gian lưu trữ dữ liệu với mảng, chuỗi và cấu trúc (struct), tiến tới kiểm soát luồng điều khiển lặp, và kết nối với phương pháp luận lập trình cấu trúc (Structured Programming). Điểm đặc sắc của tài liệu là việc kết hợp chặt chẽ giữa lý thuyết ngôn ngữ C/C++, phân tích cú pháp/bộ nhớ, cùng mô hình giải quyết vấn đề kỹ thuật được chuẩn hóa.


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

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

Nội dung bài giảng được tổ chức thành các chủ đề kỹ thuật nối tiếp nhau với tính logic cao:

  1. Kiểu dữ liệu mảng (Array): Phân tích sự cần thiết của mảng khi kiểu dữ liệu nguyên thủy không đủ đáp ứng. Trình bày khai báo mảng tĩnh (int Fibonacci[MAX_LENGTH];, int sNum[5] = {5, 6, 9, 2, 1};), cấp phát bộ nhớ động thông qua con trỏ (float *pNum = new float[N];), và đối chiếu với cấu trúc lớp std::vector<float> x(N); để khắc phục lỗi biên dịch khi khai báo kích thước động float x[N]. Minh họa cơ chế truy xuất chỉ số (sNum[index]) và tính toán dãy số.
  2. Chuỗi ký tự (String) - C-string và std::string: Định nghĩa mảng ký tự char strName[50] và con trỏ chuỗi char *pStr. Hệ thống hóa các hàm thao tác chuỗi trong thư viện chuẩn C (strlen, strcpy, strcat, strcmp, strchr, strrchr). Giới thiệu lớp đối tượng std::string trong C++ với các phương thức quản trị bộ nhớ và phần tử (max_size, at(), push_back(), pop_back(), toán tử +=).
  3. Kiểu dữ liệu tự định nghĩa (struct và typedef): Cú pháp khai báo bản ghi tổng hợp các kiểu dữ liệu khác nhau (struct Student { int ID; char name[50]; };), khai báo mảng các cấu trúc (struct Student studentList[40];), và tối ưu hóa định danh kiểu thông qua typedef (StdName_t, Student_t).
  4. Cấu trúc lặp while và vòng lặp lồng nhau (Nested Loop): Cú pháp while (<condition>) <statement>;, sơ đồ khối (flowchart), cơ chế kiểm tra điều kiện lặp, quản trị biến đếm (counter), nhận diện lỗi vòng lặp vô hạn, và kỹ thuật lồng vòng lặp để xử lý mảng đa chiều hoặc chờ dữ liệu nhập.
  5. Cấu trúc lặp for và câu lệnh ngắt luồng: Cơ chế gom nhóm 3 thành phần (khởi tạo initialization, kiểm tra điều kiện condition, cập nhật biến đếm modification). Ứng dụng vòng lặp lồng nhau qua ví dụ ma trận ảnh 2 chiều int img[12][16] kết hợp hàm số ngẫu nhiên rand() % 256. Cơ chế thay đổi luồng thực thi bằng lệnh break và continue.
  6. Cấu trúc lặp hậu kiểm do-while: Cú pháp do { <statements>; } while (<condition>);, nguyên lý "thực thi trước, kiểm tra sau", ứng dụng trong kiểm tra tính hợp lệ của dữ liệu nhập từ bàn phím.
  7. Lập trình cấu trúc và Bảng thứ tự ưu tiên toán tử (C++ Operator Precedence): Định nghĩa mô hình lập trình cấu trúc và phân loại thứ tự ưu tiên 16 cấp bậc của các toán tử trong C++ (từ toán tử truy cập thành viên con trỏ *, ->*, toán tử số học *, /, %, +, -, dịch bit >>, <<, so sánh quan hệ <>, đẳng thức ==, !=, logic bit, logic mệnh đề &&, ||, phép gán phức hợp, đến toán tử dấu phẩy ,).

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

  • Hệ hình lập trình cấu trúc (Structured Programming Paradigm): Lịch sử phát triển và mục tiêu cải thiện tính rõ ràng, chất lượng và thời gian phát triển phần mềm thông qua việc sử dụng chương trình con (subroutines), khối cấu trúc (block structures), và các câu lệnh lặp for/while. Giáo trình liên hệ hệ hình này qua các ngôn ngữ kinh điển: ALGOL, Pascal, PL/I, Ada, C/C++.
  • Mô hình giải quyết vấn đề của Don Woods & Philip Wankat: Hệ thống hóa quy trình kỹ thuật gồm các pha: Xác định vấn đề (Define problem), Thu thập thông tin (Gather information), Thăm dò ràng buộc (Explore constraints), Lập kế hoạch (Plan method), Thực thi/Xử lý sự cố (Act/troubleshoot), Đối chiếu tiêu chí (Check against criteria), Khái quát hóa giải pháp (Generalize to new situations), và Truyền đạt kết quả (Disseminate).
  • Cơ chế đánh giá biểu thức C++: Cung cấp bảng 16 mức độ ưu tiên toán tử, giúp người học xác định chính xác thứ tự thực thi của các biểu thức điều kiện phức tạp trong vòng lặp.

Kỹ năng phát triển

  • Kỹ năng kỹ thuật (Technical skills): Khai báo và quản lý bộ nhớ mảng tĩnh/động; áp dụng hàm thư viện xử lý chuỗi chuẩn C và thao tác phương thức của std::string; tổ chức cấu trúc dữ liệu bản ghi bằng struct; viết vòng lặp lồng nhau xử lý mảng đa chiều (ma trận ảnh img[12][16]).
  • Kỹ năng phân tích (Analytical skills): Phân tích sơ đồ khối thuật toán; kiểm soát điều kiện dừng; phát hiện nguyên nhân gây treo chương trình do vòng lặp vô tận (while(100);, for(;;);, biến đếm không thay đổi).
  • Kỹ năng thực hành giải quyết bài toán (Practical competencies):
    • Xử lý đồ họa văn bản: Vẽ các mẫu hình học dấu sao (*) trên terminal (tam giác, hình đối xứng, đường chéo với kích thước $N=5$).
    • Phân tích cú pháp: Xây dựng chương trình trích xuất tham số dòng lệnh theo cấu trúc <program name> [<arguments>] (ví dụ: cờ -d và tên tệp).
    • Tính toán số học: Hiện thực thuật toán in dãy số nguyên tố từ $2$ đến $N$, tính toán và xuất dãy số Fibonacci từ $3$ đến $N$.

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

Giáo trình áp dụng phương pháp sư phạm tiếp cận từ cú pháp cơ bản đến tư duy giải quyết vấn đề có hệ thống. Kiến thức không dừng lại ở mức mô tả câu lệnh mà được đặt trong cấu trúc logic chặt chẽ:

  • Phân tích đối sánh cú pháp và biểu đồ: Mỗi cấu trúc lặp (while, for, do-while) đều đi kèm sơ đồ khối (flowchart) mô tả chi tiết nhánh rẽ điều kiện (True/False). Cách tiếp cận này giúp người học hình dung đường đi của luồng lệnh trước khi chuyển đổi sang mã nguồn C++.
  • Phân tích ca điển hình (Case Studies) và bài tập thực hành:
    • Ứng dụng xử lý ma trận: Đoạn mã mẫu khởi tạo mảng 2 chiều img[12][16] với giá trị mức xám ngẫu nhiên rand() % 256 bằng hai vòng lặp for lồng nhau.
    • Kiểm soát dữ liệu nhập: Áp dụng vòng lặp do-while để yêu cầu người dùng nhập lại số dương nếu dữ liệu vào không hợp lệ (i < 0).
    • Kiểm soát luồng nâng cao: Vận dụng break và continue trong các điều kiện đặc biệt để thay đổi chu trình lặp mặc định.
  • Phương pháp đánh giá và tự học: Người học được yêu cầu tự phân tích các đoạn mã lỗi tiềm ẩn (như việc truy xuất vượt biên sNum[5] trên mảng 5 phần tử, hoặc việc cấp phát mảng biến thiên float x[N] trong C++ chuẩn), từ đó xây dựng thói quen kiểm tra biên (boundary checking) và kiểm soát bộ nhớ.

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

  • Đối chiếu trực tiếp giữa C truyền thống và C++ hiện đại: Giáo trình phân biệt rõ ràng cách tiếp cận truyền thống (C-string char[], mảng tĩnh) với thư viện chuẩn C++ (std::string, std::vector). Sự so sánh này giúp sinh viên hiểu rõ bản chất quản lý bộ nhớ ở tầng thấp trước khi sử dụng các lớp trừu tượng cấp cao.
  • Tích hợp mô hình kỹ thuật Don Woods & Philip Wankat: Khác với các tài liệu thuần lập trình cú pháp, bài giảng đưa khung phương pháp luận giải quyết vấn đề của Woods & Wankat vào giảng dạy, định hướng người học tiếp cận bài toán lập trình như một bài toán kỹ thuật hoàn chỉnh: từ phân tích ràng buộc đến kiểm định tiêu chí.
  • Tính thực tiễn qua các ví dụ mô phỏng:
    • Bài toán phân tích dòng lệnh (Command-line parser) liên kết trực tiếp với cách thức hoạt động của các tiện ích hệ điều hành và công cụ dòng lệnh (CLI).
    • Bài toán mảng 2 chiều biểu diễn ma trận điểm ảnh (img[12][16]) tạo nền tảng cho các học phần chuyên sâu về xử lý ảnh số và đồ họa máy tính.

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

  • Sinh viên bậc đại học: Sinh viên năm thứ nhất hoặc năm thứ hai chuyên ngành Khoa học Máy tính, Kỹ thuật Máy tính, Công nghệ Thông tin, và các ngành kỹ thuật kỹ thuật số đang theo học học phần Lập trình C++ (CO1011 - 4 tín chỉ).
  • Yêu cầu kiến thức tiên quyết (Prerequisites): Người học cần nắm vững các kiểu dữ liệu cơ bản (primitive data types: int, float, char), các toán tử số học/logic cơ bản, và cấu trúc điều khiển rẽ nhánh (if-else, switch-case).
  • Giảng viên và trợ giảng: Tài liệu dùng làm khung bài giảng chuẩn, cung cấp các ví dụ mã nguồn minh họa, sơ đồ khối thuật toán và hệ thống bài tập thực hành trên lớp.
  • Tự học và nghiên cứu: Phù hợp cho người học cần củng cố kiến thức nền tảng về tổ chức dữ liệu mảng, chuỗi, bản ghi và tối ưu hóa vòng lặp trong ngôn ngữ C/C++.

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

1. Giáo trình này phù hợp với ai?

Giáo trình được thiết kế cho sinh viên khối ngành Kỹ thuật và Khoa học Máy tính thuộc Trường Đại học Bách Khoa TP.HCM theo học học phần CO1011 (4 tín chỉ), cũng như người học lập trình C++ cần xây dựng nền tảng vững chắc về cấu trúc điều khiển và dữ liệu.

2. Cần kiến thức nền nào để học phần này?

Người học cần hoàn thành nội dung về các kiểu dữ liệu cơ bản (kiểu số nguyên, số thực, ký tự), biến, hằng số, biểu thức tính toán, và cấu trúc điều khiển rẽ nhánh cơ sở (if, if-else).

3. Điểm khác biệt giữa giáo trình này với các tài liệu lập trình C++ khác là gì?

Tài liệu tích hợp mô hình giải quyết vấn đề kỹ thuật của Don Woods & Philip Wankat, đồng thời cung cấp bảng tra cứu chi tiết 16 cấp độ ưu tiên của toán tử C++ và phân tích song song giữa cấu trúc mảng/chuỗi C-style với các lớp đối tượng chuẩn C++ (std::vector, std::string).

4. Làm sao để tự học hiệu quả với giáo trình này?

Người học nên vẽ sơ đồ khối (flowchart) trước khi viết mã, chủ động gõ và biên dịch lại các ví dụ mã nguồn (mảng cấu trúc Student, xử lý ma trận img[12][16]), tự giải các bài toán thực hành (vẽ mẫu hình dấu *, bộ phân tích tham số CLI, số nguyên tố, dãy Fibonacci), và kiểm tra kỹ các trường hợp vòng lặp vô hạn.

5. Có tài liệu bổ trợ nào kèm theo nội dung này?

Học phần đi kèm hệ thống sơ đồ khối giải thuật, bảng chuẩn thứ tự ưu tiên toán tử C++, các đoạn mã mẫu về cấp phát mảng động bằng con trỏ, và hệ thống bài toán lập trình mẫu trên môi trường dòng lệnh (Terminal).


Kết luận

Học phần Fundamentals of Control Structures (part 2) - CO1011 xác lập nền tảng kỹ thuật vững chắc về các kiểu dữ liệu có cấu trúc (array, string, struct) và hệ thống câu lệnh lặp (while, for, do-while) trong C++. Lộ trình học tập đề xuất bao gồm: nắm vững cơ chế phân bổ bộ nhớ -> làm chủ cú pháp và sơ đồ luồng điều khiển -> áp dụng phương pháp luận Woods & Wankat vào hiện thực giải thuật thực tế (vẽ đồ họa terminal, xử lý chuỗi lệnh CLI, tính toán số học). Tài liệu liên kết chặt chẽ với khung chương trình 4 tín chỉ của Khoa Khoa học và Kỹ thuật Máy tính – Đại học Bách Khoa TP.HCM, định hình tư duy lập trình cấu trúc chuẩn mực cho các học phần phát triển phần mềm chuyên sâu tiếp theo.