第四章:让程序重复做事——循环结构¶
你好!欢迎来到第四章!在前面的章节,我们学会了让程序做判断。但是,如果想让程序重复做同一件事很多次,比如输出100遍“你好”,难道要写100行cout吗?当然不用!这时候就需要循环。循环就像跑步,一圈一圈重复,直到达到目标才停下。这一章我们会学习三种循环:for、while 和 do...while,还有控制循环的小技巧。
4.1 for循环¶
4.1.1 for循环程序范例¶
for 循环就像体育老师喊口令:“从第1个同学开始,到第10个同学结束,每个同学报数!” 我们来看一个程序,输出1到10:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
cout << i << " ";
}
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
4.1.2 for循环的用法¶
for 循环的格式:
for (初始化; 条件; 更新) {
// 循环体:要重复执行的代码
}
- 初始化:在循环开始前执行一次,通常用来定义循环变量并赋初值,比如
int i = 1。 - 条件:每次循环开始前判断,如果为真,就执行循环体;如果为假,就退出循环。比如
i <= 10。 - 更新:每次循环体执行完后执行,通常用来改变循环变量的值,比如
i++(i增加1)。
执行顺序:
1. 执行初始化(只一次)
2. 判断条件 → 如果真,进入循环体;如果假,结束循环
3. 执行循环体
4. 执行更新
5. 回到第2步
循环变量变化过程¶
比如上面例子:
- 初始 i=1,判断 1<=10 真 → 输出1,然后 i++ 变成2
- 判断 2<=10 真 → 输出2,i++ 变3
- … 直到 i=10 输出10,i++ 变11
- 判断 11<=10 假 → 退出循环
4.1.3 编程实例讲解¶
实例1:求1到100的和¶
#include <iostream>
using namespace std;
int main() {
int sum = 0; // 累加器,初始为0
for (int i = 1; i <= 100; i++) {
sum = sum + i; // 把i加到sum上
}
cout << "1+2+...+100 = " << sum << endl;
return 0;
}
运行结果:5050
实例2:输出偶数¶
题目:输出1到20之间的所有偶数。
#include <iostream>
using namespace std;
int main() {
for (int i = 2; i <= 20; i += 2) { // i每次增加2
cout << i << " ";
}
return 0;
}
运行结果:
2 4 6 8 10 12 14 16 18 20
实例3:倒序输出¶
题目:输出10到1。
#include <iostream>
using namespace std;
int main() {
for (int i = 10; i >= 1; i--) {
cout << i << " ";
}
return 0;
}
运行结果:
10 9 8 7 6 5 4 3 2 1
4.1.4 阶段性编程练习¶
- 练习1:用for循环输出1到50,每行5个数。(提示:可以用
if (i % 5 == 0) cout << endl;换行) - 练习2:求1到100所有奇数的和。
- 练习3:输入一个整数n,计算n的阶乘(n! = 1×2×3×…×n)。
- 练习4:输出所有的“水仙花数”。水仙花数是指一个三位数,其各位数字的立方和等于该数本身,如153 = 1³+5³+3³。(提示:用循环遍历100-999,分离个十百位判断)
4.2 while循环¶
4.2.1 while循环程序范例¶
while 循环就像“当条件满足时,就一直做某事”。比如“当还有糖果时,就吃一颗”。看这个例子,输出1到10:
#include <iostream>
using namespace std;
int main() {
int i = 1; // 初始化
while (i <= 10) { // 条件
cout << i << " ";
i++; // 更新
}
return 0;
}
运行结果:和for循环一样。
4.2.2 while循环的用法¶
格式:
while (条件) {
// 循环体
}
- 先判断条件,如果为真,执行循环体;然后再次判断,直到条件为假退出。
- 注意:循环体内要有改变条件的语句,否则会变成死循环(无限循环)。
4.2.3 编程实例讲解¶
实例4:计算1到n的和(n由用户输入)¶
#include <iostream>
using namespace std;
int main() {
int n, i = 1, sum = 0;
cout << "请输入一个整数:";
cin >> n;
while (i <= n) {
sum += i; // 等价于 sum = sum + i
i++;
}
cout << "1+2+...+" << n << " = " << sum << endl;
return 0;
}
实例5:统计位数¶
题目:输入一个正整数,统计它是几位数。比如输入12345,输出5。
#include <iostream>
using namespace std;
int main() {
int num, count = 0;
cout << "请输入一个正整数:";
cin >> num;
while (num > 0) {
num = num / 10; // 去掉最后一位
count++; // 位数加1
}
cout << "它是" << count << "位数" << endl;
return 0;
}
解释:每次除以10,就减少一位,直到变成0。
4.2.4 阶段性编程练习¶
- 练习1:用while循环输出1到50的平方数(1², 2², … 50²)。
- 练习2:输入一个整数,倒序输出它(比如输入123,输出321)。不能用数组,只能用循环。
- 练习3:求两个数的最大公约数(用辗转相除法,提示:用while循环,条件是b!=0,循环内求余并交换)。
- 练习4:猜数字游戏(用while循环,直到猜中为止)。随机生成一个1-100的数,用户猜,提示“大了”“小了”,直到猜中,统计猜的次数。
4.3 do…while循环¶
4.3.1 do…while循环程序范例¶
do...while 循环和 while 类似,但它是先执行一次循环体,再判断条件。就像“先做一次,然后看是否要继续做”。比如:
#include <iostream>
using namespace std;
int main() {
int i = 1;
do {
cout << i << " ";
i++;
} while (i <= 10);
return 0;
}
4.3.2 do…while循环的用法¶
格式:
do {
// 循环体
} while (条件);
- 先执行一次循环体,然后判断条件。如果条件为真,继续下一次循环;如果为假,退出。
- 注意:最后的分号不能少。
- 特点:至少执行一次循环体,即使条件一开始为假。
对比while¶
while:先判断,可能一次都不执行。do...while:先执行,至少执行一次。
4.3.3 编程实例讲解¶
实例6:输入密码,直到正确¶
题目:假设密码是123456,让用户输入密码,如果错误就提示重新输入,直到正确。
#include <iostream>
using namespace std;
int main() {
int password, correct = 123456;
do {
cout << "请输入密码:";
cin >> password;
if (password != correct) {
cout << "密码错误,请重新输入。" << endl;
}
} while (password != correct);
cout << "密码正确,欢迎进入系统!" << endl;
return 0;
}
实例7:求平均分(至少输入一次)¶
题目:输入若干个成绩,以-1结束,计算平均分(保证至少输入一个有效成绩)。
#include <iostream>
using namespace std;
int main() {
int score, sum = 0, count = 0;
do {
cout << "请输入成绩(-1结束):";
cin >> score;
if (score != -1) {
sum += score;
count++;
}
} while (score != -1);
if (count > 0) {
double avg = (double)sum / count;
cout << "平均分:" << avg << endl;
}
return 0;
}
4.3.4 阶段性编程练习¶
- 练习1:用do…while循环输出1到10的立方。
- 练习2:编写一个菜单程序,显示选项,让用户选择,直到用户选择退出。(类似:1.开始游戏 2.设置 3.退出,输入3退出)
- 练习3:输入一个正整数,用do…while循环判断它是否是素数(提示:用i从2到sqrt(n)试除,一旦整除就标记不是素数)。
- 练习4:模拟ATM取款,初始余额1000元,每次输入取款金额,如果余额不足提示,直到输入0退出。
4.4 continue和break¶
4.4.1 continue和break程序范例¶
有时候我们需要在循环中间提前结束本次循环或整个循环。break 用来跳出整个循环,continue 用来跳过本次循环剩下的部分,直接进入下一次循环。
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // 当i=5时,跳出整个循环
}
cout << i << " ";
}
cout << endl;
for (int i = 1; i <= 10; i++) {
if (i == 5) {
continue; // 当i=5时,跳过输出,继续下一次循环
}
cout << i << " ";
}
return 0;
}
运行结果:
1 2 3 4
1 2 3 4 6 7 8 9 10
4.4.2 continue和break的用法¶
- break:立即终止当前循环(for、while、do…while、switch),程序继续执行循环后面的代码。
- continue:跳过本次循环中剩余的代码,直接进入下一次循环(对于for循环,会先执行更新部分,再判断条件)。
使用场景¶
break:当找到想要的结果后,没必要继续循环了。continue:当遇到某些不需要处理的情况时,跳过本次,继续处理下一个。
4.4.3 编程实例讲解¶
实例8:找出第一个能被7整除的数¶
题目:从1开始找,找到第一个能被7整除的数就停止。
#include <iostream>
using namespace std;
int main() {
int i = 1;
while (true) { // 无限循环,用break退出
if (i % 7 == 0) {
cout << "第一个能被7整除的数是:" << i << endl;
break;
}
i++;
}
return 0;
}
实例9:输出1-20中不能被3整除的数¶
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 20; i++) {
if (i % 3 == 0) {
continue; // 跳过输出
}
cout << i << " ";
}
return 0;
}
4.4.4 阶段性编程练习¶
- 练习1:输出1-100中所有能被5整除但不能被3整除的数。
- 练习2:求两个数的最大公约数,用循环和break优化(找到即停止)。
- 练习3:输入一个正整数,判断它是否是素数(用break优化,一旦发现整除就跳出循环)。
- 练习4:模拟一个简单的加法考试,随机出10道题,每道题答对加10分,答错可以继续做下一题,最后显示得分。如果中途输入-1,则提前退出考试。
4.5 嵌套循环¶
4.5.1 嵌套循环程序范例¶
循环里面再套循环,就是嵌套循环。最常见的是打印图形。比如打印一个3行5列的矩形:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 3; i++) { // 控制行数
for (int j = 1; j <= 5; j++) { // 控制列数
cout << "* ";
}
cout << endl; // 每行结束后换行
}
return 0;
}
运行结果:
* * * * *
* * * * *
* * * * *
4.5.2 嵌套循环的用法¶
- 外层循环执行一次,内层循环会完整执行一轮。
- 常用于处理二维结构,如打印图形、遍历表格等。
- 注意循环变量的作用域和命名,通常用
i,j,k表示。
执行过程:¶
外层 i=1,内层 j 从1到5输出5个星号,然后换行;
外层 i=2,内层 j 再从1到5输出5个星号,换行;
外层 i=3,同样。
4.5.3 编程实例讲解¶
实例10:打印直角三角形¶
题目:输入行数n,打印一个直角三角形,第一行1个,第二行2个,…第n行n个*。
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入行数:";
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) { // 每行输出i个星号
cout << "* ";
}
cout << endl;
}
return 0;
}
运行示例(n=5):
*
* *
* * *
* * * *
* * * * *
实例11:打印九九乘法表¶
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << "×" << i << "=" << i * j << "\t"; // \t是制表符,用于对齐
}
cout << endl;
}
return 0;
}
实例12:冒泡排序(简单介绍)¶
虽然还没学数组,但可以先看看嵌套循环的威力:排序。这里用最简单的冒泡排序对5个数排序。
#include <iostream>
using namespace std;
int main() {
int a[5] = {5, 3, 8, 1, 2}; // 数组,暂时理解为5个盒子
int n = 5;
// 冒泡排序
for (int i = 0; i < n - 1; i++) { // 外层控制比较轮数
for (int j = 0; j < n - 1 - i; j++) { // 内层控制每轮比较次数
if (a[j] > a[j + 1]) { // 如果前面的比后面的大,交换
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
// 输出排序后的结果
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
return 0;
}
运行结果:1 2 3 5 8
4.5.4 阶段性编程练习¶
- 练习1:打印倒直角三角形:第一行n个,第二行n-1个,…最后一行1个*。
- 练习2:打印菱形(输入奇数行数,打印菱形图案)。
- 练习3:输出100以内的所有素数(用嵌套循环,外层遍历2-100,内层判断每个数是否是素数)。
- 练习4:模拟一个简单的“猜数字”游戏升级版:程序随机生成一个4位数(每位不重复),用户猜,每次给出提示:数字正确且位置正确的个数,数字正确但位置不对的个数。用嵌套循环实现比较。
4.6 第4章编程作业¶
恭喜你学完了循环!现在来挑战几个综合题目,检验一下学习成果。
作业1:斐波那契数列¶
斐波那契数列:1, 1, 2, 3, 5, 8, 13, … 从第三项开始,每一项等于前两项之和。输入一个正整数n,输出前n项。
作业2:百钱百鸡问题¶
公鸡5元一只,母鸡3元一只,小鸡1元三只。用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?用循环枚举所有可能。
作业3:求完数¶
完数是指一个数恰好等于它的因子之和(不包括自身)。例如6 = 1+2+3。找出1000以内的所有完数。
作业4:猜数字游戏(带难度选择)¶
实现一个猜数字游戏,可以选择难度:
- 简单:1-50,猜10次
- 中等:1-100,猜7次
- 困难:1-200,猜5次
每次提示猜大了还是猜小了,如果次数用完还没猜中,游戏结束。
作业5:打印杨辉三角¶
输入行数n,打印杨辉三角(等腰三角形格式)。例如n=5:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
提示:可以用二维数组或组合数公式,但这里要求只用循环(需要一点数学知识,可以选做)。
好了,第四章的内容就到这里!你已经学会了如何让程序重复做事,这是编程中非常强大的能力。加油!🚀