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

Tài liệu học tập "Bài tập C++ cơ bản: Mảng một chiều - ĐH KTKTCN Phần 2" (bao gồm các nội dung thực hành Lab 7, Lab 8 và Lab 9) là tập bài giảng thực hành thuộc khối kiến thức cơ sở ngành của chương trình đào tạo kỹ thuật và công nghệ thông tin tại Trường Đại học Kinh tế - Kỹ thuật Công nghiệp (ĐH KTKTCN). Tài liệu giữ vị trí học phần thực hành nền tảng, làm cầu nối giữa kiến thức lập trình cơ sở (biến, kiểu dữ liệu, vòng lặp, rẽ nhánh) với các học phần chuyên sâu hơn như Cấu trúc dữ liệu và Giải thuật hoặc Lập trình hướng đối tượng.

Mục tiêu đào tạo (Learning Outcomes) của tài liệu tập trung trang bị cho sinh viên 4 nhóm năng lực kỹ thuật cơ bản trong ngôn ngữ lập trình C++:

  • Nắm vững cú pháp và các phương thức khai báo dữ liệu có cấu trúc (mảng một chiều, mảng hai chiều, xâu ký tự).
  • Làm chủ các thao tác giải thuật trên cấu trúc mảng và chuỗi (nhập/xuất, duyệt, tìm kiếm, sắp xếp, lọc, tính toán thống kê và biến đổi dữ liệu).
  • Rèn luyện kỹ năng mô-đun hóa chương trình bằng cách tổ chức mã nguồn thành các hàm chức năng độc lập.
  • Nâng cao kỹ năng phát hiện, phân tích và sửa lỗi (debugging) cú pháp cũng như lỗi giải thuật trong quá trình biên dịch và thực thi chương trình.

Cấu trúc của tài liệu được thiết kế theo định dạng bài thực hành tiêu chuẩn (Lab sheet), phân chia rõ rệt thành 3 hợp phần: Mục tiêu học tập, Tóm tắt cú pháp lý thuyết, Yêu cầu hệ thống phần cứng/phần mềm (hệ điều hành Windows, RAM tối thiểu 256MB, môi trường lập trình C-Free 5), Hệ thống bài tập có hướng dẫn mã nguồn chi tiết và Danh mục bài tập tự giải trên phòng máy. Cách tiếp cận này giúp người học củng cố lý thuyết thông qua việc đọc hiểu và trực tiếp kiểm thử các đoạn mã cụ thể trên máy tính.


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

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

Nội dung tài liệu được phân chia thành 3 bài thực hành (Lab) tương ứng với 3 chủ đề cấu trúc dữ liệu cốt lõi trong C++:

1. Lab 7: Bài tập mảng một chiều

  • Khái niệm và cú pháp: Giới thiệu 3 dạng khai báo mảng một chiều: dạng 1 (xác định số phần tử, không khởi tạo <tên kiểu><tên mảng>[số thành phần];), dạng 2 (xác định số phần tử kèm gán giá trị <tên kiểu><tên mảng>[số thành phần] = { dãy giá trị };), dạng 3 (không xác định số phần tử kèm gán giá trị <tên kiểu><tên mảng>[] = { dãy giá trị };). Quy tắc truy xuất theo chỉ số 0-indexed qua cú pháp <tên biến mảng>[chỉ số].
  • Hệ thống bài tập mẫu (14 bài):
    • Nhập, xuất và sắp xếp cơ bản mảng số thực 100 phần tử.
    • Sắp xếp mảng theo thứ tự tăng dần và kiểm tra, in số hoàn hảo.
    • Phát sinh dữ liệu ngẫu nhiên với hàm rand(), srand(time(NULL)) từ thư viện <time.h> và viết hàm đếm số âm, số dương (DemAmDemDuong90).
    • Viết hàm tìm kiếm vị trí của phần tử $x$ trong mảng (mins).
    • Viết các hàm mô-đun riêng biệt: nhapmang, xuatmang, tangdan, giamdan.
    • Thuật toán kiểm tra chữ số đầu tiên của phần tử là số lẻ (check(int n) sử dụng phép chia nguyên n /= 9 và abs).
    • Tìm giá trị lớn nhất (Max), nhỏ nhất (Min), tính trung bình cộng (TBC) và lọc các phần tử nhỏ hơn/lớn hơn TBC.
    • Sắp xếp nổi bọt có cờ hiệu kiểm soát bool kt (Xap_Xep).
    • Lọc và tính tổng các số chia hết cho 3, trung bình cộng các số lẻ.
    • Viết các hàm tính tổng mảng, tổng phần tử chẵn, tổng phần tử lẻ (Tinh_Tong, Tinh_Tong_Chan, Tinh_Tong_Le).
    • Tính tổng các vị trí chẵn, tổng các vị trí lẻ và tìm phần tử có giá trị gần nhất với giá trị trung bình của mảng bằng hàm fabs (math.h).
  • Bài tập mở rộng phòng máy (11 bài): In mảng đảo ngược; tính tổng số lẻ; xóa phần tử tại vị trí $k$; chèn phần tử sau vị trí $k$; in các giá trị phân biệt; sắp xếp số nguyên 3 chữ số theo thứ tự ưu tiên (đơn vị $\rightarrow$ hàng chục $\rightarrow$ hàng trăm); trộn hai mảng tăng dần thành mảng thứ ba tăng dần; chèn phần tử vào dãy tăng dần; in ma trận đối xứng; tìm vị trí số nhỏ nhất; in tam giác Pascal.

2. Lab 8: Bài tập mảng hai chiều

  • Khái niệm và cú pháp: Khai báo ma trận <tên kiểu><tên mảng>[<số dòng>][<số cột>]; và truy xuất qua hai chỉ số Tênmảng[chỉ_số_hàng][chỉ_số_cột].
  • Hệ thống bài tập mẫu (11 bài):
    • Nhập ma trận vuông $4 \times 4$ và tính tổng phần tử trên đường chéo.
    • Khởi tạo ma trận $5 \times 5$ theo quy luật toán học: đường chéo chính bằng 0, tam giác dưới bằng -1, tam giác trên bằng 1.
    • Tính tổng từng hàng, từng cột và lưu vào biên mở rộng của ma trận $n \times m$; tính tổng đường chéo nếu là ma trận vuông.
    • Điền giá trị tự động từ 1 đến 9 trên mảng $3 \times 3$.
    • Thuật toán xóa một hàng trong ma trận bằng phép dồn dịch chỉ số hàng (myArr[row][col] = myArr[row + 1][col]).
    • Phép cộng hai ma trận cùng kích thước $A[i][j] += B[i][j]$.
    • Đếm và in các phần tử chẵn trên hàng thứ $k$ ($k < n$).
    • Tìm kiếm vị trí tọa độ xuất hiện đầu tiên (hàng, cột) của giá trị $x$.
    • Tìm Max, Min trên cột cuối cùng ($m - 1$).
    • Đếm số phần tử dương và chẵn trên từng cột; đếm số phần tử dương trên từng hàng.
    • Tách và in riêng các phần tử âm và phần tử dương trong ma trận.
  • Bài tập mở rộng phòng máy (12 bài): Tìm Min/Max ma trận kèm chỉ số; tìm Min/Max trên đường chéo chính; in các phần tử phía dưới đường chéo chính; tạo ma trận kích thước $9 \times 14$ với $a[i][j] = i \times j$; xuất số nguyên tố trong ma trận; tìm vị trí phần tử chẵn cuối cùng; xóa một cột trong ma trận; thiết kế chương trình menu quản lý hồ sơ điểm sinh viên (xem tất cả bản ghi, xem theo ID, tìm điểm thi cao nhất/thấp nhất).

3. Lab 9: Bài tập xâu ký tự

  • Khái niệm và cú pháp: Trình bày 2 cách tiếp cận xử lý chuỗi: mảng ký tự kiểu C (char <tên xâu>[độ dài];, có khởi tạo hoặc không khởi tạo) và lớp chuỗi hiện đại string <tên xâu>; thuộc thư viện <string>.
  • Hệ thống bài tập mẫu (6 bài):
    • Lập bảng tần suất xuất hiện của các ký tự chữ cái trong xâu bằng mảng đếm 26 phần tử (dem[(int)s[i] - (int)'a']++).
    • Thuật toán đảo ngược chuỗi văn bản bằng phép duyệt lùi chỉ số từ s.length() - 1 về 0.
    • Tìm vị trí xuất hiện sau cùng của xâu con $S_2$ trong xâu $S_1$ bằng phương thức s1.rfind(s2).
    • Kiểm tra tính đúng đắn của biểu thức đóng mở ngoặc tròn () bằng biến đếm cân bằng.
    • Kiểm tra điều kiện tạo xâu $S_2$ từ xâu $S_1$ thông qua phương thức xóa ký tự s1.erase(j, 1).
    • Viết hàm TrichTen(string s) để trích xuất phần tên từ chuỗi họ tên đầy đủ bằng cách quét tìm vị trí khoảng trắng cuối cùng.

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

Tài liệu củng cố và xây dựng các nguyên lý lập trình cơ bản:

  • Tổ chức bộ nhớ mảng tĩnh: Cách cấp phát các ô nhớ tuần tự liên tiếp, quy ước đánh số chỉ số mảng bắt đầu từ 0 (0-indexed), kiểm soát giới hạn biên mảng qua các hằng số #define MAX 100.
  • Kỹ thuật lập trình thủ tục và phân rã hàm: Xây dựng hàm nhận tham số mảng (int a[], int a[][MAX]), truyền tham số theo giá trị và tham chiếu (int &n), phân tách mã nguồn thành các hàm độc lập đảm nhiệm một nhiệm vụ duy nhất (nhập, xuất, xử lý thuật toán).
  • Sử dụng các thư viện chuẩn: Ứng dụng các thư viện vào giải quyết bài toán: <iostream> (nhập xuất dữ liệu dòng), <conio.h> (hàm clrscr()), <math.h> (các hàm toán học abs, fabs), <time.h> (hàm thời gian phục vụ sinh số ngẫu nhiên) và <string> (các hàm xử lý chuỗi getline, .length(), .rfind(), .erase()).

Kỹ năng phát triển

  • Kỹ năng phân tích và cài đặt thuật toán: Cài đặt các thuật toán nền tảng gồm duyệt toàn bộ (brute-force), tìm kiếm tuyến tính, thuật toán sắp xếp đổi chỗ trực tiếp, kỹ thuật dùng cờ hiệu (flag), kỹ thuật dồn dịch phần tử để chèn/xóa trong mảng tĩnh.
  • Kỹ năng thao tác dữ liệu nhiều chiều và dữ liệu chuỗi: Xử lý các dạng bảng số liệu, đường chéo, ma trận tam giác, phân tích cú pháp biểu thức và trích xuất dữ liệu văn bản.
  • Kỹ năng thực hành và gỡ lỗi: Nhập liệu, biên dịch mã nguồn, kiểm thử các trường hợp dữ liệu biên trên môi trường C-Free 5 và sửa lỗi vượt chỉ số vùng nhớ.

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 theo định hướng thực hành trực quan (Lab-based learning) kết hợp với học tập giải quyết vấn đề (Problem-based learning):

+-------------------------------------------------------------+
| Giai đoạn 1: Chuẩn hóa Mục tiêu & Khung Lý thuyết Cú pháp   |
+-------------------------------------------------------------+
                               |
                               v
+-------------------------------------------------------------+
| Giai đoạn 2: Hướng dẫn Mẫu (Worked Examples & Code walkthrough)|
+-------------------------------------------------------------+
                               |
                               v
+-------------------------------------------------------------+
| Giai đoạn 3: Thực hành Thực nghiệm & Debug trên C-Free 5    |
+-------------------------------------------------------------+
                               |
                               v
+-------------------------------------------------------------+
| Giai đoạn 4: Mở rộng Thuật toán Độc lập (Bài tập Phòng máy) |
+-------------------------------------------------------------+

Cách tiếp cận sư phạm

  1. Chuẩn hóa mục tiêu và cú pháp: Đưa ra khung lý thuyết tối giản, tập trung thẳng vào cấu trúc cú pháp của từng loại dữ liệu trước khi đi vào bài tập.
  2. Học qua mã nguồn mẫu (Worked Examples): Mỗi dạng bài toán đều có đề bài cụ thể, kèm theo đoạn mã C++ hoàn chỉnh và ảnh chụp/mô tả kết quả chạy chương trình để người học đối chiếu ngay lập tức.
  3. Mở rộng tư duy qua bài tập tự giải: Phần "Bài tập thực hành trên phòng máy" cắt bỏ hoàn toàn phần gợi ý code, yêu cầu sinh viên phải tự tổng hợp kiến thức từ các bài mẫu để thiết kế giải thuật độc lập.

Phương pháp đánh giá và tự học

  • Đánh giá năng lực thực hành: Đánh giá dựa trên độ chính xác của mã nguồn khi biên dịch, khả năng xử lý đúng các bộ dữ liệu thử nghiệm trên phòng máy và cách tổ chức các hàm chức năng.
  • Hướng dẫn tự học: Sinh viên được khuyến nghị gõ trực tiếp mã nguồn vào IDE thay vì sao chép, tự tay sửa các lỗi cảnh báo/lỗi biên dịch, sau đó thay đổi các giá trị đầu vào để kiểm tra tính đúng đắn của giải thuật trước khi bước vào giải quyết danh mục bài tập mở rộng.

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

  • Cấu hình môi trường tinh gọn: Tài liệu xây dựng trên nền tảng phần mềm C-Free 5 và hệ điều hành Windows với yêu cầu phần cứng tối thiểu (RAM 256MB), đảm bảo tính tương thích trên các hệ thống phòng máy tính thực hành tiêu chuẩn.
  • Sự kết hợp giữa phong cách C cổ điển và C++ hiện đại: Mã nguồn phản ánh sự chuyển tiếp thực tế trong giảng dạy lập trình: vừa sử dụng các hàm/thư viện truyền thống (conio.h, mảng ký tự char[], clrscr()), vừa tích hợp các đặc trưng tiêu chuẩn của C++ (std::string, đối tượng cin/cout, hàm getline(), các phương thức chuỗi .length(), .rfind(), .erase()).
  • Hệ thống bài tập bao phủ đầy đủ các mô hình giải thuật cơ sở: Toàn bộ các bài toán đều gắn liền với những bài toán kinh điển trong khoa học máy tính:
    • Kiểm tra đặc tính số học (số hoàn hảo, số nguyên tố, tính chẵn/lẻ).
    • Thuật toán thống kê và tối ưu (Max, Min, Trung bình cộng, tìm phần tử gần giá trị trung bình nhất).
    • Đại số ma trận cơ bản (cộng hai ma trận, tính tổng đường chéo, ma trận đối xứng, xử lý tam giác ma trận).
    • Xử lý cấu trúc dữ liệu chuỗi (kiểm tra tính hợp lệ của dấu ngoặc, tách họ tên, bảng tần suất ký tự).
    • Ứng dụng quản trị dạng menu (quản lý hồ sơ điểm sinh viên bằng mảng hai chiều).

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

  • Sinh viên mục tiêu: Sinh viên năm thứ nhất hoặc năm thứ hai theo học các ngành Công nghệ thông tin, Kỹ thuật phần mềm, Hệ thống thông tin, Điện - Điện tử, Tự động hóa và Cơ điện tử tại Trường Đại học Kinh tế - Kỹ thuật Công nghiệp cũng như các trường đại học, cao đẳng đào tạo khối kỹ thuật.
  • Yêu cầu kiến thức tiên quyết (Prerequisites):
    • Đã hoàn thành các bài học về cú pháp cơ bản của C++.
    • Hiểu và sử dụng thành thạo các kiểu dữ liệu nguyên thủy (int, float, char, bool).
    • Nắm vững cấu trúc điều khiển rẽ nhánh (if, if-else, switch-case) và các cấu trúc vòng lặp (for, while, do-while).
  • Giảng viên: Sử dụng làm tài liệu phân phối trực tiếp tại các buổi thực hành phòng máy, làm cơ sở xây dựng ngân hàng bài tập kiểm tra giữa kỳ hoặc đánh giá kỹ năng lập trình định kỳ.
  • Người tự học: Phục vụ các cá nhân bắt đầu học lập trình giải thuật với ngôn ngữ C++, cần một hệ thống bài tập có mã nguồn đối chiếu rõ ràng để luyện tập kỹ năng giải thuật cơ bản.

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

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

Tài liệu được biên soạn phục vụ trực tiếp cho sinh viên các ngành kỹ thuật và công nghệ đang theo học học phần Kỹ thuật lập trình/Lập trình C++ cơ bản, cần tài liệu thực hành có sẵn mã nguồn mẫu và bài tập phòng máy.

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

Người học cần nắm vững kiến thức lập trình cơ sở: kiểu dữ liệu nguyên thủy, toán tử số học/logic, các câu lệnh rẽ nhánh (if-else) và cấu trúc vòng lặp (for, while).

3. Điểm khác biệt của tài liệu này so với sách giáo trình lý thuyết là gì?

Tài liệu được thiết kế dưới dạng tài liệu thực hành (Lab sheet), tối giản hóa các diễn giải lý thuyết hàn lâm, tập trung trực tiếp vào cú pháp chuẩn, mã nguồn bài toán mẫu có thể biên dịch chạy ngay và hệ thống bài tập tự giải trên máy.

4. Làm sao để tự học hiệu quả với tài liệu này?

Người học nên tự cài đặt môi trường lập trình C-Free 5, trực tiếp gõ lại các đoạn mã mẫu trong phần "Hướng dẫn chi tiết", quan sát kết quả thực thi, phân tích cơ chế hoạt động của từng hàm, sau đó tự giải các bài tập trong phần "Bài tập thực hành trên phòng máy".

5. Những công cụ phần mềm nào được yêu cầu trong tài liệu?

Tài liệu yêu cầu máy tính cài đặt hệ điều hành Windows, cấu hình RAM tối thiểu từ 256MB và sử dụng môi trường phát triển tích hợp (IDE) C-Free phiên bản 5.0.


Kết luận

Tài liệu "Bài tập C++ cơ bản: Mảng một chiều - ĐH KTKTCN Phần 2" (bao gồm Lab 7, Lab 8 và Lab 9) là tài liệu học tập thực hành có tính cấu trúc và tính ứng dụng cao đối với việc rèn luyện kỹ năng lập trình mảng và chuỗi trong C++. Giá trị học thuật chính của tài liệu nằm ở hệ thống mã nguồn mẫu trực quan, bao quát toàn diện các thuật toán thao tác dữ liệu từ cấp độ đơn giản đến nâng cao trên mảng một chiều, mảng hai chiều và lớp xâu ký tự. Lộ trình học tập khuyến nghị cho sinh viên là hoàn thành tuần tự từ xử lý mảng một chiều (Lab 7), phát triển tư duy bảng/ma trận với mảng hai chiều (Lab 8) và hoàn thiện năng lực xử lý văn bản với xâu ký tự (Lab 9), tạo nền tảng vững chắc để tiếp cận các cấu trúc dữ liệu phức tạp hơn như con trỏ, danh sách liên kết và lập trình hướng đối tượng.