C++大白话系列-入门基础篇-10-循环结构详解

内容分享2小时前发布
0 0 0

循环结构详解:让代码重复执行

三大结构的最后一块拼图

数学不好,能学编程吗?

许多人的担心

常见问题:

  • “我数学不好,能学编程吗?”
  • “编程是不是要很强的数学基础?”
  • “数学差的人适合当程序员吗?”

今天的答案: 编程只是一个工具!


编程是工具

砍树的例子

场景1:徒手砍树

没有工具
 ↓
费时费力
 ↓
效率低下

场景2:有斧头

有斧头
 ↓
轻松许多
 ↓
效率提升

场景3:有斧头+物理知识

有斧头 + 知道45度角最省力
 ↓
效率再次提升
 ↓
事半功倍

编程也一样

会用编程工具
 ↓
机智人

会用编程 + 有数学知识
 ↓
更厉害的人

但是! 不懂高等数学,一样能用编程解决问题!


为什么需要循环?

问题:求和

任务: 计算 233 到 788 之间所有整数之和

方法1: 手算

233 + 234 + 235 + ... + 788 = ?

累死了!

方法2: 用编程(循环)

// 几行代码搞定!

轻松!


for 循环

语法结构

for (语句1; 语句2; 语句3) {
 // 循环体
}

三个语句:

位置

名称

作用

语句1

初始化

只执行一次,一般声明循环变量

语句2

条件判断

每次判断是否继续循环

语句3

更新

每次循环后执行

执行流程

第一步:执行语句1(初始化)
 ↓
第二步:执行语句2(判断)
 ↓
 结果为0?
 ↙ ↘
是 否
↓ ↓
结束 执行循环体
 ↓
 执行语句3
 ↓
 回到语句2

完整示例

#include <stdio.h>

int main() {
int i;
for (i = 1; i <= 5; i++) {
printf("第 %d 次循环
", i);
 }
printf("循环结束
");
return 0;
}

输出:

 1 次循环
 2 次循环
 3 次循环
 4 次循环
 5 次循环
循环结束

详细执行过程

分解步骤:

  1. i = 1(初始化,只执行一次)
  2. i <= 5 → 真 → 执行循环体 → 输出”第 1 次循环”
  3. i++ → i 变成 2
  4. i <= 5 → 真 → 执行循环体 → 输出”第 2 次循环”
  5. i++ → i 变成 3
  6. i <= 5 → 真 → 执行循环体 → 输出”第 3 次循环”
  7. i++ → i 变成 4
  8. i <= 5 → 真 → 执行循环体 → 输出”第 4 次循环”
  9. i++ → i 变成 5
  10. i <= 5 → 真 → 执行循环体 → 输出”第 5 次循环”
  11. i++ → i 变成 6
  12. i <= 5 → 假 → 结束循环

实战:求和程序

1到100求和

#include <stdio.h>

int main() {
long long total = 0; // 存储累加结果
int i;
for (i = 1; i <= 100; i++) {
total = total + i; // 或写成:total += i;
 }
printf("1到100之和:%lld
", total);
return 0;
}

输出:

1到100之和:5050

执行过程

初始:total = 0

循环1:total = 0 + 1 = 1
循环2:total = 1 + 2 = 3
循环3:total = 3 + 3 = 6
循环4:total = 6 + 4 = 10
...
循环100:total = 4950 + 100 = 5050

任意范围求和

#include <stdio.h>

int main() {
long long start, end;
long long total = 0;
long long i;
printf("请输入起始数:
");
scanf("%lld", &start);
printf("请输入结束数:
");
scanf("%lld", &end);
for (i = start; i <= end; i++) {
total += i;
 }
printf("%lld 到 %lld 之和:%lld
", start, end, total);
return 0;
}

运行示例:

请输入起始数:
233
请输入结束数:
788
233  788 之和:284046

数学不够,编程来凑

暴力求解

问题: 1到30亿求和

暴力方法:

long long total = 0;
long long i;

for (i = 1; i <= 3000000000; i++) {
total += i;
}

耗时: 约2秒 ⏱️

数学优化

等差数列求和公式:

总和 = (首项 + 末项) × 项数 / 2

优化代码:

long long start = 1;
long long end = 3000000000;
long long total = (start + end) * (end - start + 1) / 2;

printf("结果:%lld
", total);

耗时: 瞬间完成 ⚡

结论

编程 = 斧头(工具)
数学 = 物理知识(优化)

有工具 → 能干活 ✅
工具 + 知识 → 干得更快 

数学不好的同学,反而可以借助编程解决数学问题!


嵌套循环

循环套循环

语法:

for (外层循环) {
for (内层循环) {
 // 执行代码
 }
}

九九乘法表

#include <stdio.h>

int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d×%d=%d	", j, i, i * j);
 }
printf("
");
 }
return 0;
}

输出:

1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
...

执行过程

i = 1:
 j = 1: 打印 1×1=1
i = 2:
 j = 1: 打印 1×2=2
 j = 2: 打印 2×2=4
i = 3:
 j = 1: 打印 1×3=3
 j = 2: 打印 2×3=6
 j = 3: 打印 3×3=9

实战:求质数

问题

任务: 找出1000以内的所有质数

质数定义: 只能被1和自己整除的数(大于1)

完整代码

#include <stdio.h>

int main() {
int i, j;
int isPrime; // 1表明是质数,0表明不是
printf("1000以内的质数:
");
 // 2是最小的质数
printf("2 ");
 // 从3开始,只判断奇数
for (i = 3; i <= 1000; i += 2) {
isPrime = 1; // 假设是质数
 // 判断i是否能被2到i-1之间的数整除
for (j = 2; j < i; j++) {
if (i % j == 0) {
 // 能整除,不是质数
isPrime = 0;
break; // 跳出内层循环
 }
 }
if (isPrime == 1) {
printf("%d ", i);
 }
 }
printf("
");
return 0;
}

算法解析

双层循环:

  1. 外层循环(i):遍历 3 到 1000 的奇数
  2. 内层循环(j):检查 i 能否被 2 到 i-1 整除
  3. 判断
  • 如果 i % j == 0,说明能整除,不是质数
  • 用 break 跳出内层循环
  • 如果 j 循环到 i,说明都不能整除,是质数

优化版本

#include <stdio.h>
#include <math.h>

int main() {
int i, j;
int isPrime;
printf("1000以内的质数:
");
printf("2 ");
for (i = 3; i <= 1000; i += 2) {
isPrime = 1;
 // 只需要判断到 sqrt(i)
for (j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
isPrime = 0;
break;
 }
 }
if (isPrime == 1) {
printf("%d ", i);
 }
 }
printf("
");
return 0;
}

优化原理: 如果 i 不是质数,必然有一个因子 ≤ √i


break 语句

作用

break = 跳出最近的一个循环

示例

#include <stdio.h>

int main() {
int i;
for (i = 1; i <= 10; i++) {
if (i == 5) {
break; // 遇到5就跳出循环
 }
printf("%d ", i);
 }
printf("
循环结束
");
return 0;
}

输出:

1 2 3 4
循环结束

break 在嵌套循环中

for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
if (j == 2) {
break; // 只跳出内层循环
 }
printf("(%d, %d) ", i, j);
 }
printf("
");
}

输出:

(1, 1)
(2, 1)
(3, 1)

记住: break 只跳出最近的一个循环


while 循环

语法结构

while (条件) {
 // 循环体
}

执行流程:

判断条件
 ↓
 为真?
 ↙ ↘
是 否
↓ ↓
执行 结束
循环体
↓
回到判断

基本示例

#include <stdio.h>

int main() {
int i = 1;
while (i <= 5) {
printf("第 %d 次循环
", i);
i++;
 }
printf("循环结束
");
return 0;
}

输出:

 1 次循环
 2 次循环
 3 次循环
 4 次循环
 5 次循环
循环结束

for vs while

一样功能的两种写法:

for 循环:

int i;
for (i = 1; i <= 100; i++) {
printf("%d ", i);
}

while 循环:

int i = 1;
while (i <= 100) {
printf("%d ", i);
i++;
}

如何选择?

场景

推荐

知道循环次数

for

不知道循环次数

while

遍历固定范围

for

条件复杂

while


编程只需初中数学

真相

统计数据:

  • 95% 以上的程序员岗位
  • 只需要初中数学
  • 就能完全应付

常用数学:

  • ✅ 加减乘除
  • ✅ 大小比较
  • ✅ 简单逻辑
  • ❌ 不需要微积分
  • ❌ 不需要高等数学

编程重大的是

  1. 逻辑思维
  2. 多练习
  3. 会用工具

数学好 = 锦上添花

数学一般 = 完全够用


本文要点回顾

  • 编程是工具:数学不好也能学
  • for循环:for(初始化; 条件; 更新) { 循环体 }
  • 执行流程:初始化 → 判断 → 循环体 → 更新 → 判断
  • 嵌套循环:循环里面套循环
  • break:跳出最近的循环
  • while循环:while(条件) { 循环体 }
  • 数学要求:初中数学足够95%岗位

记忆口诀

for循环三部曲,初始判断加更新。

while循环更简洁,条件为真就执行。

break跳出最近层,嵌套循环要分清。


实战练习

练习1:求偶数和

任务: 求1到100之间所有偶数的和

点击查看答案

cpp #include <stdio.h> int main() { long long total = 0; int i; for (i = 2; i <= 100; i += 2) { total += i; } printf(“1到100偶数之和:%lld
“, total); return 0; }

或者:
cpp #include <stdio.h> int main() { long long total = 0; int i; for (i = 1; i <= 100; i++) { if (i % 2 == 0) { total += i; } } printf(“1到100偶数之和:%lld
“, total); return 0; }

练习2:阶乘计算

任务: 计算 n! (n的阶乘)

示例: 5! = 5 × 4 × 3 × 2 × 1 = 120

点击查看答案

cpp #include <stdio.h> int main() { int n; long long result = 1; int i; printf(“请输入n:
“); scanf(“%d”, &n); for (i = 1; i <= n; i++) { result *= i; } printf(“%d! = %lld
“, n, result); return 0; }

练习3:猜数字游戏

任务: 程序随机生成1-100的数,用户猜,提示大了还是小了

点击查看答案

cpp #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int target, guess; srand(time(NULL)); target = rand() % 100 + 1; printf(“我想了一个1-100的数字,你来猜!
“); while (1) { printf(“请输入你的猜测:”); scanf(“%d”, &guess); if (guess == target) { printf(“祝贺你猜对了!
“); break; } else if (guess > target) { printf(“太大了!
“); } else { printf(“太小了!
“); } } return 0; }

练习4:用while实现求和

任务: 用while循环实现1到100求和

点击查看答案

cpp #include <stdio.h> int main() { long long total = 0; int i = 1; while (i <= 100) { total += i; i++; } printf(“1到100之和:%lld
“, total); return 0; }

练习5:用while实现质数

任务: 用while循环找出100以内的质数

点击查看答案

cpp #include <stdio.h> int main() { int i = 3; int j; int isPrime; printf(“100以内的质数:
“); printf(“2 “); while (i <= 100) { isPrime = 1; j = 2; while (j < i) { if (i % j == 0) { isPrime = 0; break; } j++; } if (isPrime == 1) { printf(“%d “, i); } i += 2; } printf(”
“); return 0; }


互动时间

思考题:

  1. for循环的三个语句可以都不写吗?
  2. while(1) 是什么意思?
  3. 如何跳过当前循环,继续下一次?(提示:continue)

如果本文对你有协助,欢迎:

  • 点赞支持
  • 关注不迷路
  • 评论区分享你的循环程序
  • ⭐ 收藏慢慢看

—-本文为”C++ 大白话”系列第 10 篇

© 版权声明

相关文章

暂无评论

none
暂无评论...