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 循环
语 法 | 流程图 | 举 例 |
do { //循环操作 } while(循环条件); | | int i=1; do { System.out.println(“好好学习!”); i++; } while ( i <= 100); |
和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循环结构的特点是先执行,再判断。
- 程序调试是满足暂停程序、观察变量和逐条执行语句等功能的工具和方法的总称。其主要方法包括设置断点、单步运行和观察变量。