1. 什么是循环嵌套?
循环嵌套,就是在一个循环的循环体内,又包含了另一个完整的循环结构。例如for循环的里面可以套for循环,for循环的里面也可以套用while循环,while循环的里面可以套用while循环,while循环的里面同样可以套用for循环。
可以理解为:
外层循环控制“第几轮”
内层循环负责“每一轮做什么”
就像钟表:时针(外层)转一圈,分针(内层)转60圈
2. 循环嵌套的基本结构
2.1 语法格式(常用)
for(int i = 1; i <= n; i++) // 外层循环{ // 外层循环的代码 for(int j = 1; j <= m; j++) // 内层循环 { // 内层循环的代码 } // 外层循环的后续代码}
执行流程:
外层循环变量i = 1
执行内层循环( j从1到m,完整执行一遍)
外层循环i++,i = 2
再次完整执行内层循环
重复直到外层循环结束
记住:内层循环跑完一遍,外层才走一步。
for (int i = 1; i <= 3; i++) { cout << "i=" << i << " 开始" << endl; for (int j = 1; j <= 3; j++) { cout << " j=" << j << endl; } cout << "i=" << i << " 结束" << endl;}
输出:
i=1 开始 j=1 j=2 j=3i=1 结束i=2 开始 j=1 j=2 j=3i=2 结束i=3 开始 j=1 j=2 j=3i=3 结束
理解了吗? 内层循环的j从1跑到3,外层i才增加1。相当于外层i执行了一次,内层的循环执行了3次,直到内层结束,再去执行外层的下一次操作。
2.2 最简单的例子:打印矩形
#include<bits/stdc++.h>using namespace std;intmain(){ // 打印一个5行×10列的矩形,用*表示 for(int i = 1; i <= 5; i++)// 外层:控制行数 { for (int j = 1; j <= 10; j++) // 内层:控制每行的*个数 { cout << "*"; } cout << endl;// 每行结束换行 } return 0;}
**************************************************
理解:
外层循环i从1到5,共执行5次
每次外层循环,内层循环j从1到10,输出10个*
内层循环结束后,输出换行
#include<bits/stdc++.h>using namespace std;/* 完数:一个数如果恰好等于它的因子之和(不包含自己) 编程序找出[1, n]的所有完数, 分行进行输出*/intmain(){ int n; cin >> n; for(int i = 1; i <= n; i++)//需要用循环实现1~n的遍历 { int sum = 0;//每次 对应一个新的i, sum都要进行清空操作 //如何判断i是完数 for(int j = 1; j <= i-1; j++)//在这个范围里找因数 { if(i % j == 0)//找到能够被i整除的j 就说明j是i的因数 { sum += j;//把j都加到sum中 } } if(i == sum) //本身 == 因数和 { cout << i << endl; } } return 0;}
3、初学者必记的2条规则
规则1:变量名要不同
// 正确for(int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) { // 外层用i,内层用j }}// 错误for(int i = 1; i <= 5; i++) { for (int i = 1; i <= 5; i++) { // 都用i,冲突了! }}
规则2:换行要放对位置
//正确for(int i = 1; i <= 5; i++) { for(int j = 1; j <= 5; j++) { cout << "*"; // 内层:打印* } cout << endl; // 外层:换行(打满一行再换行)}//错误for(int i = 1; i <= 5; i++) { for(int j = 1; j <= 5; j++) { cout << "*"; cout << endl; // 每打一个*就换行,错了! }}
4、内容总结
矩形:内层循环次数固定
三角形:内层循环次数 = 外层变量
外层管“第几轮”
内层管“每轮做什么”
换行在内层结束后
变量内外要分清