问题描述
循环输入商品编号和购买数量,当输入n时结账,结账时计算应付金额并且找零。
(一)定义初始变量
serial:商品编号 num:第一次选择时的商品数量(无论哪个商品) num1,num2,num3:再次选择时三个商品分别的数量 n:商品折扣 price1,price2,price3:三个商品分别的单价 total:未打折之前的总金额(应付金额) total1,total2,total3:未打折之前三个商品分别的总金额 total_n:打折之后的总金额(实付金额) pay:顾客付款金额 back:应找零金额 answer:是/否(继续购买商品)
由于需要键盘输入数据,所以引用Scanner sc=new Scanner(System.in); 所以开头也需要导入Scanner包,可以写import java.util.Scanner; 或者直接写import java.util.*;
import java.util.*;
public class Shopping {
public static void main(String[] args) {
int serial,num,num1=0,num2=0,num3=0,n;
float price1=243,price2=486,price3=315;
double total,total1=0,total2=0,total3=0,total_n,pay=0,back;
String answer;
Scanner sc=new Scanner(System.in);
(二)问题分析
要求实现循环输入商品编号和购买数量,由此可考虑前面部分整体的框架为循环语句。
(1)循环语句的选择
1. for语句
先判断条件是否为true,是则执行循环体,一般适用于已知循环次数。
2. while语句
先判断条件是否为true,是则执行循环体,一般适用于未知循环次数。
3.do……while语句
先执行一次循环体,再判断条件是否为true,是则继续执行循环体。
——由此可选择搭建 do……while 循环框架
System.out.println("欢迎光临XX便利店,这位顾客您好");
System.out.println("这是我们店里的火爆商品\n"+"1、T恤 2、网球鞋 3、网球拍");
System.out.println("*******************************");
do {
System.out.println("请输入商品编号");
serial=sc.nextInt();
System.out.println("请输入购买数量");
num=sc.nextInt();
System.out.println("是否要继续购买(建议理性消费)?(y/n)");
answer=sc.next();
}while(answer.equals("y"));
(2)计算应付金额
1.选择了不同的商品编号,对应不同的单价,因此采用选择语句。该题用 if 语句或 switch 语句均能实现,这里采用了switch语句,路线比较明确。
2.由于是循环选择语句,各个商品的数量应是叠加的,所以商品1的数量num1应写成num1+=num或num1=num+num1。
3.num是第一次进入循环体时键盘输入的数量,所以可以不赋初值。num1是再次选择时若选到了商品1才会键盘输入的值,因此应事先赋予初值0。total1也如此。其他商品以此类推。
switch (serial){
case 1:
num1+=num;
total1=price1*num1;
System.out.println("T恤¥"+price1+" 数量:"+num1+" 合计:"+total1);
break;
case 2:
num2+=num;
total2=price2*num2;
System.out.println("网球鞋¥"+price2+" 数量:"+num2+" 合计:"+total2);
break;
case 3:
num3+=num;
total3=price3*num3;
System.out.println("网球拍¥"+price3+" 数量:"+num3+" 合计:"+total3);
break;
default:
System.out.println("别挑我们店里没有的");
}
把这块代码插入到上述代码的中间空格处,即完成了前面部分的编写。
(3)计算实付金额
利用数学逻辑公式即可计算打过折之后的金额。
System.out.println("请选择折扣(1—10)");
n = sc.nextInt();
total=total1+total2+total3;
total_n=total*n*0.1;
System.out.println("折扣:"+n+" 应付金额:"+total+" 实付金额:"+total_n);
(4)付款金额的输入及找零
考虑到会出现付款金额小于应付金额的情况,因此采用一个 while 语句进行提醒。
System.out.println("请输入付款金额");
pay = sc.nextInt();
while(pay<total_n) {
System.out.println("钱不够");
System.out.println("请再次输入付款金额");
pay = sc.nextInt();
break;
}
back = pay - total_n;
System.out.println("应找零:" + back);
System.out.println("欢迎下次光临");
整合一下完整的程序就写出来了。
(三)完整代码
import java.util.*;
public class Shopping {
public static void main(String[] args) {
int serial,num,num1=0,num2=0,num3=0,n;
float price1=243,price2=486,price3=315;
double total,total1=0,total2=0,total3=0,total_n,pay=0,back;
String answer;
Scanner sc=new Scanner(System.in);
System.out.println("欢迎光临XX便利店,这位顾客您好");
System.out.println("这是我们店里的火爆商品\n"+"1、T恤 2、网球鞋 3、网球拍");
System.out.println("*******************************");
do {
System.out.println("请输入商品编号");
serial=sc.nextInt();
System.out.println("请输入购买数量");
num=sc.nextInt();
switch (serial){
case 1:
num1+=num;
total1=price1*num1;
System.out.println("T恤¥"+price1+" 数量:"+num1+" 合计:"+total1);
break;
case 2:
num2+=num;
total2=price2*num2;
System.out.println("网球鞋¥"+price2+" 数量:"+num2+" 合计:"+total2);
break;
case 3:
num3+=num;
total3=price3*num3;
System.out.println("网球拍¥"+price3+" 数量:"+num3+" 合计:"+total3);
break;
default:
System.out.println("别挑我们店里没有的");
}
System.out.println("是否要继续购买(建议理性消费)?(y/n)");
answer=sc.next();
}while(answer.equals("y"));
System.out.println("请选择折扣(1—10)");
n = sc.nextInt();
total=total1+total2+total3;
total_n=total*n*0.1;
System.out.println("折扣:"+n+" 应付金额:"+total+" 实付金额:"+total_n);
System.out.println("请输入付款金额");
pay = sc.nextInt();
while(pay<total_n) {
System.out.println("钱不够");
System.out.println("请再次输入付款金额");
pay = sc.nextInt();
break;
}
back = pay - total_n;
System.out.println("应找零:" + back);
System.out.println("欢迎下次光临");
}
}
(四)运行结果

|