6.1.4 技能训练
现在已经完成了 for循环结构的学习,下面通过练习巩固一下学习成果。
上机练习1
练习——计算100以内的奇数之和
需求说明
编程实现:计算100以内的奇数之和,并设置断点调试程序,追踪三个表达式的执行顺序及循环变量的变化。
提示:实现思路如下。
(1) 初始部分:声明整型变量num和sum,分别表示当前加数及当前和。
(2) 循环条件:num <= 100。
(3) 循环操作:累加求和。
参考代码示范
package cn.jbit.loops1; /* * 计算100以内的奇数之和 */ public class good { public static void main(String[] args) { int sum = 0; // 定义一个变量,进行累加 for (int i = 1; i <= 100; i++) { if (i % 2 == 0) { continue;// 如果i为奇数,结束本次循环,进行下一次循环 } sum = sum + i; } System.out.print("1--100之间的偶数和是:" + sum); } }
上机练习2
指导——统计顾客的年龄层次
训练要点
for循环结构。
需求说明
商场为了提高销售额,需要对顾客的年龄层次(30岁之上/30岁之下)进行调查(样本数为10),请计算这两个层次的顾客比例。
程序运行结果如图6.4所示。
图6.4上机练习2的运行结果
实现思路及关键代码
(1) 定义计数器变量young,记录年龄30岁以下顾客的人数。
(2) 利用循环录入10位顾客的年龄。
参考解决方案
package cn.jbit.loops1; import java.util.Scanner; public class AgeRate { public static void main(String[] args) { int young = 0; //记录年龄30岁(含)以下顾客的人数 int age = 0; //保存顾客的年龄 Scanner input = new Scanner(System.in); for(int i = 0; i < 10; i++){ System.out.print("请输入第" +(i+1)+ "位顾客的年龄:"); age = input.nextInt(); if(age > 0 && age <= 30){ young++; } } System.out.println("30岁以下的比例是:" + young/10.0*100 +"%"); System.out.println("30岁以上的比例是:" + (1-young/10.0)*100 +"%"); } }
6.2 跳转语句
通过对循环结构的学习,我们已经了解了在执行循环时要进行条件判断。只有在条件为false时,才能结束循环。但是,有时根据实际情况需要停止整个循环或者跳到下一次循环,有时需要从程序的一部分跳到程序的其他部分,这些都可以由跳转语句来完成。Java支持三种形式的跳转:break、continue和return。return将在后面的章节中讲到,下面来学习其中的两种:break和continue。
6.2.1 break 语句的使用
在学习switch选择结构时,已经使用过break语句了,下面先回顾一下switch选择结构中break语句的作用。
示例5
package cn.jbit.loops1; import java.util.*; public class Schedule { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("查看日程表,请输入日期(1-5):"); int day = input.nextInt(); switch (day) { case 1: System.out.println("出席IT科技展剪彩仪式"); break; case 2: System.out.println("飞抵香港参加亚太区会议"); break; case 3: System.out.println("会议结束游香港海洋公园"); break; case 4: System.out.println("抵京召开公司月度股东大会"); break; case 5: System.out.println("自由时间"); break; } } }
示例5演示了一个"日程安排查询程序"。输入数字1〜5 (代表周一〜周五),将看到这一天的行程安排。程序运行结果如图6.5所示。
图6.5示例5的运行结果
在switch选择结构中,break语句用于终止switch语句中的某个分支,使程序跳到switch选择结构的下一条语句。在循环结构中,break语句能发挥什么作用呢?
张浩参加4000m长跑比赛,在400m的跑道上,发令枪响起,他狂奔出去,在这个400m的跑道上循环地跑。他每跑一圈,剩余路程就会减少400m,要跑的圈数也就是循环的次数。但是,在跑步的过程中,他在心里默默地问自己:"我还有力气坚持到最后么?"。如果回答"是",就继续跑下一圈;如果回答"否",则退出。在跑到第八圈时,他无法坚持,退出了比赛。他没能跑完全程,在中间终止了这一循环过程。在这种情形下,我们就可以用break语句来描述,如下所示。
for (int i = 0; i < 100; i++) { //跑400m if (不能坚持) { break; //退出比赛 } }
这就是break语句的功能。我们来解决下面的问题。
问题:循环录入某学生五门课的成绩并计算平均分。如果某分数录入为负,则停止录入并提示录入错误。
分析:在录入分数的过程中,进行条件判断。如果录入为负,则立刻跳出循环。我们使用break语句来解决。
示例6
package cn.jbit.loops1; import java.util.Scanner; public class BreakDemo { /* * 循环录入学生成绩,输入负数则退出 */ public static void main(String[] args) { int score; //每门课的成绩 int sum = 0; //成绩之和 double avg = 0.0; //平均分 boolean isNegative = false; //是否为负数 Scanner input = new Scanner(System.in); System.out.print("输入学生姓名: "); String name = input.next(); //输入姓名 for(int i = 0; i < 5; i++){ //循环5次录入5门课成绩 System.out.print("请输入第" + (i+1) + "门课的成绩: "); score = input.nextInt(); if(score < 0){ //输入负数 isNegative = true; break; } sum = sum + score; //累加求和 } if(isNegative){ System.out.println("抱歉,分数录入错误,请重新进行录入!"); }else{ avg = sum / 5; //计算平均分 System.out.println(name + "的平均分是:" + avg); } } }
程序运行结果如图6.6所示。当录入第三门课的成绩"-70"时,输入数值是负数,条件判断 "score < 0" 为true,执行 "isNegative = true",用它来标记是否输入负数;然后执行break语句,直接退出for循环;再执行for循环结构下面的if选择结构,因为boolean类型变量isNegative的值为true,因此输出信息 "抱歉,分数录入错误,请重新进行录入!"。
图6.6示例6的运行结果
小结:break语句用于终止某个循环,使程序跳到循环体外的下一条语句。在循环中位于break后的语句将不再执行,循环也停止执行。
经验:break语句不仅可以用在for循环结构中,也可以用在while和do-while循环结构中。break语句通常与if条件语句一起使用。
6.2.2 continue 语句的使用
根据要求,在循环结构中的if语句中使用break语句退出循环。但是,可能有时会遇到这样的问题:在某次循环中,不执行完所有的循环体,就跳出本次循环,开始执行下一次循环。我们看下面这个示例。
张浩在上次的比赛中没有跑完路程就退出了,他觉得很没面子,这一次他下定决心一定跑完全程。他想了一个办法,就是中途补水。每跑一圈,如果口渴,就从旁边为他加油打气的同学手中接过水壶,喝上几口,然后继续跑。就这样,他终于坚持跑完了全程。如何用程序描述这一过程呢?这时就要用到continue语句,如下所示。
for (int i = 0; i < 10;i++) { //跑400m if (不口渴) { continue; } }
如果口渴,则执行 "接过水壶,喝水;"。如果不口渴,则执行continue语句;continue后面的语句 "接过水壶,喝水" 将不再被执行,之后进入下一次循环。可见,continue用在如下场景:在某次循环中,不执行完循环体中所有的语句,就想跳出此次循环,开始执行下一次循环。看一看下面的问题。