CC++ & Algorithm

C++ 循环的简单应用

中等43
语言版本:C++Python
概述:用实际例子展示for、while、do-while循环如何解决求和、统计和游戏等问题。

用循环解决生活中的问题——累加、统计、重复游戏

小朋友们,学会了 forwhiledo-while 三种循环,我们就可以用它们解决生活中的好多问题啦!比如:计算1加到100等于多少?统计一个班级里有多少人?或者做一个猜数字小游戏。下面我们看几个简单应用的例子,一边学一边想:这些代码背后的“重复”规律到底是什么?


1. 用 for 循环计算1到100的和——像存钱罐一样累加

就像你每天存钱,第一天存1元,第二天存2元……存到100天,一共多少钱?这个过程中,你每天都在做同一件事:把当天的钱数加到存钱罐里。用代码来实现,就需要一个变量 sum(总钱数)来“记住”累加的结果。

#include <iostream>
using namespace std;
int main() {
    int sum = 0;                 // 存钱罐,一开始是空的
    for (int i = 1; i <= 100; i++) {   // i 从1到100,每天的钱数
        sum = sum + i;           // 把今天的 i 元放进存钱罐
    }
    cout << "1到100的和是:" << sum << endl;
    return 0;
}

运行结果1到100的和是:5050

? 过程拆解

  • 第一天:sum = 0 + 1 = 1
  • 第二天:sum = 1 + 2 = 3
  • 第三天:sum = 3 + 3 = 6
  • ……
  • 第100天:sum = 4950 + 100 = 5050

注意i++i = i + 1 是一样的,都是让 i 增加1。

? 生活中的类比:不光是存钱,还可以是数星星(一次数1颗,数100次),或者做口算题(每天做1道,第二天做2道……)。

⚠️ 新手易错

  • 忘记给 sum 初始化成0,那么 sum 会是一个随机数,结果乱套。
  • 循环条件写成 i < 100,那只会加到99,少了100。
  • 在循环体里不小心把 i 改掉了,比如写了 i = i + 2,就会跳着加。

2. 用 while 循环统计数字的位数——不断“切掉”最后一位

比如输入一个数 1234,要输出它有4位。怎么数呢?你可以不停地除以10,每除一次,就“切掉”最后一位,直到数字变成0。切了多少次,就有多少位。

#include <iostream>
using namespace std;
int main() {
    int n;                       // 输入的数字
    int count = 0;               // 位数计数器,初始0
    cout << "请输入一个整数:";
    cin >> n;
    while (n != 0) {             // 只要n还不等于0
        n = n / 10;              // 去掉最后一位(整数除法)
        count++;                 // 切掉一次,位数加1
    }
    cout << "这个数有 " << count << " 位。" << endl;
    return 0;
}

运行示例(输入1234):

  • 第1次循环:n = 1234 / 10 = 123count = 1
  • 第2次循环:n = 123 / 10 = 12count = 2
  • 第3次循环:n = 12 / 10 = 1count = 3
  • 第4次循环:n = 1 / 10 = 0count = 4
  • 此时 n == 0,循环结束,输出 4

但注意一个陷阱:如果输入的是 0,while 循环一次都不执行,count 还是 0,但实际 0 有1位。所以真实编程中需要单独处理 n == 0 的情况。不过,这个例子本身是个很好的练习,让你理解循环的条件判断。

? 生活中的类比:就像你剥橘子,每剥一瓣就数一下。或者倒着数一堆硬币,每次拿走10个,数一共拿了多少次。

⚠️ 新手易错

  • 忘记在循环里更新 n,比如只写了 n = n / 10 但写成了 n / 10(没赋值),就会死循环,程序一直在检查是不是0,永远不结束。
  • 条件写成了 while (n != 0); 多了分号,那循环体就成了空语句,程序会原地打转。
  • 如果输入负数(比如 -123),第一次 n != 0 成立,但 -123 / 10 在C++中结果是 -12(向零取整),最后也会变成0,但位数统计会出错(负号不算位)。所以更好的做法是先用 abs 取绝对值。

3. 用 do-while 循环做简单菜单——至少玩一次的游戏

假设你和几个小伙伴玩“猜数字”游戏:先猜一次,然后问“还要再玩吗?”。这种 先执行,再判断 的场景,正好用 do-while 循环。它保证至少执行一次循环体,就像你拉朋友玩游戏,不管他愿不愿意,先玩一局再说。

#include <iostream>
using namespace std;
int main() {
    char choice;                 // 存储用户的选择:y或n
    do {
        cout << "猜一个数字(1-10):";
        int guess;               // 每次猜的数
        cin >> guess;
        if (guess == 7) {
            cout << "猜对了!" << endl;
        } else {
            cout << "猜错了。" << endl;
        }
        cout << "再玩一次吗?(y/n):";
        cin >> choice;
    } while (choice == 'y' || choice == 'Y');   // 小写或大写y都继续
    cout << "游戏结束。" << endl;
    return 0;
}

运行过程

  • 先执行循环体(猜一次、提示、询问)
  • 然后检查条件:如果用户输入 yY,就再循环一次;否则退出。
  • 注意 while 后面必须有个分号,这是 do-while 的语法规定。

? 生活中的类比:很多APP的“每日签到”就是先展示签到界面,然后问“是否继续签到”。或者点外卖时先显示菜单,再问“还要加菜吗?”

⚠️ 新手易错

  • 忘记在 while 后面加分号 ;,编译会报错。
  • 条件写成了 choice == 'y' && choice == 'Y',那永远不可能为真(一个字符不能同时是y和Y),应该用 ||(或)。
  • 如果没有对 choice 进行初始化就直接判断,会出问题。

常见错误总结(练练火眼金睛)

错误类型错误代码正确写法后果
死循环(条件永远成立)while (1) 忘记改变条件确保条件最终会变为假程序一直运行,卡死
忘记初始化累加变量int sum; for(...) sum+=i;int sum = 0;结果随机
do-while 忘加分号while (条件)后面加 ;编译错误
while 条件里用了 = 而不是 ==while (n = 0)while (n == 0)变成赋值,条件永远为假或真

完整示例:输出1到100中所有5的倍数

我们可以用循环加上 if 判断,输出所有满足“除以5余数为0”的数。这综合了循环和条件判断的知识。

#include <iostream>
using namespace std;
int main() {
    cout << "1到100中5的倍数有:";
    for (int i = 1; i <= 100; i++) {   // i 从1到100
        if (i % 5 == 0) {             // 如果 i 能被5整除
            cout << i << " ";         // 输出这个数,加一个空格
        }
    }
    cout << endl;                     // 换行
    return 0;
}

运行结果5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100

自己试试:改成输出所有偶数?改成输出所有平方数(1、4、9、16……)?只要修改 if 里的条件就可以了。


接下来可以学什么?

循环是一个非常强大的工具,但生活中很多问题需要两层重复,比如画一个星星方阵(行和列都要循环),这就引出了 嵌套循环。还有时候我们需要中途跳出循环(比如找到了答案就不继续找了),这时可以用 breakcontinue。另外,循环常常和数组搭配,用于处理一串数据(比如统计全班同学的分数)。慢慢来,每一次练习都会让循环在你的脑子里“转得更灵活”!

试试自己写一个程序:先猜一个1~100之间的随机数(用 rand()),然后用 do-while 让玩家一直猜,直到猜对为止,并记录猜的次数。加油!

例题精讲

1单选题

以下程序使用while循环计算1到100的和,运行后输出结果是多少? #include <iostream> using namespace std; int main() { int sum=0, i=1; while(i<=100) { sum += i; i++; } cout << sum; return 0; }

A4950
B5000
C5050
D100
2判断题

在C++中,do-while循环的循环体至少会被执行一次。

3填空题
以下程序使用for循环求1到100中所有奇数的和,请补全循环变量的增量语句。
#include <iostream>
using namespace std;
int main() {
    int sum = 0;
    for(int i=1; i<=100; ___) {
        sum += i;
    }
    cout << sum;
    return 0;
}
4单选题

观察以下for循环代码,输出“hello”的次数是? #include <iostream> using namespace std; int main() { for(int i=0; i<3; i++) { cout << "hello"; } return 0; }

A2次
B3次
C4次
D1次
5判断题

如果while循环的初始条件为假,那么循环体一次都不会被执行。