20260227 085717 Cpp 入门第四课

20260227_085717_CPP_入门第四课.md

第四章:让程序重复做事——循环结构

你好!欢迎来到第四章!在前面的章节,我们学会了让程序做判断。但是,如果想让程序重复做同一件事很多次,比如输出100遍“你好”,难道要写100行cout吗?当然不用!这时候就需要循环。循环就像跑步,一圈一圈重复,直到达到目标才停下。这一章我们会学习三种循环:forwhiledo...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. 练习1:用for循环输出1到50,每行5个数。(提示:可以用if (i % 5 == 0) cout << endl;换行)
  2. 练习2:求1到100所有奇数的和。
  3. 练习3:输入一个整数n,计算n的阶乘(n! = 1×2×3×…×n)。
  4. 练习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. 练习1:用while循环输出1到50的平方数(1², 2², … 50²)。
  2. 练习2:输入一个整数,倒序输出它(比如输入123,输出321)。不能用数组,只能用循环。
  3. 练习3:求两个数的最大公约数(用辗转相除法,提示:用while循环,条件是b!=0,循环内求余并交换)。
  4. 练习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. 练习1:用do…while循环输出1到10的立方。
  2. 练习2:编写一个菜单程序,显示选项,让用户选择,直到用户选择退出。(类似:1.开始游戏 2.设置 3.退出,输入3退出)
  3. 练习3:输入一个正整数,用do…while循环判断它是否是素数(提示:用i从2到sqrt(n)试除,一旦整除就标记不是素数)。
  4. 练习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:输出1-100中所有能被5整除但不能被3整除的数。
  2. 练习2:求两个数的最大公约数,用循环和break优化(找到即停止)。
  3. 练习3:输入一个正整数,判断它是否是素数(用break优化,一旦发现整除就跳出循环)。
  4. 练习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. 练习1:打印倒直角三角形:第一行n个,第二行n-1个,…最后一行1个*。
  2. 练习2:打印菱形(输入奇数行数,打印菱形图案)。
  3. 练习3:输出100以内的所有素数(用嵌套循环,外层遍历2-100,内层判断每个数是否是素数)。
  4. 练习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

提示:可以用二维数组或组合数公式,但这里要求只用循环(需要一点数学知识,可以选做)。


好了,第四章的内容就到这里!你已经学会了如何让程序重复做事,这是编程中非常强大的能力。加油!🚀