“Thực chiến lập trình C”, sản phẩm này chắt lọc những vùng kiến thức về lập trình ngôn ngữ C mà bọn mình hay gặp và sử dụng cho các dự án công ty nhất. Hi vọng sản phẩm sẽ đem đến một cái nhìn rõ ràng hơn cho các bạn sinh viên kỹ thuật.
Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT THỰC CHIẾN LẬP TRÌNH C CÙNG DEVIOT.VN FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Lời nói đầu Deviot trung tâm đào tạo lập trình nhúng IoT Với đội ngũ anh chị cựu sinh viên trường Đại học Bách Khoa Hà Nội, có nhiều năm kinh nghiệm lĩnh vực giữ nhiều vị trí quan trọng cơng ty, tập đồn hàng đầu nước Với kỷ luật, kiên trì tận tâm mình, đội ngũ dành hết tâm huyết mắt sản phẩm chất lượng đến với cộng đồng bạn sinh viên kỹ thuật Hi vọng sách trở thành hành trang thiếu với bạn sinh viên Hà Nội, ngày …… tháng…… năm…… Xin chào tất bạn độc giả, Ngơ Vũ Trường Giang Bản thân cựu sinh viên trường Đại học Bách Khoa Hà Nội, khóa K58 chuyên nghành Kỹ thuật đo Tin học công nghiệp, sau nhiều năm làm, nhận thấy có vùng kiến thức sử dụng nhiều công việc mà hầu hết bạn sinh viên trường chưa biết chưa tiếp cận dẫn đến sai hướng Mình định đội ngũ Deviot – Cùng học lập trình nhúng IoT mắt sản phẩm có tên “Thực chiến lập trình C Deviot”, sản phẩm chắt lọc vùng kiến thức lập trình ngơn ngữ C mà bọn hay gặp sử dụng cho dự án công ty Hi vọng sản phẩm đem đến nhìn rõ ràng cho bạn sinh viên kỹ thuật Thông tin liên hệ: Fanpage: https://www.facebook.com/deviot.vn Group Facebook: https://www.facebook.com/groups/deviot.vn Địa chỉ: Số 101C, ngõ Xã Đàn 2, Hà Nội FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Xin gửi lời cảm ơn tới người bạn thầy cô giáo giảng viên dành thời gian duyệt qua nội dung thảo đưa góp ý để sách thêm phần cải thiện nội dung Tiến sĩ: Bùi Đình Bá Hiện giảng viên mơn Cơ điện tử - Đại học Bách Khoa Hà Nội “Cuốn sách có nội dung chi tiết, trình bày dễ hiểu đào sâu vào kĩ thuật hay sử dụng lập trình C Phù hợp với bạn muốn tìm hiểu từ đầu chuyên sâu.” Bạn: Nguyễn Minh Huy Founder đội ngũ BKStar Từng dẫn dắt đội tham gia thi Robotcon tồn quốc Từ cịn học tập trường Huy tham gia nhiều dự án kỹ thuật lớn giành xuất sắc Đại học Bách Khoa Hà Nội “Nội dung sách hay trình bày khoa học Đi từ nội dung đến nâng cao lại dễ hiểu khơng hàn lâm Mình khun bạn sinh viên sử dụng sách này.” Địa điểm mua sách Offline Linh kiện điện tử Tuhu Địa chỉ: Số 2, ngõ 106 Lê Thanh Nghị, phường Bách Khoa, Hai Bà Trưng, Hà Nội Website: https://mualinhkien.vn/ SDT: 0941344233 Quán photo sau thư viên Tạ Quang Bửu FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Mục Lục Bài 1: Giới thiệu ngơn ngữ lập trình C Ngơn ngữ C ? Bạn có cần học lập trình C khơng ? IDE gì, Text Editor gì, Compiler ? Quá trình biên dịch chương trình C/C++ Một số trang web học C tiếng việt hiệu 10 Cách học C hiệu 11 Cơng cụ lập trình 11 Thực hành chương trình “Hello World” 11 Bài 2: Toán tử C thuật toán xếp 13 Toán tử C 13 1.1 Toán tử số học 13 1.2 Toán tử tăng giảm 13 1.3 Toán tử gán 15 1.4 Toán tử quan hệ 15 1.5 Toán tử logic 16 1.6 Toán tử thao tác bit 17 1.7 Tốn tử ngơi 20 Ba thuật toán xếp sử dụng nhiều C 21 2.1 Thuật toán chèn(insertion sort) 21 2.2 Thuật toán xếp lựa chọn (selection sort) 23 2.3 Thuật toán xếp bọt (Bubble Sort) 25 Buổi 3: Kiểu liệu biến 28 Kiểu liệu 28 1.1 Kiểu số nguyên 28 1.2 Kiểu số thực 28 1.3 Kiểu ký tự 29 1.4 Kiểu void 29 Định dạng C 29 Biến số ? 31 3.1 Thế biến số ? 31 3.2 Cách khai báo biến số ? 32 Biến toàn cục 33 Biến cục 34 Biến static (biến tĩnh) 34 FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT 6.1 Biến static khai báo biến cục 34 6.2 Biến static khai báo biến toàn cục khai báo hàm 35 Từ khóa const 36 7.1 Khi khai báo biến 36 7.2 Khi khai báo trỏ 36 Từ khóa extern 37 Từ khóa volatile 38 Buổi 4: Vòng lặp 39 Điều kiện If, else if, else 39 1.1 Câu lệnh If 39 1.2 Câu lệnh If else 39 1.3 Câu lệnh if … elseif … else 40 Lệnh switch case 41 Vòng lặp for 44 Từ khóa continue 47 Vòng lặp while 48 Từ khóa break 50 Buổi 5: Hàm 52 Hàm ? 52 Truyền tham chiếu truyền tham trị ? 53 2.1 Truyền tham chiếu 53 2.2 Truyền tham trị 54 Buổi 6: Mảng, chuỗi trỏ 56 Mảng chiều 56 1.1 Khai báo mảng 56 1.2 Truy cập phần tử mảng 56 1.3 Thao tác mảng 57 Mảng chiều 58 2.1 Khởi tạo mảng chiều 58 2.2 Thao tác với mảng chiều 58 Chuỗi 59 3.1 Khai báo chuỗi 59 3.2 Các thao tác với chuỗi 60 Con trỏ 61 4.1 Con trỏ gì? 62 4.2 Cách khai báo trỏ 62 4.3 Gán giá trị cho trỏ 63 FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT 4.4 Tốn tử tăng giảm trỏ 66 4.5 Truyền trỏ vào hàm 66 4.6 Trả trỏ hàm 68 4.7 Mối quan hệ trỏ mảng 68 Con trỏ cấp (Pointer to pointer) 69 Buổi 7: Giới thiệu thư viện 72 Hàm strlen 72 Hàm strcmp 73 Hàm strcpy 74 Hàm strstr 75 Hàm memset – memcpy – memcmp 75 5.1 Hàm memset 75 5.2 Hàm memcpy 77 5.3 Hàm memcmp 78 Toán tử sizeof 79 So sánh sizeof strlen 81 Buổi 8: Struct , Enum, Union 82 Struct 82 1.1 Struct gì? Và dùng struct nhỉ? 82 1.2 Truy xuất thuộc tính struct 83 1.3 Kích thước struct 83 1.4 Vấn đề phân mảnh nhớ vi điều khiển 84 1.5 Chống phân mảnh nhớ 86 1.6 Một số ví dụ struct 88 Enum 90 Union 92 Typedef 94 Bit fields 94 Bài 9: State machine ứng dụng lập trình nhúng 98 State machine ? 98 Cách State machine hoạt động 98 Buổi 10: Bộ tiền xử lý cách tạo thư viện C 101 Giai đoạn tiền xử lý Macro 101 1.1 Giai đoạn tiền xử lý 101 1.2 Macro 102 Chị thị tiền xử lý 102 2.1 #include 102 FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT 2.2 #define, #undef 104 2.3 Các thị tiền xử lý điều kiện (#ifdef, #ifndef, #if, #endif, #else and #elif) 105 Cách để tạo File thư viện lập trình C 107 Buổi 11: Kỹ thuật ép kiểu, xử lý lỗi thường gặp code 110 Kiểu liệu phạm vi 110 1.1 Kiểu số nguyên 110 1.2 Kiểu số thực 110 1.3 Kiểu ký tự 111 1.4 Kiểu void 111 Kỹ thuật ép kiểu 111 2.1 Nới rộng 111 2.2 Thu hẹp 112 Các loại lỗi lập trình C 113 3.1 Lỗi cú pháp 113 3.2 Lỗi thực thi 114 3.3 Lỗi logic 114 Các kỹ thuật xử lý lỗi 115 4.1 Chỉ thị tiền xử lý #error 115 4.2 Tạo hàm log theo chức 116 4.3 Viết hàm kiểm tra thông số đầu vào 117 4.4 Một số macro hữu ích việc debug 118 Buổi 12: Con trỏ hàm 119 Vậy trỏ hàm ? 119 Khai báo trỏ hàm cách sử dụng 119 2.1 Khai báo tường minh 119 2.2 Khai báo không tường minh 120 Truyền hàm vào hàm 121 Buổi 13: Bộ đệm vòng 123 Tại phải sử dụng đệm vòng 123 Khái niệm 123 Chúng ta thường sử dụng đệm vòng đâu ? 123 3.1 Thư viện RingBuf 124 3.2 Các sử dụng RingBuf 126 Buổi 14: Bài tập thực chiến 130 THAM KHẢO NGUỒN TÀI LIỆU 136 FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Bài 1: Giới thiệu ngơn ngữ lập trình C Ngơn ngữ C ? C ngơn ngữ lập trình cấp trung phát triển Dennis M Ritchie để phát triển hệ điều hành UNIX Bell Labs C thực thi lần máy tính DEC PDP-11 vào năm 1972 Năm 1978, Brian Kernighan Dennis Ritchie đưa mô tả C công khai C, gọi tiêu chuẩn K & R Ngôn ngữ C phát triển để tạo ứng dụng hệ thống trực tiếp tương tác với thiết bị phần cứng trình điều khiển, kernals vv Ngơn ngữ lập trình Java, Hệ điều hành UNIX, trình biên dịch C tất chương trình ứng dụng UNIX viết C Lập trình C coi sở cho ngơn ngữ lập trình khác, lý biết đến ngơn ngữ mẹ Hầu hết trình biên dịch, JVMs, Kernals vv viết ngôn ngữ C hầu hết ngôn ngữ theo cú pháp C, C ++, Java vv Nó cung cấp khái niệm cốt lõi mảng, chức năng, xử lý tập tin vv sử dụng nhiều ngôn ngữ C ++, java, C # v.v Bạn có cần học lập trình C khơng ? Câu trả lời rất cần thiết Vì ? Như giới thiệu trên, C coi ngôn ngữ mẹ tất ngơn ngữ đại Vì việc học biết cách lập trình C gần bắt buộc, giống việc bạn hành trang cho kiến thức thật chắn học lên ngơn ngữ lập trình bậc cao dễ dàng Vậy lập trình ngơn ngữ C nghành IT lập trình ngơn ngữ C ngành nhúng IoT có khác ? Các bạn biết hầu hết lập trình viên nghành IT viết chương trình để chạy thiết bị có cấu hình mạng ví dụ máy tính, laptop, cloud… Trong đặc thù nghành nhúng lập trình cho chip, máy tính nhúng có nhớ RAM, ROM tài ngun vơ hạn chế Vì khơng thể tùy tiện khai báo sử dụng tài nguyên RAM cách hoang phí Thay vào bạn phải tính tốn tiết FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT kiệm phần tài nguyên nhỏ Bất thao tác sử dụng nhiều tài nguyên gây lỗi Hard Fault, Stack overflow… IDE gì, Text Editor gì, Compiler ? IDE (Integrated Development Environment) mơi trường tích hợp dùng để viết code để phát triển ứng dụng Ngồi IDE tích hợp sẵn tool hỗ trợ khác trình biên dịch (Compiler), trình thơng dịch (Interpreter), kiểm tra lỗi (Debugger), định dạng highlight code, tổ chức thư mục code, tìm kiếm code… Text Editor trình soạn thảo, khơng tích hợp sẵn trình biên dịch trình thơng dịch bên nó, nghĩa muốn chạy ứng dụng, bạn phải dùng riêng compiler bên Những Text Editor thường dùng cho phát triển ứng dụng web, tiêu biểu Sublime text, Atom, Bracket, Notepad++, VScode…v.v Compiler hay cịn gọi Trình biên dịch, chương trình có nhiệm vụ dịch các code ngơn ngữ lập trình tương ứng thành chương trình tương đương ngơn ngữ cấp thấp (thường ngơn ngữ máy) Q trình biên dịch chương trình C/C++ Quy trình dịch q trình chuyển đổi từ ngơn ngữ bậc cao sang ngôn ngữ máy Hiểu cách đơn giản, ngôn ngữ C, C++, Java, Python… ngôn ngữ lập trình viên Máy tính khơng thể hiểu ngôn ngữ Đối với ngôn ngữ máy tính có mức logic đặc trưng mức điện áp Chính cần q trình biên dịch ngôn ngữ người dùng sang ngôn ngữ máy Q trình bao gồm bước sau: • Giai đoạn tiền xử lý (Pre-processor): Giai đoạn thực nhận mã nguồn, xóa bỏ tất thích, comment chương trình, xử lý thị tiền xử lý Ví dụ #include, #define, #if, #elif… • Giai đoạn dịch Ngơn ngữ bậc cao sang Asembly (Compiler): Giai đoạn phân tích chuyển ngôn ngữ bậc cao sang ngôn ngữ bậc thấp assembly • Giai đoạn dịch asembly sang ngôn ngữ máy (Asembler): Giai đoạn dịch chương trình sang mã máy để file Object (.o) • Giai đoạn liên kết (Linker): Giai đoạn liên kết file Object tạo thành chương trình FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT biến int a khai báo file A.c file B.c muốn truy cập vào biến int a, cần extern biến int a Các bạn truy cập nhóm https://www.facebook.com/groups/deviot.vn để tìm hiểu thêm ví dụ phần 11 Từ khóa volatile Trong lập trình nhúng (Embedded System), ta thường hay gặp khai báo biến với từ khóa volatile Việc khai báo biến volatile cần thiết để tránh lỗi sai khó phát tính optimization compiler Cú pháp: volatile int var; int volatile var; Một biến cần khai báo dạng biến volatile nào? Khi mà giá trị thay đổi cách khơng báo trước Trong thực tế, có loại biến mà giá trị bị thay đổi vậy: • Memory-mapped peripheral registers (thanh ghi ngoại vi có ánh xạ đến nhớ) • Biến tồn cục truy xuất từ tiến trình xử lý ngắt (interrupt service routine) • Biến tồn cục truy xuất từ nhiều tác vụ ứng dụng đa luồng Ví dụ: Trong lập trình nhúng, hay gặp đoạn code ta khai báo biến đếm count, bấm nút xảy ngắt ngoài, tăng biến đếm count Tuy nhiên, bật tính tối ưu code compiler, hiểu biến dường không thay đổi giá trị phần mềm nên compiler có xu hướng loại bỏ biến count để tối ưu kích cỡ file code chạy sinh Các bạn truy cập nhóm https://www.facebook.com/groups/deviot.vn để tìm hiểu thêm ví dụ phần FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 38 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Buổi 4: Vòng lặp Điều kiện If, else if, else 1.1 Câu lệnh If Đây câu lệnh điều kiện để kiểm tra điều kiện có thỏa mãn không Nếu điều kiện thỏa mãn thực thi đoạn code bên Cấu trúc câu lệnh If if (điều kiện){ // Khối lệnh thực } Ví dụ: #include int main(){ int a; printf("Nhap a = "); scanf("%d", &a); if (a % == 0) // a chia hết cho { printf("%d la so chan", a); } printf("\nXong!"); } Kết quả: Nhap a = 2 la so chan Xong! 1.2 Câu lệnh If else Cấu trúc câu lệnh if else if (condition){ // statement1 // khối lệnh thực điều kiện }else{ // statement2 // khối lệnh thực điều kiện sai } Ví dụ: #include int main(){ int a; printf("Nhap a = "); scanf("%d", &a); FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 39 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT if (a % == 0) // a chia hết cho { printf("%d la so chan", a); }else{ printf("%d la so le", a); } } Kết quả: Nhap a = 1 la so le 1.3 Câu lệnh if … else if … else Cấu trúc if … else if … else if (test expression1) { // statement(1) } else if(test expression2) { // statement(2) } else if (test expression3) { // statement(3) } … else { // statement(n) } Ví dụ: #include int main(){ int a, b; printf("Nhap a = "); scanf("%d", &a); printf("Nhap b = "); scanf("%d", &b); // a, b if(a > b){ // printf("%d lon hon %d", a, b); }else if(a == b){ printf("%d bang %d", a, b); }else{ printf("%d nho hon %d", a, b); } } FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 40 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Kết quả: Nhap a = Nhap b = nho hon Các bạn truy cập nhóm https://www.facebook.com/groups/deviot.vn để tìm hiểu thêm ví dụ phần Lệnh switch case Lệnh switch case cấu trúc điều khiển & rẽ nhánh hồn tồn thay cấu trúc if else Tuy nhiên, việc sử dụng switch case giúp code dễ viết dễ đọc Một điều sử dụng switch case cho hiệu tốt so với sử dụng if else trường hợp có nhiều điều kiện xảy Cú pháp câu lệnh switch case: switch (expression) { case constant1: // statements break; case constant2: // statements break; default: // default statements } • expression phải bắt buộc giá trị hằng, biểu thức kết cần số Trong đó, expression so sánh với giá trị case • Nếu có case khớp giá trị, khối lệnh tương ứng sau case thực gặp lệnh break Do đó, khơng sử dụng break tất case kể từ case khớp giá trị thực • Case default thực khơng có case khớp giá trị với expression FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 41 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Sơ đồ khối mơ tả hoạt động: Ví dụ 1: #include int main() { int a, b; char opera; printf("\nNhap phep toan: "); FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 42 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT scanf("%c", &opera); printf("\nNhap vao so a, b: "); scanf("%d%d", &a, &b); switch (opera) { case '+': printf("%d + %d = %d", a, b, a + b); break; case '-': printf("%d - %d = %d", a, b, a - b); break; case '*': printf("%d * %d = %d", a, b, a * b); break; case '/': if(b == 0){ printf("Khong the chia cho 0!"); }else{ printf("%d / %d = %.2f", a, b, (float)a / b); } break; default: printf("Khong co phep toan %c!", opera); break; } } Kết quả: Nhap phep toan: + Nhap vao so a, b: 10 20 10 + 20 = 30 Ví dụ 2: #include int main() { int i=2; switch (i) { case 1: printf("Case1 "); case 2: printf("Case2 "); case 3: printf("Case3 "); case 4: printf("Case4 "); default: printf("Default "); } return 0; FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 43 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT } Kết quả: Case2 Case3 Case4 Default Các bạn truy cập nhóm https://www.facebook.com/groups/deviot.vn để tìm hiểu thêm ví dụ phần Vịng lặp for Mục đích vịng lặp để giải cơng việc có lặp lặp lại nhiều lần dòng code ngắn gọn Được sử dụng để lặp lặp lại khối code có số lần lặp xác định Cú pháp for (khởi tạo giá trị biến lặp; điều kiện lặp; cập nhật biến lặp) { // lệnh cần lặp } FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 44 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT Flowchart vịng lặp • B1: Khởi tạo giá trị biến lặp lần • B2: Kiểm tra điều kiện lặp, sai chuyển sang B5 • B3: Thực nội dung thân vòng lặp • B4: Cập nhật giá trị lặp quay lại B2 • B5: Kết thúc vịng lặp Ví dụ 1: int main() { int i; for (i = 1; i 15) { /* ket thuc vong lap a lon hon 15 */ break; } } return 0; } Kết Gia Gia Gia Gia Gia Gia tri tri tri tri tri tri cua cua cua cua cua cua a: a: a: a: a: a: 10 11 12 13 14 15 Các bạn truy cập nhóm https://www.facebook.com/groups/deviot.vn để tìm hiểu thêm ví dụ phần FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 51 Ngô Vũ Trường Giang Deviot – Cùng học lập trình IOT FACEBOOK: HTTPS://WWW.FACEBOOK.COM/GROUPS/DEVIOT.VN WEBSITE: HTTPS://DEVIOT.VN 52