题目要求
点餐系统
-
菜品类Dish 属性: 名称 name 价格 price 库存数 stock 售出数 saleNum 点赞数 likeNum
不提供带参构造方法 setter/getter show方法, 横排打印每个菜品对象信息, 示例: **名称: 鱼香肉丝*************************************************** 价格: 15.0元 库存: 100 已售: 27 点赞数: 18 ****************************************************************** sale方法, 此方法用于点餐功能, 在测试类中的点赞功能中, 找到菜品对象的指针后, 用指针调用like方法, 实现点赞数+1 此处注意参数n是售出的份数, 在测试类的点餐方法中会提示用户输入, 然后把用户输入的值传过来, 累加到属性saleNum中 public void saleOut(int n){ this.saleNum += n; // 此处要注意, 当saleNum为null, +=的时候会报空指针异常 } like方法, 此方法用于点赞功能, 在测试类中的点赞功能中, 找到菜品对象的指针后, 用指针调用like方法, 实现点赞数+1 public void like(){ this.likeNum ++; // 此处要注意, 当likeNum为null, ++的时候会报空指针异常 }
2. 测试类 静态变量 控制台输入扫描器对象 菜品数组dishArray, 初始长度为5 静态代码块, 初始化3个菜品对象, 存储刀菜品数组中 主函数main, 打印菜单 do while循环打印菜单, 让用户选择 switch判断选择, case中分别调用下面的函数处理业务 1. 菜品展示display() 打印"进入菜品展示业务" 遍历dishArray, 取出每一个指针, 调用show()方法打印菜品信息 注意做null指针判断 2. 添加菜品addDish() 如果数组中没有剩余空间, 提示扩容, 然后return 打印"进入添加菜品业务" 构造一个菜品对象Dish dish = new Dish() 分别提示输入"菜品名称", "菜品价格", "库存数量", 并将用户在控制台输入的返回值存储到dish对象中(用set方法) 遍历dishArray 找到第一个不为null的位置, 把菜品对象的指针存进去 提示"添加成功" 3. 删除菜品deleteDish() 打印"进入删除菜品业务" 菜品展示一下 让用户选择需要删除的菜品编号 需要判断为空, 有剩余库存 (库存数-售出数)的情况下不能删除 (不要问为什么这么设计, 只要实现就行) 实现方式一: 直接把dishArray的指定元素置为null, 不前移 实现方式二: 不仅置为null, 还要将后面的元素前移 如果你写不出来实现方式二, 那就写实现方式一 提示"删除成功" 4. 菜品数组扩容dilatation() 打印"进入菜品扩容业务" 创建新数组, 长度是原数组1.5倍 遍历原数组, 把原数组中的元素转移到新数组中 新数组的指针赋给原数组的指针 (这时候堆中的原数组就没有指针指向了, 等待被gc) 提示"扩容成功" 5. 点餐 saleDish() 打印"进入点餐业务" 菜品展示一下 输入需要点的菜品编号, 用变量i存储 输入需要点的份数, 用变量n存储 从数组中找到指定的菜品对象指针dish 该有的判断要有 取值器取出菜品的价格 * 上面输入的份数, 得出需要支付的金额, 打印出来 dish.sale(n), 设置售出的数量, 把n传过去 提示"点餐成功" 6. 点赞 likeDish() 打印"进入点赞业务" 菜品展示一下 输入需要点赞的菜品编号, 用变量i存储 从数组中找到指定的菜品对象指针dish 该有的判断要有 dish.like() 提示"点赞成功"
package OrderFood;
public class Dish {
//菜品类Dish
//属性:
// 名称 name
// 价格 price
// 库存数 stock
// 售出数 saleNum
// 点赞数 likeNum
private String name;
private Double price;
private Integer stock;
private Integer saleNum;
private Integer likeNum;//show方法, 横排打印每个菜品对象信息
public void show() {
System.out.println("\t**名称: " + this.name);
System.out.println("*******************************************************");
System.out.println("\t价格: " + this.price + "元" + "\t库存: " + this.stock + "\t 已售:" + this.saleNum + "\t 点赞数:" + this.likeNum);
System.out.println("*******************************************************");
}// sale方法, 在测试类的点餐方法中会提示用户输入, 然后把用户输入的值传过来, 累加到属性saleNum中
public void saleOut(int n) {
this.saleNum += n;
}//like方法, 此方法用于点赞功能, 在测试类中的点赞功能中, 找到菜品对象的指针后, 用指针调用like方法, 实现点赞数+1
public void like() {
this.likeNum ++;
}//setter/getter
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 Integer getStock() {
return stock;
}public void setStock(Integer stock) {
this.stock = stock;
}public Integer getSaleNum() {
return saleNum;
}public void setSaleNum(Integer saleNum) {
this.saleNum = saleNum;
}public Integer getLikeNum() {
return likeNum;
}public void setLikeNum(Integer likeNum) {
this.likeNum = likeNum;
}
}
package OrderFood;
import java.util.Scanner;
public class Test {
// 控制台输入扫描器对象
static Scanner sc = new Scanner(System.in);
//菜品数组dishArray, 初始长度为5
static Dish[] dishArray = new Dish[5];//静态代码块, 初始化3个菜品对象, 存储刀菜品数组中
static {
Dish dish1 = new Dish();
dish1.setName("鱼香肉丝");
dish1.setPrice(20.0);
dish1.setStock(100);
dish1.setSaleNum(500);
dish1.setLikeNum(300);
dishArray[0] = dish1;Dish dish2 = new Dish();
dish2.setName("麻婆豆腐");
dish2.setPrice(10.0);
dish2.setStock(100);
dish2.setSaleNum(200);
dish2.setLikeNum(190);
dishArray[1] = dish2;Dish dish3 = new Dish();
dish3.setName("佛跳墙");
dish3.setPrice(99.0);
dish3.setStock(5);
dish3.setSaleNum(100);
dish3.setLikeNum(9);
dishArray[2] = dish3;
}// 主函数main, 打印菜单
// do while循环打印菜单, 让用户选择
// switch判断选择, case中分别调用下面的函数处理业务
public static void main(String[] args) {
int choice = 0;
do {
System.out.println("******欢迎进入本店!欢迎光临~~~********");
System.out.println("**********1.菜品展示*********");
System.out.println("**********2.添加菜品*********");
System.out.println("**********3.删除菜品*********");
System.out.println("**********4.菜品数组扩容******");
System.out.println("**********5.点餐*************");
System.out.println("**********6.点赞*************");
System.out.println("**********7.退出*************");
System.out.println("请输入:");
choice = sc.nextInt();
switch (choice) {
case 1:
display();
break;
case 2:
addDish();
break;
case 3:
deleteDish();
break;
case 4:
dilatation();
break;
case 5:
saleDish();
break;
case 6:
likeDish();
break;
}
} while (choice != 7);
System.out.println("******欢迎再次光临~~~********");}
//4. 菜品数组扩容dilatation()
// 打印"进入菜品扩容业务"
// 创建新数组, 长度是原数组1.5倍
// 遍历原数组, 把原数组中的元素转移到新数组中
// 新数组的指针赋给原数组的指针 (这时候堆中的原数组就没有指针指向了, 等待被gc)
// 提示"扩容成功"
private static void dilatation() {
System.out.println("进入菜品扩容业务");
Dish[] newDishArray = new Dish[dishArray.length + (dishArray.length / 2)];
for (int i = 0; i < dishArray.length; i++) {
newDishArray[i] = dishArray[i];
}
dishArray = newDishArray;
System.out.println("扩容成功!");
}//6. 点赞 likeDish()
// 打印"进入点赞业务"
// 菜品展示一下
// 输入需要点赞的菜品编号, 用变量i存储
// 从数组中找到指定的菜品对象指针dish
// 该有的判断要有
// dish.like()
// 提示"点赞成功"
private static void likeDish() {
System.out.println("进入点赞业务!");
display();
System.out.println("请输入需要点赞的菜品编号:");
int i = sc.nextInt() - 1;
if (i<0||i> dishArray.length+1||dishArray[i] == null) {
System.out.println("没有这个菜品");
return;
} else {
dishArray[i].like();
System.out.println("点赞成功!");
}
}//5. 点餐 saleDish()
// 打印"进入点餐业务"
// 菜品展示一下
// 输入需要点的菜品编号, 用变量i存储
// 输入需要点的份数, 用变量n存储
// 从数组中找到指定的菜品对象指针dish
// 该有的判断要有
// 取值器取出菜品的价格 * 上面输入的份数, 得出需要支付的金额, 打印出来
// dish.sale(n), 设置售出的数量, 把n传过去
// 提示"点餐成功"
private static void saleDish() {
System.out.println("进入点餐业务");
display();
System.out.println("请输入需要点的菜品编号:");
int i = sc.nextInt() - 1;
System.out.println("请输入输入需要点的份数:");
int n = sc.nextInt();if (i<0||i> dishArray.length+1||dishArray[i] == null) {
System.out.println("没有这个菜品!");
} else {
System.out.println("您需要支付" + dishArray[i].getPrice() * n + "元!");
dishArray[i].saleOut(n);
dishArray[i].setStock(dishArray[i].getStock() - n);
System.out.println("点餐成功!");
}
}//3. 删除菜品deleteDish()
// 打印"进入删除菜品业务"
// 菜品展示一下
// 让用户选择需要删除的菜品编号
// 需要判断为空, 有剩余库存 (库存数-售出数)的情况下不能删除 (不要问为什么这么设计, 只要实现就行)
// 实现方式一: 直接把dishArray的指定元素置为null, 不前移
// 实现方式二: 不仅置为null, 还要将后面的元素前移
// 如果你写不出来实现方式二, 那就写实现方式一
// 提示"删除成功"
private static void deleteDish() {
System.out.println("进入删除菜品业务");
display();
System.out.println("请选择需要删除的菜品编号:");
int index = sc.nextInt() - 1;
if (index<0||index>dishArray.length+1||dishArray[index] == null){
System.out.println("没有这个菜品");
return;
} else if ((dishArray[index].getStock() - dishArray[index].getSaleNum()) > 0) {
System.out.println("还有库存,不能删除");
return;
} else {
dishArray[index] = null;
System.out.println("删除成功!~");
}// for (int i = 0; i < dishArray.length; i++) {
// if (dishArray[i] == null) {
// dishArray[i] = dishArray[i + 1];
// }
// }
}//2. 添加菜品addDish()
// 如果数组中没有剩余空间, 提示扩容, 然后return
// 打印"进入添加菜品业务"
// 构造一个菜品对象Dish dish = new Dish()
// 分别提示输入"菜品名称", "菜品价格", "库存数量", 并将用户在控制台输入的返回值存储到dish对象中(用set方法)
// 遍历dishArray
// 找到第一个不为null的位置, 把菜品对象的指针存进去
// 提示"添加成功"
private static void addDish() {
for (int i = 0; i < dishArray.length; i++) {
if (dishArray[i]==null){
System.out.println("有栏位");
break;
}
}
if (dishArray[dishArray.length - 1] != null) {
System.out.println("没有剩余栏位,请扩容!");
return;
}
System.out.println("进入添加菜品业务~~~");
Dish dish = new Dish();
System.out.println("请输入菜品名称:");
dish.setName(sc.next());
System.out.println("请输入菜品价格:");
dish.setPrice(sc.nextDouble());
System.out.println("请输入库存数量:");
dish.setStock(sc.nextInt());
dish.setSaleNum(0);
dish.setLikeNum(0);
for (int i = 0; i < dishArray.length; i++) {
if (dishArray[i] == null) {
dishArray[i] = dish;
return;
}
}
System.out.println("添加成功!");
}//1. 菜品展示display()
// 打印"进入菜品展示业务"
// 遍历dishArray, 取出每一个指针, 调用show()方法打印菜品信息
// 注意做null指针判断
private static void display() {
System.out.println("*******进入菜品展示业务********");
for (int i = 0; i < dishArray.length; i++) {
if (dishArray[i] == null) {
System.out.println((i + 1) + "栏位无菜品");
} else {
dishArray[i].show();
}
}
}
}