III. Các cấu trúc điều khiển và lệnh trong C
A. Các câu lệnh điều khiển cơ bản: if-else, switch-case
Các câu lệnh điều khiển trong C là những công cụ quan trọng giúp kiểm soát việc thực thi chương trình. Trong đó, if-else và switch-case là hai cấu trúc điều khiển cơ bản được sử dụng rộng rãi trong ngôn ngữ lập trình C.
1. Câu lệnh điều kiện if-else
Câu lệnh if-else cho phép thực hiện một hành động tùy thuộc vào giá trị của biểu thức điều kiện. Nếu giá trị đó đúng, chương trình sẽ thực hiện các câu lệnh trong khối if, còn nếu sai, chương trình sẽ thực hiện các câu lệnh trong khối else.
Cú pháp :
if (biểu thức điều kiện) {
// các câu lệnh được thực thi nếu giá trị điều kiện là đúng
} else {
// các câu lệnh được thực thi nếu giá trị điều kiện là sai
}
Ví dụ :
int a = 10;
if (a > 0) {
printf("a la so duong");
} else {
printf("a la so am hoac bang 0");
}
Một số bài tập về câu lệnh if else và bài giải
1.1. Viết chương trình yêu cầu người dùng nhập vào một số và kiểm tra xem số đó là số âm hay số dương.
Bài giải :
#include <stdio.h>
int main() {
int num;
printf("Nhap so: ");
scanf("%d", &num);
if (num > 0) {
printf("So duong");
} else if (num < 0) {
printf("So am");
} else {
printf("Khong phai so am cung khong phai so duong");
}
return 0;
}
1.2. Viết chương trình yêu cầu người dùng nhập vào hai số và in ra số lớn nhất.
Bài giải :
#include <stdio.h>
int main() {
int num1, num2;
printf("Nhap so thu nhat: ");
scanf("%d", &num1);
printf("Nhap so thu hai: ");
scanf("%d", &num2);
if (num1 > num2) {
printf("So lon hon la: %d", num1);
} else if (num1 < num2) {
printf("So lon hon la: %d", num2);
} else {
printf("Hai so bang nhau");
}
return 0;
}
1.3. Viết chương trình yêu cầu người dùng nhập vào một ký tự và kiểm tra xem ký tự đó là chữ cái hoa hay chữ cái thường hay không phải chữ cái.
Bài giải :
#include <stdio.h>
int main() {
char c;
printf("Nhap mot ky tu: ");
scanf("%c", &c);
if (c >= 'A' && c <= 'Z') {
printf("%c la chu cai hoa", c);
} else if (c >= 'a' && c <= 'z') {
printf("%c la chu cai thuong", c);
} else {
printf("%c khong phai la chu cai", c);
}
return 0;
}
2. Câu lệnh điều kiện switch-case
Câu lệnh switch-case cho phép thực hiện một hành động tùy thuộc vào giá trị của biến. Nếu giá trị đó bằng với một trong các giá trị được khai báo trong các trường hợp case, chương trình sẽ thực hiện các câu lệnh trong khối đó.
Cú pháp:
switch (biến) {
case giá trị 1:
// các câu lệnh được thực thi nếu biến có giá trị bằng giá trị 1
break;
case giá trị 2:
// các câu lệnh được thực thi nếu biến có giá trị bằng giá trị 2
break;
...
default:
// các câu lệnh được thực thi nếu không có giá trị case nào trùng với giá trị của biến
}
Ví dụ :
char c = 'a';
switch (c) {
case 'a':
printf("c la chu a");
break;
case 'b':
printf("c la chu b");
break;
default:
printf("c khong phai chu a hoac b");
}
B. Các vòng lặp: for, while, do-while
Trong ngôn ngữ lập trình C, vòng lặp là một công cụ quan trọng để thực hiện một tác vụ nhiều lần. Có ba loại vòng lặp phổ biến trong C: for, while và do-while.
1.Vòng lặp for
Vòng lặp for cho phép thực hiện một tác vụ nhiều lần với số lần lặp được xác định trước. Vòng lặp for bao gồm ba phần: khởi tạo giá trị ban đầu, kiểm tra điều kiện lặp và cập nhật giá trị sau mỗi lần lặp.
Cú pháp:
for (khởi tạo giá trị ban đầu; kiểm tra điều kiện lặp; cập nhật giá trị){
// các câu lệnh được thực thi trong vòng lặp
}
Ví dụ:
for (int i = 0; i < 10; i++) {
printf("%d ", i);
}
// in ra các số từ 0 đến 9
Ví dụ 2 :
Viết chương trình yêu cầu người dùng nhập vào một số và kiểm tra xem số đó có phải là số nguyên tố hay không.
#include <stdio.h>
int main() {
int num, i, flag = 0;
printf("Nhap so: ");
scanf("%d", &num);
for (i = 2; i <= num / 2; ++i) {
// Kiểm tra nếu số num có thể chia hết cho i mà không dư thì nó không phải là số nguyên tố
if (num % i == 0) {
flag = 1;
break;
}
}
if (num == 1) {
printf("1 khong phai la so nguyen to");
} else {
if (flag == 0) {
printf("%d la so nguyen to", num);
} else {
printf("%d khong phai la so nguyen to", num);
}
}
return 0;
}
2.Vòng lặp while
Vòng lặp while cho phép thực hiện một tác vụ nhiều lần trong khi một điều kiện nào đó đúng. Trong khi điều kiện còn đúng, các lệnh trong vòng lặp sẽ được thực thi.
Cú pháp:
while (điều kiện){
// các câu lệnh được thực thi trong vòng lặp
}
Ví dụ:
int i = 0;
while (i < 10) {
printf("%d ", i);
i++;
}
// in ra các số từ 0 đến 9
3. Vòng lặp do-while
Vòng lặp do-while tương tự như vòng lặp while, tuy nhiên các lệnh trong vòng lặp sẽ được thực thi ít nhất một lần trước khi kiểm tra điều kiện.
Cú pháp:
do {
// các câu lệnh được thực thi trong vòng lặp
} while (điều kiện);
Ví dụ:
int i = 0;
do {
printf("%d ", i);
i++;
} while (i < 10);
// in ra các số từ 0 đến 9
Sử dụng chính xác các vòng lặp for, while và do-while là rất quan trọng để đảm bảo tính logic và hiệu suất của chương trình trong việc thực hiện các tác vụ lặp lại nhiều lần.
C. Các lệnh điều khiển khác: break, continue, goto
Trong lập trình, các lệnh điều khiển được sử dụng để kiểm soát luồng thực hiện của chương trình. Trong bài viết này, chúng ta sẽ tìm hiểu về 3 lệnh điều khiển: break
, continue
và goto
.
1.Lệnh break
Lệnh break
được sử dụng để kết thúc một vòng lặp hoặc một switch case
ngay lập tức nếu điều kiện được xác định.
Ví dụ:
for(int i=0; i<10; i++){
if(i==5){
break;
}
printf("%d ",i);
}
Kết quả của đoạn code trên sẽ là: 0 1 2 3 4
Như bạn có thể thấy, vòng lặp for được thực thi cho đến khi i = 5, sau đó lệnh break được thực hiện và kết thúc vòng lặp ngay lập tức.
2. Lệnh continue
Lệnh continue được sử dụng để bỏ qua các câu lệnh trong vòng lặp và chuyển đến vòng lặp tiếp theo.
Ví dụ:
for(int i=0; i<10; i++){
if(i==5){
continue;
}
printf("%d ",i);
}
Kết quả của đoạn code trên sẽ là: 0 1 2 3 4 6 7 8 9
Như bạn có thể thấy, khi i = 5, câu lệnh printf không được thực hiện và chương trình tiếp tục với giá trị của i là 6.
3. Lệnh goto
Lệnh goto được sử dụng để chuyển đến một nhãn đã đặt trước trong chương trình.
Ví dụ:
int n=0;
start:
n++;
if(n<=10){
printf("%d ",n);
goto start;
}
Kết quả của đoạn code trên sẽ là: 1 2 3 4 5 6 7 8 9 10
Như bạn có thể thấy, sau khi in giá trị của n, chương trình chuyển đến nhãn start và tiếp tục thực hiện vòng lặp cho đến khi n>10.
Tuy nhiên, lệnh goto thường được coi là không an toàn và có thể gây ra các lỗi khó xử lý trong chương trình nếu không được sử dụng đúng cách. Do đó, nên tránh sử dụng lệnh goto trong chương trình của bạn nếu có thể.
D. Bài tập
Các câu lệnh điều khiển cơ bản: if-else, switch-case
- Viết chương trình nhập vào một số nguyên và kiểm tra xem số đó là số chẵn hay số lẻ.
- Viết chương trình nhập vào ba số nguyên và tìm ra số lớn nhất trong ba số đó.
- Viết chương trình nhập vào một ký tự và kiểm tra xem ký tự đó là một chữ cái in hoa, in thường, số hay ký tự đặc biệt.
- Viết chương trình nhập vào một chữ cái và in ra thông tin về loại chữ cái đó (nguyên âm, phụ âm, hoa, thường).
- Viết chương trình nhập vào điểm số của một học sinh và in ra thông báo xếp loại (giỏi, khá, trung bình, yếu) dựa trên điểm số đó.
Các vòng lặp: for, while, do-while
- Viết chương trình in ra các số từ 1 đến 10 sử dụng vòng lặp for.
- Viết chương trình in ra các số từ 10 đến 1 sử dụng vòng lặp while.
- Viết chương trình tính tổng các số từ 1 đến n (n là một số nguyên dương) sử dụng vòng lặp do-while.
- Viết chương trình in ra bảng cửu chương từ 1 đến 10 sử dụng vòng lặp for.
- Viết chương trình tính giai thừa của một số nguyên dương n sử dụng vòng lặp while.
Các lệnh điều khiển khác: break, continue, goto
- Viết chương trình in ra các số từ 1 đến 100 nhưng bỏ qua các số chia hết cho 3 sử dụng lệnh continue.
- Viết chương trình tìm số nguyên tố đầu tiên trong khoảng từ 1 đến 100 sử dụng lệnh break.
- Viết chương trình nhập vào một số nguyên dương và in ra các số chẵn từ 1 đến số đó sử dụng lệnh goto.
- Viết chương trình tính tổng các số từ 1 đến 100 sử dụng lệnh break để kết thúc vòng lặp khi tổng đã vượt quá giới hạn 500.
- Viết chương trình nhập vào một số nguyên dương n và in ra các số từ 1 đến n trừ các số chia hết cho 3 sử dụng lệnh continue.