多重循环控制
1. 介绍
1) 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】
2) 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内
层循环,才可结束外层的当次循环,开始下一次的循环[听不懂,走案例]。
3) 设外层循环次数为 m
次,内层为 n
次,则内层循环体实际上需要执行 m*n
次
2. 多重循环执行步骤分析:
- 请分析 下面的多重循环执行步骤, 并写出输出 => 内存分析法
for(int i = 0; i < 2; i++) {
for( int j = 0; j < 3; j++) {
System.out.println("i=" + i + "j=" + j);
}
}
3. 应用实例:
MulForExercise01.java
(1) 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
- 思路分析:
-
化繁为简
(1) 先计算一个班 , 5个学生的成绩和平均分 , 使用for
1.1 创建 `Scanner` 对象然后,接收用户输入 1.2 得到该班级的平均分 , 定义一个 `doubel sum` 把该班级5个学生的成绩累积
Scanner sc = new Scanner(System.in);
double sum = 0; //一个班的总成绩
for (int j = 1;j <= 5;j++){
System.out.println("请输入第一个班的第" + j + "个学生的成绩:");
double score = sc.nextDouble();
sum += score; //累积
System.out.println("成绩为:"+score);
}
//因为 sum 是5个学生的总成绩
System.out.println("sum="+sum+"平均分="+(sum /5 ));
(2) 统计3个班(每个班5个学生) 平均分,在外层加个 for 循环 i,因为是每个班,都要计算一个班的学生总成绩和平均分,所以再外层嵌套一层 for 循环 3,最后在把输入的第几个班改为 第 i 个班即可
Scanner sc = new Scanner(System.in);
for (int i = 1;i <= 3;i++) { //i表示班级
double sum = 0; //一个班的总成绩
for (int j = 1; j <= 5; j++) { //j表示学生
System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
double score = sc.nextDouble();
sum += score; //累积
System.out.println("成绩为:" + score);
}
//因为 sum 是5个学生的总成绩
System.out.println("sum=" + sum + "平均分=" + (sum / 5));
}
(3) 所有班级的平均分
3.1 定义一个变量,`double totalScore` 累积所有学生的成绩
3.2 当多重循环结束后,`totalScore / (3 * 5)`
Scanner sc = new Scanner(System.in);
double totalScore = 0;//累积所有学生的总成绩
for (int i = 1;i <= 3;i++) { //i表示班级
double sum = 0; //一个班的总成绩
for (int j = 1; j <= 5; j++) { //j表示学生
System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
double score = sc.nextDouble();
sum += score; //累积
System.out.println("成绩为:" + score);
}
//因为 sum 是5个学生的总成绩
System.out.println("sum=" + sum + "平均分=" + (sum / 5));
//把 sum 累积到 totalScore
totalScore += sum;
}
System.out.println("三个班总分"+totalScore+"平均分="+totalScore / 15);
(4) 统计三个班及格人数
4.1 定义变量 int passNum = 0; 当有一个学生成绩>=60, passNum++
4.2 如果 >= 60 passNum++
Scanner sc = new Scanner(System.in);
double totalScore = 0;//累积所有学生的总成绩
int passNum = 0; //累积 及格人数
for (int i = 1;i <= 3;i++) { //i表示班级
double sum = 0; //一个班的总成绩
for (int j = 1; j <= 5; j++) { //j表示学生
System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
double score = sc.nextDouble();
if (score >= 60){
passNum++;
}
sum += score; //累积
System.out.println("成绩为:" + score);
}
//因为 sum 是5个学生的总成绩
System.out.println("sum=" + sum + "平均分=" + (sum / 5));
//把 sum 累积到 totalScore
totalScore += sum;
}
System.out.println("三个班总分"+totalScore+"平均分="+totalScore / 15);
System.out.println("及格人数="+passNum);
(5) 可以优化[效率,可读性, 结构],班级人数和学生人数分别使用变量来替换
Scanner sc = new Scanner(System.in);
double totalScore = 0;//累积所有学生的总成绩
int passNum = 0; //累积 及格人数
int classNum = 3; //班级个数
int stuNum = 5; //学生个数
for (int i = 1;i <= classNum;i++) { //i表示班级
double sum = 0; //一个班的总成绩
for (int j = 1; j <= stuNum; j++) { //j表示学生
System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
double score = sc.nextDouble();
if (score >= 60){
passNum++;
}
sum += score; //累积
System.out.println("成绩为:" + score);
}
//因为 sum 是5个学生的总成绩
System.out.println("sum=" + sum + "平均分=" + (sum / stuNum));
//把 sum 累积到 totalScore
totalScore += sum;
}
System.out.println("三个班总分"+totalScore+"平均分="+totalScore / classNum*stuNum);
System.out.println("及格人数="+passNum);
(2) 统计三个班及格人数,每个班有 5 名同学。
(3) 打印出九九乘法表
for (int i = 1; i <= 9; i++){
for(int j = 1; j <= i; j++){
// "\t"这是JAVA语言默认的制表符号,使用此符号,打印出的乘法表格较为美观
System.out.print(" " + i + "*" + j + "=" + (i * j)+"\t");
if(i == j){
System.out.print("\n");//当换行条件成立时,进行换行打印
}
}
4. 经典的打印金字塔
- 使用 for 循环完成下面的案例
请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。(Stars.java) [化繁为简,先死后活
]
-
思路分析
化繁为简- 先打印一个矩形
*****
*****
*****
*****
*****
for (int i = 1; i <= 5; i++) {
System.out.println("*****");
}
- 打印半个金字塔
* //第1层 有 1个*
** //第2层 有 2个*
*** //第3层 有 3个*
**** //第4层 有 4个*
***** //第5层 有 5个*
for (int i = 1; i <= 5; i++) { // i 表示层数
// 控制打印每层的 * 个数
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
// 每打印完一层 * 后,就换行
System.out.println("");
}
- 打印整个金字塔
2 * 层数-1
* //第1层 有 1个* 2 * 1 -1 有4=(总层数-1)个空格
*** //第2层 有 3个* 2 * 2 -1 有3=(总层数-2)个空格
***** //第3层 有 5个* 2 * 3 -1 有2=(总层数-3)个空格
******* //第4层 有 7个* 2 * 4 -1 有1=(总层数-4)个空格
********* //第5层 有 9个* 2 * 5 -1 有0=(总层数-5)个空格
for (int i = 1; i <= 5; i++) { // i 表示层数
//在输出*之前,还有输出 对应空格 = 总层数-当前层
for (int k = 1; k <= 5-i; k++){
System.out.print(" ");
}
// 控制打印每层的 * 个数
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
// 每打印完一层 * 后,就换行
System.out.println("");
}
- 打印空心的金字塔 [最难的]
* //第1层 有 1个* 当前行的第一个位置是*,最后一个位置也是*
* * //第2层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
* * //第3层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
* * //第4层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
********* //第5层 有 9个* 全部输出*
for (int i = 1; i <= 5; i++) { // i 表示层数
//在输出*之前,还有输出 对应空格 = 总层数-当前层
for (int k = 1; k <= 5-i; k++){
System.out.print(" ");
}
// 控制打印每层的 * 个数
for (int j = 1; j <= 2 * i - 1; j++) {
//当前行的第一个位置是*,最后一个位置也是*,最后一层全部输出 *
if (j == 1 || j == 2 * i - 1 || i == 5){
System.out.print("*");
}else { //其他情况输出 空格
System.out.print(" ");
}
}
// 每打印完一层 * 后,就换行
System.out.println("");
}
- 先死后活:5 层数做成变量
int totalLevel = 5;
- 把 5 改成 10
int totalLeavel = 10;
for (int i = 1; i <= totalLeavel; i++) { // i 表示层数
//在输出*之前,还有输出 对应空格 = 总层数-当前层
for (int k = 1; k <= totalLeavel-i; k++){
System.out.print(" ");
}
// 控制打印每层的 * 个数
for (int j = 1; j <= 2 * i - 1; j++) {
//当前行的第一个位置是*,最后一个位置也是*,最后一层全部输出 *
if (j == 1 || j == 2 * i - 1 || i == totalLeavel){
System.out.print("*");
}else { //其他情况输出 空格
System.out.print(" ");
}
}
// 每打印完一层 * 后,就换行
System.out.println("");
}
}