多重循环控制(难点)
(1)介绍:
1.将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do…while均可以作为外层循环和内层循环。【建议一般使用两层,最多不要超过3层,否则代码可读性很差】
2.实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可以结束外层的当次循环,开始下一次的循环。
3.设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
for(int i=1;i<=7;i++){
for(int j=1;j<=2;j++){
System.out.println("ok"); //7*2=14
}
}
(2)多重循环控制案例1:
1.1)统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分【学生的成绩从键盘输入】
1.2)统计三个半及格人数,每个人有5名同学。
2)打印出九九乘法表
思路分析:
//化繁为简
//(1)先计算一个班,5个学生的成绩,使用for
//1.1创建Scanner对象然后,接收用户输入
//1.2得到该班级的平均分
Scanner sc = new Scanner(System.in);
double sum=0; //一个班级的总分
for(int j=0;j<=4;j++){
System.out.println("第"+(j+1)+"名同学的成绩为:");
double score = sc.nextDouble();
sum+=score; //累积
}
//因为sum是5个学生的总成绩
System.out.println("sum="+sum+"平均分="+(sum/5));
}
//(2)统计3个班(每个班5名学生)平均分
for(int i=0;i<=2;i++){ //i表示班级
//(3)所有班级的平均分
//3.1定义一个变量,double totalScore 累积所有学生的成绩
double totalScore =0; //累积所有学生的成绩
totalScore+=sum; //把sum累积到totalScore
//3.2当多重循环结束后,totalScore/(3*5)
System.out.println("三个班总分="+totalScore+"平均分="+totalScore/15);
//(4)统计三个班及格人数
//4.1定义变量 int passNum=0; 当有一个学生成绩>=60,passNum++
统计3个班成绩情况,每个班有5名同学,
//4.2如果 >=60 passNum++
if(score >=60){
passNum++;
}
代码实现:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double sum=0; //一个班级的总分
double totalScore =0; //累积所有学生的成绩
int passNum=0; //累积 及格人数
int classNum=3; //班级个数
int stuNum=5; //学生个数
for(int i=1;i<=classNum;i++){ //i表示班级
for(int j=1;j<=stuNum;j++){ //j表示学生
System.out.println("请输入第"+i+"个班第"+j+"名同学的成绩为:");
double score = sc.nextDouble();
//当有一个学生成绩>=60,passNum++
if(score >=60){
passNum++;
}
sum+=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);
}
分开求解的代码实现:
1.1)统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分【学生的成绩从键盘输入】
Scanner sc = new Scanner(System.in);
int arr[]= new int[15];
int zong=0;
int sum=0;
for(int i=0;i<=2;i++){ //3个班
for(int j=0;j<=4;j++){ //每个班5名同学
System.out.println("第"+(j+1)+"名同学的成绩为:");
arr[j]=sc.nextInt();
sum=sum+arr[j];
}
sum=sum/5;
System.out.println("第"+(i+1)+"个班的平均分为:"+sum);
zong = zong+sum;
}
zong = zong/3/5;
System.out.println("所有班级的平均分为:"+zong);
}
1.2)统计3个班成绩情况,每个班有5名同学,求所有班级的及格人数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int arr[]= new int[15];
int jige=0;
for(int i=0;i<=2;i++){ //3个班
for(int j=0;j<=4;j++){ //每个班5名同学
System.out.println("第"+(i+1)+"个班第"+(j+1)+"名同学的成绩为:");
arr[j]=sc.nextInt();
if(arr[j]>=60){
jige++;
}
}
}
System.out.println("所有班级的及格人数为:"+jige);
}
2)打印九九乘法表代码实现:
public static void main(String[] args) {
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(i+"+"+j+"="+i*j+" ");
}
System.out.println();
}
}
(3)多重循环控制案例2:
经典的打印金字塔
使用for循环完成下面的案例:
请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。
1)完成思路,可以先从矩形开始打
2)实现代码
3)用while实现
思路分析:
化繁为简
1.先打印一个矩形
*****
*****
*****
*****
*****
实现:
for(int i=1;i<=6;i++){
for(int j=1;j<=5;j++){
System.out.print("*");
}
System.out.println();
}
2.打印半个金字塔
* //第一层 1个*
** //第二层 2个*
*** //第三层 3个*
**** //第四层 4个*
***** //第五层 5个*
实现:
for(int i=1;i<=5;i++){ //i表示层数
for(int j=1;j<=i;j++){ //控制打印每层*的个数
System.out.print("*");
}
System.out.println(); //每打印完一层的*后,就换行
}
3.打印整个金字塔
* //第一层 1个* 2 * 1 - 1 有4=(总层数-1)个空格
*** //第二层 3个* 2 * 2 - 1 有3=(总层数-2)个空格
***** //第三层 5个* 2 * 3 - 1 有2=(总层数-3)个空格
******* //第四层 7个* 2 * 4 - 1 有1=(总层数-4)个空格
********* //第五层 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();
}
4.打印空心的金字塔 [难点]
* //第一层 1个* 当前行的第一个位置是 *,最后一个位置也是 *
* * //第二层 2个*
* * //第三层 2个*
* * //第四层 2个*
********* //第五层 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();
}
先死后活
层数变成变量 int totalLevel = 5;
实现:
public static void main(String[] args) {
int totalLevel = 5;
for(int i=1;i<=totalLevel;i++){ //i表示层数
//在输出*之前,还有输出 对应空格 总层数-当前层
for(int k=1;k<= totalLevel - i;k++){
System.out.print(" ");
}
for(int j=1;j<= 2 * i - 1;j++){ //控制打印每层*的个数
//当前行的第一个位置是 *,最后一个位置也是 *,最后一层全部 *
if(j ==1 || j == 2 * i - 1 || i == totalLevel ){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
代码实现:
public static void main(String[] args) {
int totalLevel = 5;
for(int i=1;i<=totalLevel;i++){ //i表示层数
//在输出*之前,还有输出 对应空格 总层数-当前层
for(int k=1;k<= totalLevel - i;k++){
System.out.print(" ");
}
for(int j=1;j<= 2 * i - 1;j++){ //控制打印每层*的个数
//当前行的第一个位置是 *,最后一个位置也是 *,最后一层全部 *
if(j ==1 || j == 2 * i - 1 || i == totalLevel ){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}