Vòng lặp trong C – các cấu trúc vòng lặp for, while, do while
- 08-01-2023
- Toanngo92
- 0 Comments
Một trong những ưu điểm lớn nhất của máy tính nằm ở khả năng thực hiện lặp đi lặp lại một loạt các lệnh với tốc độ nhanh chóng. Khái niệm này được gọi là vòng lặp (loop). Vòng lặp là một đoạn mã trong chương trình được thực hiện lặp đi lặp lại cho đến khi một điều kiện cụ thể được thỏa mãn.
Trong ngôn ngữ lập trình C (tương tự với nhiều ngôn ngữ khác) cung cấp các cấu trúc vòng lặp sau:
- Vòng lặp for
- Vòng lặp while
- Vòng lặp do while
Điều kiện kiểm soát việc thực hiện vòng lặp được mã hóa bằng toán tử Quan hệ (Relational operators) và Logic (Logical operators) trong C.
Mục lục
Vòng lặp for
Cú pháp tổng quát:
for(initialize counts;conditional test; re-evaluation expression){
// todo
statements;
}
Vòng lặp for có 3 thành phần:
- Bộ đếm khởi tạo (initialize counts) là một câu lệnh gán thiết lập biến điều khiển vòng lặp, trước khi vào vòng lặp. Lệnh này được thực hiện chỉ một lần.
- Phép thử điều kiện (conditional test) là một biểu thức quan hệ, nó xác định khi nào vòng lặp sẽ kết thúc.
- Biểu thức đánh giá lại (re-evaluation expression) xác định biến điều khiển vòng lặp thay đổi như thế nào (chủ yếu là tăng hoặc giảm trong biến được đặt ở trạng thái) mỗi khi vòng lặp được lặp lại.
Ba phần này của vòng lặp for phải được phân tách bằng dấu chấm phẩy “;”. Câu lệnh tạo thành phần thân của vòng lặp, có thể là câu lệnh đơn hoặc kết hợp nhiều câu lệnh.
Vòng lặp hoặc tiếp tục thực hiện miễn là kiểm tra điều kiện trả ra true. Khi điều kiện trở thành false, chương trình sẽ thoát vòng lặp và tiếp tục với câu lệnh theo sau vòng lặp for.
Trong vòng lặp for, kiểm tra điều kiện luôn được thực hiện ở đầu vòng lặp. Điều này có nghĩa là mã bên trong vòng lặp không được thực thi nếu điều kiện ban đầu là false.
Ví dụ:
void defaultloopexample(){
int count;
for(count = 1; count <= 5 ; count++){
printf("\ncount %d",count);
}
}
void loopexample2(){
int i;
for(i = 0; i <=20; i = i+5){
printf("%d \n",i);
}
//output
//0
//5
//10
//15
//20
}
int main()
{
defaultloopexample();
loopexample2();
return 0;
}
Toán tử ‘,’ trong vòng lặp for
Phạm vi của vòng lặp for có thể được mở rộng bằng cách triển khai nhiều hơn một biểu thức khởi tạo hoặc biểu thức tăng giảm trong đặc tả vòng lặp for.
Các biểu thức được phân tách bằng toán tử ‘dấu phẩy’ và được đánh giá từ trái sang phải. Thứ tự đánh giá là quan trọng nếu giá trị của biểu thức thứ hai phụ thuộc vào giá trị mới được tính toán của biểu thức đầu tiên. Toán tử này có độ ưu tiên thấp nhất trong số các toán tử C.
Cú pháp tổng quát:
for(initialize1,initialize2;conditional test; re-evaluation1,re-evaluation1){
// todo
statements;
}
Ví dụ:
void extendloopexample(){
int i, j , max;
printf("Please enter the maximum value \n");
printf("for which a table can be printed: ");
scanf("%d", &max);
for(i = 0 , j = max ; i <= max ; i++, j--){
printf("\n%d + %d = %d",i, j, i + j);
}
}
int main()
{
extendloopexample();
return 0;
}
Vòng lặp for lồng nhau (nested for loop)
Một vòng lặp For được gọi là lồng nhau khi nó xảy ra bên trong một vòng lặp khác.
Ví dụ:
void nestedloopdongian(){
int i,j;
for(i = 0; i <=3 ; i++){
printf("\nVao vong lap so %d",i+1);
for(j = 0 ; j <=2 ; j++){
printf("\n+ Vao vong lap trong so %d",j+1);
}
}
}
int main()
{
nestedloopdongian();
return 0;
}
void nestedloopexample(){
int i, j, k;
printf("Enter no. of rows :");
scanf("%d", &i);
// printf("\n");
for (j = 0; j < i ; j++)
{
printf("\n");
for (k = 0; k <= j; k++) /*inner for loop*/
printf("*");
}
}
Một số đặc tính khác của vòng lặp for
vòng lặp có thể được sử dụng mà không cần một hoặc tất cả các định nghĩa của nó. Tuy nhiên, để đúng cú pháp, chúng ta vẫn cần viết đầy đủ dấu “;” phân tách các thành phần
Ví dụ:
void exampleloop(){
int a;
a = 0;
for (; a !=100;){
printf("\nNhap lieu");
scanf("%d",&a);
}
}
int main()
{
exampleloop();
return 0;
}
Vòng lặp while
Loại cấu trúc vòng lặp tiếp theo trong C là vòng lặp while.
Cú pháp tổng quát:
while(condition is true)
{
//todo
statements;
}
Trong đó, câu lệnh là một câu lệnh rỗng, một câu lệnh đơn hoặc một khối câu lệnh. Nếu một tập hợp các câu lệnh xuất hiện trong một vòng lặp while thì chúng phải được đặt bên trong dấu ngoặc nhọn {}. Các
điều kiện có thể là biểu thức bất kỳ. Vòng lặp tiếp tục lặp lại khi điều kiện trả về true. Vòng lặp thoát và luồng chương trình chuyển đến dòng sau mã vòng lặp, khi điều kiện trả về false.
Ví dụ:
void whileloopexample(){
int count = 1;
while( count <= 10)
{
printf("\n This is iteration %d\n",count);
count++;
}
printf("\n The loop is completed. \n");
}
int main()
{
whileloopexample();
return 0;
}
Khác biệt cách sử dụng giữa vòng lặp for và vòng lặp while
Mặc dù, chúng ta có thể sử dụng tùy ý tùy theo ngữ cảnh, tuy nhiên chúng ta có thể xét tình huống có thể sử dụng vòng lặp for với điều kiện là biết trước số lần lặp trước khi vòng lặp bắt đầu thực hiện. Khi không biết trước số lần lặp sẽ được thực hiện, vòng lặp while có thể được ưu tiên sử dụng.
Vòng lặp do while
Vòng lặp do while đôi khi được gọi là vòng lặp do trong C. Giống như vòng lặp for và while, tuy nhiên có sự khác biệt nhỏ vòng lặp này kiểm tra điều kiện của nó ở cuối vòng lặp, nghĩa là sau khi vòng lặp đã được thực hiện. Điều này có nghĩa là vòng lặp do … while sẽ thực hiện ít nhất một lần, ngay cả khi điều kiện kiểm tra trả ra false.
Cú pháp tổng quát:
do{
//todo
statements;
} white (condition);
Vòng lặp do while lặp lại cho đến khi điều kiện trả ra false. Trong vòng lặp do while câu lệnh hoặc khối câu lệnh được thực hiện trước, sau đó điều kiện được kiểm tra. Nếu true, Luồng chương trình tiếp tục được chuyển sang câu lệnh do. Khi điều kiện trả ra false, luồng chương trình được chuyển sang câu lệnh sau vòng lặp.
Ví dụ:
void dowhileexample(){
int num1, num2;
num2 = 0;
do
{
printf( "\nEnter a number : ");
scanf("%d",&num1);
printf( " No. is %d",num1);
num2++;
} while (num1 != 0);
printf ("\nThe total numbers not 0 entered were %d",--num2);
/*num2 is decremented before printing because count for last
integer (0) is not to be considered */
}
void difference_whileanddowhile(){
int i = 0;
while(i != 0){
printf("\n i khac 0 while");
}
do{
printf("\ni khac 0 do while");
}while(i != 0);
}
int main()
{
dowhileexample();
difference_whileanddowhile();
return 0;
}