L2 - for循环与嵌套逻辑

🎯 教学目标

  1. 掌握for循环执行流程
  2. 理解循环变量的作用域
  3. 能处理双重循环嵌套问题

🔑 核心知识点

基础for循环结构

1
2
3
4
for(int i=0; i<10; i++){
cout << i << " ";
}
// 输出:0 1 2 3 4 5 6 7 8 9

执行流程详解:

  1. 初始化阶段int i=0(仅在循环开始时执行一次)
  2. 条件判断i<10(每次循环前检查)
    • 若为true → 执行循环体
    • 若为false → 退出循环
  3. 迭代操作i++(每次循环体执行完毕后执行)
  4. 循环周期
    1
    初始化 → 判断 → 执行体 → 迭代 → 判断 → ...

变量作用域规则:

  • 循环变量i仅在for语句块内有效
  • 若在循环外访问i将导致编译错误
  • 可通过外部声明扩展作用域:
    1
    2
    3
    int i; // 声明在外部
    for(i=0; i<10; i++){ /*...*/ }
    cout << i; // 此时i=10

嵌套循环模板

1
2
3
4
5
6
7
8
9
10
11
12
// 打印3行5列的星号矩阵
for(int row=0; row<3; row++){
for(int col=0; col<5; col++){
cout << "*";
}
cout << endl; // 换行在行循环内
}
/* 输出:
*****
*****
*****
*/

执行特征分析:

  1. 外层循环控制行数:决定整体结构层数
  2. 内层循环控制列数:处理每行的细节元素
  3. 执行次数计算:外层次数 × 内层次数(本例3×5=15次)
  4. 内存消耗:每层循环变量独立存储

📚 进阶技巧

循环控制语句

1
2
3
4
5
6
7
8
9
10
11
12
13
// break示例:遇到4立即终止循环
for(int i=0; i<10; i++){
if(i == 4) break;
cout << i << " ";
}
// 输出:0 1 2 3

// continue示例:跳过奇数
for(int i=0; i<10; i++){
if(i%2 != 0) continue;
cout << i << " ";
}
// 输出:0 2 4 6 8

关键区别:

break continue
作用范围 当前整个循环 本次循环迭代
典型应用 提前退出条件 跳过特定情况
嵌套影响 只影响所在层 只影响所在层

调试案例解析

1
2
3
4
// 死循环示例分析
for(int i=5; i>0; i++){ // 错误点:i++导致i永远>0
cout << i << endl;
}

调试步骤:

  1. 定位循环条件i>0
  2. 追踪变量变化:初始i=5 → 每次+1 → 6,7,8…
  3. 发现矛盾点:迭代方向与条件判断矛盾
  4. 修正方案:应改为i--

🧩 经典算法实现

九九乘法表

1
2
3
4
5
6
for(int i=1; i<=9; i++){
for(int j=1; j<=i; j++){
cout << j << "×" << i << "=" << i*j << "\t";
}
cout << endl;
}

实现原理:

  1. 外层循环:控制被乘数(1-9)
  2. 内层循环:控制乘数(1到当前被乘数)
  3. 输出对齐:使用\t制表符保持列对齐
  4. 迭代关系:每行元素个数=行号

执行过程模拟(以i=3为例):

1
2
3
4
i=3时:
j循环执行3次:
1×3=3 2×3=6 3×3=9
换行

💣 易错点详解

  1. 循环条件设置错误

    1
    2
    for(int i=0; i<=5; i++) // 执行6次(0-5)
    for(int i=1; i<5; i++) // 执行4次(1-4)
  2. 嵌套循环变量混淆

    1
    2
    3
    4
    5
    for(int i=0; i<3; i++){
    for(int i=0; i<5; i++){ // 内层覆盖外层i
    cout << i; // 输出0-4(错误!)
    }
    }
  3. 迭代语句位置错误

    1
    2
    3
    4
    5
    int i=0;
    for( ; i<5; ){
    cout << i;
    i++; // 必须手动增加
    }
  4. 浮点数循环陷阱

    1
    2
    for(double d=0.1; d!=1.0; d+=0.1) 
    // 浮点精度问题可能导致无限循环

🛠️ 调试技巧

  1. 输出中间变量

    1
    2
    3
    4
    for(int i=0; i<5; i++){
    cout << "当前i值:" << i << endl;
    // ...其他代码
    }
  2. 使用调试器观察点

    • 在IDE中设置变量监控
    • 单步执行观察循环流程
  3. 边界条件测试

    • 测试循环的第一次和最后一次迭代
    • 验证初始值和终止条件
  4. 复杂度预估

    • 对嵌套循环进行时间复杂度分析:
      • 单层O(n)
      • 双层O(n²)
      • 三层O(n³)

🏋️ 配套练习

  1. 数字菱形阵

    • 输入:层数n(奇数)
    • 输出:
      1
      2
      3
      4
      5
        1
      222
      33333
      222
      1
    • 要求:n=3时输出如上,使用双重循环控制空格和数字
  2. 质数验证器

    • 输入:整数m(1<m<1000)
    • 输出:所有能组成m的质数对(例如16→3+13)
    • 进阶:输出用时最少的前三对组合
  3. 数列生成器

    • 输入:起始值a,差值d,项数n
    • 输出:等差数列前n项,每行5个数
      1
      2
      3
      4
      输入:2 3 7
      输出:
      2 5 8 11 14
      17 20
  4. 字母金字塔

    • 输入:大写字母(如E)
    • 输出:
      1
      2
      3
      4
      5
          A
      ABA
      ABCBA
      ABCDCBA
      ABCDEDCBA
  5. 数位分解器

    • 输入:任意正整数
    • 输出:各个位数+位数和
      1
      2
      3
      4
      5
      6
      7
      输入:3141
      输出:
      千位:3
      百位:1
      十位:4
      个位:1
      各位和:9