LogoCSP Wiki By Yundou
程序设计

循环结构

有时,我们需要做一件事很多遍,为了不写过多重复的代码,我们需要循环。

有时,循环的次数不是一个常量,那么我们无法将代码重复多遍,必须使用循环。

for 语句

以下是 for 语句的结构:

for (初始化; 判断条件; 更新) {
  循环体;
}

执行顺序:

图片描述

初始化表达式在循环开始前执行一次,用于初始化循环变量;条件表达式在每次循环开始前进行判断,如果为真,则执行循环体;迭代表达式在每次循环体执行完毕后执行,用于更新循环变量。

适用场景

当你明确知道循环需要执行的次数时,使用 for 语句非常合适。例如,遍历数组、输出一定范围内的数字等。

for循环执行流程

  • 执行初始化表达式,初始化循环变量。
  • 检查条件表达式的值,如果为真,则执行循环体;如果为假,则跳出循环。
  • 执行完循环体后,执行迭代表达式,更新循环变量。
  • 重复步骤 2 和 3,直到条件表达式的值为假。

经典例题及代码实现

题面:输出从 1 到 10 的所有整数。 输入样例:无 输出样例

1 2 3 4 5 6 7 8 9 10

示例代码

#include <iostream>
using namespace std;
 
int main() {
    for (int i = 1; i <= 10; i++) {
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

总结

for 语句是一种非常方便的循环结构,适合处理已知循环次数的情况。它的优点是代码简洁,结构清晰,便于阅读和维护。但如果循环次数不确定,使用 for 语句可能会比较麻烦。

while 语句

以下是 while 语句的结构:

while (判断条件) {
  循环体;
}

执行顺序:

图片描述

条件表达式在每次循环开始前进行判断,如果为真,则执行循环体;如果为假,则跳出循环。

适用场景

当你不知道循环需要执行的具体次数,只知道循环的终止条件时,使用 while 语句比较合适。例如,读取用户输入直到满足某个条件为止。

算法原理详解

  • 检查条件表达式的值,如果为真,则执行循环体;如果为假,则跳出循环。
  • 执行完循环体后,再次检查条件表达式的值,重复步骤 1,直到条件表达式的值为假。

经典例题及代码实现

题面:计算用户输入的整数的和,直到用户输入 0 为止。 输入样例

1 2 3 0

输出样例

6

示例代码

#include <iostream>
using namespace std;
 
int main() {
    int num, sum = 0;
    cin >> num;
    while (num != 0) {
        sum += num;
        cin >> num;
    }
    cout << sum << endl;
    return 0;
}

总结

while 语句适用于循环次数不确定的情况。它的优点是灵活性高,可以根据不同的条件动态控制循环的执行。但需要注意的是,如果条件表达式一直为真,会导致无限循环,因此要确保在适当的时候使条件表达式为假。

do...while 语句

以下是 do...while 语句的结构:

do {
  循环体;
} while (判断条件);

执行顺序:

图片描述

与 while 语句的区别在于,do...while 语句是先执行循环体再进行判断的。

循环体至少会执行一次,然后再检查条件表达式的值。如果为真,则继续执行循环体;如果为假,则跳出循环。

适用场景

当你希望循环体至少执行一次,并且根据执行后的结果来决定是否继续循环时,使用 do while 语句比较合适。例如,菜单系统,用户至少会看到一次菜单选项。

dowhile执行流程

  • 执行循环体。
  • 检查条件表达式的值,如果为真,则继续执行循环体;如果为假,则跳出循环。
  • 重复步骤 1 和 2,直到条件表达式的值为假。

经典例题及代码实现

题面:让用户输入一个大于 10 的整数,如果输入的数不大于 10,则提示用户重新输入,直到输入一个大于 10 的整数为止。 输入样例

5
8
12

输出样例

你输入的大于 10 的整数是: 12

示例代码

#include <iostream>
using namespace std;
 
int main() {
    int num;
    do {
        cin >> num;
        if (num <= 10) {
            cout << "输入的数不大于 10,请重新输入。" << endl;
        }
    } while (num <= 10);
    cout << "你输入的大于 10 的整数是: " << num << endl;
    return 0;
}

总结

do while 语句的特点是循环体至少会执行一次。它在需要确保循环体至少执行一次的场景中非常有用。但同样要注意避免无限循环的问题,确保条件表达式最终能变为假。

for、while 和 do-while 的区别

1. 语法结构与执行顺序

循环类型语法结构执行顺序
forfor(初始化; 条件; 更新) { 循环体 }先执行初始化,再判断条件,若为真则执行循环体,最后执行更新,重复直至条件为假。
whilewhile(条件) { 循环体 }先判断条件,若为真则执行循环体,重复直至条件为假。可能一次都不执行
do-whiledo { 循环体 } while(条件);先执行一次循环体,再判断条件,若为真则继续执行,重复直至条件为假。至少执行一次

2. 循环条件的位置

  • forwhile 的条件判断在循环体执行前,若初始条件不满足,则循环体不执行
  • do-while 的条件判断在循环体执行后,无论条件是否满足,循环体至少执行一次

示例:计算 1+2+...+10(初始值 sum=0, i=11

// for 循环:条件不满足,循环体不执行
for (int sum = 0, i = 11; i <= 10; i++) { sum += i; }  // sum 仍为 0
 
// while 循环:条件不满足,循环体不执行
int sum = 0, i = 11;
while (i <= 10) { sum += i; i++; }  // sum 仍为 0
 
// do-while 循环:先执行一次循环体,再判断条件
int sum = 0, i = 11;
do { sum += i; i++; } while (i <= 10);  // 执行一次,sum=11,i=12,条件不满足,结束

break 语句

功能介绍

在 C++ 中,break 语句主要用于终止当前所在的循环结构(forwhiledo-while)或者 switch 语句。当程序执行到 break 语句时,会立即跳出当前的循环体或者 switch 块,继续执行循环或者 switch 之后的代码。

适用场景

  • 提前结束循环:当在循环过程中满足某个特定条件,且后续的循环操作不需要再执行时,可以使用 break 语句提前结束循环。
  • 跳出嵌套循环的某一层:在嵌套循环中,可以使用 break 语句跳出当前所在的内层循环。

具体执行方式

当程序执行到 break 语句时,会直接跳过当前循环体中剩余的代码,将控制流转移到循环结束后的下一条语句。如果是嵌套循环,break 语句只会跳出当前所在的那一层循环。

经典例题及代码实现

题面:在一个包含 10 个整数的数组中,查找第一个大于 10 的数,并输出该数的位置。如果没有找到,则输出 -1。 输入样例

2 4 6 8 12 14 16 18 20 22

输出样例

4

示例代码

#include <iostream>
using namespace std;
 
int main() {
    int arr[10];
    // 读入数组元素
    for (int i = 0; i < 10; i++) {
        cin >> arr[i];
    }
    int pos = -1;
    for (int i = 0; i < 10; i++) {
        if (arr[i] > 10) {
            pos = i;
            // 找到第一个大于 10 的数后,使用 break 语句提前结束循环
            break;
        }
    }
    cout << pos << endl;
    return 0;
}

总结

break 语句可以帮助我们在满足特定条件时提前结束循环,避免不必要的计算,提高程序的效率。但在使用时需要注意,break 语句只会跳出当前所在的那一层循环,如果需要跳出多层循环,可能需要使用其他技巧,如使用标志变量等。

continue 语句

功能介绍

continue 语句也是用于控制循环结构的执行流程。当程序执行到 continue 语句时,会跳过当前循环体中剩余的代码,直接进入下一次循环的条件判断。也就是说,continue 语句会提前结束当前这一次的循环,开始下一次循环。

适用场景

  • 跳过某些不必要的循环操作:当在循环过程中遇到某些特定条件,不需要执行本次循环的剩余操作时,可以使用 continue 语句跳过这些操作,直接进入下一次循环。
  • 过滤不符合条件的元素:在遍历数组或者集合时,可以使用 continue 语句过滤掉不符合条件的元素,只对符合条件的元素进行处理。

具体执行方式

当程序执行到 continue 语句时,会忽略当前循环体中 continue 语句之后的所有代码,直接跳转到循环的条件判断部分。如果条件仍然满足,则开始下一次循环;如果条件不满足,则结束循环。

经典例题及代码实现

题面:输出 1 到 10 之间所有的奇数。 输入样例:无 输出样例

1 3 5 7 9

示例代码

#include <iostream>
using namespace std;
 
int main() {
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            // 如果是偶数,使用 continue 语句跳过本次循环的剩余操作,直接进入下一次循环
            continue;
        }
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

总结

continue 语句可以帮助我们在循环中灵活地控制程序的执行流程,跳过不必要的操作,提高程序的效率。但在使用时需要注意,continue 语句只会影响当前所在的那一层循环,不会跳出循环。如果需要跳出循环,应该使用 break 语句。

例题