Java基础-day08-超市购物系统总结

Java基础-day08-超市购物系统总结

超市购物小票——自定义类

1案例介绍与演示

将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对象。

2案例分析

a)案例回顾

在超市购物小票案例中,我们封装了三个方法,在switch中为3个case执行用户选择的三个不同的操作:1输入购买数量 2打印购物小票 3退出系统

而所有的变量均”零散地”定义在成员位置。

b)重构内容分析

1:将原来的成员位置零散定义的变量,封装为商品项GoodsItem对象。

2:将所有使用变量值的地方全部改为使用GoodsItem对象

c)实现步骤

定义Person类

定义Person类,包含成员变量名称、年龄、地址

重构使用到变量的逻辑

将所有使用到成员位置商品属性的代码处,均由直接使用改为通过对象名访问对象属性的方式。

代码实现:

package StudentJavaSEday08;
/**
 * 
 * 自定义数据类型 商品项类
 *
 * 属性
 *
 * 商品名称 String 商品id String 商品单价 double 商品数量 int 商品金额 double
 */
public class GoodsItem {
 // 商品名称
 String name;
 // 商品id
 String id;
 // 商品单价
 double price;
 // 商品数量
 int number;
 // 商品金额
 double money;
}
package StudentJavaSEday08;
/*
使用switch语句完成三个分支的代码逻辑
当用户输入1时,让用户输入所要购买的商品数量
当用户输入2时,给用户打印出对应的购物小票
当用户输入3时,退出系统
1.定义商品数据
2.提示用户输入相对应的操作 1.输入商品数量  2.打印小票  3.退出系统
3.接收用户输入的选择
4.使用switch进行判断
5.整体是一个死循环
代码重构
 1.定义一个商品项类
 2.在成员位置创建两个商品对象
 3.给两个商品对象的属性赋值
 定义一个方法为商品对象初始化属性的方法  方法名 init   参数 无  返回值 无
 4.修改购买方法和打印小票方法  因为里边访问的变量都不存在了 需要改成商品对象去访问属性的方式
*/
//导入Scanner
import java.util.Scanner;
public class Supermarket {
 // 定义少林寺酥饼核桃商品对象
 static GoodsItem sls = new GoodsItem();
 // 定义然光Q移商品对象
 static GoodsItem rg = new GoodsItem();
 public static void main(String[] args) {
 // 调用init方法 用来初始化数据
 init();
 while (true) {
 // 提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统
 System.out.println("请输入您的操作:1.输入商品数量    2.打印购物小票    3.退出系统");
 // 接收用户输入的选择 使用Scanner完成
 // Scanner sc = new Scanner(System.in);
 // 调用nextInt方法 接收用户的选择
 // int choose = sc.nextInt();
 // 调用键盘录入整数方法enterNumber接收用户输入的选择
 int choose = enterNumber();
 // 使用switch进行判断用户的选择
 switch (choose) {
 case 1:
 // 调用buy方法 完成用户输入商品数量
 buy();
 break;
 case 2:
 // 调用printTicket方法 打印购物小票
 printTicket();
 break;
 case 3:
 System.out.println("优惠多多,期待下次光临!!");
 System.exit(0);
 break;
 default:
 System.out.println("请正确输入!");
 break;
 }
 }
 }
 // 定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无
 public static void init() {
 // 给少林寺对象赋值
 sls.name = "少林寺酥饼核桃";
 sls.id = "090115";
 sls.price = 15.50;
 // 给然光对象赋值
 rg.name = "然光Q移";
 rg.id = "090028";
 rg.price = 16.00;
 }
 // 定义一个键盘录入整数的方法 方法名 enterNumber 需要的数据 无 返回的数据 一个用户输入的整数
 public static int enterNumber() {
 Scanner sc = new Scanner(System.in);
 int number = sc.nextInt();
 return number;
 }
 // 将用户输入商品数量封装成方法 方法名 buy 需要的数据 无 返回的数据 无
 public static void buy() {
 Scanner sc = new Scanner(System.in);
 // 依次让用户给每个商品的数量重新赋值
 System.out.println("请输入少林寺酥饼核桃的购买数量:");
 sls.number = sc.nextInt();
 sls.money = sls.number * sls.price;
 System.out.println("请输入然光Q移的购买数量:");
 rg.number = sc.nextInt();
 rg.money = rg.number * rg.price;
 }
 // 打印购物小票方法 方法名 printTicket 需要的数据 无 返回的数据 无
 public static void printTicket() {
 // ===============票头=========================
 System.out.println("            欢   迎    光   临");
 System.out.println("品名               售价    数量    金额");
 System.out.println("-------------------------------------");
 // ===============票体=========================
 System.out.println(sls.name + "(" + sls.id + ")" + "   " + sls.price + " * " + sls.number + " = " + sls.money);
 System.out
 .println(rg.name + "(" + rg.id + ")" + "          " + rg.price + " * " + rg.number + " = " + rg.money);
 System.out.println("-------------------------------------");
 // ===============票脚=========================
 // 项数
 int lineNumber = 2;
 // 总数量
 int totalNumber = sls.number + rg.number;
 // 总金额
 double totalMoney = sls.money + rg.money;
 System.out.println(lineNumber + " 项商品      共计:" + totalNumber + " 件");
 System.out.println("总计:" + totalMoney);
 }
}

运行结果:

超市购物小票——集合

1案例介绍与演示

将本日第二章内容所有的Person对象放置到集合中使用。

2案例分析

d)重构内容分析

1:将原来的成员位置的多个商品项GoodsItem对象封装到一个ArrayList集合中

2:将所有使用变量值的地方全部改为先从集合中后去对象,再使用GoodsItem对象获取属性值的方式。

e)实现步骤

成员位置定义ArrayList集合

定义方法,用于为集合赋值,准备要操作的数据。

重构使用到变量的逻辑

将所有使用到成员位置商品项的代码处,均由使用对象名访问对象属性的方式改为先从集合中获取对象,再获取属性值的方式。

3自定义类型与集合的使用优点分析

当使用自定义类型时,将数据与数据之间产生了合理必要的联系:一个商品的属性应都属于一个商品,则可以以一个商品作为数据操作的基本单位。

当使用集合时,由原来成员位置定义多个对象改为定义一个集合对象。所有使用数据的地方循环遍历即可,无论有再多新数据的产生,其代码不需要更改。

代码实现:

/*
 自定义数据类型 商品项类
 属性
 商品名称 String 
 商品id String
 商品单价 double
 商品数量  int
 商品金额  double  
*/
public class GoodsItem {
 // 商品名称
 String name;
 // 商品id
 String id;
 // 商品单价
 double price;
 // 商品数量
 int number;
 // 商品金额
 double money;
}
/*
 使用switch语句完成三个分支的代码逻辑
 当用户输入1时,让用户输入所要购买的商品数量
 当用户输入2时,给用户打印出对应的购物小票
 当用户输入3时,退出系统
 1.定义商品数据
 2.提示用户输入相对应的操作 1.输入商品数量  2.打印小票  3.退出系统
 3.接收用户输入的选择
 4.使用switch进行判断
 5.整体是一个死循环
 代码重构
 准备数据
 1.定义一个商品项类
 2.在成员位置定义一个集合 用来存储所有商品
 3.为成员位置的集合初始化商品   
 4.修改购买和打印小票方法 将商品对象从集合中取出来,访问商品对象的属性
*/
//导入Scanner
import java.util.Scanner;
//导入ArrayList
import java.util.ArrayList;
public class Supermarket2
{ 
 //在成员位置定义一个集合 用来存储所有商品
 static ArrayList<GoodsItem> list = new  ArrayList<GoodsItem>();
 public static void main(String[] args)
 {
 //调用init方法 用来初始化数据
 init();
 while(true){
 //提示用户输入相对应的操作 1.输入商品数量  2.打印小票  3.退出系统
 System.out.println("请输入您的操作:1.输入商品数量    2.打印购物小票    3.退出系统");
 //接收用户输入的选择 使用Scanner完成
 int choose  = enterNumber();
 //使用switch进行判断用户的选择
 switch(choose){
 case 1: 
 //调用buy方法 完成用户输入商品数量
 buy();
 break;
 case 2: 
 //调用printTicket方法 打印购物小票
 printTicket();
 break;
 case 3:
 System.out.println("爱买不买,下次带钱来!!");
 System.exit(0);
 break;
 default:
 System.out.println("你瞎啊!");
 break;
 }
 }
 }
 //定义一个方法为商品对象初始化属性的方法  方法名 init   参数 无  返回值 无
 public static void init(){
 //定义少林寺酥饼核桃商品对象
 GoodsItem sls = new GoodsItem();
 //给少林寺对象赋值
 sls.name =  "少林寺酥饼核桃";
 sls.id =  "090115";
 sls.price = 15.50;
 //定义然光Q移商品对象
 GoodsItem rg = new GoodsItem();
 //给然光对象赋值
 rg.name = "然光Q移";
 rg.id = "090028";
 rg.price = 16.00;
 //定义人参果商品对象
 GoodsItem rsg = new GoodsItem();
 //给然光对象赋值
 rsg.name = "人参果";
 rsg.id = "090001";
 rsg.price = 111111.00;
 //将商品对象添加到集合中
 list.add(sls);
 list.add(rg);
 list.add(rsg);
 }
 //定义一个键盘录入整数的方法   方法名 enterNumber  需要的数据  无 返回的数据 一个用户输入的整数
 public static int enterNumber(){
 Scanner sc = new Scanner(System.in);
 int number = sc.nextInt();
 return number;
 }
 //将用户输入商品数量封装成方法   方法名 buy  需要的数据 无  返回的数据 无
 public static void buy(){
 Scanner sc = new Scanner(System.in);
 /*
 遍历存储商品的集合list,依次获取每个商品
 让用户给每个商品的数量赋值
 计算每个商品的金额
 */
 for(int i = 0 ;i < list.size();i++){
 //依次获取每个商品
 GoodsItem thisItem = list.get(i);
 System.out.println("请输入"+thisItem.name+"商品的购买数量:");
 //让用户给每个商品的数量赋值
 thisItem.number = sc.nextInt();
 //计算每个商品的金额
 thisItem.money = thisItem.number * thisItem.price;
 }
 }
 //打印购物小票方法   方法名 printTicket  需要的数据 无  返回的数据 无
 public static void printTicket(){
 //===============票头=========================
 System.out.println("            欢   迎    光   临");
 System.out.println("品名               售价    数量    金额");
 System.out.println("-------------------------------------");
 //===============票体=========================
 /*
 遍历商品集合,依次获取每个商品,打印每个商品的属性
 */
 for(int i = 0 ;i<list.size();i++){
 //依次获取每个商品
 GoodsItem thisItem = list.get(i);
 //依次获取每个商品
 System.out.println(thisItem.name+"("+thisItem.id+")"+"   "+thisItem.price+" * "+thisItem.number+" = "+thisItem.money);
 }
 //System.out.println(sls.name+"("+sls.id+")"+"   "+sls.price+" * "+sls.number+" = "+sls.money);
 //System.out.println(rg.name+"("+rg.id+")"+"          "+rg.price+" * "+rg.number+" = "+rg.money);
 System.out.println("-------------------------------------");
 //===============票脚=========================
 //项数
  int lineNumber = list.size();
  //总数量
  int totalNumber = 0;
  //总金额
  double totalMoney = 0.0;
  /*
 遍历商品集合 ,依次获取每个商品 
 将每个商品的数量累加
 将每个商品的金额累加
  */
  //遍历商品集合
  for(int i = 0 ;i < list.size();i++){
  //依次获取每个商品 
 GoodsItem thisItem  = list.get(i);
 //总数量
 totalNumber += thisItem.number;
 //总金额
 totalMoney  += thisItem.money;
  }
  System.out.println(lineNumber+" 项商品      共计:"+totalNumber+" 件");
  System.out.println("总计:"+totalMoney);
 }
}

运行结果:

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2017-06-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

对一道if-else相关的程序题的简单分析(r5笔记第45天)

今天同事在微信群里提出了一个问题,看似是一个面试题。 大体的意思就是补充下面if条件使得输出 Hello World if(){ System.out.prin...

3565
来自专栏C语言及其他语言

第一个 C 语言编译器是怎样编写的?

作者: 伯乐在线 - Chaobs 网址: http://blog.jobbole.com/94311/ 首先向C语言之父Dennis Ritchie致敬! ...

3889
来自专栏互扯程序

Java8函数式编程实践精华

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

1223
来自专栏我杨某人的青春满是悔恨

Swift API 设计指南(上)

本文翻译自苹果官方文档:Swift API Design Guidelines,如有错漏,欢迎指出。

1063
来自专栏PHP在线

5个经典的JavaScript面试题

在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司...

3518
来自专栏工科狗和生物喵

对菜鸟教程的Python一百例的个别改进

好吧,其实是小妹子Python公选课结课,所以我来帮忙做个大作业(简单到哭的大作业好吗?)!她的大作业就是老师把菜鸟教程的Python一百例扒下来做成文档,然后...

4026
来自专栏数说工作室

正则表达式的“阿赖耶识”| 【SAS Says·扩展篇】正则表达式

阿赖耶识...为宇宙万有之本,含藏万有,使之存而不失,故称藏识。又因其能含藏生长万有之种子,故亦称种子识。 ——《佛光大辞典》 佛家说人有九识,除眼、耳、鼻、舌...

3363
来自专栏web前端教室

【视频】- 5分钟学习<函数式编程>

温馨提示:视频请点此观看 // 视频文字版: JavaScript 函数式编程是一个存在了很久的话题, 现在ES6语法对于函数式编程更为友好,所以开始变的更...

2356
来自专栏Python小屋

Python中带else子句的for循环执行过程

这几天在厦门讲课,每天6小时,没有太多时间写新代码,宾馆不知道咋想的也不提供WiFi,只好用手机做个热点临时分享一点基础知识,300M的包月流量伤不起,热点瞬间...

2754
来自专栏青玉伏案

代码重构(五):继承关系重构规则

陆陆续续的发表了多篇关于重构的文章了,还是那句话,重构是一个项目迭代开发中必不可少的一个阶段。其实重构伴随着你的项目的整个阶段。在前几篇关于重构的文章中我们谈到...

2056

扫码关注云+社区