Giáo Trình Lập Trình Căn Bản

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

Giáo trình Lập trình Căn bản (biên tập bởi Dương Văn Hiếu, xuất bản trên hệ thống VOER) là tài liệu học tập chuẩn hóa cho học phần Lập trình Căn bản A với thời lượng 45 tiết. Môn học giữ vị trí nền tảng trong chương trình đào tạo đại học khối ngành Công nghệ Thông tin và Kỹ thuật, đóng vai trò tiên quyết để sinh viên tiếp thu các học phần chuyên sâu tiếp theo như Cấu trúc Dữ liệu, Hệ điều hành và Lập trình Ứng dụng.

Mục tiêu học tập của giáo trình được xác định rõ qua các chuẩn đầu ra:

  • Nắm vững khái niệm về ngôn ngữ lập trình, phân biệt ngôn ngữ máy, hợp ngữ và ngôn ngữ bậc cao; hiểu cơ chế dịch thông dịch và biên dịch.
  • Làm chủ khái niệm giải thuật, các đặc trưng của giải thuật và phương pháp biểu diễn giải thuật bằng ngôn ngữ tự nhiên, mã giả và lưu đồ (flowchart).
  • Nắm bắt cú pháp và ngữ nghĩa của ngôn ngữ C: hệ thống 32 từ khóa, 40 toán tử chuẩn, các chỉ thị tiền xử lý và kiểu dữ liệu chuẩn.
  • Vận dụng các lệnh đơn, cấu trúc điều khiển rẽ nhánh, lựa chọn, vòng lặp để hiện thực hóa giải thuật.
  • Thiết kế chương trình dạng module hóa thông qua hàm và xử lý các kiểu dữ liệu nâng cao gồm mảng, con trỏ, chuỗi ký tự, cấu trúc (struct) và tập tin (file).

Cấu trúc giáo trình được phân tách thành hai phần chính:

  • Phần 1: Giới thiệu cấu trúc dữ liệu và giải thuật – Thiết lập tư duy logic giải quyết bài toán độc lập với ngôn ngữ lập trình.
  • Phần 2: Ngôn ngữ lập trình C – Trình bày toàn diện cú pháp và kỹ thuật lập trình qua 10 chương chuyên đề.

Điểm đặc sắc của giáo trình là phương pháp tiếp cận tuần tự theo quy trình 5 bước: Mô tả bài toán $\rightarrow$ Vẽ sơ đồ xử lý (lưu đồ) $\rightarrow$ Viết ngôn ngữ giả $\rightarrow$ Cài đặt bằng ngôn ngữ C $\rightarrow$ Thực thi và kiểm thử. Giáo trình phân tích sâu cơ chế bộ nhớ vật lý (kích thước byte, bit dấu, biểu diễn hệ cơ số) song song với việc hướng dẫn sử dụng môi trường lập trình Turbo C 3.0.


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 gồm Phần 1 về giải thuật và 10 chương chuyên đề trong Phần 2:

  • Phần 1 – Cấu trúc dữ liệu và giải thuật: Định nghĩa giải thuật là hệ thống quy tắc xác định dãy thao tác trên dữ liệu vào để thu được kết quả sau hữu hạn bước. Xác lập 4 đặc trưng cốt lõi: tính kết thúc, tính xác định, tính phổ dụng, và tính hiệu quả (đo bằng thời gian thực thi và tài nguyên bộ nhớ). Trình bày 3 cấu trúc suy luận nền tảng: Tuần tự (Sequential), Lựa chọn (Selection – dạng điều kiện đơn, rẽ nhánh if-else, lựa chọn trường hợp), và Lặp (Repeating – lặp xác định và lặp không xác định). Minh họa qua các thuật toán cơ bản: hoán đổi giá trị hai bình chất lỏng qua bình thứ ba; tìm ước chung lớn nhất (UCLN); giải phương trình bậc nhất $ax + b = 0$; tính tổng tích lũy $S = \sum_{i=1}^n a_i$; tìm giá trị cực đại ($max$) theo nguyên tắc "thử và sửa"; sắp xếp dãy số tăng dần qua $n-1$ bước so sánh đổi chỗ.
  • Chương 1 – Giới thiệu về ngôn ngữ C & Môi trường Turbo C 3.0: Lược sử hình thành từ ngôn ngữ BCPL (Martin Richards, 1967), ngôn ngữ B (Ken Thompson, 1970 trên PDP-7) đến ngôn ngữ C của Dennis Ritchie (Bell Labs, trên PDP-11) và bản chuẩn hóa năm 1978 của B.W. Kernighan & Dennis Ritchie (chuẩn ANSI C). Phân tích 5 đặc tính của C: tính cô đọng (compact – 32 từ khóa, 40 toán tử), tính cấu trúc (structured), tính tương thích (compatible), tính linh động (flexible), và cơ chế biên dịch (compile/link). Hướng dẫn môi trường Turbo C 3.0 với hệ thống phím chức năng: F1 (trợ giúp tổng quát), Ctrl-F1 (trợ giúp theo ngữ cảnh), F2 (lưu tập tin), F3 (mở tập tin), Ctrl-F9 (thực thi), F10 (kích hoạt thanh menu), các tổ hợp thao tác khối Ctrl-K-B, Ctrl-K-K, Ctrl-K-C, Ctrl-K-V, Ctrl-K-Y, Ctrl-K-W, Ctrl-K-R và tìm kiếm Ctrl-Q-F, Ctrl-Q-A, Ctrl-L.
  • Chương 2 – Các thành phần cơ bản trong C: Quy tắc đặt tên (danh biểu hợp lệ có tối đa 31 ký tự đầu có nghĩa); hằng số nguyên hệ thập phân, bát phân (tiền tố 0), thập lục phân (tiền tố 0x), số nguyên dài (hậu tố L/l); hằng số thực dấu phẩy động và dạng số mũ khoa học (e/E); hằng ký tự ASCII; hằng chuỗi ký tự kết thúc bằng ký tự rỗng \0. Khai báo biến toàn cục (bên ngoài hàm) và biến cục bộ (đầu khối lệnh). Hệ thống toán tử: số học (+, -, *, /, %), toán tử tăng/giảm tiền tố/hậu tố (++x, x++, --x, x--), toán tử quan hệ (>, >=, <, <=, ==, !=), toán tử logic (&&, ||, !), toán tử bitwise (&, |, ^, ~, >>, <<), toán tử điều kiện ba ngôi (? :), toán tử con trỏ (&, *), toán tử dấu phẩy (,) và toán tử gán phức hợp (+=, -=, *=, /=).
  • Chương 3 – Các câu lệnh đơn trong C: Định nghĩa câu lệnh kết thúc bằng dấu chấm phẩy (;), phân biệt lệnh đơn và lệnh có cấu trúc, cấu trúc khối lệnh { }. Cú pháp lệnh gán =, nguyên tắc tương thích kiểu dữ liệu và cơ chế chuyển đổi kiểu tự động/báo lỗi (như lỗi gán char* cho int). Các câu lệnh nhập xuất chuẩn printfscanf.
  • Chương 4 đến Chương 10: Khảo sát các lệnh có cấu trúc (if-else, switch-case, for, while, do-while); cấu trúc chương trình con (hàm, tham số, giá trị trả về); kiểu mảng (1 chiều, nhiều chiều); kiểu con trỏ (địa chỉ bộ nhớ); kiểu chuỗi ký tự; kiểu cấu trúc (struct); và kiểu tập tin (xử lý file I/O).

Progression logic của giáo trình đi từ tư duy giải thuật độc lập $\rightarrow$ cú pháp cơ sở $\rightarrow$ câu lệnh đơn $\rightarrow$ cấu trúc điều khiển $\rightarrow$ hàm $\rightarrow$ cấu trúc dữ liệu dẫn xuất $\rightarrow$ tương tác tập tin lưu trữ.

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

  • Lý thuyết nền tảng (Fundamental theories): Lý thuyết giải thuật tính toán; phân loại ngôn ngữ lập trình (ngôn ngữ máy, hợp ngữ dịch bằng Assembler, ngôn ngữ cấp cao); cơ chế chuyển dịch chương trình nguồn sang chương trình đích thông qua thông dịch (interpreter) hoặc biên dịch (compiler).
  • Nguyên lý cốt lõi (Core principles): Nguyên lý lập trình cấu trúc; nguyên lý tổ chức bộ nhớ dựa trên hệ thống phân loại kiểu dữ liệu chuẩn:
Phân loại Kiểu dữ liệu Kích thước Miền giá trị (Domain)
Số nguyên 1 byte unsigned char
char
1 byte (8 bits)
1 byte (8 bits)
$0 \dots 255$ (256 ký tự ASCII)
$-128 \dots 127$ (dùng bit trái nhất làm bit dấu)
Số nguyên 2 bytes unsigned int
int, short int, enum
2 bytes (16 bits)
2 bytes (16 bits)
$0 \dots 65.535$
$-32.768 \dots 32.767$
Số nguyên 4 bytes unsigned long
long
4 bytes (32 bits)
4 bytes (32 bits)
$0 \dots 4.294.967.295$
$-2.147.483.648 \dots 2.147.483.647$
Số thực float
double
long double
4 bytes
8 bytes
10 bytes
$3.4 \times 10^{-38} \dots 3.4 \times 10^{38}$
$1.7 \times 10^{-308} \dots 1.7 \times 10^{308}$
$3.1 \times 10^{-4932} \dots 3.1 \times 10^{4932}$
Kiểu đặc biệt void 0 byte Kiểu rỗng không chứa giá trị

Nguyên lý phạm vi biến (scope) phân định rõ biến toàn cục và biến cục bộ.

  • Khung quy trình thiết yếu (Essential frameworks): Khung 5 bước chuyển đổi bài toán thực tế thành chương trình thực thi: $$\text{Bài toán} \xrightarrow{\text{Bước 1}} \text{Mô tả thuật toán} \xrightarrow{\text{Bước 2}} \text{Lưu đồ} \xrightarrow{\text{Bước 3}} \text{Mã giả} \xrightarrow{\text{Bước 4}} \text{Mã nguồn C} \xrightarrow{\text{Bước 5}} \text{Thực thi}$$

Kỹ năng phát triển

  • Kỹ năng kỹ thuật (Technical skills): Soạn thảo, biên dịch, liên kết và sửa lỗi cú pháp trên IDE Turbo C 3.0; khai báo biến, biểu diễn chuyển đổi số giữa các hệ cơ số (hệ 10, hệ 2, hệ 8, hệ 16); xử lý biểu thức logic, biểu thức bitwise và thứ tự ưu tiên toán tử; thao tác nhập/xuất dữ liệu có định dạng.
  • Kỹ năng phân tích (Analytical skills): Phân tích bài toán toán học sang mô hình xử lý tính toán; thiết kế lưu đồ thuật toán phân nhánh và vòng lặp; phân tích độ phức tạp về thời gian chạy và dung lượng bộ nhớ.
  • Năng lực thực hành (Practical competencies): Cài đặt thành thạo các thuật toán cơ sở (giải phương trình $ax+b=0$, $ax^2+bx+c=0$, tính tổng dãy số, tìm cực đại, sắp xếp đổi chỗ); kiểm soát tính tương thích kiểu dữ liệu trong biểu thức và lệnh gán.

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

Phương pháp tiếp cận sư phạm (Pedagogical approach)

Giáo trình áp dụng phương pháp quy nạp kết hợp diễn dịch: bắt đầu từ các bài toán toán học quen thuộc, mô tả cách giải quyết thủ công của con người, trừu tượng hóa thành thuật toán dạng văn bản tự nhiên, trực quan hóa bằng lưu đồ hình khối, sau đó chuyển thành mã giả và hoàn thiện bằng cú pháp chuẩn của ngôn ngữ C.

Bài tập và tình huống minh họa (Case studies)

Hệ thống bài học tích hợp chuỗi ví dụ minh họa và tình huống cụ thể:

  1. Ví dụ hoán vị: Bài toán đổi chất lỏng giữa bình A (đựng rượu) và bình B (đựng nước mắm) thông qua bình phụ C để minh họa nguyên lý gán biến trung gian.
  2. Ví dụ tìm UCLN: Thuật toán tìm ước chung lớn nhất của hai số $a, b$ bằng cách so sánh, chọn số nhỏ hơn gán cho UCLN và giảm dần đơn vị trong vòng lặp kiểm tra tính chia hết.
  3. Ví dụ giải phương trình: Xét nghiệm phương trình bậc nhất $ax + b = 0$ và bậc hai $ax^2 + bx + c = 0$ với đầy đủ các nhánh biện luận hệ số $a=0, b=0, b \neq 0$.
  4. Ví dụ tính tổng tích lũy: Khởi tạo $S=0$, duyệt biến đếm $i=1 \dots n$, tích lũy $S = S + a_i$.
  5. Ví dụ tìm cực trị: Tìm phần tử lớn nhất trong dãy $n$ số bằng phương pháp "thử và sửa" ($max = a_1$, so sánh và cập nhật $max = a_i$).
  6. Ví dụ sắp xếp: Sắp xếp dãy số tăng dần qua $n-1$ lần duyệt so sánh từng cặp phần tử $a_i, a_j$ ($j > i$) và hoán đổi vị trí.

Bài tập thực hành (Practical exercises)

Hệ thống bài tập yêu cầu người học:

  • Chuyển đổi các hằng số nguyên 2 bytes ($12, 255, 31000, 32767, -32768$) sang dạng nhị phân, bát phân và thập lục phân.
  • Biển diễn các hằng ký tự 'A', 'a', 'Z', 'z' dưới dạng nhị phân và bát phân qua mã ASCII.
  • Xây dựng giải thuật và vẽ lưu đồ cho bài toán tính tổng bình phương $S = \sum_{i=1}^n a_i^2$ và chuỗi đan dấu: $$S = 1 - a_1^2 + a_2^2 - a_3^2 + \dots + (-1)^n a_n^2$$
  • Soạn thảo và chạy thử chương trình nhập xuất chuỗi ký tự mẫu CHAO.C.

Phương pháp đánh giá (Assessment methods)

  • Đánh giá khả năng xây dựng lưu đồ thuật toán đảm bảo 4 đặc trưng (tính kết thúc, tính xác định, tính phổ dụng, tính hiệu quả).
  • Kiểm tra kiến thức định kiểu, tính toán giá trị biểu thức logic/bitwise theo bảng chân trị và thứ tự ưu tiên toán tử.
  • Đánh giá năng lực lập trình trực tiếp trên máy qua khả năng biên dịch không lỗi, kiểm soát tương thích kiểu và tính đúng đắn của kết quả thực thi.

Hướng dẫn tự học (Self-study guidelines)

  • Thực hiện đầy đủ quy trình 5 bước đối với mọi bài toán trước khi gõ code.
  • Sử dụng phím F1Ctrl-F1 trong môi trường Turbo C 3.0 để tra cứu cú pháp và kiểu dữ liệu trực tiếp theo ngữ cảnh con trỏ.
  • Tuân thủ quy tắc đặt tên tập tin của hệ điều hành DOS (tên tối đa 8 ký tự, phần mở rộng tối đa 3 ký tự, mặc định .CPP/.C).

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

Bối cảnh lịch sử và cập nhật chuẩn hóa

Giáo trình ghi nhận đầy đủ tiến trình lịch sử phát triển của ngôn ngữ C:

  • Năm 1967: Martin Richards phát triển ngôn ngữ BCPL.
  • Năm 1970: Ken Thompson phát triển ngôn ngữ B từ BCPL khi xây dựng hệ điều hành UNIX trên máy DEC PDP-7.
  • Cuối thập niên 1960 – đầu thập niên 1970: Dennis Ritchie phát triển ngôn ngữ C tại Bell Laboratories, cài đặt lần đầu trên UNIX của máy DEC PDP-11.
  • Năm 1978: Dennis Ritchie và Brian W. Kernighan xuất bản tài liệu The C Programming Language, thiết lập nền tảng cho chuẩn ANSI C sau này.

Xu hướng kỹ thuật được tích hợp

  • Chuẩn hóa lập trình cấu trúc: Hướng dẫn phân rã bài toán lớn thành các khối lệnh, cấu trúc rẽ nhánh, vòng lặp và chương trình con (hàm), giảm thiểu cấu trúc tuần tự đơn thuần.
  • Hệ thống hóa toán tử: Bảng tổng hợp chi tiết thứ bậc ưu tiên từ cấp cao nhất ((), [], !, ~, ++, --, con trỏ *, &) đến cấp thấp nhất (toán tử dấu phẩy ,).
  • Tối ưu hóa mã lệnh: Trình bày các toán tử viết tắt phức hợp (+=, -=, *=, /=) và toán tử điều kiện ba ngôi ?: thay thế câu lệnh if-else nhằm thu gọn kích thước mã nguồn và tăng tốc độ xử lý.

Ứng dụng thực tế và liên kết chuyên ngành

Ngôn ngữ C được định vị là ngôn ngữ lập trình hệ thống kết hợp giữa khả năng can thiệp phần cứng (qua con trỏ, toán tử bitwise &, |, ^, ~, >>, <<) và tính trực quan của ngôn ngữ bậc cao. Giáo trình tạo nền tảng trực tiếp cho sinh viên theo học các chuyên ngành Kỹ thuật Viễn thông, Tự động hóa và Công nghệ Phần mềm.


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

Sinh viên và ngành đào tạo

Giáo trình được biên soạn chuyên biệt cho các nhóm đối tượng:

  • Sinh viên năm thứ 2 chuyên ngành Tin học, Toán Tin, Lý Tin.
  • Sinh viên năm thứ 2 chuyên ngành Kỹ thuật Điện tử, Viễn thông, Tự động hóa.

Điều kiện tiên quyết (Prerequisites)

Để tiếp thu hiệu quả nội dung giáo trình, sinh viên cần đáp ứng các điều kiện tiên quyết:

  • Kiến thức toán học đại cương (đại số, giải tích, các dạng phương trình và chuỗi số).
  • Kỹ năng thao tác cơ bản trên máy tính và hệ điều hành (quản lý tập tin, thư mục, sử dụng bàn phím).

Hướng dẫn dành cho giảng viên

  • Sử dụng làm khung bài giảng lý thuyết và giáo trình thực hành trong thời lượng 45 tiết chuẩn.
  • Kết hợp giảng dạy Phần 1 trên lớp lý thuyết để rèn luyện tư duy giải thuật; sử dụng Phần 2 cho các buổi hướng dẫn cú pháp và tổ chức thực hành trên phòng máy với Turbo C 3.0.

Mục đích tự học và tra cứu

  • Phù hợp cho người mới bắt đầu học lập trình cần nắm bắt bản chất của máy tính, cơ chế cấp phát bộ nhớ và tư duy thuật toán chặt chẽ.
  • Tài liệu tra cứu bảng mã ASCII, bảng chân trị bitwise, miền giá trị kiểu dữ liệu và bảng thứ bậc ưu tiên toán tử trong 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 đại học năm thứ 2 thuộc các khối ngành Tin học, Toán Tin, Lý Tin, Điện tử, Viễn thông, Tự động hóa và những người tự học lập trình muốn xây dựng nền tảng từ ngôn ngữ C.

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

Người học cần có kiến thức toán học cơ bản và kỹ năng sử dụng máy tính căn bản. Giáo trình không yêu cầu kiến thức lập trình trước đó vì toàn bộ khái niệm giải thuật và cú pháp được giảng dạy từ đầu.

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

Giáo trình dành toàn bộ Phần 1 để đào tạo tư duy giải thuật độc lập thông qua ngôn ngữ tự nhiên, mã giả và lưu đồ trước khi bước vào học cú pháp C. Đồng thời, giáo trình phân tích cặn kẽ bản chất vật lý của kiểu dữ liệu (kích thước byte, bit dấu, miền giá trị, chuyển đổi hệ cơ số 2, 8, 16).

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

Người học nên tuân thủ quy trình: phân tích bài toán $\rightarrow$ vẽ lưu đồ giải thuật $\rightarrow$ viết mã giả $\rightarrow$ cài đặt trên Turbo C 3.0 $\rightarrow$ thực thi và kiểm thử. Đồng thời, cần chủ động tra cứu thông tin cú pháp bằng phím Ctrl-F1 và làm đầy đủ các bài tập chuyển đổi cơ số, vẽ lưu đồ cuối chương.

5. Giáo trình sử dụng danh mục tài liệu tham khảo nào?

Giáo trình trích dẫn 5 tài liệu tham khảo chính thống:

  1. Nguyễn Văn Linh, Giáo trình Tin Học Đại Cương A, Khoa Công Nghệ Thông Tin, Đại học Cần Thơ, 1991.
  2. Nguyễn Đình Tê, Hoàng Đức Hải, Giáo trình lý thuyết và bài tập ngôn ngữ C, Nhà xuất bản Giáo dục, 1999.
  3. Nguyễn Cẩn, C – Tham khảo toàn diện, Nhà xuất bản Đồng Nai, 1996.
  4. Võ Văn Viện, Giúp tự học Lập Trình với ngôn ngữ C, Nhà xuất bản Đồng Nai, 2002.
  5. B.W. Kernighan & Dennis Ritchie, The C Programming Language, Prentice Hall Publisher, 1988.

Kết luận

Giáo trình Lập trình Căn bản cung cấp khung kiến thức hoàn chỉnh về cấu trúc dữ liệu, giải thuật và kỹ thuật lập trình C chuẩn trong khuôn khổ 45 tiết giảng dạy đại học.

Lộ trình học tập đề xuất:

  1. Giai đoạn 1: Nắm vững lý thuyết giải thuật, 4 đặc trưng, 3 cấu trúc suy luận và kỹ năng vẽ lưu đồ.
  2. Giai đoạn 2: Làm chủ môi trường Turbo C 3.0, bảng kiểu dữ liệu chuẩn, hệ thống 40 toán tử và các câu lệnh đơn.
  3. Giai đoạn 3: Hiện thực hóa các cấu trúc rẽ nhánh, lựa chọn, vòng lặp và module hóa chương trình bằng hàm.
  4. Giai đoạn 4: Nâng cao kỹ năng quản lý bộ nhớ và dữ liệu phức hợp với mảng, con trỏ, chuỗi, kiểu cấu trúc (struct) và thao tác tập tin.

Người học có thể mở rộng kiến thức thông qua danh mục 5 tài liệu tham khảo kinh điển được nêu trong giáo trình để hoàn thiện kỹ năng lập trình hệ thống và ứng dụng.