循环结构详解:让代码重复执行
三大结构的最后一块拼图
数学不好,能学编程吗?
许多人的担心
常见问题:
- “我数学不好,能学编程吗?”
- “编程是不是要很强的数学基础?”
- “数学差的人适合当程序员吗?”
今天的答案: 编程只是一个工具!
编程是工具
砍树的例子
场景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 次循环
循环结束
详细执行过程
分解步骤:
- i = 1(初始化,只执行一次)
- i <= 5 → 真 → 执行循环体 → 输出”第 1 次循环”
- i++ → i 变成 2
- i <= 5 → 真 → 执行循环体 → 输出”第 2 次循环”
- i++ → i 变成 3
- i <= 5 → 真 → 执行循环体 → 输出”第 3 次循环”
- i++ → i 变成 4
- i <= 5 → 真 → 执行循环体 → 输出”第 4 次循环”
- i++ → i 变成 5
- i <= 5 → 真 → 执行循环体 → 输出”第 5 次循环”
- i++ → i 变成 6
- 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;
}
算法解析
双层循环:
- 外层循环(i):遍历 3 到 1000 的奇数
- 内层循环(j):检查 i 能否被 2 到 i-1 整除
- 判断:
- 如果 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% 以上的程序员岗位
- 只需要初中数学
- 就能完全应付
常用数学:
- ✅ 加减乘除
- ✅ 大小比较
- ✅ 简单逻辑
- ❌ 不需要微积分
- ❌ 不需要高等数学
编程重大的是
- 逻辑思维
- 多练习
- 会用工具
数学好 = 锦上添花
数学一般 = 完全够用
本文要点回顾
- ✨ 编程是工具:数学不好也能学
- ✨ 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; }
互动时间
思考题:
- for循环的三个语句可以都不写吗?
- while(1) 是什么意思?
- 如何跳过当前循环,继续下一次?(提示:continue)
如果本文对你有协助,欢迎:
- 点赞支持
- 关注不迷路
- 评论区分享你的循环程序
- ⭐ 收藏慢慢看
—-本文为”C++ 大白话”系列第 10 篇
