II. Các khái niệm cơ bản về C
Bên cạnh những khái niệm cơ bản trên, để hiểu rõ hơn về ngôn ngữ lập trình C, cần phải nắm vững một số khái niệm khác như:
Biến (Variable): là một vùng nhớ được đặt tên để lưu trữ giá trị và có thể được thay đổi giá trị trong quá trình chạy chương trình.
Hằng số (Constant): là một giá trị không thay đổi trong quá trình chạy chương trình, được đặt tên hoặc không đặt tên.
Kiểu dữ liệu (Data Type): là một thuộc tính quan trọng của biến để xác định kiểu giá trị mà biến có thể lưu trữ và các phép toán mà biến có thể thực hiện.
Câu lệnh (Statement): là một phần tử cơ bản trong ngôn ngữ lập trình C, thực hiện một hoạt động cụ thể như gán giá trị cho biến, tính toán, điều khiển luồng chương trình...
Hàm (Function): là một khối mã được định nghĩa và có thể tái sử dụng trong chương trình. Mỗi hàm thực hiện một công việc cụ thể và có thể nhận tham số đầu vào và trả về giá trị.
Mảng (Array): là một tập hợp các biến cùng kiểu dữ liệu được đặt tên và được lưu trữ liên tiếp trong bộ nhớ. Các phần tử của mảng có thể truy cập thông qua chỉ số.
Con trỏ (Pointer): là một biến đặc biệt lưu trữ địa chỉ bộ nhớ của một biến khác. Việc sử dụng con trỏ cho phép truy cập và thao tác với các vùng nhớ được cấp phát động trong quá trình chạy chương trình.
Các khái niệm trên sẽ được sử dụng rất nhiều trong ngôn ngữ lập trình C và là cơ sở để xây dựng các chương trình phức tạp hơn. Việc hiểu và sử dụng chúng hiệu quả sẽ giúp cho việc lập trình trở nên dễ dàng hơn.
A. Cú pháp và cấu trúc của ngôn ngữ C
Ngôn ngữ lập trình C có cú pháp đơn giản và dễ hiểu. Các chương trình được viết bằng C sẽ được biên dịch thành mã máy và thực thi trên máy tính. Để viết chương trình C, người lập trình cần phải nắm được các cấu trúc cơ bản của ngôn ngữ, bao gồm:
1. Khai báo biến
Trong C, người lập trình cần phải khai báo các biến trước khi sử dụng chúng trong chương trình. Cú pháp khai báo biến trong C là:
<kiểu dữ liệu> <tên biến>;
Ví dụ:
int a;
float b;
char c;
2. Câu lệnh điều kiện
Câu lệnh điều kiện được sử dụng để kiểm tra một điều kiện nào đó và thực hiện các hành động tương ứng với điều kiện đó. Cú pháp câu lệnh điều kiện trong C là:
if (<điều kiện>) {
// hành động nếu điều kiện đúng
} else {
// hành động nếu điều kiện sai
}
3. Vòng lặp
Vòng lặp được sử dụng để lặp lại một tập hợp các hành động nhiều lần. Cú pháp vòng lặp trong C bao gồm hai loại: vòng lặp while và vòng lặp for.
a. Vòng lặp while
while (<điều kiện>) {
// hành động
}
b. Vòng lặp for
for (khởi tạo; <điều kiện>; bước nhảy) {
// hành động
}
4. Hàm
Hàm trong C là một khối mã được đóng gói và có thể tái sử dụng. Cú pháp khai báo hàm trong C là:
<kiểu dữ liệu trả về> <tên hàm>(<các tham số>) {
// các câu lệnh trong hàm
}
Ví dụ:
int tinh_tong(int a, int b) {
int tong = a + b;
return tong;
}
Trên đây là một số cấu trúc cơ bản của ngôn ngữ C. Việc nắm vững các cấu trúc này sẽ giúp người lập trình dễ dàng hơn trong việc viết và hiểu các chương trình bằng ngôn ngữ C.
B. Biến và kiểu dữ liệu trong C
1. Biến trong C
Trong C, biến là một vùng lưu trữ trong bộ nhớ được sử dụng để lưu giữ giá trị của một dữ liệu nhất định. Mỗi biến sẽ được đặt tên và có một kiểu dữ liệu xác định kiểu dữ liệu của giá trị mà nó có thể lưu trữ.
2. Kiểu dữ liệu trong C
Kiểu dữ liệu xác định loại giá trị mà một biến có thể chứa. Các kiểu dữ liệu cơ bản trong C bao gồm:
Kiểu số nguyên: int
Kiểu số thực: float, double
Kiểu ký tự: char
Ngoài các kiểu dữ liệu cơ bản, C cũng cho phép định nghĩa các kiểu dữ liệu phức tạp hơn như kiểu struct, kiểu liệt kê và kiểu con trỏ.
3. Khai báo biến trong C
Để khai báo một biến trong C, ta cần chỉ định tên biến và kiểu dữ liệu của nó. Ví dụ:
int age;
float salary;
char grade;
Trong đó, biến age
có kiểu dữ liệu là int
, biến salary có kiểu dữ liệu là float
, và biến grade
có kiểu dữ liệu là char
.
4.Gán giá trị cho biến trong C
Để gán giá trị cho một biến trong C, ta sử dụng toán tử gán =. Ví dụ:
age = 30;
salary = 1500.50;
grade = 'A';
5. Ép kiểu trong C
Khi muốn chuyển đổi kiểu dữ liệu của một biến sang kiểu dữ liệu khác, ta có thể sử dụng các toán tử ép kiểu. Ví dụ:
int num1 = 10;
float num2 = 3.5;
float result = (float)num1 / num2; // Ép kiểu num1 sang float trước khi thực hiện phép chia
Trong ví dụ trên, ta ép kiểu biến num1
sang kiểu float
trước khi thực hiện phép chia với biến num2
.
6. Con trỏ trong C
Con trỏ là một biến đặc biệt trong C, nó lưu trữ địa chỉ bộ nhớ của một biến khác. Ví dụ:
int num = 10;
int *ptr;
ptr = # // Gán địa chỉ của biến num cho con trỏ ptr
printf("Giá trị của biến num: %d\n", num); // In ra giá trị của biến num
C. Câu lệnh trong C
1. Câu lệnh gán (Assignment statement)
Câu lệnh gán trong C được sử dụng để gán giá trị cho biến. Cú pháp của câu lệnh gán là:
biến = giá_trị;
Ví dụ:
int x;
x = 10;
Trong ví dụ trên, giá trị 10 được gán cho biến x kiểu int.
2. Câu lệnh điều kiện (Conditional statement)
Câu lệnh điều kiện trong C được sử dụng để kiểm tra một điều kiện và thực hiện một hành động tương ứng nếu điều kiện đó đúng. Cú pháp của câu lệnh điều kiện là:
if (điều_kiện) {
// Hành động được thực hiện nếu điều kiện đúng
}
Ví dụ:
int x = 10;
if (x > 5) {
printf("x lon hon 5");
}
Trong ví dụ trên, câu lệnh printf sẽ được thực hiện nếu biến x có giá trị lớn hơn 5.
3. Câu lệnh vòng lặp (Loop statement)
Câu lệnh vòng lặp trong C được sử dụng để lặp lại một hành động nhiều lần. Có hai loại câu lệnh vòng lặp trong C là for và while.
- Câu lệnh vòng lặp for
Cú pháp của câu lệnh vòng lặp for là:
for (biểu_thức1; điều_kiện; biểu_thức2) {
// Hành động được lặp lại nhiều lần
}
Trong đó, biểu_thức1 được thực hiện một lần duy nhất khi vòng lặp bắt đầu, điều_kiện được kiểm tra trước mỗi lần lặp, nếu đúng thì hành động được lặp lại, còn nếu sai thì vòng lặp kết thúc, và biểu_thức2 được thực hiện sau mỗi lần lặp.
Ví dụ:
for (int i = 0; i < 10; i++) {
printf("%d ", i);
}
Trong ví dụ trên, vòng lặp sẽ được thực hiện 10 lần, và câu lệnh printf sẽ in ra giá trị của biến i.
- Câu lệnh vòng lặp while
Cú pháp của câu lệnh vòng lặp while là:
while (điều_kiện) {
// Hành động được lặp lại
}
D. Hàm trong C
1. Khái niệm và cú pháp
Hàm là một khối mã được định nghĩa để thực hiện một tác vụ cụ thể và có thể được gọi từ các phần khác của chương trình. Trong C, hàm được định nghĩa bởi cú pháp sau:
kiểu_dữ_liệu tên_hàm(tham_số 1, tham_số 2, ..., tham_số n) {
// Khối lệnh
}
Trong đó:
kiểu_dữ_liệu là kiểu dữ liệu của giá trị trả về của hàm. Nếu hàm không trả về giá trị, kiểu dữ liệu là void.
tên_hàm là tên của hàm, đặt theo quy tắc đặt tên biến.
tham_số1, tham_số2, ..., tham_sốn là các tham số đầu vào của hàm, được định nghĩa với kiểu dữ liệu tương ứng.
Ví dụ, đây là định nghĩa của một hàm đơn giản có tên tong_hai_so trong C:
int tong_hai_so(int a, int b) {
int tong = a + b;
return tong;
}
Hàm này nhận vào hai tham số a và b, tính tổng của chúng và trả về giá trị tổng đó.
2.Gọi hàm
Để gọi một hàm trong C, ta sử dụng cú pháp sau:
ten_ham(tham_so1, tham_so2, ..., tham_son);
Ví dụ, để gọi hàm tong_hai_so ở ví dụ trên, ta có thể sử dụng câu lệnh sau:
int ket_qua = tong_hai_so(3, 5);
Kết quả của hàm tong_hai_so với tham số a = 3
và b = 5
sẽ được gán vào biến ket_qua
.
3.Hàm đệ quy
Hàm đệ quy là hàm gọi chính nó. Trong C, ta có thể sử dụng hàm đệ quy để giải quyết một số bài toán đơn giản, như tính giai thừa hay dãy Fibonacci. Ví dụ, đây là định nghĩa của hàm tính giai thừa bằng đệ quy trong C:
int giai_thua(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * giai_thua(n - 1);
}
}
Hàm giai_thua
tính giai thừa một số n, được gọi chính nó trong hàm giai_thua