循环综合应用实例
困难11用循环解决生活中的计算问题:求和、找极值、统计
学完循环之后,你会发现它特别适合处理那些需要重复做同一件事情的场景。比如:你想知道一个学期里每次数学考试的总分、平均分;或者你想统计全班同学的身高,找出最高的和最矮的;又或者你想计算从1加到100等于多少……这些事都可以用循环轻松搞定。
循环就像是一个勤快的“自动机器人”,你告诉它“重复做某件事多少遍”,它就会老老实实地做完,还能在过程中帮你记录中间结果。下面我们通过几个经典的例子,来看看循环在数学运算、条件判断和统计中的综合应用。
1. 用循环累加:从“零花钱”到“总分”
最基础的循环应用就是累加。比如你想算一算自己一周(7天)一共花了多少零花钱,每天花的不一样,那么你就可以建一个变量 total(总花费)来存结果,每天的花费加到 total 里。类似地,算一个班级10个同学的总分,也是同样的思路。
我们来写一个例子:输入10个同学的分数,计算总分和平均分。注意 sum 初始为0,每次输入一个分数就加到 sum 里。
#include <iostream>
using namespace std;
int main() {
int score; // 存放每次输入的分数
int sum = 0; // 存放总分,初始为0
int maxScore = 0; // 存放最高分,假设分数最小是0
int minScore = 100; // 存放最低分,假设分数最大是100
// 循环10次,每次输入一个分数
for (int i = 1; i <= 10; i++) {
cout << "请输入第" << i << "位同学的分数:";
cin >> score;
sum += score; // 累加总分
if (score > maxScore) maxScore = score; // 更新最高分
if (score < minScore) minScore = score; // 更新最低分
}
cout << "总分:" << sum << endl;
// 注意:平均分要除以小数10.0,才能得到小数结果
cout << "平均分:" << sum / 10.0 << endl;
cout << "最高分:" << maxScore << " 最低分:" << minScore << endl;
return 0;
}
这里用 sum / 10.0 而不是 sum / 10,是因为整数除以整数结果会直接去掉小数部分(比如99/10=9),而除以小数10.0会得到小数(99/10.0=9.9)。小朋友们可以试试看两种写法的区别。
另一个常见的累加:计算1+2+3+…+100。你当然可以一个一个加,但循环只需要几行:
int total = 0; // 存放总和
for (int i = 1; i <= 100; i++) { // i从1加到100
total += i; // 每次把i加到total里
}
cout << "1+2+...+100 = " << total; // 输出5050
想一想: 如果你想知道1×2×3×…×10的结果,该怎么做呢?把 total 初始值改成1,每次用 total *= i; 就行了(这叫累乘)。
2. 用循环找最大值和最小值:谁最高?谁最低?
在刚才的分数例子中,我们同时找出了最高分和最低分。这种“边输入边比较”的方法很实用。当你要在一组数据中找出最大值(或最小值)时,可以这样做:
- 先给一个初始值:比如找最大值,可以把
max设成一个非常小的数(比如0),这样任何正常的数都比它大;找最小值,可以把min设成一个非常大的数(比如100或1000),这样任何正常的数都比它小。 - 每次拿到一个新数,就比较它和当前
max/min的大小,如果新数更大/更小,就更新。
举个例子:老师想统计全班20个同学的体重,找出最重和最轻的。假设体重都在30~100公斤之间。
#include <iostream>
using namespace std;
int main() {
int weight; // 每次输入的体重
int maxWeight = 0; // 最重,初始为0
int minWeight = 200; // 最轻,初始为一个很大的数
for (int i = 1; i <= 20; i++) {
cout << "输入第" << i << "位同学的体重(公斤):";
cin >> weight;
if (weight > maxWeight) maxWeight = weight;
if (weight < minWeight) minWeight = weight;
}
cout << "最重:" << maxWeight << "公斤" << endl;
cout << "最轻:" << minWeight << "公斤" << endl;
return 0;
}
注意:minWeight 的初始值一定要大,否则所有输入都比它大,它就永远不会更新,结果就错了。比如你把 minWeight 设成0,那任何体重(比如50)都比0大,所以 if (weight < minWeight) 永远不成立,最后输出0,那显然是错的。
3. 用循环统计满足条件的数据:及格了几个人?
除了求和、找极值,循环还经常用来统计个数。比如老师想知道全班(30人)有多少人及格(分数≥60),我们可以定义一个计数器 count,每输入一个分数,如果≥60,就把 count 加1。循环结束后输出 count。
#include <iostream>
using namespace std;
int main() {
int score; // 存放每次输入的分数
int passCount = 0; // 及格人数,初始为0
for (int i = 1; i <= 30; i++) {
cout << "请输入第" << i << "位同学的分数:";
cin >> score;
if (score >= 60) {
passCount++; // 及格人数加1
}
}
cout << "全班及格人数:" << passCount << "人" << endl;
// 还可以计算及格率:passCount / 30.0 * 100 + "%"
double passRate = passCount * 100.0 / 30;
cout << "及格率:" << passRate << "%" << endl;
return 0;
}
生活中还能统计什么? 比如:统计自己一个月(30天)中有几天是阳光明媚的(温度>20°C),或者记录一周中哪几天花了超过10元零花钱。只要把条件换一换就行。
4. 新手最容易犯的循环错误
| 错误类型 | 例子 | 说明 |
|---|---|---|
| 循环条件写错 | for (int i=1; i<=10; i++) 写成 for (int i=1; i<10; i++) | 少循环1次,只处理了9个数 |
| 初始化忘记 | int sum; 没赋0,直接 sum += score; | sum的值是随机的(垃圾值),结果完全不对 |
| 整数除法 | 平均分写 sum / 10 | 如果总分99,得到9而不是9.9,需要写成 sum / 10.0 |
| 极值初始值设反 | 找最小值时设 minScore = 0 | 分数都大于0,最小值永远不会更新,最终输出0(错误) |
| 忘记更新极值 | 只写了 if (score > maxScore) 但忘记写 maxScore = score; | 最高分始终是初始值,不会改变 |
小技巧: 调试代码时,可以在循环里加一句 cout 输出中间结果,看看每一步是否正确。比如输出每次累加后的 sum 值。
5. 完整示例:综合统计全班成绩
现在我们综合运用求和、找极值、统计三个功能,写一个程序:输入一个班级30个同学的分数(0~100),输出总分、平均分、最高分、最低分、及格人数(≥60)、优秀人数(≥90)。
#include <iostream>
using namespace std;
int main() {
// 定义变量,全部初始化为0或合理的值
int score; // 每次输入的分数
int sum = 0; // 总分
int maxScore = 0; // 最高分,假定最低为0
int minScore = 100; // 最低分,假定最高为100
int passCount = 0; // 及格人数(≥60)
int goodCount = 0; // 优秀人数(≥90)
// 循环30次,输入每个同学的分数
for (int i = 1; i <= 30; i++) {
cout << "请输入第" << i << "位同学的分数(0~100):";
cin >> score;
// 累加总分
sum += score;
// 更新最高分和最低分
if (score > maxScore) maxScore = score;
if (score < minScore) minScore = score;
// 统计及格和优秀
if (score >= 60) passCount++;
if (score >= 90) goodCount++;
}
// 输出结果
cout << endl;
cout << "总分:" << sum << endl;
cout << "平均分:" << sum / 30.0 << endl;
cout << "最高分:" << maxScore << endl;
cout << "最低分:" << minScore << endl;
cout << "及格人数:" << passCount << "人,及格率:"
<< passCount * 100.0 / 30 << "%" << endl;
cout << "优秀人数:" << goodCount << "人,优秀率:"
<< goodCount * 100.0 / 30 << "%" << endl;
return 0;
}
运行效果(假设输入了30个分数,比如大部分在60~95之间):
请输入第1位同学的分数(0~100):88
请输入第2位同学的分数(0~100):92
...
请输入第30位同学的分数(0~100):73
总分:2345
平均分:78.1667
最高分:100
最低分:45
及格人数:25人,及格率:83.3333%
优秀人数:8人,优秀率:26.6667%
6. 更多相关知识点
掌握了循环的基本用法后,你还可以继续学习:
- 嵌套循环:循环里面再放一个循环,比如打印乘法口诀表、处理二维网格数据。
break和continue:提前跳出循环或跳过某次循环的剩余部分(比如遇到非法输入可以跳出)。- while / do-while 循环:当不明确知道循环次数时(比如一直输入直到输入-1结束),用
while更方便。 - 数组:用循环一次性处理很多数据(比如把30个分数存到数组里,方便后续排序、查找等)。
快拿起你身边的编程工具,试着把今天的例子改一改,计算一下你的班级里有多少人喜欢数学、多少人喜欢体育吧!熟练之后,循环会成为你最得力的助手。
例题精讲
以下C++代码用于计算1到100之间所有能被3整除的整数之和,请在空白处选择正确的条件表达式: int sum = 0; for (int i = 1; i <= 100; i++) { if (______) sum += i; }
以下C++代码可以正确计算1到10的累加和,循环结束后sum的值应为55。 int sum = 0; for (int i = 1; i <= 10; i++); sum += i;
以下程序从键盘输入n个整数(n由用户输入),然后统计其中正数的个数。请将空白处补充完整。
#include <iostream>
using namespace std;
int main() {
int n, x, count = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
if (___){
count++;
}
}
cout << count << endl;
return 0;
}以下程序通过循环找出10个输入整数中的最大值,请选择正确的初始值设置。 int max_val = ______; // 初始值 for (int i = 0; i < 10; i++) { int x; cin >> x; if (x > max_val) max_val = x; } cout << max_val;
以下代码能够正确计算1到20之间所有奇数的乘积(即1×3×5×...×19),并输出结果。 int product = 0; for (int i = 1; i <= 20; i += 2) { product *= i; } cout << product;