THÔNG TIN THƯ MỤC VÀ MÔ TẢ HỌC THUẬT GIÁO TRÌNH TIN HỌC CƠ SỞ II – NGÔN NGỮ C


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

Giáo trình Tin học cơ sở II – Ngôn ngữ C (tên văn bản: Giáo trình tin học cơ sở – Phần lập trình trên ngôn ngữ C) là tài liệu học tập chính thức do tác giả Vũ Bá Duy biên soạn vào tháng 1 năm 2003, đại diện nhóm tác giả là Đào Kiến Quốc, phát hành nội bộ qua thư viện điện tử của Khoa Công nghệ – Đại học Quốc gia Hà Nội (địa chỉ liên hệ đóng góp chuyên môn: dkquoc@vnu.vn).

Về vị trí trong chương trình đào tạo, tài liệu đảm nhiệm khối kiến thức cơ sở ngành công nghệ thông tin và kỹ thuật máy tính, đóng vai trò cầu nối giữa phần nhập môn tin học đại cương (Tin học cơ sở I) với các học phần lập trình nâng cao và lập trình hướng đối tượng (OOP) sau này, cụ thể là ngôn ngữ C++.

Mục tiêu học tập (learning outcomes) của giáo trình bao gồm:

  1. Nắm vững cú pháp chuẩn ANSI C (ANSI standard C năm 1983), bộ từ khóa và bảng ký tự mã hóa ASCII.
  2. Hiểu rõ cơ chế biểu diễn dữ liệu nhị phân, phân định ranh giới bộ nhớ của các kiểu dữ liệu nguyên, thực, con trỏ và mảng.
  3. Làm chủ kỹ thuật xây dựng thuật toán thông qua các cấu trúc điều khiển tuần tự, rẽ nhánh (if, switch) và vòng lặp (while, do...while, for).
  4. Tiếp cận phương pháp lập trình có cấu trúc (structured programming), phân rã hệ thống thành các hàm (functions) độc lập, có khả năng tái sử dụng mã nguồn.

Giáo trình được tiếp cận theo phương pháp kỹ thuật hệ thống: gắn liền cú pháp ngôn ngữ với quy chế hoạt động của trình biên dịch (compiler), trình liên kết (linker) và kiến trúc bộ nhớ máy tính. Điểm đặc thù của tài liệu là phân tích sâu các thao tác cấp thấp như xử lý bitwise, quản lý địa chỉ trực tiếp qua con trỏ và cơ chế phân định luồng nhập/xuất đệm.


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

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

Cấu trúc giáo trình bao gồm 6 phần nội dung chính và danh mục tài liệu tham khảo:

[Chương I: Bảng chữ cái, tên, từ khóa & Các bước lập trình]
[Chương II: Biến, hằng, kiểu dữ liệu & Biểu thức, phép toán]
[Chương III: Cấu trúc chương trình C & Nhập/xuất dữ liệu]
[Chương IV: Các cấu trúc điều khiển chương trình]
[Chương V: Mảng và con trỏ]
[Chương VI: Các vấn đề cơ bản về hàm]
  1. Phần I – Bảng chữ cái, tên và từ khoá; Các bước lập trình giải bài toán: Trình bày lịch sử phát triển của ngôn ngữ C do Dennis Ritchie thiết kế năm 1972 tại phòng thí nghiệm Bell Telephone (phát triển từ ngôn ngữ B của Ken Thompson) nhằm xây dựng hệ điều hành UNIX; sự ra đời của chuẩn ANSI C năm 1983. Phân tích chu trình phát triển phần mềm gồm 4 giai đoạn: Soạn thảo mã nguồn (.C), Biên dịch sang mã đối tượng (.OBJ), Liên kết tạo tệp thực thi đích (.EXE), Chạy và kiểm thử.
  2. Phần II – Biến, hằng và các kiểu dữ liệu trong C; Biểu thức và các phép toán: Định nghĩa biến, hằng số (const), định dạng cơ số (hệ thập phân, thập lục phân 0x, bát phân 0). Hệ thống kiểu dữ liệu nguyên và thực. Khái niệm kiểu con trỏ và kiểu void. Hệ thống toán tử 15 cấp độ ưu tiên: số học, quan hệ, logic, thao tác bit (&, |, ~, ^, <<, >>), tích lũy, điều kiện (?:), tăng/giảm (++, --), địa chỉ (&) và truy xuất ô nhớ (*).
  3. Phần III – Chương trình C; Cấu trúc chương trình; Câu lệnh và dòng chú thích; Nhập và xuất dữ liệu: Khung cấu trúc tổng quát 10 dòng của tệp mã nguồn C (chỉ thị tiền xử lý #include, khai báo nguyên mẫu hàm, định nghĩa kiểu typedef, định nghĩa macro #define, biến/hằng toàn cục, hàm main(), định nghĩa hàm người dùng). Kỹ thuật xuất nhập dữ liệu qua các hàm getch(), getche(), scanf(), gets(), printf(), putch(), puts().
  4. Phần IV – Các cấu trúc điều khiển chương trình: Cấu trúc tuần tự, rẽ nhánh (if, if...else), lựa chọn đa trường hợp (switch...case...default), các cấu trúc lặp điều kiện trước (while), lặp điều kiện sau (do...while), lặp đếm (for), và các lệnh ngắt luồng (break, continue).
  5. Phần V – Mảng và con trỏ (trang 63–79): Định nghĩa mảng một chiều, mảng nhiều chiều, bản chất tương đương giữa tên mảng và con trỏ cố định, các phép toán số học trên con trỏ.
  6. Phần VI – Các vấn đề cơ bản về hàm (trang 79–90): Khai báo nguyên mẫu hàm (prototype), cú pháp định nghĩa hàm, cơ chế truyền tham số theo giá trị (call by value) và truyền địa chỉ tham chiếu (call by reference).
  7. Tài liệu tham khảo (trang 95): Hệ thống hóa các nguồn tham khảo chuyên sâu, bao gồm tài liệu chuyên đề về cấu trúc dữ liệu và biểu diễn dấu phẩy động [3 - Chương 14].

Logic phát triển của tài liệu đi từ các phần tử từ vựng sơ cấp đến các cấu trúc dữ liệu phức hợp và trừu tượng hóa mô-đun hàm, bảo đảm tính liên tục về mặt thuật toán.

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

  • Hệ thống ký tự và định danh: Sử dụng bảng mã ASCII gồm 256 ký tự (128 ký tự chuẩn từ 0–127 và 128 ký tự mở rộng từ 128–255). Quy tắc định danh tên biến/hằng/hàm: chiều dài tối đa 32 ký tự, bắt đầu bằng chữ cái hoặc dấu gạch dưới _, phân biệt chữ hoa và chữ thường, loại trừ tập hợp 32 từ khóa chuẩn:
    asm       enum      signed    auto      extern    sizeof
    break     float     static    case      for       struct
    char      goto      switch    const     if        typedef
    continue  int       union     default   long      unsigned
    do        register  void      double    return    volatile
    else      short     while
    
  • Kiến trúc dữ liệu bộ nhớ:
    • Nhóm số nguyên: char (1 byte, miền giá trị -128 đến 127), unsigned char (1 byte, 0 đến 255), int (2 byte, -32768 đến 32767), unsigned int (2 byte, 0 đến 65535), short (2 byte), unsigned short (2 byte), long (4 byte, -2.147.483.648 đến 2.147.438.647), unsigned long (4 byte, 0 đến 4.294.967.295). Quy định quan hệ kích thước hệ thống: $\text{sizeof(char)} = 1 \le \text{sizeof(short)} \le \text{sizeof(int)} \le \text{sizeof(long)}$.
    • Nhóm số thực: float (4 byte, độ chính xác 7–8 chữ số, giới hạn $3.4 \times 10^{38}$), double (8 byte, độ chính xác 15 chữ số, giới hạn $1.7 \times 10^{308}$), long double (10 byte, độ chính xác 18–19 chữ số, giới hạn $3.1 \times 10^{4932}$) theo mô hình định trị và phần mũ.
    • Kiểu con trỏ và địa chỉ: Cú pháp <kiểu> * <tên_con_trỏ>, lưu trữ địa chỉ ô nhớ dạng Segment:Offset hoặc Offset, truy xuất gián tiếp qua toán tử giải tham chiếu *.
  • Cơ chế chuyển kiểu (Type Casting): Chuyển kiểu tự động theo thứ tự mở rộng miền giá trị: $$\text{char} \longrightarrow \text{int} \longrightarrow \text{long} \longrightarrow \text{float} \longrightarrow \text{double}$$ và ép kiểu tường minh theo cú pháp (kiểu_mới)(biểu_thức).

Kỹ năng phát triển

  • Kỹ năng lập trình thuật toán: Xây dựng giải thuật giải phương trình bậc hai ($ax^2 + bx + c = 0$), thuật toán trừ liên tiếp tìm ước số chung lớn nhất (thuật toán Euclid), kiểm tra bất đẳng thức tam giác kết hợp tính chu vi và diện tích theo công thức Heron.
  • Kỹ năng thao tác nhị phân cấp thấp: Vận dụng các toán tử bitwise để xử lý trực tiếp các bit nhị phân trong bộ nhớ: phép hội bit &, phép tuyển bit |, phép đảo bit ~, phép tuyển loại trừ ^ (XOR), phép dịch trái << (tương đương nhân với $2^k$) và phép dịch phải >> (tương đương chia nguyên cho $2^k$).
  • Kỹ năng kiểm soát luồng nhập/xuất chuẩn: Định dạng chuỗi đặc tả format trong scanf và printf bằng các ký tự định kiểu (%d, %f, %c, %s, %x, %o, %p), quy định độ rộng hiển thị [n], số chữ số thập phân [.m] và căn lề trái [-].

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

Giáo trình áp dụng mô hình sư phạm diễn dịch: mỗi chủ đề bắt đầu bằng việc công bố quy chuẩn cú pháp, phân tích cơ chế cấp phát bộ nhớ của trình biên dịch, sau đó minh họa bằng các đoạn mã nguồn hoàn chỉnh có đánh số dòng để giải thích luồng thực thi.

Hệ thống bài tập và nghiên cứu tình huống (Case Studies)

Tài liệu thiết kế các ví dụ lập trình cụ thể nhằm giải quyết các bài toán kỹ thuật:

  • Xử lý điều kiện biên hình học: Chương trình tính diện tích tam giác sử dụng hàm sqrt() từ thư viện <math.h>, yêu cầu kiểm tra tính hợp lệ của dữ liệu đầu vào qua biểu thức quan hệ phức hợp: (a+b>c) && (a+c>b) && (b+c>a).
  • Phân nhánh thuật toán đại số: Chương trình giải phương trình bậc hai xử lý phân biệt 3 nhánh giá trị của $\Delta = b^2 - 4ac$ ($\Delta = 0$: nghiệm kép; $\Delta > 0$: 2 nghiệm phân biệt; $\Delta < 0$: vô nghiệm thực).
  • Vòng lặp không xác định số lần: Thuật toán Euclid tìm ước chung lớn nhất (UCLN) bằng vòng lặp while (a != b) kết hợp xử lý các trường hợp suy biến khi $a=0$ hoặc $b=0$.
  • Xử lý tín hiệu bàn phím thời gian thực: Đọc ký tự qua hàm getch() lặp liên tục cho đến khi nhận mã phím ESC (mã ASCII 27); xử lý bộ đệm 2 byte cho các phím chức năng mở rộng (như phím mũi tên lên $\uparrow$ trả về chuỗi 2 byte gồm mã 0 và mã mở rộng 72).

Đánh giá và hướng dẫn tự học

  • Phương pháp thực hành: Sinh viên bắt buộc phải tự nhập mã nguồn, dịch lỗi thông qua môi trường Borland C (BC) hoặc Turbo C (TC), liên kết với các tệp tiêu đề hệ thống (<stdio.h>, <math.h>) và kiểm tra tính đúng đắn với các bộ dữ liệu mẫu (test cases).
  • Tự học và gỡ lỗi: Chú trọng phân tích sự khác biệt giữa toán tử tiền tố ++a/--a và hậu tố a++/a--, cơ chế rơi qua (fall-through) trong cấu trúc switch khi thiếu lệnh break, và nguyên tắc kiểm tra điều kiện lặp trước của cấu trúc while.

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

  • Tính chuẩn hóa theo ANSI C: So với ngôn ngữ C nguyên bản năm 1972 của Dennis Ritchie vốn chỉ phục vụ phát triển hệ điều hành UNIX và không tối ưu cho người dùng thông thường, giáo trình được chuẩn hóa hoàn toàn theo tiêu chuẩn ANSI C năm 1983, đảm bảo tính khả chuyển (portability) của mã nguồn giữa các nền tảng phần cứng khác nhau.
  • Phân biệt kỹ thuật giữa C và C++:
    • Trong chuẩn C thuần túy, tất cả các câu lệnh khai báo biến, hằng trong một khối lệnh bắt buộc phải đặt tại các dòng đầu tiên của khối lệnh đó (trước mọi câu lệnh thực thi). Giáo trình chỉ rõ điểm khác biệt này so với C++, nơi biến có thể được khai báo tại bất kỳ vị trí nào trước khi sử dụng.
    • Ngôn ngữ C không có kiểu dữ liệu boolean độc lập (như trong Pascal hay C++). Giá trị logic được quy ước hoàn toàn qua số nguyên: giá trị 0 hoặc con trỏ NULL đại diện cho trạng thái Sai (False); giá trị khác 0 hoặc con trỏ khác NULL đại diện cho trạng thái Đúng (True).
  • Tích hợp môi trường phát triển: Hướng dẫn tích hợp quy trình phát triển trong các trình biên dịch Borland C (BC), Turbo C, Microsoft C trên nền hệ điều hành MS-DOS và Windows, liên kết các thư viện tĩnh qua cấu hình thư mục Option/Directories.

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

  • Sinh viên đại học: Phục vụ trực tiếp sinh viên năm thứ nhất và năm thứ hai thuộc các ngành Công nghệ thông tin, Khoa học máy tính, Kỹ thuật điện tử – Viễn thông và các ngành kỹ thuật liên quan tại Đại học Quốc gia Hà Nội.
  • Điều kiện tiên quyết (Prerequisites): Người học cần nắm vững kiến thức toán học đại cương, biểu diễn thông tin nhị phân và các khái niệm cơ bản về thuật toán trong học phần Tin học cơ sở I.
  • Giảng viên: Sử dụng làm đề cương chuẩn cho bài giảng lý thuyết trên lớp và hệ thống bài tập thực hành trong phòng máy.
  • Tham khảo tự học: Dành cho người tự học lập trình muốn hiểu rõ nguyên lý hoạt động của máy tính ở mức mã máy, quản lý bộ nhớ RAM và cơ chế biên dịch.

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 thiết kế cho sinh viên đại học khối kỹ thuật và người bắt đầu học lập trình có cấu trúc, cần hiểu rõ bản chất ngôn ngữ C ở cấp độ bộ nhớ và hệ thống.

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

Người học cần có kiến thức cơ bản về hệ đếm (nhị phân, bát phân, thập lục phân), logic toán học sơ cấp và tư duy phân tích bài toán thuật toán từ môn Tin học cơ sở I.

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

Giáo trình mô tả trực tiếp mối quan hệ giữa câu lệnh C và cách phân bổ ô nhớ của máy tính (kích thước byte, biểu diễn số bù hai, bảng chân lý bitwise, cơ chế ngăn xếp và con trỏ), không chỉ dừng lại ở cú pháp bề mặt.

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

Người học cần trực tiếp viết và biên dịch các đoạn mã mẫu trong giáo trình trên môi trường Borland C hoặc Turbo C, tự kiểm nghiệm các trường hợp dữ liệu biên và đối chiếu sự thay đổi của biến qua từng bước lặp.

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

Giáo trình kết nối trực tiếp với hệ thống tệp tiêu đề chuẩn của C (stdio.h, math.h), các tài liệu tham khảo chuyên đề về biểu diễn số thực [3 - Chương 14] và hệ thống thư viện điện tử của Khoa Công nghệ – ĐHQGHN.


Kết luận

Giáo trình Tin học cơ sở II – Ngôn ngữ C cung cấp nền tảng lý thuyết chuẩn mực về ngôn ngữ lập trình C theo chuẩn ANSI C 1983. Giá trị cốt lõi của văn bản nằm ở phương pháp tiếp cận trực diện vào cơ chế cấp phát bộ nhớ, biểu diễn bitwise và tư duy mô-đun hóa chương trình.

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

  1. Nắm vững từ khóa, kiểu dữ liệu và biểu thức (Phần I, II).
  2. Xây dựng cấu trúc chương trình và thành thạo nhập/xuất dữ liệu (Phần III).
  3. Làm chủ các cấu trúc điều khiển thuật toán (Phần IV).
  4. Nghiên cứu cấu trúc dữ liệu nâng cao gồm mảng, con trỏ và hàm (Phần V, VI).

Tài nguyên mở rộng bao gồm hệ thống bài tập thực hành trên trình biên dịch Borland C/Turbo C và các chuyên đề tham khảo về cấu trúc dữ liệu máy tính.