Giáo Trình Kỹ Thuật Lập Trình C: Quản Lý Màn Hình, Đồ Họa, Xử Lý Tệp Và Kiến Trúc Bộ Nhớ

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

Giáo trình Kỹ thuật lập trình C là tài liệu học thuật được biên soạn phục vụ học phần Kỹ thuật lập trình và Cấu trúc dữ liệu trong chương trình đào tạo trình độ đại học các ngành Khoa học Máy tính, Kỹ thuật Phần mềm, Kỹ thuật Máy tính và Điện tử Viễn thông. Học phần giữ vị trí nền tảng, làm cầu nối giữa kiến thức lập trình cơ sở và các môn học chuyên sâu về kiến trúc máy tính, hệ điều hành, lập trình nhúng và xử lý đồ họa máy tính.

Mục tiêu học tập của giáo trình tập trung vào việc trang bị cho người học:

  • Khả năng làm chủ cơ chế quản lý giao diện hiển thị văn bản đa cửa sổ thông qua thư viện conio.h.
  • Kỹ thuật lập trình đồ họa tương tác cấp thấp, điều khiển điểm ảnh (pixel), vẽ hình học cơ bản, hoạt ảnh và kết xuất dữ liệu đồ họa thông qua thư viện graphics.h.
  • Nguyên lý tổ chức, truy xuất luồng tập tin nhị phân và văn bản ở mức hệ thống (I/O cấp 1) và mức luồng đệm (I/O cấp 2 thuộc stdio.h).
  • Hiểu biết về kiến trúc phân đoạn bộ nhớ của vi xử lý 8086/x86 (các thanh ghi CS, DS, SS, ES), 6 mô hình bộ nhớ (Memory Models), kỹ thuật thao tác con trỏ gần/xa (near/far), cùng kỹ thuật xây dựng hàm nhận đối số bất định bằng con trỏ vô kiểu (void*).

Cấu trúc giáo trình tiếp cận theo hướng kỹ thuật hệ thống kết hợp thực nghiệm mã nguồn. Các khái niệm lý thuyết về bộ nhớ, thanh ghi và định dạng tệp tin luôn đi kèm giải thích nguyên lý hoạt động của hàm thư viện và các chương trình mẫu bằng ngôn ngữ C trong môi trường Turbo C/DOS. Điểm đặc thù của tài liệu là phân tích sâu sự khác biệt trong cơ chế thực thi của các hàm cùng chức năng (như printf/cprintf, scanf/cscanf, các chế độ ghi tệp văn bản và nhị phân), giúp người học nhận diện tường tận các tác động ở mức hệ thống phần cứng và hệ điều hành.


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

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

1. Quản lý màn hình văn bản và cửa sổ (Thư viện conio.h)

Chương này cung cấp hệ thống hàm định dạng giao diện văn bản:

  • Chọn mốt hiển thị bằng hàm textmode(int mode) với các hằng LASTMODE (-1), BW40 (0 - đen trắng 40 cột), C40 (1 - 16 màu 40 cột), BW80 (2 - đen trắng 80 cột), C80 (3 - 16 màu 80 cột), MONO (7 - đơn sắc 80 cột). Màn hình chuẩn được cố định 25 hàng với hệ tọa độ gốc (1,1) ở góc trên bên trái.
  • Thiết lập bảng màu qua hàm textbackground(int color) và textcolor(int color). Quy định 16 mã màu từ BLACK (0) đến WHITE (15); hỗ trợ tạo chữ nhấp nháy bằng cách cộng thêm giá trị 128 vào tham số màu.
  • Xây dựng phân vùng hiển thị bằng hàm window(xt, yt, xd, yd), làm sạch vùng cửa sổ qua clrscr(), dịch chuyển con trỏ bằng gotoxy(x, y), xóa ký tự đến cuối dòng bằng clreol(), xóa dòng bằng delline(), trích xuất tọa độ hiện hành qua wherex(), wherey().
  • Thu thập tham số hiển thị bằng gettextinfo(struct text_info *r) với cấu trúc text_info lưu trữ tọa độ biên (winleft, wintop, winright, winbottom), thuộc tính màu (attribute, normattr), mốt màn hình (currmode), kích thước (screenwidth, screenheight) và tọa độ con trỏ (curx, cury).
  • So sánh cơ chế hiển thị: Hàm chuẩn printf/scanf áp dụng trên phạm vi toàn màn hình; trong khi cprintf/cscanf chịu sự giới hạn của cửa sổ hiện hành (window) và tuân thủ định dạng màu do textcolor thiết lập.

2. Lập trình đồ họa máy tính (Thư viện graphics.h)

Nội dung chương tập trung vào kỹ thuật thao tác đồ họa mức điểm ảnh (pixel):

  • Cơ chế khởi tạo hệ thống đồ họa qua initgraph(int *graphdriver, int *graphmode, char *driverpath) kết hợp hằng nhận dạng tự động DETECT (0); nạp các tệp điều khiển đồ họa BGI (CGA.BGI, EGAVGA.BGI, HERC.BGI, IBM8514.BGI, PC3270.BGI, SVGA256.BGI) và phông chữ vector dạng .CHR (TRIP.CHR, GOTH.CHR).
  • Kiểm tra lỗi đồ họa thông qua graphresult() và chuỗi thông báo lỗi grapherrormsg(), xử lý các mã lỗi hệ thống (grOk, grNoInitGraph, grFileNotFound, grInvalidDriver, grNoLoadMem).
  • Nhóm hàm dựng hình cơ bản: đoạn thẳng (line, lineto, linerel, moveto), đường tròn và cung elip (circle, arc, ellipse, pieslice), đa giác và đường gấp khúc (drawpoly, fillpoly), hình khối (rectangle, bar, khối hộp chữ nhật ba chiều bar3d với tham số độ sâu depth và nắp top).
  • Thuộc tính đồ họa: Xác định kiểu và bề dày nét vẽ bằng setlinestyle dựa trên cấu trúc linesettingstype; thiết lập mẫu tô và màu tô qua setfillstyle; thay đổi bảng màu qua setpalette và struct palettetype; quản lý chế độ ghi điểm ảnh qua setwritemode (COPY_PUT = 0, XOR_PUT = 1).
  • Quản lý khung nhìn đồ họa (viewport): Thiết lập vùng cắt bằng setviewport, chuyển đổi hệ tọa độ âm dương để biểu diễn hàm số toán học (như hàm $y = \sin(x)$), xóa khung nhìn bằng clearviewport, xóa toàn màn hình bằng cleardevice.
  • Xử lý văn bản đồ họa: Xuất chuỗi ký tự bằng outtext, outtextxy; định kiểu phông chữ và chiều hiển thị (ngang HORIZ_DIR, dọc VERT_DIR) qua settextstyle; căn lề qua settextjustify; tính toán kích thước chuỗi bằng textheight và textwidth.
  • Tạo hoạt ảnh và in đồ họa: Đo dung lượng bộ nhớ khung chữ nhật qua imagesize, cấp phát bộ nhớ động bằng malloc, trích xuất điểm ảnh qua getimage và tái tạo qua putimage với các toán tử logic (COPY_PUT, XOR_PUT, OR_PUT, AND_PUT, NOT_PUT); kỹ thuật quét bit qua putpixel/getpixel phục vụ in ảnh ra các dòng máy in kim LQ1070, LQ1170, FX1050.

3. Thao tác trên tệp tin (Thư viện stdio.h)

Chương này phân loại và trình bày hai hệ thống xử lý tệp:

  • Phân biệt I/O cấp 1 (hệ thống) sử dụng số hiệu tệp (handle), thao tác đọc/ghi theo mảng byte nhị phân trực tiếp không qua vùng đệm riêng biệt cho từng kiểu dữ liệu.
  • Phân biệt I/O cấp 2 (luồng đệm) quản lý thông qua biến con trỏ cấu trúc FILE* (chứa các trường level, bsize, flags), hỗ trợ vùng đệm mặc định 512 byte giúp tối ưu số lần truy xuất đĩa cứng.
  • Bản chất tệp văn bản so với tệp nhị phân trên hệ điều hành DOS:
    • Tệp văn bản: Khi ghi, ký tự chuyển dòng LF (mã 10) được tự động đổi thành cặp mã CR/LF (13 và 10); khi đọc, cặp mã 13 và 10 được chuyển thành mã 10. Ký tự kết thúc tệp được biểu diễn bằng mã ASCII 26 (Ctrl+Z) hoặc mã EOF (-1).
    • Tệp nhị phân: Bảo toàn chính xác từng byte dữ liệu giữa bộ nhớ RAM và đĩa cứng; hàm feof() chỉ trả về giá trị khác không khi đầu đọc vượt qua byte dữ liệu cuối cùng của tệp.
  • Hệ thống hàm tệp cấp 2:
    • Hàm chung: fopen (các chế độ "r", "w", "a", "rb", "wb", "ab", "r+", "w+", "a+"), fclose, fcloseall, fflush, fflushall, feof, ferror, perror, unlink, remove, rewind, fseek, ftell.
    • Nhập xuất ký tự: putc, fputc, getc, fgetc.
    • Nhập xuất văn bản có định dạng: fprintf, fscanf, fputs, fgets.
    • Nhập xuất khối dữ liệu nhị phân: putw, getw, fwrite, fread.
    • Tương tác với các luồng thiết bị chuẩn: stdin (bàn phím), stdout (màn hình), stderr (luồng lỗi).

4. Kỹ thuật biên dịch dự án và công cụ gỡ lỗi (Turbo C Debugger & TCC)

Chương trình đào tạo mở rộng sang các công cụ phát triển phần mềm:

  • Quản lý dự án đa tệp bằng tệp mô tả dự án .PRJ trong môi trường IDE Turbo C, biên dịch độc lập các mô-đun .C thành .OBJ và liên kết thành .EXE qua phím chức năng F9.
  • Biên dịch dòng lệnh thông qua trình biên dịch tcc:
    • Cú pháp: tcc [tuỳ chọn] ten_tep.
    • Các tham số cấu hình: -I (chỉ định thư mục tệp tiêu đề .h), -L (thư mục thư viện .lib), -e (đặt tên tệp thực thi .exe), -c (chỉ biên dịch tạo .obj), -C (cho phép chú thích lồng nhau), -K (mặc định kiểu char là unsigned char), -A (tuân thủ chuẩn ANSI, bỏ qua các từ khóa mở rộng như near, far, cdecl, pascal, interrupt).
  • Công cụ gỡ lỗi Turbo C Debugger:
    • Sửa lỗi cú pháp thông qua cửa sổ Message và định vị dòng lệnh lỗi trong cửa sổ Edit.
    • Chạy từng bước: Phím F7 (Trace Into - đi sâu vào định nghĩa hàm) và phím F8 (Step Over - thực thi toàn bộ hàm mà không nhảy vào bên trong).
    • Giám sát biến qua cửa sổ Watch (Ctrl+F7, F5, F6, thêm/xóa/sửa biến theo dõi).
    • Đặt điểm dừng (Breakpoint qua Ctrl+F8 hoặc menu Break/watch) và thực thi đến vị trí con trỏ (F4 - Go to Cursor).
    • Theo dõi vết thực thi hàm qua Call stack (Ctrl+F3), tìm kiếm hàm nhanh bằng Find Function.
    • Tính toán biểu thức và hiệu chỉnh giá trị biến động trong lúc chạy qua cửa sổ Evaluation (Ctrl+F4).

5. Kiến trúc bộ nhớ vi xử lý 8086 và các hàm nâng cao

Phần phụ lục chuyên sâu phân tích cấu trúc tổ chức bộ nhớ của chương trình:

  • Bản đồ bộ nhớ chương trình trên kiến trúc phân đoạn:
    • Đoạn mã (Code Segment) do thanh ghi CS trỏ tới.
    • Đoạn dữ liệu (Data Segment - biến tĩnh và toàn cục) do thanh ghi DS trỏ tới.
    • Đoạn ngăn xếp (Stack Segment - biến cục bộ) do thanh ghi SS trỏ tới.
    • Đoạn mở rộng (Extra Segment) do thanh ghi ES quản lý vùng nhớ cấp phát động.
  • Phân loại con trỏ: Con trỏ gần (near - 2 byte, chỉ lưu độ lệch offset 16-bit trong đoạn hiện thời) và con trỏ xa (far - 4 byte, lưu cả địa chỉ đoạn segment và offset).
  • 6 mô hình bộ nhớ (Memory Models): Tiny (Mã + Dữ liệu + Ngăn xếp $\le$ 64KB, tạo tệp .COM), Small (Mã 64KB, Dữ liệu 64KB), Medium (Mã 1MB - con trỏ xa, Dữ liệu 64KB - con trỏ gần), Compact (Mã 64KB - con trỏ gần, Dữ liệu 1MB - con trỏ xa), Large (Mã 1MB, Dữ liệu 1MB, con trỏ mã và dữ liệu đều là far), Huge (Mã 1MB, Dữ liệu 1MB, cho phép mảng dữ liệu vượt kích thước 64KB).
  • Điều khiển kích thước ngăn xếp và heap thông qua hai biến hệ thống _stklen và _heaplen trong dos.h.
  • Xây dựng hàm nhận đối số bất định: Khai báo bằng dấu ba chấm ..., sử dụng con trỏ không định kiểu void*, cấp phát bộ nhớ động qua malloc, các phép toán tăng con trỏ và ép kiểu để trích xuất các phần tử thuộc nhiều kiểu dữ liệu khác nhau trong danh sách tham số.

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

  • Cơ chế quản lý tài nguyên phần cứng trực tiếp (màn hình hiển thị, bộ điều khiển đồ họa, cổng giao tiếp, máy in).
  • Nguyên lý tổ chức luồng dữ liệu tệp tin và cơ chế đệm trong bộ nhớ RAM.
  • Kiến trúc phân đoạn bộ nhớ (Segmented Architecture) và mô hình tổ chức không gian địa chỉ 16-bit của họ vi điều khiển/vi xử lý x86.
  • Giải thuật đồ họa quét dòng, tô màu biên (floodfill), vẽ đa giác và các phép toán logic nhị phân trên bộ đệm khung (Frame Buffer).

Kỹ năng phát triển

  • Kỹ năng kỹ thuật: Lập trình giao diện văn bản đa nhiệm dạng cửa sổ, thiết kế ứng dụng đồ họa 2D, lập trình tương tác tệp dữ liệu có cấu trúc.
  • Kỹ năng phân tích: Phân tích và lựa chọn mô hình bộ nhớ phù hợp theo quy mô ứng dụng; phân biệt cấu trúc luồng tệp tin văn bản và nhị phân.
  • Kỹ năng thực hành: Sử dụng công cụ gỡ lỗi (Debugger), đặt điểm dừng, dò vết ngăn xếp, biên dịch đa mô-đun qua dòng lệnh tcc và tệp cấu hình .PRJ.

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

Giáo trình áp dụng phương pháp tiếp cận sư phạm kỹ thuật: đi từ phân tích bản chất hệ thống (cấu trúc thanh ghi, bản đồ bộ nhớ, bảng mã ASCII và cấu trúc tệp tin), diễn giải cú pháp và tham số hàm, sau đó minh họa trực tiếp bằng các chương trình hoàn chỉnh.

Hệ thống bài tập và chương trình mẫu trong giáo trình mang tính ứng dụng kỹ thuật cao:

  • Xây dựng phần mềm quản lý hồ sơ cán bộ: Chia màn hình thành 4 cửa sổ màu riêng biệt (RED, MAGENTA, BROWN) để nhập họ tên, tuổi, hệ số lương vào mảng cấu trúc, sau đó khôi phục mốt văn bản gốc và in báo cáo.
  • Mô phỏng đồng hồ kim hệ thống: Lấy thời gian thực từ cấu trúc struct time qua hàm gettime(&t), tính toán tọa độ góc bằng hàm lượng giác (sin, cos trong math.h), vẽ và xóa chuyển động của 3 kim giờ, phút, giây độc lập bằng chế độ setwritemode(XOR_PUT).
  • Mô phỏng chuyển động quỹ đạo không gian: Vẽ tàu vũ trụ chuyển động dọc theo phương trình đường elip trên nền 1000 điểm ảnh sao nhấp nháy, ứng dụng kỹ thuật cấp phát bộ nhớ động malloc kết hợp imagesize, getimage và putimage.
  • Xây dựng giải thuật in ảnh từ màn hình đồ họa ra máy in kim chuyên dụng thông qua việc trích xuất từng cột bit ảnh (tao_mau và in_anh).

Phương pháp đánh giá kết quả học tập dựa trên việc biên dịch thực tế mã nguồn, quan sát hiển thị trên máy tính, và thực hiện các yêu cầu đối chứng trong bài tập cuối chương. Người học được yêu cầu hoán đổi giữa các cặp hàm (như thay cscanf bằng scanf, thay fopen("...","wt") bằng fopen("...","wb")) nhằm rút ra ưu điểm, nhược điểm và sự khác biệt về kết quả đầu ra. Hướng dẫn tự học yêu cầu sinh viên sử dụng thành thạo các tổ hợp phím gỡ lỗi F7, F8, cửa sổ Watch và Call stack để tự kiểm tra luồng dữ liệu nội tại của biến trong suốt quá trình chạy chương trình.


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

Tài liệu thể hiện các đặc tính kỹ thuật có tính hệ thống và chuyên sâu:

  • Tích hợp kỹ thuật đồ họa mở rộng 256 màu: Bên cạnh đồ họa 16 màu chuẩn EGA/VGA, giáo trình cung cấp quy trình nạp trình điều khiển đồ họa bên ngoài thông qua hàm installuserdriver("SVGA256", NULL) kết hợp mốt đồ họa độ phân giải cao để hiển thị dải 256 màu.
  • Khai thác tối đa kiến trúc phân đoạn 8086: Phân tích cơ chế hoạt động của 6 mô hình bộ nhớ (Tiny, Small, Medium, Compact, Large, Huge), chỉ rõ các giới hạn 64KB của từng đoạn dữ liệu, mã lệnh và ngăn xếp, giúp lập trình viên quản trị hiệu quả vùng nhớ động và con trỏ xa far.
  • Tách biệt rõ ràng cơ chế tệp tin: Phân tích cơ chế chuyển đổi ký tự điều khiển định dạng dòng của hệ điều hành DOS (cặp mã CR=13, LF=10) và dấu kết thúc tệp tin Ctrl+Z (mã 26) trong chế độ văn bản, đối chiếu với tính toàn vẹn dữ liệu trong chế độ nhị phân.
  • Tự động hóa biên dịch và gỡ lỗi nâng cao: Trình bày chi tiết cách cấu hình tệp dự án .PRJ trên giao diện IDE và các cờ tùy chọn dòng lệnh của trình biên dịch tcc, hỗ trợ lập trình viên xây dựng các phần mềm cấu trúc mô-đun lớn.

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

Giáo trình được thiết kế cho các nhóm đối tượng cụ thể trong môi trường đào tạo đại học và nghiên cứu kỹ thuật:

Nhóm đối tượng Điều kiện tiên quyết & Mục đích sử dụng
Sinh viên đại học (Năm 1 - Năm 2)
Ngành CNTT, Kỹ thuật Phần mềm, Khoa học Máy tính
Yêu cầu tiên quyết: Nắm vững cấu trúc lập trình C cơ bản (câu lệnh rẽ nhánh, vòng lặp, mảng, hàm, kiểu dữ liệu nguyên thủy).
Mục đích: Học tập các chủ đề nâng cao về con trỏ, thao tác tệp tin, giao diện văn bản, đồ họa và phân bổ bộ nhớ.
Sinh viên ngành Kỹ thuật Máy tính, Điện tử Viễn thông, Tự động hóa Yêu cầu tiên quyết: Kiến thức cơ sở về tin học đại cương và cấu trúc máy tính.
Mục đích: Xây dựng nền tảng về kiến trúc vi xử lý 8086, lập trình điều khiển giao tiếp thiết bị ngoại vi và quản trị bộ nhớ mức thấp.
Giảng viên và Cán bộ nghiên cứu Mục đích: Sử dụng làm đề cương bài giảng lý thuyết, ngân hàng bài tập thực hành trong phòng máy và thiết kế đề thi kết thúc học phần.
Kỹ sư lập trình hệ thống / Tự học Mục đích: Tài liệu tra cứu các hàm chuẩn của Turbo C (conio.h, graphics.h, stdio.h, dos.h), các cờ biên dịch dòng lệnh tcc và kỹ thuật tối ưu hóa bộ nhớ x86.

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 phục vụ sinh viên đại học và cao đẳng kỹ thuật đang theo học các học phần Kỹ thuật lập trình, Lập trình hệ thống hoặc Ngôn ngữ C nâng cao. Nội dung cũng phù hợp cho kỹ sư muốn tìm hiểu cơ chế quản trị bộ nhớ mức thấp và xử lý đồ họa cấp điểm ảnh trên kiến trúc x86.

2. Cần kiến thức nền nào để học giáo trình này?

Người học cần hoàn thành học phần cơ sở về lập trình C, nắm vững cú pháp khai báo biến, các toán tử số học/logic, cấu trúc điều khiển (for, while, if-else), mảng một chiều/hai chiều, chuỗi ký tự và khái niệm cơ bản về kiểu dữ liệu có cấu trúc (struct).

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

Tài liệu không dừng lại ở mức cú pháp ngôn ngữ thuần túy mà đi sâu vào kiến trúc phần cứng và hệ thống: phân tích chi tiết bản đồ bộ nhớ (CS, DS, SS, ES), con trỏ near/far, kỹ thuật phân đoạn (segmentation), cơ chế xử lý bộ đệm tệp tin cấp 1/cấp 2, cùng quy trình biên dịch dự án đa tệp bằng dòng lệnh tcc và kỹ thuật gỡ lỗi chuyên sâu bằng Turbo C Debugger.

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

Người học cần cài đặt môi trường Turbo C hoặc các trình giả lập DOS (như DOSBox), gõ và biên dịch trực tiếp từng chương trình mẫu trong tài liệu (như bài toán quản lý cửa sổ, mô phỏng đồng hồ, đồ thị hàm số). Sau đó, thực hiện các bài tập so sánh (như hoán đổi scanf và cscanf, thay đổi cờ mở tệp) và dùng các phím F7, F8, cửa sổ Watch để phân tích sự biến đổi của dữ liệu trong RAM.

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

Đi kèm với giáo trình là hệ thống mã nguồn mẫu hoàn chỉnh, bảng tổng kết mã lỗi đồ họa (graphresult), bảng hằng số màu/mốt hiển thị, bảng tra cứu các hàm thư viện theo thứ tự chữ cái (từ _chmod, clearviewport, clrscr đến textmode, wherey) và các phụ lục chuyên đề về dòng lệnh tcc, mô hình bộ nhớ và xây dựng hàm với đối số bất định.


Kết luận

Giáo trình Kỹ thuật lập trình C là tài liệu học thuật hoàn chỉnh, cung cấp hệ thống kiến thức toàn diện từ kỹ thuật lập trình giao diện văn bản, đồ họa máy tính 2D, quản lý luồng dữ liệu tệp tin đến kiến trúc phân đoạn bộ nhớ và kỹ thuật biên dịch đa mô-đun.

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

  1. Giai đoạn 1: Làm chủ kỹ thuật điều khiển màn hình văn bản và cửa sổ bằng thư viện conio.h.
  2. Giai đoạn 2: Thực hành kỹ thuật dựng hình, tô màu, xử lý hoạt ảnh và quản lý khung nhìn với thư viện graphics.h.
  3. Giai đoạn 3: Xây dựng ứng dụng quản lý dữ liệu trên tệp nhị phân và tệp văn bản qua stdio.h.
  4. Giai đoạn 4: Hoàn thiện kỹ năng gỡ lỗi (Debugger), làm chủ công cụ dòng lệnh tcc, nắm vững các mô hình bộ nhớ 8086 và xây dựng các hàm nâng cao với đối số biến thiên.

Tài nguyên hỗ trợ bao gồm môi trường biên dịch Turbo C, hệ thống tệp thư viện liên kết BGI, phông chữ .CHR và tập danh mục tra cứu hàm chuẩn được tích hợp chi tiết trong phần phụ lục của giáo trình.