Chương 1, các khái niệm cơ bản của ngôn ngữ C. GIỚI THIỆU NGÔN NGỮ C 1. Lịch sử ngôn ngữ lập trình C Lập trình cấu trúc là phƣơng pháp tổ chức, phân chia chƣơng trình thành các hàm, thủ tục, chúng đƣợc dùng để xử lý dữ liệu nhƣng lại tách rời các cấu trúc dữ liệu. Thông qua các ngôn ngữ Foxpro, Pascal, C, v.
đa số những ngƣời làm Tin học đã khá quen biết với phƣơng pháp lập trình này. Năm 1972, tại phòng thí nghiệm Bell, lập trình viên Dennis Ritchie đã tạo ra một ngôn ngữ mới có tên C. (Đƣợc dùng để thay thế ngôn ngữ lập trình cũ mà anh ta đang sử dụng là ngôn ngữ B. C có nguồn gốc từ ngôn ngữ BCPL do Martin Richards phát triển, BCPL sau đó đã đƣợc Ken Thompson phát triển thành ngôn ngữ B.
Trong khi BCPL và B không hỗ trợ kiểu dữ liệu, thì C đã có nhiều kiểu dữ liệu khác nhau. Những kiểu dữ liệu chính gồm: kiểu ký tự (character), kiểu số nguyên (interger) và kiểu số thực (float)). Ngôn ngữ C đƣợc thiết kế với một mục tiêu: Sử dụng để viết hệ điều hành. (Ban đầu, ngôn ngữ C đƣợc phát triển để sử dụng trong hệ điều hành UNIX.
Nó kế thừa nhiều tính năng của các ngôn ngữ trƣớc đây nhƣ B và BCPL). Ngôn ngữ cực kỳ đơn giản và linh hoạt và sớm đƣợc sử dụng cho nhiều loại chƣơng trình khác nhau. Nó nhanh chóng trở thành một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới. 21 Sự phổ biến của C là do hai yếu tố chính.
Đầu tiên là ngôn ngữ không cản trở lập trình viên. Anh ta có thể làm bất cứ điều gì bằng cách sử dụng cấu trúc C thích hợp. Lý do thứ hai mà C phổ biến là trình biên dịch C có sẵn cho hầu hết các máy tính. Do đó, mọi ngƣời có thể đính kèm trình biên dịch C cho máy của họ một cách dễ dàng và ít chi phí.
Các mã lệnh viết bằng C trên máy này có thể đƣợc biên dịch và chạy trên một máy khác chỉ cần thay đổi rất ít hoặc không phải thay đổi gì cả. Năm 1980, Bjarne Stroustrup bắt đầu làm việc với một ngôn ngữ mới, đƣợc gọi là “C++”. Ngôn ngữ này đƣợc cải thiện và tăng cƣờng trên C bằng cách thêm một số tính năng mới. Một trong những ngôn ngữ mới nhất, Java, dựa trên C++, Java là đƣợc thiết kế để trở thành “C++ với các lỗi đã đƣợc sửa”.
Các tính chất của ngôn ngữ C C là ngôn ngữ đƣợc sử dụng rộng rãi. C có những tính chất sau đây: - Đơn giản C là một ngôn ngữ đơn giản theo nghĩa nó cung cấp một cách tiếp cận có cấu trúc (để giải quyết vấn đề thành nhiều phần), tập hợp phong phú các hàm thư viện, kiểu dữ liệu, v. - Máy độc lập và linh hoạt Không giống như ngôn ngữ Assembly, các chương trình C có thể được thực thi trên các máy khác nhau với một số thay đổi cụ thể của máy. Do đó, C là một ngôn ngữ độc lập máy.
- Ngôn ngữ lập trình bậc trung Ban đầu, C được dự định để làm lập trình cấp thấp. Nó được sử dụng để phát triển các ứng dụng hệ thống như kernel, trình điều khiển, v. Nó cũng hỗ trợ các tính năng của ngôn ngữ cấp cao. Đó là lý do tại sao nó được gọi là ngôn ngữ bậc trung.
- Ngôn ngữ lập trình cấu trúc C là một ngôn ngữ lập trình cấu trúc theo nghĩa chúng ta có thể chia chương trình thành các phần bằng các hàm. Vì vậy, nó rất dễ hiểu và sửa đổi. Các hàm cũng cung cấp khả năng sử dụng lại mã. - Thƣ viện phong phú C cung cấp rất nhiều hàm sẵn có giúp phát triển nhanh chương trình.
- Quản lý bộ nhớ 22 C hỗ trợ tính năng phân bổ bộ nhớ động. Trong ngôn ngữ C, chúng ta có thể giải phóng bộ nhớ được phân bổ bất cứ lúc nào bằng cách gọi hàm free(). - Tốc độ nhanh Thời gian biên dịch và thực thi nhanh do ngôn ngữ C cung cấp sẵn các thư viện. - Con trỏ C cung cấp các tính năng của con trỏ.
Chúng ta có thể tương tác trực tiếp với bộ nhớ bằng cách sử dụng các con trỏ. Chúng ta có thể sử dụng các con trỏ cho bộ nhớ, cấu trúc, hàm, mảng, v. - Đệ quy Trong C, chúng ta có thể gọi hàm trong hàm. Nó cung cấp khả năng sử dụng lại mã cho mọi hàm.
Đệ quy cho phép lập trình viên sử dụng phương pháp quay lui. - Mở rộng Một lý do nữa cho việc C được sử dụng rộng rãi và hiệu quả là do các trình dịch, các thư viện và các phần mềm thông dịch của các ngôn ngữ bậc cao khác lại thường được tạo nên từ C. TẬP KÝ TỰ HỢP LỆ TRONG C 1. Tập ký tự Mỗi ngôn ngữ lập trình đều đƣợc xây dựng từ một bộ ký tự riêng của nó.
Các ký tự đƣợc nhóm lại theo nhiều cách khác nhau để tạo nên các từ. Sau đó các từ lại đƣợc liên kết theo một nguyên tắc nào đó để tạo thành các câu lệnh. Một chƣơng trình bao gồm nhiều câu lệnh để diễn đạt một thuật toán nào đó. Ngôn ngữ C đƣợc xây dựng trên bộ ký tự gồm: - 26 chữ cái latinh: a, b, c,…, x, y, z hoặc chữ cái hoa: A, B, C,.
- Các ký tự toán học: +, - , *, /, =, (, ),. - Ký tự gạch nối _ - Các ký tự đặc biệt khác nhƣ:. Lƣu ý: - Dấu cách thực sự là một khoảng cách dùng để tách các từ.1 “Ha noi” chứa 6 ký tự, bao gồm các ký tự H, a, dấu cách, n, o và i. “Hanoi” chứa 5 ký tự, bao gồm các ký tự H, a, n, o, i.
Từ khóa Trong ngôn ngữ C, từ khóa đƣợc xác định trƣớc, là các từ dành riêng đƣợc sử dụng trong lập trình, có ý nghĩa đặc biệt đối với trình biên dịch. Từ khóa là một phần của cú pháp và chúng không thể đƣợc sử dụng làm định danh.2 Cho khai báo: int bien_dem; Trong đó: int là từ khóa để chỉ ra rằng bien_dem là một biến kiểu int (kiểu số nguyên). Ngôn ngữ C phân biệt giữa hoa và chữ thƣờng, vì vậy tất cả các từ khóa phải đƣợc viết bằng chữ thƣờng. Sau đây là danh sách các từ khóa đƣợc sử dụng trong C: auto double int struct reak else long switch case enum register typedef char extern return union continue for signed void do if static while default goto sizeof volatile const float short unsigned 1.
Định danh Khái niệm định danh rất quan trọng trong quá trình lập trình, nó không những thể hiện rõ ý nghĩa trong chƣơng trình mà còn dùng để xác định các đại lƣợng khác nhau khi thực hiện chƣơng trình. Định danh thƣờng đƣợc đặt cho hằng, biến, mảng, con trỏ, nhãn, v. Chiều dài tối đa của định danh là 32 ký tự. Quy tắc đặt định danh: - Định danh phải là duy nhất.
- Một định danh hợp lệ chứa các chữ cái (cả chữ hoa và chữ thƣờng), chữ số, dấu gạch dƣới. 24 - Ký tự đầu tiên của định danh phải là chữ cái hoặc dấu gạch dƣới. - Không sử dụng từ khóa làm định danh. - Chiều dài tối đa của định danh là 32 ký tự.
Lƣu ý: Nên đặt định danh có ý nghĩa trong các bài toán cụ thể.3 Một số định danh đúng: delta, a_1, x, x1, x2, Num_ODD; Một số định danh sai: 3a_1 (ký tự đầu là số) a-1 (sử dụng dấu gạch ngang) int (đặt tên trùng với từ khóa) del ta (có khoảng trắng) g(x) (có dấu ngoặc tròn) Lƣu ý: Trong C, định danh đƣợc phân biệt bởi chữ hoa và chữ thƣờng. Ví dụ number khác Number; case khác Case (case là từ khóa, do đó bạn đặt tên là Case vẫn đúng). MỘT SỐ QUY ƢỚC KHI VIẾT CHƢƠNG TRÌNH 1. Chƣơng trình đầu tiên Một ví dụ kinh điển đƣợc sử dụng để giới thiệu trong hầu hết các ngôn ngữ lập trình, in ra màn hình console dòng “Hello, World”.h> 2 int main() 3 { 4 /* Chuong trinh dau tien trong C */ 5 printf("Hello, World!\n"); 6 return 0; 7 } - Sử dụng DevC, gõ các dòng code trên; - Lƣu chƣơng trình với tên hello.c - Nhấn F9 để biên dịch.
- Nhấn F10 để chạy chƣơng trình, dòng chữ “Hello, World” sẽ hiển thị trên màn hình console. Giải thích: 25 Dòng 1: #include <stdio.h>: bộ lệnh tiền xử lý, thông báo cho trình biên dịch C đã thêm tệp tiêu đề stdio.h trong chƣơng trình trƣớc khi biên dịch mã nguồn, stdio là các chuẩn đầu vào/đầu ra, cho phép sử dụng các lệnh đƣợc chứa trong tệp stdio.h Dòng 2: int main(): hàm chính, nơi bắt đầu thực thi chƣơng trình. Dòng 4: /* Chuong trinh dau tien trong C */: sẽ đƣợc trình biên dịch bỏ qua, đƣợc sử dụng để thêm các chú thích trong chƣơng trình. Dòng 5: printf("Hello, World! \n");: là một chức năng có sẵn trong C, hiển thị ra màn hình dòng Hello, World.
Dòng 6: return 0; : chấm dứt hàm main() và trả về giá trị 0. Cấu trúc chƣơng trình viết trong C Một chƣơng trình trong C đƣợc phân chia thành nhiều phần. Xem xét Ví dụ 1.4 sau đây: Ví dụ 1.4 Viết chƣơng trình tính tổng hai số nguyên a, b. 1 /* Phần tài liệu 2 * Vi_du_1_4.c - Le Thi Chi - - Mô tả tên tệp.
3 *Tinh tong cua hai so nguyen a - Tóm tắt nội dung của va b chƣơng trình.h> Phần liên kết.h> Phần liên kết bao gồm các tệp tiêu đề của các hàm thƣ viện chuẩn có thể đƣợc sử dụng trong chƣơng trình. 7 int tinhtong(int, int); Phần khai báo nguyên mẫu hàm. Khai báo các nguyên mẫu hàm đƣợc sử dụng trong chƣơng trình. 8 main() Phần hàm chính.
26 9 { Phần hàm main() là 10 int x, y, tong; phần quan trọng nhất của bất kỳ chƣơng 11 printf("Nhap x = "); trình C nào. Trình biên 12 scanf("%d", &x); dịch bắt đầu thực hiện 13 printf("Nhap y = "); chƣơng trình C từ hàm main(). Hàm main() là 14 scanf("%d", &y); bắt buộc trong lập 15 tong = tinhtong(x,y); trình C. Nó có hai 16 printf("Tong = %d ", tong); phần: 17 getch(); Phần khai báo: Tất cả các biến đƣợc sử dụng 18 } sau này trong phần thi hành đƣợc khai báo trong phần này.
Phần thực thi: Phần này chứa các câu lệnh sẽ đƣợc thực hiện bởi trình biên dịch. 19 int tinhtong(int a, int b) Phần chƣơng trình 20 { con: Chứa tất cả các hàm do ngƣời dùng 21 int t; định nghĩa. 22 t=a+b; Khi biên dịch chƣơng 23 return t; trình, căn cứ vào các 24 } lời gọi hàm, mà các mã chƣơng trình của các hàm tƣơng ứng đƣợc thực thi.