CC++ & Algorithm

循环综合应用实例

困难11
语言版本:C++Python
概述:结合数学运算和条件判断,用循环解决求和、统计、找极值等实际问题。

用循环解决生活中的计算问题:求和、找极值、统计

学完循环之后,你会发现它特别适合处理那些需要重复做同一件事情的场景。比如:你想知道一个学期里每次数学考试的总分、平均分;或者你想统计全班同学的身高,找出最高的和最矮的;又或者你想计算从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. 更多相关知识点

掌握了循环的基本用法后,你还可以继续学习:

  • 嵌套循环:循环里面再放一个循环,比如打印乘法口诀表、处理二维网格数据。
  • breakcontinue:提前跳出循环或跳过某次循环的剩余部分(比如遇到非法输入可以跳出)。
  • while / do-while 循环:当不明确知道循环次数时(比如一直输入直到输入-1结束),用 while 更方便。
  • 数组:用循环一次性处理很多数据(比如把30个分数存到数组里,方便后续排序、查找等)。

快拿起你身边的编程工具,试着把今天的例子改一改,计算一下你的班级里有多少人喜欢数学、多少人喜欢体育吧!熟练之后,循环会成为你最得力的助手。

例题精讲

1单选题

以下C++代码用于计算1到100之间所有能被3整除的整数之和,请在空白处选择正确的条件表达式: int sum = 0; for (int i = 1; i <= 100; i++) { if (______) sum += i; }

Ai % 3 == 0
Bi % 3 != 0
Ci / 3 == 0
Di % 3 == 1
2判断题

以下C++代码可以正确计算1到10的累加和,循环结束后sum的值应为55。 int sum = 0; for (int i = 1; i <= 10; i++); sum += i;

3填空题
以下程序从键盘输入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;
}
4单选题

以下程序通过循环找出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;

A0
B100
C-1000000(一个很小的数)
D第一个输入的值(需特殊处理)
5判断题

以下代码能够正确计算1到20之间所有奇数的乘积(即1×3×5×...×19),并输出结果。 int product = 0; for (int i = 1; i <= 20; i += 2) { product *= i; } cout << product;