Khóa học lập trình C bằng tiếng Việt
Từ nguyên lý máy tính đến kỹ thuật nâng cao
Khóa học lập trình C tiếng Việt, đi từ cách máy tính chạy một chương trình cho tới hệ thống, mạng và lập trình nhúng. Mỗi bài đều có mã nguồn chạy được, sơ đồ minh họa và bài tập tự làm.
- Phần
- 22
- Chương
- 59
- Bài đã có
- 116
- Phút nội dung
- 2022
Khóa học này khác gì
Bắt đầu từ nguyên lý
Không dạy cú pháp trước. Bạn hiểu chương trình nằm ở đâu và chạy ra sao, rồi mới học viết.
Mọi bài đều chạy được
Không có lý thuyết suông. Mỗi khái niệm đi kèm mã nguồn và lệnh terminal để tự kiểm chứng.
Dạy cả cạm bẫy
Tràn bộ đệm, con trỏ treo, hành vi không xác định. Những thứ khiến C khó dùng đúng.
Tới tận hệ thống và nhúng
Lộ trình đi từ Hello World cho tới lập trình Linux, mạng, vi điều khiển và mini RTOS.
Nội dung đã sẵn sàng
Toàn bộ lộ trìnhPhần 0
Làm quen với lập trình và ngôn ngữ C
Hiểu C là gì, cài được môi trường, biết chương trình biến thành file chạy như thế nào, và viết được chương trình đầu tiên.
- 1.1Tổng quan về CC ra đời thế nào, dùng ở đâu, mạnh yếu ra sao, và vì sao sau hơn 50 năm nó vẫn chưa bị thay thế.14 phút
- 1.2Cài đặt môi trườngChọn và cài trình biên dịch, editor, công cụ gỡ lỗi trên Linux, WSL, macOS hoặc Windows.12 phút
- 1.3Quy trình biên dịchBốn giai đoạn tiền xử lý, biên dịch, hợp dịch, liên kết. Chạy tay từng bước và đọc kết quả trung gian.20 phút
- 1.4Chương trình C đầu tiênMổ xẻ Hello World từng thành phần, và chứng minh main không phải điểm bắt đầu thật sự.16 phút
Phần 1
Cơ sở ngôn ngữ
Nắm cú pháp cơ bản, kiểu dữ liệu, nhập xuất, toán tử và rẽ nhánh.
- 2.1Cấu trúc chương trình CNăm thành phần của một file nguồn, phân biệt câu lệnh với khối lệnh, và luật dấu chấm phẩy.13 phút
- 2.2BiếnBiến là một ô nhớ có tên. Khai báo, khởi tạo, gán, phạm vi và thời gian sống.15 phút
- 2.3Kiểu dữ liệuKích thước, miền giá trị, vì sao chuẩn C không cố định kích thước, tràn số và bẫy số thực.24 phút
- 2.4sizeofToán tử tính lúc biên dịch, in bằng %zu, và bẫy sizeof trên tham số mảng.13 phút
- 2.5Hằng sốSo sánh define, const và enum. Đọc const với con trỏ, và ba cạm bẫy của macro.15 phút
- 3.1printfGiá trị trả về, escape sequence, và cơ chế đệm quyết định khi nào chữ hiện ra màn hình.15 phút
- 3.2Format specifierGiải phẫu đầy đủ năm thành phần của một đặc tả định dạng, kèm lỗ hổng chuỗi định dạng.28 phút
- 3.3scanfGiá trị trả về, giới hạn độ rộng, khoảng trắng trong chuỗi định dạng và tập ký tự.19 phút
- 3.4Nhập chuỗi bằng fgetsCách nhập an toàn được dùng suốt khóa học, kèm hàm nhập số nguyên hoàn chỉnh.17 phút
- 3.5Các lỗi nhập liệu thường gặpNăm lỗi khiến chương trình bỏ qua lượt nhập, treo vô hạn, hoặc bị tràn bộ đệm.17 phút
- 4.1Toán tử số họcBẫy chia số nguyên, dấu của phép lấy dư, chia cho 0, và các ứng dụng của toán tử %.15 phút
- 4.2Toán tử so sánhKết quả so sánh là số nguyên, và năm lỗi so sánh kinh điển của người mới học C.15 phút
- 4.3Toán tử logicQuy tắc chân lý trong C, đánh giá ngắn mạch, và phân biệt toán tử logic với toán tử bit.13 phút
- 4.4Toán tử gánCác dạng gán rút gọn, phép gán là biểu thức, và bẫy ép kiểu ngầm.11 phút
- 4.5Tăng và giảmPhân biệt tiền tố với hậu tố, và những biểu thức tuyệt đối không được viết.13 phút
- 4.6Độ ưu tiên toán tửBảng độ ưu tiên đầy đủ và năm bẫy khiến biểu thức chạy khác hoàn toàn ý định.17 phút
- 5.1Câu lệnh ifĐiều kiện trong C là một con số, và bài học từ lỗi bảo mật goto fail của Apple.12 phút
- 5.2if và elseRẽ hai nhánh, và bẫy else lơ lửng khi bỏ ngoặc nhọn ở if lồng nhau.11 phút
- 5.3else ifChuỗi nhiều nhánh loại trừ nhau, và vì sao thứ tự điều kiện quyết định tính đúng sai.12 phút
- 5.4if lồng nhauKhi nào cần lồng, và kỹ thuật guard clause để làm phẳng mã nguồn.13 phút
- 5.5switchNăm ràng buộc bắt buộc nhớ, fallthrough có chủ ý và vô ý, và bảng nhảy.19 phút
- 5.6breakThoát switch và thoát vòng lặp, và vì sao break chỉ thoát được một tầng.11 phút
- 5.7continueBỏ qua phần còn lại của lượt lặp, và bẫy vòng lặp vô hạn khi dùng trong while.11 phút
- 5.8Toán tử ba ngôiToán tử duy nhất của C có ba toán hạng. Khi nào nên dùng và khi nào không.11 phút
Phần 2
Vòng lặp và tư duy thuật toán
Thành thạo ba loại vòng lặp và biết cách nghĩ ra thuật toán trước khi viết code.
- 6.1whileVòng lặp kiểm tra điều kiện trước, ba thành phần bắt buộc, và ba nguyên nhân chạy vô hạn.15 phút
- 6.2do whileVòng lặp kiểm tra điều kiện sau, chạy ít nhất một lần, và hai ứng dụng chính.12 phút
- 6.3forBa phần trong ngoặc, các biến thể, khai báo biến trong for, và bẫy size_t đếm ngược.18 phút
- 6.4Vòng lặp lồng nhauQuan hệ hàng và cột, độ phức tạp nhân lên, và vì sao thứ tự duyệt quyết định tốc độ.17 phút
- 6.5Điều khiển vòng lặpbreak, continue, goto và return trong vòng lặp, cùng cách thoát nhiều tầng.14 phút
- 6.6Vòng lặp vô hạnBa cách viết, các ứng dụng hợp lệ, và cách chẩn đoán khi vô hạn ngoài ý muốn.13 phút
- 7.1Quy trình giải bài toánSáu bước từ lúc đọc đề tới lúc có chương trình chạy đúng, kèm ví dụ áp dụng đầy đủ.18 phút
- 7.2Thuật toánNăm tính chất bắt buộc, và vì sao cùng một bài toán có thể chênh nhau hàng vạn lần.16 phút
- 7.3Mã giảCách mô tả thuật toán không phụ thuộc ngôn ngữ, và quy ước dùng trong khóa học.14 phút
- 7.4Lưu đồSáu ký hiệu chuẩn, cách vẽ ba cấu trúc cơ bản, và giới hạn của lưu đồ.14 phút
- 7.5Độ phức tạpBig-O, cách đếm nhanh từ vòng lặp, quy đổi ra thời gian thật, và độ phức tạp không gian.22 phút
- 7.6Phân tích một bài toánMô hình vào xử lý ra, bảng phân tích bắt buộc, và năm câu hỏi trước khi viết code.17 phút
Phần 3
Hàm
Chia chương trình thành hàm, hiểu khung ngăn xếp, nắm đệ quy.
- 8.1Khái niệm hàmVì sao cần hàm, sáu lợi ích cụ thể, và sáu nguyên tắc thiết kế một hàm tốt.14 phút
- 8.2Khai báo hàmNguyên mẫu hàm, vì sao trình biên dịch cần nó, và ba cách đặt nguyên mẫu.14 phút
- 8.3Định nghĩa hàmBốn thành phần của một định nghĩa, quy tắc một định nghĩa, và hàm inline.15 phút
- 8.4Lời gọi hàm và khung ngăn xếpĐiều gì thật sự xảy ra khi gọi một hàm, và cách nhìn thấy khung ngăn xếp bằng gdb.22 phút
- 8.5Tham sốTham số hình thức và đối số thực tế, truyền mảng, và khi nào nên gom vào struct.16 phút
- 8.6Giá trị trả vềBa cách trả về nhiều giá trị, ba quy ước báo lỗi, và bẫy thiếu return.18 phút
- 8.7Truyền theo giá trịC luôn truyền bản sao. Vì sao swap cần con trỏ, và vì sao mảng trông như ngoại lệ.18 phút
- 8.8Phạm vi biếnBiến cục bộ, biến toàn cục, che khuất biến, và vì sao nên tránh biến toàn cục.16 phút
- 8.9staticMột từ khóa hai nghĩa hoàn toàn khác nhau, và bảng tổng hợp năm lớp lưu trữ.17 phút
- 8.10Đệ quyHai thành phần bắt buộc, chạy tay ngăn xếp đệ quy, chi phí thật, và khi nào không nên dùng.24 phút
Phần 4
Array và String
Thành thạo mảng một và hai chiều, hiểu chuỗi C là mảng ký tự kết thúc bằng ký tự null.
- 9.1Mảng là gìBố cục bộ nhớ, công thức địa chỉ, và lý do C không kiểm tra biên mảng.18 phút
- 9.2Khởi tạo mảngSáu cách khởi tạo, khởi tạo có chỉ định của C99, và vì sao không gán mảng bằng dấu bằng.17 phút
- 9.3Truy cập phần tửBốn cách viết tương đương, công thức địa chỉ, và bẫy chỉ số có dấu.15 phút
- 9.4Duyệt mảngBa cách duyệt, macro đếm phần tử và giới hạn của nó, cùng cách in mảng gọn gàng.16 phút
- 9.5Tìm kiếmTìm tuyến tính, tìm nhị phân, bẫy tràn khi tính điểm giữa, và bsearch của thư viện chuẩn.22 phút
- 9.6Tìm giá trị nhỏ nhất và lớn nhấtCách khởi tạo đúng, trả về cả vị trí, và thuật toán tìm cả hai bằng ít phép so sánh hơn.16 phút
- 9.7Tổng và trung bìnhHai cái bẫy tràn số và chia nguyên, cùng sai số cộng dồn với số thực.17 phút
- 9.8Sắp xếp cơ bảnBa thuật toán sắp xếp O(n bình phương), tính ổn định, và bài đo thời gian thực tế.28 phút
- 10.1Ma trậnKhai báo, bố cục theo hàng, vì sao chiều thứ hai bắt buộc phải ghi.18 phút
- 10.2Nhập và xuất ma trậnVòng lặp lồng chuẩn, căn cột khi in, và cách kiểm tra dữ liệu vào.15 phút
- 10.3Cộng và trừ ma trậnPhép toán theo từng phần tử, điều kiện kích thước, và cách viết hàm dùng lại được.14 phút
- 10.4Nhân ma trậnBa vòng lặp lồng nhau, độ phức tạp lập phương, và thứ tự vòng lặp quyết định tốc độ.24 phút
- 10.5Chuyển vịChuyển vị ra mảng mới và chuyển vị tại chỗ cho ma trận vuông.14 phút
- 10.6Đường chéo và tam giácHai đường chéo, ba vùng tam giác, và điều kiện chỉ số của từng vùng.15 phút
- 11.1Chuỗi trong CChuỗi là mảng ký tự, khác biệt giữa mảng ghi được và hằng chuỗi chỉ đọc.18 phút
- 11.2Ký tự kết thúc chuỗiVì sao mọi hàm chuỗi đều phụ thuộc vào một byte 0, và chuyện gì xảy ra khi thiếu nó.18 phút
- 11.3Nhập chuỗiVì sao gets bị xóa khỏi chuẩn, cách dùng fgets đúng, và xử lý ký tự xuống dòng.20 phút
- 11.4strlenĐếm ký tự trước byte 0, chi phí tuyến tính, và bẫy gọi strlen trong điều kiện vòng lặp.15 phút
- 11.5strcpySao chép chuỗi, vì sao strcpy nguy hiểm, và cách dùng snprintf thay thế.18 phút
- 11.6strcatNối chuỗi, chi phí bậc hai khi nối trong vòng lặp, và cách nối hiệu quả.17 phút
- 11.7strcmpSo sánh theo thứ tự từ điển, ý nghĩa dấu của kết quả, và bẫy so sánh chuỗi bằng dấu bằng.16 phút
- 11.8strchrTìm ký tự trong chuỗi, chiều tìm ngược, và cách tách chuỗi bằng con trỏ.15 phút
- 11.9strstrTìm chuỗi con, độ phức tạp thực tế, và cách thay thế mọi lần xuất hiện.18 phút
- 11.10Tự cài lại thư viện chuỗiCài lại tám hàm của string.h, kèm bộ kiểm thử tự động so với bản chuẩn.26 phút
Phần 5
Pointer
Bước chuyển quan trọng nhất của C. Hiểu bộ nhớ, địa chỉ, con trỏ và con trỏ hàm.
- 12.1Bộ nhớ, địa chỉ và giá trịMô hình bộ nhớ phẳng, mỗi byte một địa chỉ, và vì sao con trỏ là khái niệm tất yếu.18 phút
- 12.2Toán tử lấy địa chỉToán tử và, kiểu của kết quả, và những thứ không lấy địa chỉ được.15 phút
- 12.3Con trỏKhai báo, khởi tạo, con trỏ rỗng, con trỏ hoang, và vì sao kiểu con trỏ quan trọng.22 phút
- 12.4Giải tham chiếuToán tử sao, đọc và ghi qua con trỏ, và bốn cách giải tham chiếu sai.20 phút
- 12.5Con trỏ và hàmTruyền con trỏ vào hàm, trả về con trỏ, và quy tắc vàng về vòng đời.18 phút
- 12.6Mô phỏng truyền tham chiếuBa mẫu dùng con trỏ để hàm ghi ra ngoài, và cách kiểm tra tham số con trỏ.18 phút
- 12.7Con trỏ và mảngPhân rã mảng, bốn cách viết tương đương, và ba chỗ mảng không phân rã.20 phút
- 12.8Số học con trỏCộng trừ con trỏ đếm theo phần tử, hiệu hai con trỏ, và giới hạn của chuẩn.20 phút
- 13.1Con trỏ tới con trỏHai tầng gián tiếp, khi nào cần, và cách đọc khai báo nhiều dấu sao.20 phút
- 13.2Con trỏ và chuỗiDuyệt chuỗi bằng con trỏ, cắt chuỗi không sao chép, và mẫu quét chuỗi.18 phút
- 13.3Mảng con trỏMảng chuỗi kiểu ragged, đối số dòng lệnh, và so sánh với mảng hai chiều.20 phút
- 13.4Con trỏ tới mảngPhân biệt con trỏ tới mảng với mảng con trỏ, và quy tắc đọc khai báo từ trong ra.18 phút
- 13.5Con trỏ hàmLưu địa chỉ hàm, gọi qua con trỏ, và bảng điều phối thay cho chuỗi if.22 phút
- 13.6Hàm gọi lạiĐảo ngược quyền điều khiển, qsort và bsearch, và mẫu truyền ngữ cảnh.20 phút
- 13.7Con trỏ voidCon trỏ không kiểu, lập trình tổng quát, và những giới hạn phải nhớ.18 phút
- 13.8const với con trỏBốn tổ hợp const, quy tắc đọc từ phải sang trái, và cách chọn đúng.18 phút
Phần 6
Memory Management
Hiểu bản đồ bộ nhớ tiến trình, dùng đúng malloc và free, nhận diện bốn loại lỗi bộ nhớ.
- 14.1Ngăn xếpCách ngăn xếp cấp và thu hồi bộ nhớ, giới hạn kích thước, và ba cách làm tràn nó.18 phút
- 14.2Vùng cấp phát độngVì sao cần heap, nó khác ngăn xếp ở đâu, và bộ cấp phát làm việc thế nào.20 phút
- 14.3Bộ nhớ tĩnhVùng .data và .bss, biến static trong hàm, và thứ tự khởi tạo trước khi main chạy.16 phút
- 14.4Bộ nhớ toàn cụcBiến toàn cục nằm ở đâu, liên kết ngoài và nội bộ, và định nghĩa dự phòng.16 phút
- 14.5Bản đồ bộ nhớSáu vùng của một tiến trình, cách xem chúng thật, và đọc địa chỉ để đoán loại lỗi.20 phút
- 14.6mallocCấp phát vùng nhớ lúc chạy, cách viết đúng, và bốn lỗi kinh điển khi gọi nó.22 phút
- 14.7callocCấp phát và xóa về 0 trong một bước, kiểm tra tràn tự động, và khi nào nên dùng.15 phút
- 14.8reallocĐổi kích thước vùng đã cấp, cái bẫy mất con trỏ, và mẫu mảng tự lớn.22 phút
- 14.9freeTrả bộ nhớ về hệ thống, các quy tắc bắt buộc, và vì sao free không xóa dữ liệu.18 phút
- 14.10Rò rỉ bộ nhớBốn nguyên nhân rò rỉ, cách phát hiện bằng công cụ, và bốn mẫu phòng tránh.22 phút
- 14.11Con trỏ treoBa cách tạo ra con trỏ treo, vì sao nó khó phát hiện, và cách phòng.18 phút
- 14.12Giải phóng hai lầnVì sao gọi free hai lần phá cấu trúc bên trong bộ cấp phát, và cách phòng tuyệt đối.16 phút
- 14.13Dùng sau khi giải phóngLoại lỗi bộ nhớ nguy hiểm nhất, cơ chế khai thác, và bộ công cụ phát hiện.20 phút
Phần 7
Struct / Union / Enum
Gom dữ liệu thành kiểu mới, hiểu padding và alignment.
- 15.1Struct cơ bảnGom nhiều kiểu vào một, ba cách khởi tạo, và bố cục bộ nhớ kèm phần đệm.24 phút
- 15.2typedefĐặt tên mới cho kiểu, bốn cách kết hợp với struct, và khi nào không nên dùng.16 phút
- 15.3Con trỏ structToán tử mũi tên, truyền struct hiệu quả, và kiểu không hoàn chỉnh để giấu chi tiết.20 phút
- 15.4Struct lồng nhauStruct chứa struct, thành viên vô danh của C11, và bố cục bộ nhớ khi lồng.18 phút
- 15.5Mảng structDanh sách bản ghi, sắp xếp và tìm kiếm, cùng so sánh hai cách bố trí dữ liệu.20 phút
- 15.6Struct và hàmTruyền và trả về struct, quy ước gọi hàm, và mẫu thiết kế giao diện quanh struct.20 phút
- 15.7Struct và cấp phát độngCặp hàm tạo và hủy, sao chép nông so với sao chép sâu, và mảng thành viên linh hoạt.24 phút
- 16.1Enum cơ bảnHằng số có tên, quy tắc đánh số, kiểu thật của enum và những giới hạn của nó.18 phút
- 16.2enum với switchVì sao không viết nhánh mặc định, và cách để trình biên dịch bắt lỗi thiếu nhánh.16 phút
- 16.3Máy trạng tháiBảng chuyển trạng thái thay cho hàng chục nhánh if, và cách kiểm chứng nó.22 phút
- 17.1Union cơ bảnMọi thành viên dùng chung một vùng nhớ, kích thước, và quy tắc chỉ đọc thành viên vừa ghi.18 phút
- 17.2Union có nhãnGhép enum với union thành kiểu biến thể an toàn, và bộ hàm thao tác quanh nó.22 phút
- 17.3Ứng dụng thực tếĐọc dữ liệu theo byte, gói tin mạng, thanh ghi phần cứng, và giới hạn về tính di động.20 phút