- 当需要重复执行一段代码很多遍的时候,可以使用循环结构来解决问题。
- 循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。
- 由循环体中的条件,判断继续执行该功能还是退出循环。
for循环
for 循环语法:
for (循环变量赋初始值;循环条件;更新循环变量) {
循环体
}
- 循环变量:用于控制循环的变量,一般在循环条件中使用
- for循环的执行逻辑:
- 首先会给循环变量赋一个初始值
- 然后判断是否满足循环条件
- 如果不满足,直接跳出循环;
- 如果满足,执行循环体,更新循环变量,再跳回去重新判断是否满足循环条件。
- 使用for循环时,【循环变量赋初始值】,【循环条件】,【更新循环变量】这三个表达式都可以省略,变为
for ( ; ; )
,这表示不用给循环变量赋初始值,也不用在每次执行后更新循环变量,同时循环的条件始终为真,也就是说每次都会选择进入循环体。 - 如果循环体只有一句话,可以不用大括号括起来
#include <iostream>
using namespace std;
int main() {
// 输入一个整型变量表示存款总数量
int savings = 0;
// 用循环变量 i 表示现在的天数,最开始为1,每次循环后都加1天,不满足小于等于100天时就跳出循环
for (int i=1; i<=100; i++) {
// 更新存款总数
savings = savings + i;
// 输出存款总数
cout << i << ":总数" << savings << endl;
}
return 0;
}
除了正常的循环之外,循环控制语句可以更改程序执行的正常序列。循环控制语句常用的是 break
和 continue
。
break
用法:通常放在循环体中,当执行到这句语句时,跳出整个循环,也就是说整个循环立即终止continue
用法:通常也是放在循环体中,当执行到这句语句时,跳过当前循环体,强迫进入下一次循环
#include <iostream>
using namespace std;
int main() {
int savings = 0;
for (int i=1; i<=100; i++) {
// 如果天数是10的倍数,直接进入下一天
if (i % 10 == 0)
continue;
// 更新存款总数
savings = savings + i;
// 输出存款总数
cout << i << ":总数" << savings << endl;
// 当存到1000元时,跳出循环
if (savings >= 1000)
break;
}
return 0;
}
while 循环
while循环只关注循环终止的条件和循环体的内容本身。
while 语法:
while (循环成立条件) {
循环体
}
while 循环执行逻辑:
- 只要循环成立条件为真,就进入循环体
- 重复这个步骤,直到循环成立条件为假
#include <iostream>
using namespace std;
int main() {
// 声明生成的随机数字和猜的数字这两个变量
int num, guess;
// 提供随机种子
srand((unsigned)time(NULL));
// 随机生成一个1-100的数字
num = rand() % 100 + 1;
// 输入猜测的数字
cin >> guess;
// 如果猜的数字和生成的数字不相同就进入循环
while (guess != num) {
// 输出猜大了还是猜小了
if (guess > num)
cout << "猜大了" << endl;
else if (guess < num)
cout << "猜小了" << endl;
// 重新输入猜测的数字
cin >> guess;
}
// 当猜的数字和生成的数字相同时,跳出循环后,输出“猜对了”
cout << "猜对了" << endl;
return 0;
}
do while 循环
无论如何,至少要执行一次猜数字的操作,可以用 do while 的写法
do while 语法:
do {
循环体
} while (循环成立条件);
do while 执行逻辑:
- 和while类似
- 唯一的区别在于:因为条件表达式出现在循环的尾部,所以至少会执行一次循环体,执行完成后,再判断是否进入下一次循环。
#include <iostream>
using namespace std;
int main() {
// 声明生成的随机数字和猜的数字这两个变量
int num, guess;
// 提供随机种子
srand((unsigned)time(NULL));
// 随机生成一个1-100的数字
num = rand() % 100 + 1;
//先进入循环,如果猜的数字和生成的数字不相同就再次进入循环
do {
cin >> guess;
if (guess > num)
cout << "猜大了" << endl;
else if (guess < num)
cout << "猜小了" << endl;
} while (guess != num);
// 当猜的数字和生成的数字相同时,跳出循环后,输出“猜对了”
cout << "猜对了" << endl;
return 0;
}
for 和 while 的比较
- 相同点:都是表达循环结构的语句,都可以使用
break
和continue
作为循环控制语句 - 不同点:for循环需要清楚循环次数/循环变量的变化范围;while循环只需要知道什么时候停下来就好。
例如:
- 如果是明确存钱100天,我们就更适合用 for语句来写,因为循环的次数非常显然。
- 如果是明确存到1000元就不存了,并不知道要存多少天,那我们就更适合用
while
语句来写。
int savings = 0;
int day = 1;
while (savings < 1000) {
savings = savings + day;
cout << day << " :存款总数为" << savings << endl;
// 天数加一
day++;
}
练习:判断是否为质数
#include <iostream>
using namespace std;
int main() {
int n, i = 2;
cin >> n;
if (n == 1) {
cout << "no" << endl;
return 0;
}
while (i < n) {
if (n % i == 0) {
cout << "no" << endl;
return 0;
}
i++;
}
cout << "yes" << endl;
return 0;
}
多重循环
循环嵌套适用于循环的大操作里有重复的小操作的情景。
- 可以任意嵌套,比如
for
嵌for
,for
嵌while
,while
嵌for
,while
嵌while
都可以 - 如果是for嵌for,内外层的循环变量(比如上述代码的i和j)需要用不一样的变量,否则容易产生混乱
- 在嵌套操作中都需要使用缩进,以增强代码可读性
- 可以多层嵌套,但是有时候太多层嵌套容易超时,需要引起注意
练习:打印九九乘法表
用for循环内部嵌套for循环的方式来写:
for (int i = 1; i <= 9; i++) {
// 在第i行中,对于每个小于i的数字,都打印一个等式和tab分隔
for (int j = 1; j <= i ; j++) {
cout << j << "*" << i << "=" << j*i << "\t";
}
// 第i行最后打印换行符
cout << endl;
}
用for循环内部嵌套while循环的方式来写:
for (int i = 1; i <= 9; i++) {
// 在第i行中,对于每个小于i的数字,都打印一个等式和tab分隔
int j = 1;
while (j <= i) {
cout << j << "*" << i << "=" << j*i << "\t";
j++;
}
// 第i行最后打印换行符
cout << endl;
}