项目作业:开发一个控制台版的“购物车管理”程序。
任务描述
一、项目准备
1、开发工具:JDK、Eclipse
2、需求分析:
包括商品管理和购物车管理。
1)商品管理主要功能
-
商品信息导入
-
显示所有商品信息
2)购物车主要功能
-
添加商品到购物车
-
修改购物车中的商品数量
-
显示购物车中的所有商品信息
-
结算
3、效果运行图
4、详细设计
包括如下类的设计:
-
商品类(Goods)
-
商品管理类(GoodsManage)
-
购物车中的商品信息类(GoodsInCart)
-
购物车类(ShoppingCart)
-
测试类 (TestDemo)
下面分别对各个类进行介绍:
1)商品类(Goods),包括如下属性和方法
方法:
-构造方法
-getter和setter方法
-hashCode()和equals()方法
-toString()方法
2)商品管理类(GoodsManage)
属性:存放商品的容器(goodsSet):Set类型
方法:
-构造方法
-getter和setter方法
-商品信息导入:public void importGoods();
-显示所有商品信息:public void displayAllGoods();
3)购物车中的商品信息类(GoodsInCart)
属性:
- 商品信息(goods):Goods类型
- 商品数量(num):int类型
方法:
-构造方法
-getter和setter方法
4)购物车类(ShoppingCart)
属性:
- 购物车(shoppingCart):Map类型,其中key为String类型,value为GoodsInCart类型
方法:
-添加商品到购物车:
public void addGoodsToCart(GoodsManage gm);
-修改购物车中的商品数量:public void updateNumInCart();如果购物车中没有商品,需要给出提示信息
- 显示购物车中的所有商品:public void displayAllInCart();如果购物车中没有商品,需要给出提示信息
- 结算:public void settleAccounts();结算后购物车要清空。
- 构造方法及getter和setter方法
5)测试类(TestDemo)
- 根据需求设计完成主流程实现
二、整体要求:
1、完成需求分析和详细设计中所涉及到的所有功能。
2、代码结构要层次分明,代码编辑思路要清晰、整洁。
3、要求Java代码书写、命名符合规范,并在代码中添加必要的注释
4、程序运行效果与提供的页面效果图、结构保持一致
5、将作业项目导出(Export)成压缩文件
评分标准是什么?
规范【10分】
-
每个类都封装在自己独立的 ".java"文件中;
-
文件、class、成员变量命名规范;
-
代码结构要层次分明;
-
Java代码规范及添加适量注释。
程序整体运行效果【10分】
-
程序可以正常运行,无编译和运行错误
-
程序执行结果的布局结构满足效果图要求
-
程序显示的内容满足效果图要求
商品类【9分】
-
正确设置属性描述商品编号、名称、价格和描述
-
正确完成构造方法
-
正确完成getter和setter方法
-
正确完成hashCode和equals方法
-
正确完成toString方法
商品管理类【14分】
-
正确设置属性存放商品的容器
-
正确完成构造方法
-
正确完成getter和setter方法
-
正确完成商品信息导入方法
-
正确完成显示所有商品信息方法
购物车中的商品信息类【4分】
-
正确设置属性描述商品信息和商品数量
-
正确完成构造方法方法
-
正确完成getter和setter方法
购物车类【29分】
-
正确设置属性描述存放购物车的集合
-
正确完成构造方法
-
正确完成getter和setter方法
-
正确完成添加商品到购物车的方法
-
正确完成修改购物车中商品数量的方法
-
正确完成显示购物车中所有商品的方法
测试类【24分】
-
正确编写主菜单、商品管理和购物车管理的菜单方法
-
正确编写主业务逻辑的方法,如果输入错误数字,要给出提示信息2
-
Goods类:
package 购物车课程设计; public class Goods { private String goodsId; private String name; private double price; private String description; public Goods(String goodsId, String name, double price, String description) { this.goodsId = goodsId; this.name = name; this.price = price; this.description = description; } @Override public String toString() { return goodsId +","+name + "," + price + "," + description; } public String getGoodsId() { return goodsId; } public void setGoodsId(String goodsId) { this.goodsId = goodsId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((goodsId == null) ? 0 : goodsId.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Goods other = (Goods) obj; if (goodsId == null) { if (other.goodsId != null) return false; } else if (!goodsId.equals(other.goodsId)) return false; return true; } }
GoodsManage类:
-
package 购物车课程设计; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class GoodsManage { private Map<String, Goods> goodsMap; // 用Map来存储商品对象,方便查找 public GoodsManage() { goodsMap = new HashMap<>(); } public void addGoods(Goods goods) { goodsMap.put(goods.getGoodsId(), goods); } public void removeGoods(String goodsId) { Goods removegoods= goodsMap.remove(goodsId); if (removegoods == null) { System.out.println("删除失败,该商品不存在"); } else { System.out.println("已成功将"+removegoods.getName()+"删除"); } } public void displayAllGoods() { if (goodsMap.isEmpty()) { System.out.println("当前没有商品信息!"); } else { System.out.println("商品编号\t商品名\t商品价格\t商品描述\t"); for (Goods goods : goodsMap.values()) { System.out.println(goods.getGoodsId() + "\t" + goods.getName() + "\t" + goods.getPrice() + "\t" + goods.getDescription()); } } } public Goods findGoods(String goodsId) { if (goodsMap.containsKey(goodsId)) { System.out.println("查找成功"); return goodsMap.get(goodsId); } else { System.out.println("未找到商品编号为:"+goodsId+"的商品信息"); return null; } } public ArrayList<Goods> findGoodsByName(String goodsName) { ArrayList<Goods> goodsList = new ArrayList<>(); if (goodsMap.isEmpty()) { System.out.println("当前没有商品信息!"); } else { for (Goods goods : goodsMap.values()) { if (goods.getName().contains(goodsName)) { goodsList.add(goods); } } if (goodsList.isEmpty()) { System.out.println("未找到名称包含 \"" + goodsName + "\" 的商品信息"); } else { System.out.printf("名称包含 \"%s\" 的商品有 %d 个:\n", goodsName, goodsList.size()); System.out.printf("商品编号:\t商品名:\t\t价格:\t\t商品信息:\t\n"); for (Goods goods : goodsList) { System.out.printf("%-10s\t%-20s\t%-10.2f\t%-50s\n", goods.getGoodsId(), goods.getName(), goods.getPrice(), goods.getDescription()); } } } return goodsList; } public void alterGoods(String alterGoodsId, Goods goods) { if (findGoods(alterGoodsId) == null) { System.out.println("商品不存在!"); } else { goodsMap.put(alterGoodsId, goods); System.out.println("修改成功!"); } } // public ArrayList<Goods> findGoodsByPrice(double minPrice, double maxPrice) { // ArrayList<Goods> goodsList = new ArrayList<>(); // // if (goodsMap.isEmpty()) { // System.out.println("当前没有商品信息!"); // } else { // for (Goods goods : goodsMap.values()) { // if (goods.getPrice() >= minPrice && goods.getPrice() <= maxPrice) { // goodsList.add(goods); // } // } // // if (goodsList.isEmpty()) { // // } // } // // return goodsList; // } }
TestDemo类(测试类)
-
package 购物车课程设计; import java.io.FileWriter; import java.io.IOException; public class TestDemo { public static void Presentation() { Goods g1 = new Goods("001", "笔记本", 5499.0, "ThinkPad X1 Carbon"); Goods g2 = new Goods("002", "手机", 3999.0, "小米10 Pro"); Goods g3 = new Goods("003", "耳机", 1399.0, "Bose QuietComfort 35 II"); try { FileWriter writer = new FileWriter("E://goods.txt"); writer.write(g1.toString() + "\n"); writer.write(g2.toString() + "\n"); writer.write(g3.toString() + "\n"); writer.close(); } catch (IOException e) { e.printStackTrace(); System.out.println("警告!文件写入异常!"); } } public static void main(String[] args) { ShoppingSystem shoppingSystem=new ShoppingSystem(); Presentation(); //仅作为演示使用 For presentation only! shoppingSystem.InitialSystem(); shoppingSystem.DisplayofMainMenu(); } }
system类:
-
package 购物车课程设计; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class ShoppingSystem { Scanner scanner=new Scanner(System.in); ShoppingCart sc = new ShoppingCart(); GoodsManage gm = new GoodsManage(); public void InitialSystem() { try { FileReader reader = new FileReader("E://goods.txt"); BufferedReader bufferedReader = new BufferedReader(reader); String line; while ((line = bufferedReader.readLine()) != null) { String[] values = line.split(","); Goods goods = new Goods(values[0], values[1], Double.parseDouble(values[2]), values[3]); gm.addGoods(goods); } bufferedReader.close(); reader.close(); } catch (IOException e) { e.printStackTrace(); System.out.println("文件读取异常!请检查后重试!"); } } public void writeIn() { } public void DisplayofMainMenu() { while (true) { System.out.println("***************************************"); System.out.println("请输入对应的数字进行操作:"); System.out.println(" ***主菜单***"); System.out.println(" 1. 商品管理\n 2. 购物车\n 0. 退出"); System.out.println("***************************************"); int choice = scanner.nextInt(); switch (choice) { case 1: DisplayofGoodsMenu(); break; case 2: DisplayofCartMenu(); break; case 0: System.out.println("感谢您的使用!再见!"); return; default: System.out.println("您的输入有误,请重新输入"); break; } } } public void DisplayofGoodsMenu() { while (true) { System.out.println("***************************************"); System.out.println("请输入对应的数字进行操作:"); System.out.println(" ***商品管理***"); System.out.println(" 1. 商品信息导入\n 2. 显示所有商品信息\n 3.删除指定商品信息\n 4.修改指定商品信息\n 5.查找商品信息(以编号为索引)\n 6.查找商品信息(以名字为索引)\n 0. 返回上一级菜单(主菜单)"); System.out.println("***************************************"); int choice = scanner.nextInt(); switch (choice) { case 1: System.out.println("请输入商品编号:"); String goodsId = scanner.next(); System.out.println("请输入商品名:"); String goodsName = scanner.next(); System.out.println("请输入商品价格:"); double goodsPrice=scanner.nextDouble(); System.out.println("请输入商品描述:"); String goodsDescription=scanner.next(); Goods newlyadded=new Goods(goodsId, goodsName, goodsPrice, goodsDescription); gm.addGoods(newlyadded); break; case 2: gm.displayAllGoods(); break; case 3: System.out.println("请输入需要删除的商品编号:"); String deletedgoodsId= scanner.next(); gm.removeGoods(deletedgoodsId); break; case 6: System.out.println("请输入需要查询的商品名:"); String foundgoodsName=scanner.next(); gm.findGoodsByName(foundgoodsName); break; case 5: System.out.println("请输入需要查询的商品编号:"); String foundgoodsId=scanner.next(); gm.findGoods(foundgoodsId); break; case 4: System.out.println("请输入需要查询的商品编号:"); String alString=scanner.next(); System.out.println("请输入需要修改的商品名"); goodsName=scanner.next(); System.out.println("请输入需要修改的商品价格"); goodsPrice=scanner.nextDouble(); System.out.println("请输入需要修改的商品信息"); goodsDescription=scanner.next(); Goods goods=new Goods(alString, goodsName, goodsPrice,goodsDescription); gm.alterGoods(alString, goods); break; case 0: DisplayofMainMenu(); break; default: System.out.println("您的输入有误,请重新输入"); break; } } } public void DisplayofCartMenu() { while (true) { System.out.println("***************************************"); System.out.println("请输入对应的数字进行操作:"); System.out.println(" ***购物车管理***"); System.out.println(" 1. 添加商品到购物车\n 2. 修改购物车中商品的数量\n 3.显示购物车中所有的商品信息\n 4.结算\n 0. 返回上一级菜单(主菜单)"); System.out.println("***************************************"); int choice = scanner.nextInt(); switch (choice) { case 1: System.out.println("请输入商品编号:"); String goodsId = scanner.next(); System.out.println("请输入购买数量:"); int numToAdd = scanner.nextInt(); sc.addGoods(gm, goodsId, numToAdd); break; case 2: System.out.println("请输入商品编号:"); String goodsIdToUpdate = scanner.next(); System.out.println("请输入修改后的数量:"); int numToUpdate = scanner.nextInt(); sc.updateNum(goodsIdToUpdate, numToUpdate); break; case 3: sc.displayAll(); break; case 4: sc.settleAccounts(); break; case 0: DisplayofMainMenu(); break; default: System.out.println("您的输入有误,请重新输入"); break; } } } }
购物车类:
-
package 购物车课程设计; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.net.InetAddress; public class ShoppingCart { private Map<String, GoodsInCart> goodsInCartMap; // 用Map来存储购物车中的商品信息 public ShoppingCart() { goodsInCartMap = new HashMap<>(); } public void addGoods(GoodsManage gm, String goodsId, int num) { Goods goods = gm.findGoods(goodsId); if (goods == null) { System.out.println("该商品不存在!"); } else { GoodsInCart goodsInCart = goodsInCartMap.get(goodsId); if (goodsInCart == null) { goodsInCartMap.put(goodsId, new GoodsInCart(goods, num)); } else { goodsInCart.setNum(goodsInCart.getNum() + num); } System.out.println("成功添加到购物车!"); } } public void updateNum(String goodsId, int num) { GoodsInCart goodsInCart = goodsInCartMap.get(goodsId); if (goodsInCart == null) { System.out.println("该商品不存在购物车中!"); } else { goodsInCart.setNum(num); if (num == 0) { goodsInCartMap.remove(goodsId); } System.out.println("修改成功!"); } } public void displayAll() { if (goodsInCartMap.isEmpty()) { System.out.println("当前购物车为空!"); } else { System.out.println("商品编号:\t商品名:\t\t价格:\t购买数量:\t小计:\t"); for (GoodsInCart goodsInCart : goodsInCartMap.values()) { System.out.println(goodsInCart.getGoods().getGoodsId() + "\t" +goodsInCart.getGoods().getName() + "\t" + goodsInCart.getGoods().getPrice() + "\t" +goodsInCart.getNum()+"\t"+goodsInCart.getGoods().getPrice()*goodsInCart.getNum()); } } } public void settleAccounts() { LocalDateTime currentTime = LocalDateTime.now(); if (goodsInCartMap.isEmpty()) { System.out.println("当前购物车为空!"); } else { double totalPrice = 0.0; try { File file=new File("E://receipt.txt"); FileWriter writer = new FileWriter(file);//打印小票 System.out.println("时间:"+currentTime.toString()+"\t"+"操作员:"+InetAddress.getLocalHost ().getHostName ().toString ()); System.out.println("*************************************************"); System.out.println("商品编号:\t商品名:\t\t价格:\t购买数量:\t小计:\t"); writer.write("时间:"+currentTime.toString()+"\t"+"操作员:"+InetAddress.getLocalHost ().getHostName ().toString ()+"\t"+"\n"); writer.write("*************************************************\n"); writer.write("商品编号:\t商品名:\t\t价格:\t购买数量:\t小计:\t\n"); for (GoodsInCart goodsInCart : goodsInCartMap.values()) { double price = goodsInCart.getGoods().getPrice() * goodsInCart.getNum(); System.out.println(goodsInCart.toString() + price); totalPrice += price; writer.write(goodsInCart.toString()+price+"\n"); } System.out.println("总价:" + totalPrice); System.out.println("*************************************************"); System.out.println("欢迎下次光临!购物小票已保存至:"+file.getAbsolutePath()); writer.write("*************************************************\n欢迎下次光临!购物小票已保存至:"+file.getAbsolutePath()); writer.close(); goodsInCartMap.clear(); // 结算后清空购物车 } catch (IOException e) { e.printStackTrace(); System.out.println("警告!文件写入异常!"); } finally { } } } }
这个购物车管理程序是一个基于Java语言开发的控制台应用程序,实现了商品管理和购物车管理功能。该程序具有以下技术性优势:
1. 面向对象编程
该程序采用面向对象编程思想进行开发,将不同功能的代码封装在不同的类中,并通过类之间的调用、继承、组合等关系实现功能的模块化组合。
2. 基本数据类型、字符串、集合和文件操作
通过对基本数据类型、字符串、集合等知识点的运用,实现了商品和购物车的信息存储、读取和修改,以及对文件的读写操作。同时,在程序执行过程中根据用户输入进行相应的处理,保证了程序的交互性和灵活性。
3. 代码规范和注释
在编写代码时,考虑到代码的可读性和可维护性,通过遵循Java编码规范、加入适量注释等方式使得代码结构清晰、易懂、容易维护和修改。
4. 异常处理
在程序中加入了异常处理机制,即当程序出现异常或错误时能够根据具体情况提示用户相应信息,从而避免程序崩溃或运行出错。
总之,该程序通过对Java相关知识的学习和应用,成功地实现了购物车管理的基本功能,并且编写规范、注释清晰,运行效果良好,是一份具有理论和实践价值的程序设计作业。