http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Mục lục Giới thiệu Ngơn ngữ C Đối với độc giả Điều kiện tiền đề Tổng quan Ngôn ngữ C Sự thật ngôn ngữ C Tại lại sử dụng C? Chương trình C Cài đặt môi trường C Cài đặt môi trường cục - Local Text Editor Bộ biên dịch C Cài đặt môi trường UNIX/Linux Cài đặt môi trường Mac OS Cài đặt Windows 10 Cấu trúc chương trình C 10 Chương trình C: Hello World 10 Biên dịch & Thực thi Chương trình C 11 Cú pháp C 12 Các Token C 12 Dấu chấm phảy ; C 12 Comment C 13 Định danh (Identifier) C 13 Các từ khóa C 13 Khoảng trắng C 14 Kiểu liệu C 14 Kiểu integer 15 Kiểu dấu chấm động (Floating-Point) 17 http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Kiểu void 18 Biến C 19 Định nghĩa biến ngôn ngữ C: 19 Khai báo biến ngôn ngữ C: 20 Ví dụ 21 Lvalue Rvalue C: 22 Hằng số C 23 Hằng số nguyên - Interger 23 Hằng số dấu chấm động 24 Hằng số ký tự 24 Hằng số chuỗi (string) 26 Định nghĩa số 26 Sử dụng tiền xử lý #define 26 Sử dụng từ khóa const 27 Lớp lưu trữ C 28 Lớp lưu trữ auto 28 Lớp lưu trữ register 29 Lớp lưu trữ static 29 Lớp lưu trữ extern 30 Toán tử C 31 Toán tử số học 32 Toán tử quan hệ 33 Toán tử logic 34 Toán tử so sánh bit 35 Toán tử gán 38 Các toán tử hỗn hợp ↦ sizeof & ternary 40 Thứ tự ưu tiên toán tử C 41 Điều khiển luồng C 43 Toán tử ? : 44 http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Vòng lặp C 44 Các lệnh điều khiển vòng lặp 46 Vòng lặp vô hạn 46 Hàm C 47 Định nghĩa hàm 47 Ví dụ: 48 Khai báo hàm 49 Gọi hàm 49 Tham số hàm: 50 Quy tắc phạm vi C 51 Biến cục 52 Biến toàn cục 52 Tham số thức 54 Khởi tạo biến toàn cục biến cục 55 Mảng Ngôn ngữ C 55 Khai báo mảng C 56 Khởi tạo mảng C 56 Truy cập phần tử mảng C 57 Chi tiết mảng C 58 Con trỏ C 59 Con trỏ gì? 60 Cách sử dụng trỏ? 61 Con trỏ NULL ngôn ngữ C 62 Chi tiết trỏ: 62 Chuỗi C 63 Cấu trúc C 66 Định nghĩa cấu trúc 66 Truy cập thành phần cấu trúc 67 Các cấu trúc tham số hàm 69 http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Con trỏ tới cấu trúc 71 Các trường bit - Bit Fields 73 Union C 73 Định nghĩa Union 74 Truy xuất thành viên Union 75 Trường Bit C 77 Khai báo Trường Bit 79 Từ khóa typedef C 81 typedef vs #define 82 Input & Output C 83 Các File tiêu chuẩn 84 Hàm getchar() & putchar() 84 Hàm gets() & puts() 85 Hàm scanf() printf() 86 Nhập - Xuất File C 87 Mở file 87 Đóng file 88 Ghi file 89 Đọc file 89 Hàm Nhập – Xuất nhị phân 91 Bộ tiền xử lý C 91 Ví dụ tiền xử lý 92 Các Macro định nghĩa trước 93 Toán tử tiền xử lý 95 Phần tiếp tục macro (\) 95 Dấu thăng (#) 95 Toán tử Token Pasting (##) 95 Toán tử defined() 96 Macro tham số 97 http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Header File C 98 Cú pháp Include 98 Hoạt động Include 98 Once-Only Header 99 Include với điều kiện 99 Ép kiểu C 100 Sự nâng cấp integer 101 Phép chuyển đổi số học thông thường 102 Xử lý lỗi C 103 Hàm perror() strerror() thông báo lỗi errno 103 Lỗi chia cho số 105 Trạng thái chương trình 105 Đệ quy C 106 Tính tốn giai thừa 107 Dãy Fibonacci 108 Tham số biến C 108 Quản lý nhớ C 111 Cấp phát nhớ động 111 Thay đổi giải phóng nhớ 113 Tham số dòng lệnh C 114 C - Tài liệu tham khảo 117 Các đường link hữu ích C 117 http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Giới thiệu Ngôn ngữ C Ngôn ngữ C ngôn ngữ chương trình máy tính theo câu lệnh, thủ tục theo mục đích chung phát triển năm 1972 Dennis M Ritchie Bell Telephone lab để phát triển Hệ điều hành UNIX Ngôn ngữ C ngôn ngữ máy tính sử dụng rộng rãi nhất, với ngơn ngữ Java ngơn ngữ lập trình phổ biến hàng đầu, sử dụng rộng rãi giới lập trình viên đại Loạt hướng dẫn dựa nguồn tài liệu của: Tutorialspoint Đối với độc giả Bài hướng dẫn thiết kế cho lập trình viên cần tìm hiểu ngôn ngữ C ngôn ngữ bắt đầu cho việc tiếp cận giới phần mềm Bài hướng dẫn đưa cho bạn đầy đủ hiểu biết ngôn ngữ C từ bắt đầu đến mức nâng cao Điều kiện tiền đề Trước bắt đầu với học này, bạn nên có hiểu biết thuật ngữ Chương trình máy tính Những hiểu biết ngôn ngữ lập trình giúp bạn dễ dàng hiểu khái niệm ngôn ngữ C tiến nhanh đường học tập Tổng quan Ngôn ngữ C Ngơn ngữ C ngơn ngữ lập trình bậc cao phát triển ban đầu Dennis M.Ritchie để phát triển hệ thống lập trình UNIX Bell Labs C phát triển ban đầu máy tính DEC PDP-11 năm 1972 Năm 1978, Brian Kernighan Dennis Ritchie công khai mô tả ngôn ngữ C, biết đến tên tiêu chuẩn K&R Hệ điều hành UNIX, biên dịch C, tất cần thiết cho việc viết chương trình với ngơn ngữ C Ngơn ngữ C sử dụng rộng rãi môi trường chuyên nghiệp lý sau đây: Dễ dàng việc học http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Ngơn ngữ có cấu trúc Nó cung cấp chương trình hiệu Nó xử lý hoạt động tầng thấp Nó biên dịch nhiều tảng khác Copyright © vietjack.com Sự thật ngơn ngữ C C phát triển ban đầu để viết Hệ điều hành có tên UNIX C ngôn ngữ kế thừa ngôn ngữ B giới thiệu năm 1970 Ngơn ngữ chuẩn hóa năm 1988 Viện tiêu chuẩn quốc gia Hoa Kỳ (ANSI) Hệ điều hành UNIX viết ngôn ngữ C năm 1973 Ngày C sử dụng rộng rãi ngơn ngữ lập trình hệ thống Hầu hết ứng dụng lớn có kế thừa, triển khai từ ngôn ngữ C Hệ điều hành Linux hệ quản trị sở liệu MySQL viết ngôn ngữ C Tại lại sử dụng C? C phát triển ban đầu cho việc phát triển hệ thống, đặc biệt hệ điều hành C thừa nhận ngôn ngữ phát triển hệ thống cung cấp code chạy đoạn code nhanh chóng ngơn ngữ kiểu Assemly Vài ví dụ sử dụng C sau: Hệ điều hành Bộ biên dịch ngôn ngữ Các chương trình dịch mã số Các trình Text Editor (notepad ) Các trình in ấn Network Drivers Các chương trình đại http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Cơ sở liệu Ngôn ngữ thông dịch Tiện ích Copyright © vietjack.com Chương trình C Một chương trình C thay đổi từ dòng đến hàng triệu dòng code, nên viết nhiều file với định dạng “.c”, ví dụ hello.c Bạn sử dụng “vi”, “vim” trình editor để viết chương trình C thành file Bài hướng dẫn giả sử bạn biết cách sử dụng trình soạn thảo cách viết source code - mã nguồn bên file chương trình Cài đặt mơi trường C Cài đặt mơi trường cục - Local Nếu bạn muốn cài đặt chương trình C, bạn cần phải sử dụng phần mềm máy tính bạn: (a) Chương trình soạn văn - Text Editor (b) Bộ biên dịch C Text Editor Được sử dụng để soạn thảo chương trình Ví dụ vài trình editor Window Notepad, Notepad ++, vim hay vi… Tên phiên trình editor thay đổi theo hệ điều hành Ví dụ, Notepad sử dụng Windows, vim hay vi sử dụng Linux UNIX Các file bạn tạo trình editor gọi source file (file nguồn) chứa chương trình code Các file chương trình C thường đặt tên với phần mở rộng ".c" Trước bắt đầu chương trình bạn, chắn bạn có trình editor máy tính bạn có đủ kinh nghiệm để viết chương trình máy tính, lưu trữ file thực thi Bộ biên dịch C Mã nguồn viết file nguồn dạng đọc Nó biên dịch thành mã máy, CPU thực chương trình dựa lệnh viết http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Bộ biên dịch sử dụng để biên dịch mã nguồn (source code) bạn đến chương trình thực thi Tơi giả sử bạn có kiến thức biên dịch ngơn ngữ lập trình Bộ biên dịch thông dụng biên dịch GNU C/C++, mặt khác bạn có biên dịch khác HP Solaris với Hệ điều hành tương ứng Dưới phần hướng dẫn giúp bạn cách cài đặt biên dich GNU C/C++ hệ điều hành khác Tôi đề cập đến C/C++ biên dịch GNU gcc hoạt động cho ngôn ngữ C C++ Cài đặt môi trường UNIX/Linux Nếu bạn sử dụng Linux UNIX, bạn kiểm tra GCC cài đặt môi trường bạn chưa lệnh sau đây: $ gcc -v Nếu bạn có cài đặt GNU máy tính bạn, sau phản hồi thông báo sau: Using built-in specs Target: i386-redhat-linux Configured with: /configure prefix=/usr Thread model: posix gcc version 4.1.2 20080704 (Red Hat 4.1.2-46) Nếu GCC chưa cài đặt, bạn cài đặt với hướng dẫn đường link đây: http://gcc.gnu.org/install/ Bài hướng dẫn viết dựa Linux tất ví dụ dược biên dịch Cent OS hệ thống Linux Cài đặt môi trường Mac OS Nếu bạn sử dụng hệ điều hành Mac OS X, cách đơn giản để có GCC download mơi trường phát triển Xcode, bạn sử dụng biên dịch GNU cho C/C++ Xcode sẵn link sau: developer.apple.com/technologies/tools/ http://vietjack.com/ Trang chia sẻ học online miễn phí Trang http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Cài đặt Windows Để cài đặt GCC Windows bạn cần phải cài đặt MinGW Để cài đặt MinGW, bạn truy cập vào www.mingw.org, theo hướng dẫn trang download Download phiên cho chương trình MinGW, tên MinGW-.exe Khi cài đặt MinWG, bạn phải cài đặt gcc-core, gcc-g++, binutils MinGW runtime, bạn cài đặt nhiều Thêm thư mục bin nơi cài đặt MinGW vào biến môi trường PATH bạn, bạn sử dụng trực tiếp công cụ dạng command line dễ dàng Khi q trình cài đặt hồn tất, bạn chạy gcc, g++, ar, ranlib, dlltool công cụ GNU khác Windows command line Cấu trúc chương trình C Trước nghiên cứu khối tạo nên chương trình C, bạn xem chương trình C mẫu Chương trình C: Hello World Một chương trình C bao gồm phần sau đây: Các lệnh tiền xử lý Các hàm Các biến Các lệnh biểu thức Các comment Đầu tiên xem đoạn code đơn giản mà in hình hai từ “Hello World”: #include int main() { http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 10 http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com main() { int i = 17; char c = 'c'; /* ascii value is 99 */ float sum; sum = i + c; printf("Value of sum : %f\n", sum ); } Khi đoạn code biên dịch thực thi, cho kết sau: Value of sum : 116.000000 Ở đây, cách đơn giản để hiểu giá trị c chuyển thành integer, giá trị cuối double, phép chuyển đổi số học thông thường áp dụng biên dịch biến đổi i c thành kiểu float lấy kết phép cộng chuyển sang kiểu float Xử lý lỗi C Các ngôn ngữ lập trình ngơn ngữ C khơng cung cấp trực tiếp hỗ trợ việc xử lý lỗi ngơn ngữ chương trình hệ thống, cung cấp mức thấp dạng giá trị trả Hầu hết hàm C hàm Unix trả giá trị null trường hợp lỗi thiết lập mã lỗi errno cho biến tồn cục dẫn có lỗi xảy q trình gọi hàm Bạn tìm thấy nhiều mã lỗi khác Header file có tên Vì lập trình viên C kiểm tra giá trị trả thực hành động xác dựa vào giá trị trả Trong thực tế, lập trình viên nên thiết lập giá trị errno thời điểm khởi tạo chương trình Một giá trị thể khơng có lỗi chương trình Hàm perror() strerror() thơng báo lỗi errno Ngơn ngữ chương trình C cung cấp hàm perror() strerror() sử dụng để hiển thị thông báo lỗi errno Hàm perror() hiển thị chuỗi mà bạn truyền cho nó, theo sau dấu hai chấm, khoẳng trắng sau đoạn văn mơ tả giá trị lỗi http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 103 http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Hàm strerror() trả trỏ đến đoạn văn biểu diễn giá trị lỗi Cùng thử mô điều kiện lỗi thử mở file không tồn Tại sử dụng hai hàm để cách sử dụng, bạn sử dụng nhiều cách để in giá trị lỗi bạn Điểm quan trọng thứ cần ghi nhớ bạn nên sử dụng stderr để đưa tất lỗi #include #include #include extern int errno ; int main () { FILE * pf; int errnum; pf = fopen ("unexist.txt", "rb"); if (pf == NULL) { errnum = errno; fprintf(stderr, "Value of errno: %d\n", errno); perror("Error printed by perror"); fprintf(stderr, "Error opening file: %s\n", strerror( errnum )); } else { fclose (pf); } return 0; } Khi đoạn code biên dịch thực hiện, in kết sau: Value of errno: Error printed by perror: No such file or directory http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 104 http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Error opening file: No such file or directory Lỗi chia cho số Đây lỗi phổ biến trình chia, lập trình viên không kiểm tra điều kiện số bị chia số gặp lỗi q trình thực Đoạn code bên sửa lỗi việc kiểm tra điều kiện số bị chia số trước chia: #include #include main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "Division by zero! Exiting \n"); exit(-1); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d\n", quotient ); exit(0); } Khi đoạn code biên dịch thực in kết sau: Division by zero! Exiting Trạng thái chương trình Trong thực tế để chương trình với giá trị EXIT_SUCCESS trường hợp chương trình sau hoạt động thành cơng Ở EXIT_SUCCESS macro định nghĩa giá trị http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 105 http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Nếu bạn có điều kiện lỗi chương trình bạn, bạn nên thoát với trạng thái trả EXIT_FAILURE định nghĩa có giá trị -1 Bây viết chương trình sau: #include #include main() { int dividend = 20; int divisor = 5; int quotient; if( divisor == 0){ fprintf(stderr, "Division by zero! Exiting \n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d\n", quotient ); exit(EXIT_SUCCESS); } Kết in sau chương trình thực sau: Value of quotient : Đệ quy C Đệ quy trình lặp lặp lại thành phần theo cách Dưới ví dụ minh họa tổng quát: void recursion() { recursion(); /* function calls itself */ } http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 106 http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com int main() { recursion(); } Ngơn ngữ lập trình C hỗ trợ đệ quy, ví dụ, hàm gọi đến Nhưng bạn sử dụng hàm đệ quy, lập trình viên cần phải cẩn thận định nghĩa điều kiện thoát khỏi hàm, phòng gặp phải vòng lặp vơ hạn Hàm lặp đệ quy hữu dụng để giải vấn đề tốn học tính tốn giai thừa, tạo dãy Fibonacci, … Tính tốn giai thừa Dưới ví dụ, tính tốn giai thừa số cho trước sử dụng hàm đệ quy: #include int factorial(unsigned int i) { if(i ) { printf("Too many arguments supplied.\n"); } else { printf("One argument expected.\n"); } } Khi đoạn code biên dịch thực thi với tham số, in kết sau: $./a.out testing The argument supplied is testing Khi bạn truyền tham số cho đoạn code in kết sau đây: $./a.out testing1 testing2 Too many arguments supplied Khi đoạn code thực thực thi với khơng có tham số truyền vào, in kết đây: $./a.out http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 115 http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com One argument expected Chú ý argv[0] giữ giá trị tên chương trình argv[1] trỏ đến tham số dòng lệnh cung cấp, argv[n] tham số cuối Nếu khơng có tham số cung cấp, argc 1, bạn truyền tham số sau argc có giá trị Bạn truyền tất tham số dòng lệnh riêng rẽ khoảng trắng, tham số tự có khoảng trắng bạn truyền tham số đặt chúng dấu trích dẫn kép (“”) trích dẫn đơn („‟) Bây viết lại chương trình bạn in tên chương trình truyền tham số dòng lệnh đặt bên dấu trích dẫn kép (“”) #include int main( int argc, char *argv[] ) { printf("Program name %s\n", argv[0]); if( argc == ) { printf("The argument supplied is %s\n", argv[1]); } else if( argc > ) { printf("Too many arguments supplied.\n"); } else { printf("One argument expected.\n"); } } Khi đoạn code biên dịch thực với tham số đơn riêng rẽ dấu cách bên dấu trích dẫn kép, kết sau in ra: $./a.out "testing1 testing2" http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 116 http://vietjack.com/cprogramming/index.jsp Copyright © vietjack.com Progranm name /a.out The argument supplied is testing1 testing2 C - Tài liệu tham khảo Các tài liệu chứa thơng tin hữu ích Ngơn ngữ C Bạn nên sử dụng chúng để nâng cáo kiến thức hiểu chủ đề loạt hướng dẫn Các đường link hữu ích C Tutorialspoint − Loạt hướng dẫn xây dựng dựa nguồn Compile and Execute C Online − Biên dịch thực thi chương trình C trực tuyến History of C − Sự phát triển Ngôn ngữ C, Dennis M Ritchie Notes on K&R2 − Một sách hướng dẫn tuyệt vời K&R2 Programming in C − Các tác phẩm, lịch sử, văn hóa Ngơn ngữ chương trình C Learn GNU Debugger - GDB − Một cơng cụ để dubug lỗi chương trình C C++ Unix Makefile − Một file dẫn chương trình cách biên dịch kết nối chương trình C C++ C++ tutorial − Nếu bạn làm việc với C lúc nên tìm hiểu C++ http://vietjack.com/ Trang chia sẻ học online miễn phí Trang 117