Java基础-第06章:循环进阶[云图智联]

原创
2020/07/08 10:25
阅读数 93

1. 多重循环结构

1.1 为什么需要多重循环

  通过之前的学习我们知道,if语句等选择结构是可以嵌套的,同理,循环结构也可以。通过嵌套循环结构可以更方便的、解决更多有意思的问题。

1.2 什么是多重循环

  简单地说,多重循环就是在一个循环体内又嵌套另一个完整的循环结构。前面我们学习了三种循环:while循环、do-while循环和for循环。这三种循环之间是可以互相嵌套的。在多重循环中,外层循环变量变化一次,内层循环就要从初始值到结束值变化一遍。好比钟表的时针每转一格,分针就要转一圈。

1.3 多重循环的应用:

1.3.1输出九九乘法表

1.3.1.1 通过分析上面的效果图,我们可以总结出:
  (1)一共有9行;
  (2)每行的重复操作就是输出公式,公式的数量=当选的行号(第n行就有n个公式);
  (3)每个公式的第一个数字是从1循环到当前的行号,第二数字是固定值,即当前的行号,等号的后面就是两个数字的乘积;
1.3.1.2 所以,我们可以使用二重循环来解决:
  (1)用外层循环控制行数,循环变量i应该从1到9;
  (2)用内层循环控制公式的个数,循环变量j应该从1到i;
  (3)循环操作就是输出公式:j * i = ( j * i );注意:每输出完一行后,要换行。
1.3.1.3 套用语法,写出代码:

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print(j +"*"+ i + "=" + i*j + "\t");
    }
    System.out.println();
}

1.3.2 数组的冒泡排序

   排序是计算机编程中非常普遍的一个任务,对于排序已经开发出很多不同的算法,比如:选择排序、插入排序、快速排序等,本小节介绍一个直观的排序算法:冒泡排序,它也是多重循环的一个经典应用。
1.3.2.1 原理(以升序为例):将数组中的相邻两个元素进行比较,较大的交换到后面。经过这样一轮操作后,最大的数就交换到了数组的最后(像气泡一样冒出了水面,故名:冒泡);同理,再将除了最大值以外的其他所有数字,按照同样的方法进行一轮“比较并交换”的操作,第二大的数字也被移动到了数组倒数第二的位置......(如果要求降序排序,则每次将较小的值交换到后面)。动画演示如下:

1.3.2.2 分析:
  1.通过上面的文字和动画分析我们可以知道:“比较并决定是否交换”是一个重复的操作,毫无疑问,要使用循环来解决;
  2.假设有n个数字需要排序,我们可以使用数组来存储这些元素;
  3.通过一轮比较,就可以产生一个“当前数字中的”最大值,n个数字只需要产生(n-1)个“最大值”,即:我们需要(n-1)轮比较。可以创建一个for循环,循环变量用i表示,初始值如果为0,循环条件应为 i<(n-1);
  4.在第1轮的比较中,一共需要比较(n-1)次;随着要比较的数字的逐个减少,因此第2轮中,需要比较(n-1-1)次;第3轮中,需要比较(n-1-2)次...所以我们还需要创建一个内层for循环来处理每一轮内部的若干次比较,如果用变量j来表示并且初始值为0的话,则循环条件应为j<(n-1-i);

1.3.2.3 编码:

public static void main(String[] args) {
    int[] nums= {23,56,5,90,78,20};
    for(int i=0;i<nums.length-1;i++) {  //外层循环,用来控制比较的轮数
        for(int j=0;j<(nums.length-1-i);j++) {  //内层循环,控制每轮的次数
            if(nums[j]>nums[j+1]) {  //如果此元素大于他后面的元素
                int emp;      //则交换位置
                emp=nums[j];
                nums[j]=nums[j+1];
                nums[j+1]=emp;
            }
        }       
    }
    System.out.println("排序后的数组是:");
    for (int i : nums) {    //foreach循环,详情见下文
        System.out.print(i+"\t");
    }   
}

1.3.3.4 说明:在上述代码中,我们使用了一个foreach循环(each:每一个/各个),它是一个更简便的for循环,也叫“增强型for循环”。通过它,我们不使用下标变量就可以方便的遍历整个数组,其中的“i”就代表了nums中的每一个元素,要注意:变量i的数据类型必须与数组元素的类型相同。所以,此行代码可以读作“对nums中的每一个元素i进行以下操作”。

2.多重循环中的跳转语句

2.1 在多重循环中使用continue语句:跳过它所在循环的后面的语句,继续下一次循环;
2.2 在多重循环中使break语句:跳出它所在的循环,执行循环体后的代码;
2.3 对比图:

2.4 补充:在多重循环中,break语句只能跳出它所在的循环,如果想跳出指定的循环,可以给目标循环起一个名字,然后“break 名字;”即可。如:

for1:for (int i = 0; i < 5; i++) {
    for2:for (int j = 0; j < 4; j++) {
        for3:for (int k = 0; k < 3; k++) {
            if(布尔表达式) {
                break for1;
            }
        }
    }
}

3. 习题

3.1 习题1:使用冒泡排序对从键盘输入的5名学员成绩进行降序排列。

3.1.1 分析:可以使用循环来接收数组的5个元素;对数组进行降序排列与前方讲过的升序排列非常相似,只需要将两两比较中、较小的数字交换到后面即可。
3.1.2 参考代码:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("请输入5名学员的成绩:");
    int[] scores=new int[5];
    //给数组元素赋值
    for (int i = 0; i < scores.length; i++) {
        scores[i]=input.nextInt();
    }
    //降序排列
    for(int i=0;i<scores.length-1;i++) {  //外层循环,用来控制比较的轮数
        for(int j=0;j<(scores.length-1-i);j++) {  //内层循环,控制每轮的次数
            if(scores[j]<scores[j+1]) {  //如果此元素小于他后面的元素
                int emp;      //交换位置
                emp=scores[j];
                scores[j]=scores[j+1];
                scores[j+1]=emp;
            }
        }       
    }
    //输出
    System.out.println("将成绩按降序排序后是:");
    for (int i : scores) {
        System.out.print(i+"\t");
    }       
}

3.2 习题2:保洁阿姨要打扫一栋3层的教学楼,每层4个教室,如果教室干净的话就无需打扫。请编程统计:阿姨最后打扫了几个教室。效果如图所示:


3.2.1 分析:一共有3*4=12个教室,无论是否打扫,保洁都需要重复的、逐一检查,所以我们要使用两层循环。再根据检查的情况决定是否打扫,如果打扫了,还需要将用来计数的变量值自增1。
3.2.2 参考代码:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int count=0;    //用来计数,打扫了几间教室
    for (int i = 0; i < 3; i++) {
        System.out.println("来到第"+(i+1)+"层楼:");
        for (int j = 0; j < 4; j++) {
            System.out.println("第"+(j+1)+"间教室需要打扫吗?(y/n)");
            if (input.next().equals("y")) {
                count ++;
                System.out.println("打扫了一间教室");
            } 
        }
        System.out.println("去上一层楼");
        System.out.println();
    }
    System.out.println("一共打扫了"+count+"间教室");
}

3.2.3 请同学们换一种方式:使用continue语句来解决这个问题。

 

(想要了解更多的职场,职业规划方面的经验,文章第一时间发布于云图智联官网)

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部