5.4 技能训练
上机练习 1
指导——计算100以内的偶数之和
训练要点
while循环结构。
程序调试。
需求说明
编程实现:计算100以内的偶数之和。
设置断点并调试程序,观察每一次循环中变量值的变化。
实现思路及关键代码
(1)声明并初始化循环变量:int num=0。
(2) 分析循环条件和循环操作。
循环条件:num<=100。
循环操作:累加求和。
(3) 套用while循环结构写出代码。
参考解决方案
package cn.jbit.loops1; public class EvenSum { /* * 计算100以内偶数之和 */ public static void main(String[] args) { int sum = 0; //当前之和 int num = 2; //加数 while(num <= 100){ sum = sum + num; //累加 num = num + 2; } System.out.println("100以内的偶数之和为:" + sum); } }
上机练习2
指导——查询商品价格
训练要点
while循环结构。
需求说明
用户从控制台输入需要查询的商品的编号,根据编号显示对应的商品价格。假设商品名称和商品价格:T恤¥245.0,网球鞋¥570.0,网球拍¥320.0。
♦ 循环查询商品价格。
♦ 输入"n" 结束循环。
♦ 程序运行结果如图5.14所示。
图5.14查询商品价格的运行结果
实现思路及关键代码
(1)声明变量,存储商品信息:name(商品名称)、price(商品价格)和goodsNo(商品编号)。
(2)循环体:根据用户输入的商品编号,使用switch语句选择该编号对应的商品信息并输出。
switch(goodsNo){ case 1: //给变量name和price赋予1号商品信息 break; case 2: //给变量name和price赋予2号商品信息 break; case 3: //给变量name和price赋予3号商品信息 break; }
(3) 循环条件:当用户输入"y" 时继续执行循环体。
while("y".equals(answer)){ }
参考解决方案
package cn.jbit.loops1; import java.util.Scanner; public class PriceLookup { /* * 商品价格查询 */ public static void main(String[] args) { String name = ""; //商品名称 double price = 0.0; //商品价格 int goodsNo = 0; //商品编号 System.out.println("MyShopping管理系统 > 购物结算\n"); //商品清单 System.out.println("*******************************************"); System.out.println("请选择购买的商品编号:"); System.out.println("1.T 恤 2.网球鞋 3.网球拍"); System.out.println("*******************************************"); Scanner input = new Scanner(System.in); String answer = "y"; //标识是否继续 while("y".equals(answer)){ System.out.print("请输入商品编号:"); goodsNo = input.nextInt(); switch(goodsNo){ case 1: name = "T 恤"; price = 245.0; break; case 2: name = "网球鞋"; price = 570.0; break; case 3: name = "网球拍"; price = 320.0; break; } System.out.println(name+ "\t" + "¥" + price +"\n"); System.out.print("是否继续(y/n)"); answer = input.next(); } System.out.println("程序结束!"); } }
上机练习3
练习——升级购物结算
需求说明
循环输入商品编号和购买数量,系统自动计算每种商品的价钱(单价X购买数量),并累加到总金额。
当用户输入"n"时,表示需要结账,则退出循环开始结账。
结账时,根据折扣(假设享受八折优惠)计算应付金额,输入实付金额,计算找零。
程序运行结果如图5.15所示。
图5.15购物结算的运行结果
提示:
在上机练习2的基础上,增加如下变量存储信息。
int amount = 0; //购买数量
double discount = 0.8; //折扣比例
double total = 0.0; //商品总价
double payment = 0.0; //实付金额
循环输入商品编号和购买数量,计算购买此商品的合计金额并累加到总金额。
退出循环结账时,根据折扣显示应付金额,输入实付金额后,显示找钱。
参考解决方案
package cn.jbit.loops1; import java.util.Scanner; public class Pay { /* * 购物结算 */ public static void main(String[] args) { String name = ""; //商品名称 double price = 0.0; //商品价格 int goodsNo = 0; //商品编号 int amount = 0; //购买数量 double discount = 0.8; //折扣比例 double total = 0.0; //商品总价 double payment = 0.0; //实付金额 //商品清单 System.out.println("*******************************************"); System.out.println("请选择购买的商品编号:"); System.out.println("1.T 恤 2.网球鞋 3.网球拍"); System.out.println("*******************************************"); Scanner input = new Scanner(System.in); String answer = "y"; //标识是否继续 while("y".equals(answer)){ System.out.print("\n请输入商品编号:"); goodsNo = input.nextInt(); switch(goodsNo){ case 1: name = "T 恤"; price = 245; break; case 2: name = "网球鞋"; price = 570; break; case 3: name = "网球拍"; price = 320; break; } System.out.print("请输入购买数量:"); amount = input.nextInt(); System.out.println(name+ "¥" + price +"\t数量 " + amount + "\t合计 ¥" + price*amount); total += price*amount; System.out.print("是否继续(y/n)"); answer = input.next(); } System.out.println("\n折扣:" + discount); System.out.println("应付金额:" +total*discount); System.out.print("实付金额:"); payment = input.nextDouble(); while(payment - total*discount < 0){ System.out.print("您输入的金额小于应付金额,请重新输入:"); payment = input.nextDouble(); } System.out.println("找钱:" + (payment - total*discount)); } }
5.5 do-while循环
通过前面的学习我们知道,当一开始循环条件就不满足的时候,while循环一次也不会执行。有时有这样的需要:无论如何循环都先执行一次,再判断循环条件,决定是否继续执行。do-while循环结构就满足这样的需要。
5.5.1 为什么需要 do-while 循环
问题:经过几天的学习,老师给张浩一道测试题,让他上机编写程序,然后老师检查是否合格。如果不合格,则继续编写。
分析:这次和5.2.2节的示例5情况不同,张浩要先上机编写程序(执行循环操作),再问老师是否合格(判断循环条件)。while循环的特点是先判断,再执行,已经不适合这种情况。这时我们需要do-while循环解决该问题。
5.5.2 什么是 do-while 循环
下面看一看do-while循环是什么样的,如表5-2所示。
表 5-2 do-while 循环
和while循环不同,do-while循环以关键字do开头,然后是大括号括起来的循环操作,接着才是while关键字和紧随的小括号括起来的循环条件。需要注意的是,do-while循环结构以分号结尾。
结合表5-2, do-while循环的执行顺序一般如下。
(1) 声明并初始化循环变量。
(2) 执行一遍循环操作。
(3) 判断循环条件,如果循环条件满足,则循环继续执行,否则退出循环。
do-while循环的特点是先执行,再判断。
根据do-while循环的执行过程可以看出,循环操作至少执行一遍。
5.5.3 如何使用 do-while 循环
使用do-while循环解决问题的步骤与采用while循环解决问题的步骤是类似的。
说明:使用do-while循环解决问题的步骤如下。
(1) 分析循环条件和循环操作。
(2) 套用do-while语法写出代码。
(3) 检查循环能否退出。
现在使用do-while循环解决5.5.1节提出的问题。根据上面的步骤可知,循环条件是老师评价不合格,循环操作是上机编写程序。套用do-while语法,写出如示例7所示的代码。
示例7
package cn.jbit.loops1; import java.util.Scanner; public class DoWhileDemo { /* * 如何使用do-while循环 */ public static void main(String[] args) { Scanner input = new Scanner(System.in); String answer = ""; //标识是否合格 do{ System.out.println("上机编写程序!"); System.out.print("合格了吗?(y/n)"); answer = input.next(); System.out.println(""); }while(!"y".equals(answer)); System.out.println("恭喜你通过了测试!"); } }
检查一下,当输入为y的时候,程序退出循环。程序运行结果如图5.16所示。
图5.16示例7的运行结果
常见错误2
使用do-while循环结构解决问题时,经常会遇到下面的错误。
public class ErrorDemo { public static void main(String args[]) { int i; do { System.out.println("循环"); i++; } while (i < 4) } }
分析代码会发现while后缺少分号 , 程序编译将出现编译错误。
所以,while后面的分号是必需的,千万不要忘记。
对比:学习了 while和do-while两种循环结构,那么这两种循环结构有什么异同呢?
相同点:都是循环结构,使用“while(循环条件)”表示循环条件,使用大括号将循环操作括起来。
不同点:表现在以下三个方面。
语法不同。与while循环结构相比,do-while循环结构将while关键字和循环条件放在后面,而且前面多了关键字do , 后面多了一个分号。
执行次序不同。while循环结构先判断,再执行;do-while循环结构先执行,再判断。
在一开始循环条件就不满足的情况下,while循环结构一次都不会执行,do-while循环结构则不管什么情况都至少执行一次。
5.5.4 技能训练
上机练习4
练习——升级菜单切换
需求说明
进入系统主菜单后,提示用户输入数字,然后根据选择进入相应的功能模块。
如果用户输入错误,则可以重复输入,直到输入正确,执行相应的操作后退出循环。
程序运行结果如图5.17所示。
图5.17菜单切换的运行结果
提示:
声明boolean类型变量isRight来标识用户的输入是否正确,初值为true。如果输入错误,则其值变为fhlse。
使用do-while循环结构:循环体中接收用户的输入,利用switch语句执行不同的操作,循环体至少执行一次。
循环条件是判断isRight的值。如果为false则继续执行循环体;否则退出循环,程序结束。
代码提示:
package cn.jbit.loops1; import java.util.Scanner; public class MainMenu { /* * 升级菜单切换 */ public static void main(String[] args) { System.out.println("欢迎使用MyShopping管理系统\n"); System.out.println("*******************************"); System.out.println("\t1.客 户 信 息 管 理"); System.out.println("\t2.购 物 结 算"); System.out.println("\t3.真 情 回 馈"); System.out.println("\t4.注 销"); System.out.println("*******************************\n"); int choice; //用户选择 boolean isRight; //输入是否正确 System.out.print("请选择,输入数字:"); Scanner input = new Scanner(System.in); do{ isRight = true; choice = input.nextInt(); if(choice == 1){ System.out.println("执行客户信息管理"); }else if(choice == 2){ System.out.println("执行购物结算"); }else if(choice == 3){ System.out.println("执行真情回馈"); }else if(choice == 4){ System.out.println("执行注销"); }else{ System.out.print("输入错误,请重新输入数字:"); isRight = false; } }while(!isRight); System.out.println("\n程序结束"); } }
本章总结
循环结构由循环条件和循环操作构成。只要满足循环条件,循环操作就会反复执行。
使用循环解决问题的步骤:分析循环条件和循环操作,套用循环的语法写出代码,检查循环能否退出。
编写循环结构代码时需注意:循环变量的初值、循环操作中对循环变量值的改变和循环条件三者间的关系;确保循环次数正确,不要出现"死循环"。
while循环结构的特点是先判断,后执行;do-while循环结构的特点是先执行,再判断。
程序调试是满足暂停程序、观察变量和逐条执行语句等功能的工具和方法的总称。其主要方法包括设置断点、单步运行和观察变量。