多重循环控制

时间:2023-02-09 17:04:45

1. 介绍

1) 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。 【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】

2) 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内 层循环,才可结束外层的当次循环,开始下一次的循环

例:判断输出

多重循环控制

public class Test14
{
public static void main(String[] args)
{
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
System.out.println("i="+i+"j="+j);
}
}
}
}

2. 多重循环例题 134

例1

统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。

统计三个班及格人数,每个班有 5 名同学。

//化繁为简
//(1) 先计算一个班 , 5 个学生的成绩和平均分 , 使用 for
//1.1 创建 Scanner 对象然后,接收用户输入
//1.2 得到该班级的平均分 , 定义一个 doubel sum 把该班级 5 个学生的成绩累积

//(2) 统计 3 个班(每个班 5 个学生) 平均分
//(3) 所有班级的平均分

//统计三个班及格人数,每个班有 5 名同学。
//(4) 统计三个班及格人数
//4.1 定义变量 int passNum = 0; 当有一个学生成绩>=60, passNum++
//4.2 如果 >= 60 passNum++
//(5) 可以优化[效率,可读性, 结构]
//创建 Scanner 对象
import java.util.Scanner;
public class Test14
{
public static void main(String[] args)
{
Scanner input = new Scanner (System.in);
double allsum = 0;//记录所有班的总分
int passNum=0;//及格人数统计
for(int i =1;i<=3;i++)//每个班级
{
double sum = 0;//记录每个班总分
for(int j=1;j<=5;j++)//每个学生
{
System.out.println("请输入第"+i+"个班级第"+j+"个学生成绩");
double score = input.nextDouble();
System.out.println("学生成绩为"+score);
sum=sum+score;
//如果 >= 60 passNum++
if(score>=60)
{
passNum++;
}
}
System.out.println("请输入第"+i+"个班级总分为:"+sum+"平均成绩为"+(sum/5));//输出一个班的平均成绩
allsum = allsum+sum;
}
System.out.println("总分"+allsum+"所有班平均分为:"+(allsum/15));//总平均分
System.out.println("总及格人数:"+passNum);//总及格人数
}
}

例2 打印出九九乘法表 135

[课后题]

//打印出九九乘法表[课后题]
public class Test14
{
public static void main(String[] args)
{
int i=1;
for(i=1;i<=9;i++)
{
int j=1;
for(j=1;j<=i;j++)
{
System.out.print(j+"*"+i+"="+(i*j)+"\t");//print是不换行输出
}
System.out.println("");//总体换行
}
}
}

例3 打印金字塔 136

多重循环控制

public class Test14
{
public static void main(String[] args)
{
for(int i=1;i<=5;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("");
}
}
}

例4 打印空心金字塔

多重循环控制

public class Test14
{
public static void main(String[] args)
{
int totallevel=10;
for(int i=1;i<=totallevel;i++)//表示层数
{
for(int k=1;k<=totallevel-i;k++)//打印空格
{
System.out.print(" ");
}
for(int j=1;j<=2*i-1;j++)//打印星星
{
//当前位置第一个(j==1)是*,最后一个(j==2*i-1)也是*,最后一行(i==5) 全部输出*
if(j==1||j==2*i-1||i==totallevel)
{
System.out.print("*");
}
else
{
System.out.print(" ");//其他情况输出空格
}
}
System.out.println("");
}
}
}

5. 跳转语句 break

5.1 跳转语句break 138

break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环[for , while , do-while]中

5.1 Math.random()生成随机数[0-1) 137-138

随机生成 1-100 的一个数,直到生成了 97 这个数,看看你一共用了几次?

public class Test15
{
public static void main(String[] args)
{
int ret=0;
int count = 0;
for(;;)
{
ret = (int)(Math.random()*100)+1;
count++;
if(ret==97)
{
break;
}
}
System.out.println("count="+count);
System.out.println("ret="+ret);
}
}

6. break小例题 139

多重循环控制

//break小例题
public class Test15
{
public static void main(String[] args)
{
for(int i=0;i<10;i++)
{
if(i==3)
{
break;
}
System.out.println("i="+i);
}
}
}

7. break细节

多重循环控制

//break细节关于标签的使用
public class Test15
{
public static void main(String[] args)
{
abc1:
for(int j=0;j<4;j++)
{
abc2:
for(int i=0;i<20;i++)
{
if(i==2)
{
break abc1;
}
System.out.println("i="+i);
}
}
}
}

8. 比较两个字符串是否相等 equals

//比较字符串是否相等  equals
import java.util.Scanner;
public class Test15
{
public static void main(String[] args)
{
String name = "中国";
System.out.println(name.equals("中国"));//T
System.out.println("中国".equals(name));//T,两种写法都对
}
}

9. break练习

例1 141

1-100 以内的数求和,求出 当和 第一次大于 20 的当前数 【for + break】

public class Test15
{
public static void main(String[] args)
{
int sum=0;
for(int i=1;i<=100;i++)
{
sum+=i;
if(sum>20)
{
System.out.println("和>20的时候,当前数i="+i);
break;
}
}
}
}

例2 142

实现登录验证,有 3 次机会,如果用户名为"丁真" ,密码"666"提示登录成功,否则提示还有几次机会,请使用 for+break 完成

import java.util.Scanner;
public class Test15
{
public static void main(String[] args)
{
// 思路分析
// 1. 创建 Scanner 对象接收用户输入
// 2. 定义 String name ; String passwd; 保存用户名和密码
// 3. 最多循环 3 次[登录 3 次],如果 满足条件就提前退出
// 4. 定义一般变量 int chance 记录还有几次登录机会
Scanner myScanner = new Scanner(System.in);
String name = "";
String passwd = "";
int chance = 3;//登录一次少一次
for(int i=1;i<=3;i++)
{
System.out.println("请输入名字");
name = myScanner.next();
System.out.println("请输入密码");
passwd = myScanner.next();
if("丁真".equals(name) && "666".equals(passwd))//比较字符串是否相等
{
System.out.println("恭喜你,登陆成功");
break;
}
else//登录次数减少
{
chance--;
System.out.println("你还有"+chance+"次机会");
}
}
}
}

10. 跳转控制语句continue 144

1) continue 语句用于结束本次循环,继续执行下一次循环。

2) continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层环 , 这个和前面的标签的 使用的规则一样

例 145

//跳转控制语句continue  145
public class Test15
{
public static void main(String[] args)
{
int i=1;
while(i<=4)
{
i++;
if(i==2)
{
continue;
}
System.out.println("i="+i);
}
}
}

11. 自我提升 打印菱形

多重循环控制

import java.util.Scanner;
public class Test15
{
public static void main(String[] args)
{
System.out.println("请输入想要的层数");
Scanner myScanner = new Scanner(System.in);
int n = myScanner.nextInt();//自我控制层数
//先打印上半部分,上5层
for(int i =1;i<=n;i++)//层数
{
//打印空格
for(int j=1;j<=n-i;j++)
{
System.out.print(" ");
}
//打印*
for(int k=1;k<=2*i-1;k++)
{
if(k==1 || k==2*i-1)//变成空心
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println();
}
//在打印下半部分
for(int a=1;a<=n-1;a++)//层数
{
//打印空格
for(int b=1;b<=a;b++)
{
System.out.print(" ");
}
//打印*
for(int c=1;c<=2(n-a)-1;c++)//此规律2(5-a)-1,细细琢磨
{
if(c==1||c==2*(n-a)-1)//变成空心
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println();
}
}
}