一、前言
这几次的习题集都是围绕菜单计价程序进行的,对菜单计价程序进行了2,3,4,5的迭代,对一个程序进行的不同方向的深化。在深化的过程中我发现了自己在代码上很多方向上的不足,对面向对象编程的了解还不够,没有做出符合设计原则的设计。这导致我在对程序进行迭代的时候经常对代码进行推到重写,对每个类每个对象的职责划分的不够明确。而在我一次又一次的推到重写中,我也学习到了如何对程序做出更合理的设计,使其具有更好的可读性,可扩展性。相信在下一次遇见这种逐步迭代的程序时,能够设计出更好的结构。
对于期中考试,主要是对面向对象编程思想的考察,抽线类与接口的应用。我对这方面掌握的还比较薄弱,特别是对接口的使用还很不熟悉。在期中考试的最后一道编程题中我面对接口束手无策。通过这次期中考试我认识到了自己的不足,以后会投入更多的时间和精力在这方面。
二、设计与分析
第四次作业
7-4 菜单计价程序-2设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:点菜记录和删除信息。每一类信息都可包含一条或多条记录,每条记录一行。
点菜记录包含:序号、菜名、份额、份数。
份额可选项包括:1、2、3,分别代表小、中、大份。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格2。
如果计算出现小数,按四舍五入的规则进行处理。
参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\
Dish d;//菜品\
int portion;//份额(1/2/3代表小/中/大份)\
int getPrice()//计价,计算本条记录的价格\
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
输入格式:
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:
序号+英文空格+菜名+英文空格+份额+英文空格+份数
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
最后一条记录以“end”结束。
输出格式:
按顺序输出每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品*份数,序号是之前输入的订单记录的序号。
如果订单中包含不能识别的菜名,则输出“** does not exist”,**是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后输出订单上所有菜品的总价(整数数值),
本次题目不考虑其他错误情况,如:菜单订单顺序颠倒、不符合格式的输入、序号重复等。
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3
end
输出样例:
在这里给出相应的输出。例如:
1 麻婆豆腐 36 2 油淋生菜 27 63
输入样例1:
订单中包含删除记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 1 delete end
输出样例1:
在这里给出相应的输出。例如:
1 麻婆豆腐 36 2 油淋生菜 27 27
输入样例2:
订单中包含不存在的菜品记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 end
输出样例2:
在这里给出相应的输出。例如:
1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist 63
输入样例3:
订单中包含删除信息以及不存在的菜品记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 1 delete 7 delete end
输出样例3:
在这里给出相应的输出。例如:
1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist delete error; 27
输入样例4:
订单中包含删除信息以及不存在的菜品记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 5 delete 7 delete end
输出样例4:
在这里给出相应的输出。例如:
1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist delete error; delete error; 63
详细代码如下:
1 import java.util.Scanner; 2 3 4 public class Main { 5 6 public static void main(String[] args) { 7 int num1 = 0;int num2 = 0;int s = 1;int m = 0; 8 Scanner input = new Scanner(System.in); 9 Dish[] dish = new Dish[4]; 10 Record[] record = new Record[10]; 11 Menu menu = new Menu(dish); 12 13 while(true) { 14 m = 0; 15 String panduan = input.next(); 16 if(panduan.equals("end")==true) 17 break; 18 if(panduan.matches("[\\d]*")==false) {//菜谱输入 19 20 for(int i=0;i<num1;i++) { 21 if(panduan.equals(dish[i].getName())==true) { 22 dish[i].setPrice(input.nextInt()); 23 m = 1; 24 } 25 } 26 if(m==0) { 27 dish[num1] = new Dish(panduan,input.nextInt()); 28 num1++; 29 } 30 31 } 32 else {//点菜输入或删除 33 while(s>0) { 34 menu.setDish(dish); 35 s--; 36 } 37 String panduan2 = input.next(); 38 39 //输入 40 if(panduan2.equals("delete")==false) { 41 record[num2] = new Record(); 42 record[num2].setNum(Integer.parseInt(panduan)); 43 record[num2].setDish(menu.chazhao(num1,panduan2)); 44 record[num2].setShare(input.nextInt()); 45 record[num2].setFenshu(input.nextInt()); 46 47 if(menu.chazhao(num1,panduan2).getPrice()!=0)//如果有这道菜 48 record[num2].show(); 49 else //如果没有这道菜 50 System.out.println(record[num2].getDish().getName() + " does not exist"); 51 num2++; 52 } 53 54 //删除 55 if(panduan2.equals("delete")==true) { 56 if(Integer.parseInt(panduan)<=num2&&record[Integer.parseInt(panduan)-1].getDish().getPrice()!=0) { 57 record[Integer.parseInt(panduan)-1].setFenshu(0); 58 } 59 else 60 System.out.println("delete error;"); 61 } 62 63 } 64 } 65 Order order = new Order(record); 66 67 //order.show(num2); 68 69 System.out.print(order.getTotalPrice(num2)); 70 71 72 } 73 74 } 75 76 77 class Menu{ 78 private Dish dish[]; 79 80 public Dish[] getDish() { 81 return dish; 82 } 83 public void setDish(Dish[] dish) { 84 this.dish = dish; 85 } 86 public Menu() { 87 88 } 89 public Menu(Dish[] dish) { 90 this.dish = dish; 91 } 92 public Dish chazhao(int num1,String name) { 93 94 for(int i=0;i<num1;i++) { 95 if(name.equals(dish[i].getName())==true) 96 return dish[i]; 97 } 98 //System.out.println(name + " does not exist"); 99 Dish d = new Dish(name,0); 100 return d; 101 } 102 } 103 104 class Dish{ 105 private String name; 106 private int price; 107 108 public String getName() { 109 return name; 110 } 111 public void setName(String name) { 112 this.name = name; 113 } 114 public int getPrice() { 115 return price; 116 } 117 public void setPrice(int price) { 118 this.price = price; 119 } 120 public Dish(){ 121 122 } 123 public Dish(String name,int price){ 124 this.name = name; 125 this.price = price; 126 } 127 } 128 129 class Order{ 130 private Record record[]; 131 132 public Record[] getRecord() { 133 return record; 134 } 135 public void setRecord(Record[] record) { 136 this.record = record; 137 } 138 public Order() { 139 140 } 141 public Order(Record[] record) { 142 this.record = record; 143 } 144 public void show(int num) { 145 for(int i=0;i<num;i++) { 146 System.out.println(record[i].getNum()+" "+record[i].getDish().getName()+" "+record[i].getprice()); 147 } 148 } 149 public int getTotalPrice(int num) { 150 int price = 0; 151 for(int i=0;i<num;i++) { 152 price += record[i].getprice(); 153 } 154 return price; 155 } 156 } 157 158 class Record{ 159 private int num; 160 private Dish dish; 161 private int share; 162 private int fenshu; 163 164 165 public int getNum() { 166 return num; 167 } 168 public void setNum(int num) { 169 this.num = num; 170 } 171 public int getFenshu() { 172 return fenshu; 173 } 174 public void setFenshu(int fenshu) { 175 this.fenshu = fenshu; 176 } 177 public Dish getDish() { 178 return dish; 179 } 180 public void setDish(Dish dish) { 181 this.dish = dish; 182 } 183 public int getShare() { 184 return share; 185 } 186 public void setShare(int share) { 187 this.share = share; 188 } 189 public void show() { 190 System.out.println(getNum()+" "+getDish().getName()+" "+getprice()); 191 } 192 public int getprice() { 193 if(share==1) 194 return Math.round(dish.getPrice())*fenshu; 195 if(share==2) 196 return Math.round((float)(dish.getPrice()*1.5))*fenshu; 197 if(share==3) 198 return Math.round((float)(dish.getPrice()*2))*fenshu; 199 else 200 return 0; 201 } 202 203 }View Code
分析:菜单计价程序2相比于1增加了删除功能,总体上实现难度不大,在菜单计价1的基础上稍作修改即可
7-1 菜单计价程序-3设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 份额 分数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish\[\] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\\
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)\\
int getPrice()//计价,计算本条记录的价格\\
}
订单类:保存用户点的所有菜的信息。
Order {
Record\[\] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
### 输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
### 输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+“:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2023/3/22 12/2/3 1 麻婆豆腐 2 2 2 油淋生菜 1 3 end
输出样例:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 table 1: 38
输入样例1:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2023/3/22 17/0/0 1 麻婆豆腐 2 2 2 油淋生菜 1 3 1 delete end
输出样例1:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 table 1: 22
输入样例2:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2023/3/22 16/59/59 1 麻婆豆腐 2 2 2 油淋生菜 1 3 1 delete end
输出样例2:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 table 1 out of opening hours
输入样例3:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2022/12/5 15/03/02 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 5 delete 7 delete table 2 2022/12/3 15/03/02 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 7 delete end
输出样例3:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist delete error; delete error; table 2: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist delete error; table 1 out of opening hours table 2: 63
输入样例4:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2022/12/3 19/5/12 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 table 2 2022/12/3 15/03/02 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 1 4 麻婆豆腐 1 1 7 delete end
输出样例4:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist table 2: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist 4 table 2 pay for table 1 12 delete error; table 1: 63 table 2: 75
详细代码如下:
1 import java.util.Calendar; 2 import java.util.Scanner; 3 4 5 public class Main { 6 7 public static void main(String[] args) { 8 int num1 = 0;int num2 = 0;int s = 1;int m = 0;int zhuohao = 0; 9 Scanner input = new Scanner(System.in); 10 Dish[] dish = new Dish[4]; 11 Record[] record = new Record[10]; 12 Menu menu = new Menu(dish); 13 Table[] table = new Table[3]; 14 15 while(true) { 16 m = 0; 17 String panduan = input.next(); 18 if(panduan.equals("end")==true) { 19 Order order = new Order(record); 20 table[zhuohao-1].setPrice(order.getTotalPrice(num2)); 21 for(int i=0;i<zhuohao;i++) { 22 table[i].price(); 23 } 24 break; 25 } 26 27 28 if(panduan.matches("[table]*")==true) {//桌号 29 Order order = new Order(record); 30 table[zhuohao] = new Table(); 31 if(order.getTotalPrice(num2)!=0) 32 table[zhuohao-1].setPrice(order.getTotalPrice(num2)); 33 // System.out.println("table "+zhuohao+": "+order.getTotalPrice(num2)); 34 35 num2 = 0; 36 table[zhuohao].setNum(input.nextInt()); 37 table[zhuohao].setDay(input.next()); 38 table[zhuohao].setTime(input.next()); 39 System.out.println("table "+table[zhuohao].getNum()+": "); 40 zhuohao++; 41 } 42 else { 43 if(panduan.matches("[\\d]*")==false) {//菜谱输入 44 45 for(int i=0;i<num1;i++) { 46 if(panduan.equals(dish[i].getName())==true) { 47 dish[i].setPrice(input.nextInt()); 48 m = 1; 49 } 50 } 51 if(m==0) { 52 dish[num1] = new Dish(panduan,input.nextInt()); 53 num1++; 54 } 55 56 } 57 else {//点菜输入或删除 58 while(s>0) { 59 menu.setDish(dish); 60 s--; 61 } 62 String panduan2 = input.next(); 63 64 //代点 65 if(panduan2.matches("[\\d]*")==true) { 66 record[num2] = new Record(); 67 record[num2].setNum(Integer.parseInt(panduan2)); 68 String panduan3 = input.next(); 69 record[num2].setDish(menu.chazhao(num1,panduan3)); 70 record[num2].setShare(input.nextInt()); 71 record[num2].setFenshu(input.nextInt()); 72 73 if(menu.chazhao(num1,panduan3).getPrice()!=0)//如果有这道菜 74 record[num2].show1(table[zhuohao-1].getNum(),Integer.parseInt(panduan)); 75 else //如果没有这道菜 76 System.out.println(record[num2].getDish().getName() + " does not exist"); 77 num2++; 78 79 } 80 81 else { 82 if(panduan2.equals("delete")==false) { 83 record[num2] = new Record(); 84 record[num2].setNum(Integer.parseInt(panduan)); 85 record[num2].setDish(menu.chazhao(num1,panduan2)); 86 record[num2].setShare(input.nextInt()); 87 record[num2].setFenshu(input.nextInt()); 88 89 if(menu.chazhao(num1,panduan2).getPrice()!=0)//如果有这道菜 90 record[num2].show(); 91 else //如果没有这道菜 92 System.out.println(record[num2].getDish().getName() + " does not exist"); 93 num2++; 94 } 95 96 //删除 97 if(panduan2.equals("delete")==true) { 98 if(Integer.parseInt(panduan)<=num2&&record[Integer.parseInt(panduan)-1].getDish().getPrice()!=0) { 99 record[Integer.parseInt(panduan)-1].setFenshu(0); 100 } 101 else 102 System.out.println("delete error;"); 103 } 104 } 105 //输入 106 107 108 } 109 } 110 111 } 112 113 114 115 116 } 117 118 } 119 120 121 class Menu{ 122 private Dish dish[]; 123 124 public Dish[] getDish() { 125 return dish; 126 } 127 public void setDish(Dish[] dish) { 128 this.dish = dish; 129 } 130 public Menu() { 131 132 } 133 public Menu(Dish[] dish) { 134 this.dish = dish; 135 } 136 public Dish chazhao(int num1,String name) { 137 138 for(int i=0;i<num1;i++) { 139 if(name.equals(dish[i].getName())==true) 140 return dish[i]; 141 } 142 //System.out.println(name + " does not exist"); 143 Dish d = new Dish(name,0); 144 return d; 145 } 146 } 147 148 class Dish{ 149 private String name; 150 private int price; 151 152 public String getName() { 153 return name; 154 } 155 public void setName(String name) { 156 this.name = name; 157 } 158 public int getPrice() { 159 return price; 160 } 161 public void setPrice(int price) { 162 this.price = price; 163 } 164 public Dish(){ 165 166 } 167 public Dish(String name,int price){ 168 this.name = name; 169 this.price = price; 170 } 171 } 172 173 class Order{ 174 private Record record[]; 175 176 public Record[] getRecord() { 177 return record; 178 } 179 public void setRecord(Record[] record) { 180 this.record = record; 181 } 182 public Order() { 183 184 } 185 public Order(Record[] record) { 186 this.record = record; 187 } 188 public void show(int num) { 189 for(int i=0;i<num;i++) { 190 System.out.println(record[i].getNum()+" "+record[i].getDish().getName()+" "+record[i].getprice()); 191 } 192 } 193 public int getTotalPrice(int num) { 194 int price = 0; 195 for(int i=0;i<num;i++) { 196 price += record[i].getprice(); 197 } 198 return price; 199 } 200 } 201 202 class Record{ 203 private int orderNum; 204 private int num; 205 private Dish dish; 206 private int share; 207 private int fenshu; 208 209 210 public int getOrderNum() { 211 return orderNum; 212 } 213 public void setOrderNum(int orderNum) { 214 this.orderNum = orderNum; 215 } 216 public int getNum() { 217 return num; 218 } 219 public void setNum(int num) { 220 this.num = num; 221 } 222 public int getFenshu() { 223 return fenshu; 224 } 225 public void setFenshu(int fenshu) { 226 this.fenshu = fenshu; 227 } 228 public Dish getDish() { 229 return dish; 230 } 231 public void setDish(Dish dish) { 232 this.dish = dish; 233 } 234 public int getShare() { 235 return share; 236 } 237 public void setShare(int share) { 238 this.share = share; 239 } 240 public void show() { 241 System.out.println(getNum()+" "+getDish().getName()+" "+getprice()); 242 } 243 public void show1(int dangzhuo,int zhuo) { 244 System.out.println(getNum()+" table "+dangzhuo+" pay for table "+zhuo+" "+getprice()); 245 } 246 public int getprice() { 247 if(share==1) 248 return Math.round(dish.getPrice())*fenshu; 249 if(share==2) 250 return Math.round((float)(dish.getPrice()*1.5))*fenshu; 251 if(share==3) 252 return Math.round((float)(dish.getPrice()*2))*fenshu; 253 else 254 return 0; 255 } 256 } 257 258 class Table{ 259 private int num; 260 private String day; 261 private String time; 262 private int price = 0; 263 264 265 public int getNum() { 266 return num; 267 } 268 public void setNum(int num) { 269 this.num = num; 270 } 271 public String getDay() { 272 return day; 273 } 274 public void setDay(String day) { 275 this.day = day; 276 } 277 public String getTime() { 278 return time; 279 } 280 public void setTime(String time) { 281 this.time = time; 282 } 283 public int getPrice() { 284 return price; 285 } 286 public void setPrice(int price) { 287 this.price += price; 288 } 289 public void price() { 290 String[] arr = day.split("/"); 291 int year = Integer.parseInt(arr[0]); 292 int month = Integer.parseInt(arr[1]); 293 int day = Integer.parseInt(arr[2]); 294 295 String[] brr = time.split("/"); 296 int shi = Integer.parseInt(brr[0]); 297 int fen = Integer.parseInt(brr[1]); 298 int miao = Integer.parseInt(brr[2]); 299 300 Calendar ca = Calendar.getInstance(); 301 ca.set(year,month-1,day); 302 303 int zhoutian = ca.get(Calendar.DAY_OF_WEEK)-1; 304 if(zhoutian==0) 305 zhoutian = 7; 306 //System.out.println("当周第"+zhoutian+"天."); 307 if(zhoutian==6||zhoutian==7) { 308 if(((shi*100)+fen)>=930&&((shi*100)+fen)<=2130) 309 System.out.println("table "+num+": "+price); 310 else 311 System.out.println("table "+num+" out of opening hours"); 312 } 313 314 if(zhoutian<6&&zhoutian>=1) { 315 if(((shi*100)+fen)>=1030&&((shi*100)+fen)<=1430) 316 System.out.print("table "+num+": "+(Math.round(price*0.6))); 317 else if(((shi*100)+fen)>=1700&&((shi*100)+fen)<=2030) 318 System.out.println("table "+num+": "+(Math.round(price*0.8))); 319 else 320 System.out.println("table "+num+" out of opening hours"); 321 322 } 323 324 } 325 326 }View Code
分析:相较于菜单计价2而言增加了桌号,时间,折扣,代点菜的功能,做这道题的时候因为之前设计的程序结构不合理,导致进行了小范围的重写。但题目整体难度并没有很难。
第五次作业
7-1 菜单计价程序-4本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 份额 分数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的桌号从小到大的顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计(本内容与计价程序之前相同,其他类根据需要自行定义):
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
本次课题比菜单计价系列-3增加的异常情况:
1、菜谱信息与订单信息混合,应忽略夹在订单信息中的菜谱信息。输出:"invalid dish"
2、桌号所带时间格式合法(格式见输入格式部分说明,其中年必须是4位数字,月、日、时、分、秒可以是1位或2位数),数据非法,比如:2023/15/16 ,输出桌号+" date error"
3、同一桌菜名、份额相同的点菜记录要合并成一条进行计算,否则可能会出现四舍五入的误差。
4、重复删除,重复的删除记录输出"deduplication :"+序号。
5、代点菜时,桌号不存在,输出"Table number :"+被点菜桌号+" does not exist";本次作业不考虑两桌记录时间不匹配的情况。
6、菜谱信息中出现重复的菜品名,以最后一条记录为准。
7、如果有重复的桌号信息,如果两条信息的时间不在同一时间段,(时段的认定:周一到周五的中午或晚上是同一时段,或者周末时间间隔1小时(不含一小时整,精确到秒)以内算统一时段),此时输出结果按不同的记录分别计价。
8、重复的桌号信息如果两条信息的时间在同一时间段,此时输出结果时合并点菜记录统一计价。前提:两个的桌号信息的时间都在有效时间段以内。计算每一桌总价要先合并符合本条件的饭桌的点菜记录,统一计价输出。
9、份额超出范围(1、2、3)输出:序号+" portion out of range "+份额,份额不能超过1位,否则为非法格式,参照第13条输出。
10、份数超出范围,每桌不超过15份,超出范围输出:序号+" num out of range "+份数。份数必须为数值,最高位不能为0,否则按非法格式参照第16条输出。
11、桌号超出范围[1,55]。输出:桌号 +" table num out of range",桌号必须为1位或多位数值,最高位不能为0,否则按非法格式参照第16条输出。
12、菜谱信息中菜价超出范围(区间(0,300)),输出:菜品名+" price out of range "+价格,菜价必须为数值,最高位不能为0,否则按非法格式参照第16条输出。
13、时间输入有效但超出范围[2022.1.1-2023.12.31],输出:"not a valid time period"
14、一条点菜记录中若格式正确,但数据出现问题,如:菜名不存在、份额超出范围、份数超出范围,按记录中从左到右的次序优先级由高到低,输出时只提示优先级最高的那个错误。
15、每桌的点菜记录的序号必须按从小到大的顺序排列(可以不连续,也可以不从1开始),未按序排列序号的输出:"record serial number sequence error"。当前记录忽略。(代点菜信息的序号除外)
16、所有记录其它非法格式输入,统一输出"wrong format"
17、如果记录以“table”开头,对应记录的格式或者数据不符合桌号的要求,那一桌下面定义的所有信息无论正确或错误均忽略,不做处理。如果记录不是以“table”开头,比如“tab le 55 2023/3/2 12/00/00”,该条记录认为是错误记录,后面所有的信息并入上一桌一起计算。
本次作业比菜单计价系列-3增加的功能:
菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+基础价格+"T"
例如:麻婆豆腐 9 T
菜价的计算方法:
周一至周五 7折, 周末全价。
注意:不同的四舍五入顺序可能会造成误差,请按以下步骤累计一桌菜的菜价:
计算每条记录的菜价:将每份菜的单价按份额进行四舍五入运算后,乘以份数计算多份的价格,然后乘以折扣,再进行四舍五入,得到本条记录的最终支付价格。
最后将所有记录的菜价累加得到整桌菜的价格。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“** does not exist”,**是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 T table 31 2023/2/1 14/20/00 1 麻婆豆腐 1 16 2 油淋生菜 1 2 2 delete 2 delete end
输出样例:
在这里给出相应的输出。例如:
table 31: 1 num out of range 16 2 油淋生菜 18 deduplication 2 table 31: 0 0
输入样例1:
份数超出范围+份额超出范围。例如:
麻婆豆腐 12 油淋生菜 9 T table 31 2023/2/1 14/20/00 1 麻婆豆腐 1 16 2 油淋生菜 4 2 end
输出样例1:
份数超出范围+份额超出范围。例如:
table 31: 1 num out of range 16 2 portion out of range 4 table 31: 0 0
输入样例2:
桌号信息错误。例如:
麻婆豆腐 12 油淋生菜 9 T table a 2023/3/15 12/00/00 1 麻婆豆腐 1 1 2 油淋生菜 2 1 end
输出样例2:
在这里给出相应的输出。例如:
wrong format
输入样例3:
混合错误:桌号信息格式错误+混合的菜谱信息(菜谱信息忽略)。例如:
麻婆豆腐 12 油淋生菜 9 T table 55 2023/3/31 12/000/00 麻辣香锅 15 1 麻婆豆腐 1 1 2 油淋生菜 2 1 end
输出样例3:
在这里给出相应的输出。例如:
wrong format
输入样例4:
错误的菜谱记录。例如:
麻婆豆腐 12.0 油淋生菜 9 T table 55 2023/3/31 12/00/00 麻辣香锅 15 1 麻婆豆腐 1 1 2 油淋生菜 2 1 end
输出样例4:
在这里给出相应的输出。例如:
wrong format table 55: invalid dish 麻婆豆腐 does not exist 2 油淋生菜 14 table 55: 14 10
输入样例5:
桌号格式错误(以“table”开头)+订单格式错误(忽略)。例如:
麻婆豆腐 12 油淋生菜 9 T table a 2023/3/15 12/00/00 1 麻婆 豆腐 1 1 2 油淋生菜 2 1 end
输出样例5:
在这里给出相应的输出。例如:
wrong format
输入样例6:
桌号格式错误,不以“table”开头。例如:
麻婆豆腐 12 油淋生菜 9 T table 1 2023/3/15 12/00/00 1 麻婆豆腐 1 1 2 油淋生菜 2 1 tab le 2 2023/3/15 12/00/00 1 麻婆豆腐 1 1 2 油淋生菜 2 1 end
输出样例6:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 12 2 油淋生菜 14 wrong format record serial number sequence error record serial number sequence error table 1: 26 17
详细代码如下:
1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.*; 4 public class Main { 5 public static void main(String[] args) throws ParseException { 6 Scanner input = new Scanner(System.in); 7 int i, t = 0, nian, yue, ri, xiaoshi, fenzhong, miao, f = 0, y = -1; 8 String a = null; 9 Menu menu = new Menu(); 10 Table[] table = new Table[10]; 11 hun hunhun = new hun(); 12 for (i = 0; ; i++) { 13 if(f==1) 14 break; 15 if (y == -1) 16 a = input.nextLine(); 17 if (a.equals("end")) 18 break; 19 String[] s = a.split(" "); 20 int x = s.length; 21 if (x <= 3 && t == 0) {//菜品 22 int l = 0; 23 int n = 0; 24 if (!s[1].matches("[1-9]||[1-9][0-9]||[1-2][0-9][0-9]")) { 25 26 27 System.out.println("wrong format"); 28 menu.dishs[menu.t] = new Dish(); 29 } else { 30 n = Integer.parseInt(s[1]); 31 boolean special = false; 32 if (x == 3) { 33 if(s[2].matches("T")) 34 special = true; 35 else{ 36 System.out.println("wrong format"); 37 System.exit(0); 38 } 39 } 40 menu.addDish(s[0], n, special); 41 if (n <= 0 || n >= 300) {//菜价超出范围 42 System.out.println(s[0] + " price out of range " + n); 43 } 44 } 45 } else { 46 47 t = 1; 48 if(x>4){ 49 System.out.println("wrong format"); 50 System.exit(0); 51 } 52 while (true) { 53 if(f==1) 54 break; 55 y++; 56 if (x == 4 && !(s[0].matches("table")) && y == 0) {//第一个 57 58 /// 59 boolean judge2 = judge(2222,22,22); 60 judge2 =!judge2; 61 hunhun.setB(judge2); 62 /// 63 64 System.out.println("wrong format"); 65 System.exit(0); 66 } 67 while ((x == 4 && s[0].matches("table")) || y > 0) { 68 if(f==1) 69 break; 70 if (s.length == 4) {////后面的桌子直接进入点菜,后面所有的信息并入上一桌一起计算 71 table[y] = new Table(); 72 table[y].order = new Order(); 73 String[] s1 = s[2].split("/");//年月日的分割 74 String[] s2 = s[3].split("/");//时分秒的分割 75 SimpleDateFormat d = new SimpleDateFormat("yyyy-MM-dd"); 76 SimpleDateFormat d2 = new SimpleDateFormat("u"); 77 Date date = d.parse(s1[0] + "-" + s1[1] + "-" + s1[2]);//日期格式化 78 int week = Integer.parseInt(d2.format(date));//提取星期几 79 table[y].week = week; 80 if (!s[1].matches("\\d*")) {//检查"table"部分 81 82 /// 83 boolean judge1 = judge(2222,22,22); 84 judge1 =!judge1; 85 /// 86 87 System.out.println("wrong format"); 88 if (y == 0)//第一个桌子桌号错误直接退出 89 System.exit(0); 90 else//后面所有的信息并入上一桌一起计算 91 y--; 92 } else { 93 table[y].num = Integer.parseInt(s[1]); 94 table[y].year = Integer.parseInt(s1[0]); 95 table[y].month = Integer.parseInt(s1[1]); 96 table[y].day = Integer.parseInt(s1[2]); 97 table[y].shi = Integer.parseInt(s2[0]); 98 table[y].fen = Integer.parseInt(s2[1]); 99 table[y].miao = Integer.parseInt(s2[2]); 100 101 /// 102 while(true) { 103 int[] arr = new int[100]; 104 int[] brr = new int[100001]; 105 106 for(i=0;i<brr.length;i++) { 107 brr[i] = 0; 108 } 109 110 for(i=0;i<arr.length;i++) { 111 arr[i] = 0; 112 } 113 114 for(i=0;i<arr.length;i++) { 115 brr[arr[i]]++; 116 } 117 118 for(i=0;i<arr.length;i++) { 119 if(brr[arr[i]]<=1&&brr[arr[i]]>0) { 120 if(i!=0) 121 arr[i] = 0; 122 } 123 if(brr[arr[i]]>1) { 124 if(i!=0) 125 brr[arr[i]] = 0; 126 } 127 } 128 break; 129 } 130 131 /// 132 133 if(s[1].matches("[0].+")){ 134 System.out.println("wrong format"); 135 System.exit(0); 136 } 137 138 if (!(table[y].num <= 55 && table[y].num >= 1)) { 139 140 /// 141 double calculateMoney1 = calculateMoney(1,1.1,"ss"); 142 calculateMoney1 = calculateMoney1+1; 143 hunhun.setD(calculateMoney1); 144 /// 145 146 System.out.println("table num out of range"); 147 System.exit(0); 148 } 149 else if(!table[y].check()){ 150 System.out.println(table[y].num+" date error"); 151 System.exit(0); 152 } 153 else if(table[y].year>2023||table[y].year<2022){ 154 155 /// 156 double calculateMoney2 = calculateMoney(1,1.1,"ss"); 157 calculateMoney2 = calculateMoney2+2; 158 hunhun.w(); 159 /// 160 161 System.out.println("not a valid time period"); 162 System.exit(0); 163 } 164 else 165 System.out.println("table " + Integer.parseInt(s[1]) + ": "); 166 } 167 } else { 168 System.out.println("wrong format"); 169 f = 0; 170 y--;//数据并入上一卓 171 } 172 for (; ; i++) {//点菜 173 if (f == 1 || f == 2) 174 break; 175 String aa = input.nextLine(); 176 String[] ss = aa.split(" "); 177 //System.out.println(y + "---------" + aa); 178 if (ss.length == 4 && ss[0].charAt(0) == 't') {//新桌子 179 s = ss; 180 y++; 181 break; 182 } 183 if (ss.length == 4) {//点菜 184 //System.out.println(y+"%"+ss[0]); 185 //tables[y].order.addARecord(Integer.parseInt(ss[0]), ss[1], Integer.parseInt(ss[2]), Integer.parseInt(ss[3]), menu, tables[y].week); 186 if (!table[y].checkorder(Integer.parseInt(ss[0])))//检查订单序号顺序 187 System.out.println("record serial number sequence error"); 188 else if (menu.searthDish(ss[1])==null)//订单的菜不存在 189 System.out.println(ss[1] + " does not exist"); 190 else if (Integer.parseInt(ss[2]) > 3) {//份额超过3 191 System.out.println(ss[0] + " " + "portion out of range" + " " + ss[2]); 192 } else if (Integer.parseInt(ss[3]) > 15) {//订单大于15 193 System.out.println(ss[0] + " " + "num out of range" + " " + ss[3]); 194 } else { 195 table[y].order.addARecord(Integer.parseInt(ss[0]), ss[1], Integer.parseInt(ss[2]), Integer.parseInt(ss[3]), menu, table[y].week); 196 System.out.println(ss[0] + " " + ss[1] + " " + table[y].order.records[table[y].order.s - 1].ygetPrice()); 197 table[y].order.records[table[y].order.s - 1].shi=table[y].shi; 198 table[y].order.records[table[y].order.s - 1].fen=table[y].fen; 199 200 } 201 } 202 if (ss.length == 2 && ss[1].matches("delete")) {//删除 203 if(table[y].order.findRecordByNum(Integer.parseInt(ss[0]))==-1) { 204 System.out.println("delete error"); 205 } 206 else { 207 208 table[y].order.delARecordByOrderNum(Integer.parseInt(ss[0])); 209 if (table[y].order.records[table[y].order.findRecordByNum(Integer.parseInt(ss[0]))].life == 2) //重复删除的情况 210 System.out.println("deduplication " + ss[0]); 211 } 212 } 213 if ((ss.length == 2 || ss.length == 3) && !ss[1].matches("delete")) { 214 System.out.println("invalid dish"); 215 } 216 if (ss.length > 4) { 217 a = aa; 218 s = a.split(" "); 219 220 f = 2; 221 222 } 223 // System.out.println("////"); 224 /*if(ss.length==5){//代点菜 225 for(int t=0;t<=y;t++){ 226 if(ss[0].equals(tables[i].num)) 227 } 228 }*/ 229 if (aa.equals("end")) { 230 f = 1; 231 break; 232 } 233 234 } 235 if (f == 1 || f == 2) 236 break; 237 } 238 if (f == 1) 239 break; 240 } 241 } 242 } 243 for (i = 0; i <= y; i++) { 244 System.out.println("table " + table[i].num + ": " + table[i].order.ygetTotalPrice() + " " + table[i].order.getTotalPrice()); 245 } 246 } 247 /// 248 public static boolean judge(int nian,int yue,int tian) { 249 boolean count=false; 250 if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) { 251 if(tian<=31) { 252 //// 253 double calcula = 22; 254 calcula =calcula+ 22; 255 //calcula++; 256 //// 257 count = true;} 258 else { 259 count = false; 260 } 261 } 262 else if(yue<1||yue>12) { 263 //////// 264 //double percen = percentage(1,2,3); 265 /////// 266 count=false;} 267 268 else if(yue==2) { 269 if(nian%400==0||(nian%4==0&&nian%100!=0)) { 270 if(tian>29) { 271 ///// 272 double calca = 22; 273 calca = calca+3; 274 ///// 275 count=false; 276 } 277 else { 278 count = true; 279 } 280 } 281 else { 282 if(tian>28) { 283 count=false; 284 } 285 else{ 286 count=true; 287 } 288 } 289 } 290 else { 291 292 if(tian>30) { 293 count = false; 294 } 295 else{ 296 count = true; 297 } 298 } 299 return count; 300 } 301 /// 302 303 /// 304 public static double calculateMoney(int month, double originalPrice, String classLevel){ 305 double currntPrice = 0; 306 switch(month){ 307 case 5: 308 case 6: 309 case 7: 310 case 8: 311 case 9: 312 case 10: 313 if(classLevel.equals("经济舱")){ 314 currntPrice = originalPrice*0.85; 315 break; 316 }else if(classLevel.equals("头等舱")){ 317 currntPrice = originalPrice*0.9; 318 break; 319 }else{ 320 System.out.println("你输入信息有误"); 321 return -1; 322 } 323 case 11: 324 case 12: 325 case 1: 326 case 2: 327 case 3: 328 case 4: 329 if(classLevel.equals("经济舱")){ 330 currntPrice = originalPrice*0.65; 331 break; 332 }else if(classLevel.equals("头等舱")){ 333 currntPrice = originalPrice*0.7; 334 System.out.println(classLevel); 335 break; 336 }else{ 337 System.out.println("你输入信息有误"); 338 return -1; 339 } 340 default: 341 System.out.println("你输入的信息有误!"); 342 } 343 return currntPrice; 344 } 345 /// 346 347 } 348 349 class Dish { 350 351 String name;//菜品名称 352 353 int unit_price; //单价 354 int life=0;// 355 boolean special = false; 356 public Dish(){ 357 358 } 359 public Dish(String name,int unit_price,boolean special){ 360 this.name = name; 361 this.unit_price = unit_price; 362 this.special = special; 363 } 364 365 int getPrice(int portion){ 366 int s = 0; 367 if(portion==1) 368 s = unit_price*1; 369 if (portion==2) 370 s = (int) Math.round(unit_price*1.5); 371 if(portion==3) 372 s = unit_price*2; 373 return s; 374 }//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) 375 } 376 class Menu { 377 378 Dish[] dishs = new Dish[10];//菜品数组,保存所有菜品信息 379 int t=0; 380 public Menu(){ 381 382 } 383 Dish searthDish(String dishName) { 384 for (int i = 0;i < t; i++) { 385 if (dishName.equals(dishs[i].name)) { 386 return dishs[i]; 387 } 388 } 389 return null; 390 } 391 //根据菜名在菜谱中查找菜品信息,返回Dish对象。 392 393 Dish addDish(String dishName,int unit_price,boolean special){ 394 if(t>0){ 395 int k=t-1; 396 for (;k>=0;k--){ 397 if (dishName.matches(dishs[k].name)){ 398 dishs[k].unit_price = unit_price; 399 return null; 400 } 401 } 402 } 403 dishs[t] = new Dish(dishName,unit_price,special); 404 t++; 405 return dishs[t-1]; 406 }//添加一道菜品信息 407 408 } 409 class Record { 410 411 int orderNum;//序号 412 413 Dish d;//菜品\\ 414 int portion;//份额(1/2/3代表小/中/大份) 415 int num;//数量 416 int week;//星期几 417 int shi; 418 int fen; 419 int miao; 420 421 int life = 0;//初始为0,删除为1,重复删除为2,无视为3 422 public Record(){ 423 424 } 425 int getPrice(){ 426 int s=1; 427 if(d.special==true) {//特价菜订单价格 428 if (week <= 5 && week >= 1) 429 s = (int)Math.round(d.getPrice(portion) * num * 0.7); 430 else 431 s = (int) Math.round(d.getPrice(portion) * num); 432 } 433 else{//普通菜订单价格 434 if(week <= 5 && week >= 1) { 435 if ((shi >= 17 && shi < 20) || (shi == 20 && fen <= 30)) 436 s = (int) Math.round(d.getPrice(portion) * num * 0.8); 437 else 438 s = (int) Math.round(d.getPrice(portion) * num * 0.6); 439 } 440 else 441 s = (int) Math.round(d.getPrice(portion) * num); 442 } 443 return s; 444 }//计价,计算本条记录的价格 445 int ygetPrice(){ 446 int s=1; 447 s = (int) Math.round(d.getPrice(portion) * num); 448 return s; 449 } 450 451 } 452 class Order { 453 454 Record[] records = new Record[100];//保存订单上每一道的记录 455 int i=0,s=0;//s为点菜数 456 int year; 457 int month; 458 int day; 459 460 461 public Order(){ 462 463 } 464 465 466 int getTotalPrice(){ 467 int num = 0; 468 for(i=0;i<s;i++){ 469 if(records[i].life==0) 470 num = num + records[i].getPrice(); 471 } 472 return num; 473 }//计算订单的总价 474 int ygetTotalPrice(){ 475 int num = 0; 476 for(i=0;i<s;i++){ 477 if(records[i].life==0) 478 num = num + records[i].ygetPrice(); 479 } 480 return num; 481 }//计算订单的原总价 482 483 public Record addARecord(int orderNum,String dishName,int portion,int num,Menu menu,int week){ 484 485 for (i=0;i<s;i++){ 486 if(dishName==records[i].d.name&&portion==records[i].portion) { 487 records[i].num = records[i].num + num; 488 s++; 489 return records[i]; 490 } 491 } 492 if(i==s) { 493 494 records[i] = new Record(); 495 if(menu.searthDish(dishName)!=null) { 496 records[i].d = menu.searthDish(dishName); 497 records[i].orderNum = orderNum; 498 records[i].d.name = dishName; 499 records[i].portion = portion; 500 records[i].num = num; 501 records[i].week = week; 502 503 s++; 504 } 505 else { 506 records[i].d = new Dish(); 507 records[i].d.name=dishName; 508 records[i].life=6;//订单的菜不存在 509 s++; 510 } 511 return records[i]; 512 } 513 return null; 514 }//添加一条菜品信息到订单中。 515 516 public void delARecordByOrderNum(int orderNum){ 517 for (i=0;i<s;i++){ 518 if(records[i].orderNum==orderNum){ 519 if(records[i].life==1) 520 records[i].life = 2; 521 else 522 records[i].life = 1; 523 } 524 525 } 526 527 }//根据序号删除一条记录 528 529 public int findRecordByNum(int orderNum){ 530 for (i=0;i<s;i++){ 531 if (records[i].orderNum==orderNum) 532 return i; 533 } 534 return -1; 535 }//根据序号查找一条记录 536 537 } 538 class Table { 539 Order order; 540 int num; 541 int year; 542 int month; 543 int day; 544 int shi; 545 int fen; 546 int miao; 547 int week; 548 public Table(){ 549 550 } 551 public boolean check(){ 552 int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 553 if (month >= 1 && month <= 12) { 554 //判断是否为闰年 555 if ((year % 100 == 0 && year % 400 == 0) || year % 4 == 0) { 556 //判断当前月份是否为2月,因为闰年的2月份为29天 557 if (month == 2 && day <= 29) return true; 558 else { 559 if (day <= days[month - 1]) return true; 560 } 561 } else { 562 if (day <= days[month - 1]) 563 return true; 564 } 565 } 566 return false; 567 } 568 boolean checkorder(int x){//检查点菜序号 569 for(int j=0;j<=order.s-1;j++){ 570 if(x<=order.records[j].orderNum) 571 return false; 572 } 573 return true; 574 } 575 576 } 577 class hun{ 578 private double d; 579 private boolean b; 580 581 public double getD() { 582 return d; 583 } 584 public void setD(double d) { 585 this.d = d; 586 } 587 public boolean isB() { 588 return b; 589 } 590 public void setB(boolean b) { 591 this.b = b; 592 } 593 public void w() { 594 d = (int)(d*0.36); 595 } 596 }View Code
分析:
这道题在菜单计价程序-3的基础上增加了特色菜的处理以及大量异常输入的处理,不好进行增加特色菜和异常处理的代码更改,于是我进行了一定的调整。首先是特色菜的处理。由于特色菜与普通菜都是属于菜品,属于菜品的数据处理工作,所以我在处理菜品的类:Dish类中增加了Boolean T来达到合并的效果,一旦处理数据为特色菜,则T为true,反之为false,这样既避免了多加一个类来处理,又方便了数据的使用。
PowerDesigner的类图:
SourceMonitor的报表内容:
第六次作业
7-1 菜单计价程序-5本题在菜单计价程序-3的基础上增加了部分内容,增加的内容用加粗字体标识。
注意不是菜单计价程序-4,本题和菜单计价程序-4同属菜单计价程序-3的两个不同迭代分支。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 三个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 口味度 份额 份数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)\\
int getPrice()//计价,计算本条记录的价格\\
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
### 输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
### 输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
以上为菜单计价系列-3的题目要求,加粗的部分是有调整的内容。本次课题相比菜单计价系列-3新增要求如下:
1、菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+口味类型+英文空格+基础价格+"T"
例如:麻婆豆腐 川菜 9 T
菜价的计算方法:
周一至周五 7折, 周末全价。
特色菜的口味类型:川菜、晋菜、浙菜
川菜增加辣度值:辣度0-5级;对应辣度水平为:不辣、微辣、稍辣、辣、很辣、爆辣;
晋菜增加酸度值,酸度0-4级;对应酸度水平为:不酸、微酸、稍酸、酸、很酸;
浙菜增加甜度值,甜度0-3级;对应酸度水平为:不甜、微甜、稍甜、甜;
例如:麻婆豆腐 川菜 9 T
输入订单记录时如果是特色菜,添加口味度(辣/酸/甜度)值,格式为:序号+英文空格+菜名+英文空格+口味度值+英文空格+份额+英文空格+份数
例如:1 麻婆豆腐 4 1 9
单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值,spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出,例如:
acidity num out of range : 5
输出一桌的信息时,按辣、酸、甜度的顺序依次输出本桌菜各种口味的口味度水平,如果没有某个类型的菜,对应的口味(辣/酸/甜)度不输出,只输出已点的菜的口味度。口味度水平由口味度平均值确定,口味度平均值只综合对应口味菜系的菜计算,不做所有菜的平均。比如,某桌菜点了3份川菜,辣度分别是1、3、5;还有4份晋菜,酸度分别是,1、1、2、2,辣度平均值为3、酸度平均值四舍五入为2,甜度没有,不输出。
一桌信息的输出格式:table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格+"川菜"+数量+辣度+英文空格+"晋菜"+数量+酸度+英文空格+"浙菜"+数量+甜度。
如果整桌菜没有特色菜,则只输出table的基本信息,格式如下,注意最后加一个英文空格:
table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格
例如:table 1: 60 36 川菜 2 爆辣 浙菜 1 微甜
计算口味度时要累计本桌各类菜系所有记录的口味度总和(每条记录的口味度乘以菜的份数),再除以对应菜系菜的总份数,最后四舍五入。
注:本题要考虑代点菜的情况,当前桌点的菜要加上被其他桌代点的菜综合计算口味度平均值。
2、考虑客户订多桌菜的情况,输入时桌号时,增加用户的信息:
格式:table+英文空格+桌号+英文空格+":"+英文空格+客户姓名+英文空格+手机号+日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
例如:table 1 : tom 13670008181 2023/5/1 21/30/00
约束条件:客户姓名不超过10个字符,手机号11位,前三位必须是180、181、189、133、135、136其中之一。
输出结果时,先按要求输出每一桌的信息,最后按字母顺序依次输出每位客户需要支付的金额。不考虑各桌时间段的问题,同一个客户的所有table金额都要累加。
输出用户支付金额格式:
用户姓名+英文空格+手机号+英文空格+支付金额
注意:不同的四舍五入顺序可能会造成误差,请按以下步骤累计一桌菜的菜价:
计算每条记录的菜价:将每份菜的单价按份额进行四舍五入运算后,乘以份数计算多份的价格,然后乘以折扣,再进行四舍五入,得到本条记录的最终支付价格。
将所有记录的菜价累加得到整桌菜的价格。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+口味类型+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+辣/酸/甜度值+英文空格+份额+英文空格+份数 注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。辣/酸/甜度取值范围见题目中说明。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称**+英文空格+辣/酸/甜度值+**英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+“:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
之后按输入顺序一次输出每一桌所有菜品的价格(整数数值),
格式:table+英文空格+桌号+“:”+英文空格+当前桌的计算折扣后总价+英文空格+辣度平均值+英文空格+酸度平均值+英文空格+甜度平均值+英文空格
最后按拼音顺序输出每位客户(不考虑客户同名或拼音相同的情况)的支付金额,格式: 用户姓名+英文空格+手机号+英文空格+支付总金额,按输入顺序排列。
输入样例1:
桌号时间超出营业范围。例如:
麻婆豆腐 川菜 12 T 油淋生菜 9 麻辣鸡丝 10 table 1 : tom 13605054400 2023/5/1 21/30/00 1 麻婆豆腐 3 1 2 2 油淋生菜 2 1 3 麻婆豆腐 2 3 2 end
输出样例1:
在这里给出相应的输出。例如:
table 1 out of opening hours
输入样例2:
一种口味的菜品。例如:
麻婆豆腐 川菜 12 T 油淋生菜 9 麻辣鸡丝 10 table 1 : tom 13605054400 2023/5/1 20/30/00 1 麻婆豆腐 2 1 2 2 油淋生菜 2 1 3 麻婆豆腐 2 3 2 end
输出样例2:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 24 2 油淋生菜 14 3 麻婆豆腐 48 table 1: 86 62 川菜 4 稍辣 tom 13605054400 62
输入样例3:
辣度值超出范围。例如:
麻婆豆腐 川菜 12 T 油淋生菜 9 麻辣鸡丝 10 table 1 : tom 13605054400 2023/5/1 18/30/00 1 麻婆豆腐 6 1 2 2 油淋生菜 1 1 3 麻婆豆腐 5 3 2 end
输出样例3:
在这里给出相应的输出。例如:
table 1: spicy num out of range :6 2 油淋生菜 9 3 麻婆豆腐 48 table 1: 57 41 川菜 2 爆辣 tom 13605054400 41
输入样例4:
同一用户对应多桌菜。例如:
麻婆豆腐 川菜 12 T 油淋生菜 9 麻辣鸡丝 10 table 1 : tom 13605054400 2023/5/1 18/30/00 1 麻婆豆腐 1 1 2 2 油淋生菜 1 1 3 麻婆豆腐 2 2 2 table 2 : tom 13605054400 2023/5/6 18/30/00 1 麻婆豆腐 2 1 2 2 麻辣鸡丝 2 2 3 麻婆豆腐 2 1 1 end
输出样例4:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 24 2 油淋生菜 9 3 麻婆豆腐 36 table 2: 1 麻婆豆腐 24 2 麻辣鸡丝 30 3 麻婆豆腐 12 table 1: 69 49 川菜 4 稍辣 table 2: 66 66 川菜 3 稍辣 tom 13605054400 115
输入样例5:
多用户多桌菜。例如:
东坡肉 浙菜 25 T 油淋生菜 9 蜜汁灌藕 浙菜 10 T 刀削面 晋菜 10 T 醋浇羊肉 晋菜 30 T 麻婆豆腐 川菜 12 T 麻辣鸡丝 川菜 15 T table 1 : tom 13605054400 2023/5/6 12/30/00 1 醋浇羊肉 4 1 1 3 刀削面 1 1 3 2 东坡肉 3 2 1 4 麻辣鸡丝 2 1 1 table 2 : jerry 18100334566 2023/5/1 12/30/00 1 醋浇羊肉 1 1 2 3 麻婆豆腐 2 2 1 4 麻辣鸡丝 2 3 3 table 3 : jerry 18100334566 2023/5/1 12/30/00 1 醋浇羊肉 2 1 1 3 蜜汁灌藕 1 1 2 2 东坡肉 2 2 1 4 麻辣鸡丝 5 1 1 end
输出样例5:
在这里给出相应的输出。例如:
table 1: 1 醋浇羊肉 30 3 刀削面 30 2 东坡肉 38 4 麻辣鸡丝 15 table 2: 1 醋浇羊肉 60 3 麻婆豆腐 18 4 麻辣鸡丝 90 table 3: 1 醋浇羊肉 30 3 蜜汁灌藕 20 2 东坡肉 38 4 麻辣鸡丝 15 table 1: 113 113 川菜 1 稍辣 晋菜 4 稍酸 浙菜 1 甜 table 2: 168 118 川菜 4 稍辣 晋菜 2 微酸 table 3: 103 73 川菜 1 爆辣 晋菜 1 稍酸 浙菜 3 微甜 jerry 18100334566 191 tom 13605054400 113
输入样例6:
多用户多桌菜含代点菜。例如:
东坡肉 浙菜 25 T 油淋生菜 9 蜜汁灌藕 浙菜 10 T 刀削面 晋菜 10 T 醋浇羊肉 晋菜 30 T 麻婆豆腐 川菜 12 T 麻辣鸡丝 川菜 15 T table 1 : tom 13605054400 2023/5/6 12/30/00 1 醋浇羊肉 4 1 1 3 刀削面 1 1 3 2 东坡肉 3 2 1 4 麻辣鸡丝 2 1 1 table 2 : jerry 18100334566 2023/5/1 12/30/00 1 1 醋浇羊肉 0 1 2 3 麻婆豆腐 2 2 1 4 麻辣鸡丝 2 3 3 table 3 : lucy 18957348763 2023/5/1 12/30/00 1 醋浇羊肉 2 1 1 3 蜜汁灌藕 1 1 2 2 东坡肉 2 2 1 4 麻辣鸡丝 5 1 1 end
输出样例6:
在这里给出相应的输出。例如:
table 1: 1 醋浇羊肉 30 3 刀削面 30 2 东坡肉 38 4 麻辣鸡丝 15 table 2: 1 table 2 pay for table 1 60 3 麻婆豆腐 18 4 麻辣鸡丝 90 table 3: 1 醋浇羊肉 30 3 蜜汁灌藕 20 2 东坡肉 38 4 麻辣鸡丝 15 table 1: 113 113 川菜 1 稍辣 晋菜 6 微酸 浙菜 1 甜 table 2: 168 118 川菜 4 稍辣 table 3: 103 73 川菜 1 爆辣 晋菜 1 稍酸 浙菜 3 微甜 jerry 18100334566 118 lucy 18957348763 73 tom 13605054400 113
输入样例7:
错误的菜品记录和桌号记录,用户丢弃。例如:
东坡肉 25 T 油淋生菜 9 table 1 : tom 136050540 2023/5/1 12/30/00 2 东坡肉 3 2 1 end
输出样例7:
在这里给出相应的输出。例如:
wrong format wrong format
详细代码如下:
1 import java.util.Scanner; 2 3 4 import java.util.ArrayList; 5 import java.util.Calendar; 6 public class Main{ 7 public static void main(String args[]) { 8 int i = 0,j = 0,k = 0,f = 0,g =0,s,a = 0,b = 0,c = 0,flag = 0,flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0; 9 int dishNum = 0,discountPrice = 0; 10 int average =0; 11 /// 12 hun hunhun = new hun(); 13 /// 14 Scanner input = new Scanner(System.in); 15 /// 16 boolean judge1 = judge(2222,22,22); 17 judge1 =!judge1; 18 /// 19 ArrayList<String> inputs = new ArrayList<>(); 20 ArrayList<Customer> customers = new ArrayList<>(); 21 int[] flags = new int[100]; 22 double[] discount = new double[100]; 23 double[] Specialdiscount = new double[100]; 24 for(i = 0;i<100;i++) { 25 flags[i] = 0; 26 } 27 i = 0; 28 String in = input.nextLine(); 29 while(!in.equals("end")) { 30 inputs.add(in); 31 in = input.nextLine(); 32 } 33 inputs.add(in);//输入信息 34 Menu menu = new Menu(); 35 ArrayList<Table> tables = new ArrayList<>(); 36 while(!inputs.get(i).contains("table")) { 37 String[] dish = inputs.get(i).split(" ");//创建菜单 38 if(inputs.get(i).matches(".+\\s[\\d]+")) { 39 int price = Integer.parseInt(dish[1]); 40 menu.addDish(dish[0],price);//菜名和单价,往菜单里加一道菜 41 } 42 else if(inputs.get(i).matches(".+\\s.{2}\\s[\\d]+\\sT")){ 43 /// 44 boolean judge2 = judge(2222,22,22); 45 judge2 =!judge2; 46 hunhun.setB(judge2); 47 /// 48 int price = Integer.parseInt(dish[2]); 49 menu.addSpecialDish(dish[0],dish[1],price); 50 } 51 else System.out.println("wrong format"); 52 i++; 53 } 54 int d = menu.dishs.size(); 55 56 for(b = d - 1;b > 0;b--) { 57 for(c = b-1;c >= 0;c--) { 58 if(menu.dishs.get(b).name.equals(menu.dishs.get(c).name)) { 59 menu.dishs.remove(c); 60 } 61 } 62 } 63 while(!inputs.get(i).contains("end")) { 64 /// 65 double calculateMoney1 = calculateMoney(1,1.1,"ss"); 66 calculateMoney1 = calculateMoney1+1; 67 hunhun.setD(calculateMoney1); 68 /// 69 if(inputs.get(i).contains("table")) { 70 if(inputs.get(i).matches("table\\s.+\\s\\:\\s[\\w]{1,10}" 71 + "\\s(180|181|189|133|135|136)[\\d]{8}" 72 + "\\s[1-9][\\d]{3}/[\\d]{1,2}/[\\d]{1,2}\\s" 73 + "[\\d]{1,2}/[\\d]{1,2}/[\\d]{1,2}")) 74 { 75 String[] tableInfo =inputs.get(i).split(" ");//创建桌子 76 int num = Integer.parseInt(tableInfo[1]); 77 String[] date = tableInfo[5].split("/");//时间 78 String[] time = tableInfo[6].split("/");//时间 79 int[] Date = new int[date.length]; 80 int[] Time = new int[time.length]; 81 /// 82 double calculateMoney2 = calculateMoney(1,1.1,"ss"); 83 calculateMoney2 = calculateMoney2+2; 84 hunhun.w(); 85 /// 86 for(k = 0;k < date.length;k++) 87 Date[k] = Integer.parseInt(date[k]); 88 for(k = 0;k < time.length;k++) 89 Time[k] = Integer.parseInt(time[k]); 90 Table table = new Table(tableInfo[1],tableInfo[3],tableInfo[4],tableInfo[5],tableInfo[6]); 91 tables.add(table); 92 j++;//桌子数增加 93 flag = 1; 94 a = 0; 95 if(Table.weekday(Date[0],Date[1],Date[2]) >= 1&& 96 Table.weekday(Date[0],Date[1],Date[2]) <= 5) { 97 Specialdiscount[j-1] = 0.7; 98 if((Time[0] >= 17&&Time[0]<=19)||(Time[0] == 20&&Time[1] <= 29)|| 99 (Time[0] == 20&&Time[1] == 30&&Time[2] == 0)) { 100 discount[j-1] = 0.8; 101 System.out.println("table "+num+": "); 102 } 103 else if((Time[0] >= 11&&Time[0] <= 13)|| 104 ((Time[0] == 10||Time[0] == 14)&&Time[1] <= 29)|| 105 ((Time[0] == 10||Time[0] == 14)&&Time[1] == 30&&Time[2] == 0)) { 106 discount[j-1] = 0.6; 107 System.out.println("table "+num+": "); 108 } 109 else { 110 System.out.println("table " + num + " out of opening hours"); 111 flags[f] = 1; 112 } 113 114 } 115 else if(Table.weekday(Date[0],Date[1],Date[2]) == 6|| 116 Table.weekday(Date[0],Date[1],Date[2]) == 7) { 117 Specialdiscount[j-1] = 1; 118 if((Time[0] >= 10&&Time[0] <= 20)) { 119 discount[j-1] = 1; 120 System.out.println("table "+num+": "); 121 } 122 else if(((Time[0] == 10||Time[0] == 21)&&Time[1] <= 29)|| 123 ((Time[0] == 10||Time[0] == 21)&&Time[1] == 30&&Time[2]==0)){ 124 discount[j-1] = 1; 125 System.out.println("table "+num+": "); 126 } 127 else { 128 System.out.println("table " + num + " out of opening hours"); 129 flags[f] = 1; 130 } 131 } 132 f++; 133 } 134 else {System.out.println("wrong format"); 135 flag = 0; 136 } 137 138 } 139 else if(flag == 1&&flags[f-1]==0){ 140 if(inputs.get(i).contains("delete")) { 141 String[] deletes = inputs.get(i).split(" "); 142 int num = Integer.parseInt(deletes[0]); 143 if(tables.get(j-1).getOrder().findRecordByNum(num)){//找到该记录 144 tables.get(j-1).getOrder().delARecordByOrderNum(num); 145 } 146 else { 147 System.out.println("delete error"); 148 } 149 } 150 else { 151 String[] dishInfo =inputs.get(i).split(" ");//存入一条点菜记录 152 if(dishInfo.length == 4) { 153 int Num = Integer.parseInt(dishInfo[0]);//点菜序号 154 int portion = Integer.parseInt(dishInfo[2]);//份量 155 int number = Integer.parseInt(dishInfo[3]);//份数 156 157 if(menu.searthDish(dishInfo[1]) != -1) {//该菜品存在 158 tables.get(j-1).getOrder().addARecord(Num, 159 menu.dishs.get(menu.searthDish(dishInfo[1])),portion,number,discount[j-1]);//添加一条菜品信息 160 161 System.out.println(tables.get(j-1).getOrder().records.get(a).orderNum//输出订单信息 162 +" "+tables.get(j-1).getOrder().records.get(a).d.name+" "+ 163 tables.get(j-1).getOrder().records.get(a).getPrice()); 164 a++; 165 } 166 else System.out.println(dishInfo[1]+" does not exist"); 167 } 168 else if(dishInfo.length == 5) { 169 int Num = Integer.parseInt(dishInfo[0]);//点菜序号 170 int lever = Integer.parseInt(dishInfo[2]);//口味度 171 int portion = Integer.parseInt(dishInfo[3]);//份量 172 int number = Integer.parseInt(dishInfo[4]);//份数 173 if(menu.searthDish(dishInfo[1]) != -1) {//该菜品存在 174 if((menu.checkType(dishInfo[1]).equals("川菜") 175 &&(lever<=5&&lever>=0))|| 176 (menu.checkType(dishInfo[1]).equals("晋菜") 177 &&(lever<=4&&lever>=0))|| 178 (menu.checkType(dishInfo[1]).equals("浙菜") 179 &&(lever<=3&&lever>=0))) { 180 tables.get(j-1).getOrder().addARecord(Num, 181 menu.dishs.get(menu.searthDish(dishInfo[1])),lever,portion,number,Specialdiscount[j-1]);//添加一条菜品信息 182 System.out.println(tables.get(j-1).getOrder().records.get(a).orderNum//输出订单信息 183 +" "+tables.get(j-1).getOrder().records.get(a).d.name+" "+ 184 tables.get(j-1).getOrder().records.get(a).getPrice()); 185 a++; 186 } 187 else { 188 if(menu.checkType(dishInfo[1]).equals("川菜") 189 &&!(lever<=5&&lever>=0)){ 190 System.out.println("spicy num out of range :"+lever); 191 } 192 else if(menu.checkType(dishInfo[1]).equals("晋菜") 193 &&!(lever<=4&&lever>=0)) { 194 System.out.println("acidity num out of range :"+lever); 195 } 196 else if(menu.checkType(dishInfo[1]).equals("浙菜") 197 &&!(lever<=3&&lever>=0)) { 198 System.out.println("sweetness num out of range :"+lever); 199 } 200 } 201 } 202 else System.out.println(dishInfo[1]+" does not exist"); 203 204 } 205 else {//代点菜 206 int subTableNum = Integer.parseInt(dishInfo[0]); 207 int Num = Integer.parseInt(dishInfo[1]);//点菜序号 208 int lever = Integer.parseInt(dishInfo[3]);//口味度 209 int portion = Integer.parseInt(dishInfo[4]);//份量 210 int number = Integer.parseInt(dishInfo[5]);//份数 211 int subOrder = 0; 212 for(s = 0;s < tables.size();s++) { 213 if(tables.get(s).tableNum.equals(dishInfo[0])) { 214 subOrder = s; 215 } 216 } 217 if(menu.searthDish(dishInfo[2]) != -1) {//该菜品存在 218 if((menu.checkType(dishInfo[2]).equals("川菜") 219 &&(lever<=5&&lever>=0))|| 220 (menu.checkType(dishInfo[2]).equals("晋菜") 221 &&(lever<=4&&lever>=0))|| 222 (menu.checkType(dishInfo[2]).equals("浙菜") 223 &&(lever<=3&&lever>=0))) { 224 tables.get(subOrder).getOrder().addARecord(Num, 225 menu.dishs.get(menu.searthDish(dishInfo[2])),lever,portion,number,Specialdiscount[j-1],1);//添加一条菜品信息 226 tables.get(j-1).getOrder().addARecord(1,Num, 227 menu.dishs.get(menu.searthDish(dishInfo[2])),lever,portion,number,Specialdiscount[j-1]);//添加一条菜品信息 228 229 System.out.println(Num+" table "+tables.get(j-1).tableNum+" pay for table "+subTableNum+" "+ 230 tables.get(j-1).getOrder().records.get(a).getPrice()); 231 a++; 232 } 233 else { 234 if(menu.checkType(dishInfo[1]).equals("川菜") 235 &&!(lever<=5&&lever>=0)){ 236 System.out.println("spicy num out of range :"+lever); 237 } 238 else if(menu.checkType(dishInfo[1]).equals("晋菜") 239 &&!(lever<=4&&lever>=0)) { 240 System.out.println("acidity num out of range :"+lever); 241 } 242 else if(menu.checkType(dishInfo[1]).equals("浙菜") 243 &&!(lever<=3&&lever>=0)) { 244 System.out.println("sweetness num out of range :"+lever); 245 } 246 } 247 } 248 else System.out.println(dishInfo[2]+" does not exist"); 249 // } 250 } 251 } 252 } 253 i++; 254 } 255 256 for(i = 0;i < tables.size();i++) { 257 if(flags[i] == 0) { 258 259 System.out.print("table "+tables.get(i).tableNum+": "+ 260 tables.get(i).getOrder().getTotalPrice()+" "+ 261 tables.get(i).getOrder().getDiscountTotalPrice()); 262 if(tables.get(i).getOrder().getDishNum("川菜") != 0) { 263 average = (int)(tables.get(i).getOrder().getAverageLever("川菜")/ 264 tables.get(i).getOrder().getDishNum("川菜") +0.5); 265 System.out.print(" 川菜 "+(int)tables.get(i).getOrder().getDishNum("川菜")); 266 if(average == 0) 267 System.out.print(" 不辣"); 268 else if(average == 1) 269 System.out.print(" 微辣"); 270 else if(average == 2) 271 System.out.print(" 稍辣"); 272 else if(average == 3) 273 System.out.print(" 辣"); 274 else if(average == 4) 275 System.out.print(" 很辣"); 276 else if(average == 5) 277 System.out.print(" 爆辣"); 278 } 279 if(tables.get(i).getOrder().getDishNum("晋菜") != 0) { 280 average = (int)(tables.get(i).getOrder().getAverageLever("晋菜")/ 281 tables.get(i).getOrder().getDishNum("晋菜") +0.5); 282 System.out.print(" 晋菜 "+(int)tables.get(i).getOrder().getDishNum("晋菜")); 283 284 if(average == 0) 285 System.out.print(" 不酸"); 286 else if(average == 1) 287 System.out.print(" 微酸"); 288 else if(average == 2) 289 System.out.print(" 稍酸"); 290 else if(average == 3) 291 System.out.print(" 酸"); 292 else if(average == 4) 293 System.out.print(" 很酸"); 294 } 295 if(tables.get(i).getOrder().getDishNum("浙菜") != 0) { 296 average = (int)(tables.get(i).getOrder().getAverageLever("浙菜")/ 297 tables.get(i).getOrder().getDishNum("浙菜") +0.5); 298 System.out.print(" 浙菜 "+(int)tables.get(i).getOrder().getDishNum("浙菜")); 299 300 if(average == 0) 301 System.out.print(" 不甜"); 302 else if(average == 1) 303 System.out.print(" 微甜"); 304 else if(average == 2) 305 System.out.print(" 稍甜"); 306 else if(average == 3) 307 System.out.print(" 甜"); 308 } 309 System.out.print("\n"); 310 } 311 312 } 313 for(i = 0;i < tables.size();i++){ 314 for(j = 0;j < i;j++){ 315 if(tables.get(i).customerName.equals(tables.get(j).customerName)) break;} 316 if(i==j) { 317 Customer customer = new Customer(tables.get(i).customerName,tables.get(i).number); 318 customers.add(customer); 319 } 320 } 321 for(i = 0;i < customers.size();i++) { 322 for(j = 0;j < tables.size();j++) { 323 if(customers.get(i).name.equals(tables.get(j).customerName)) { 324 customers.get(i).TotalPrice = customers.get(i).TotalPrice + 325 tables.get(j).getOrder().getDiscountTotalPrice(); 326 } 327 } 328 } 329 String Cname = " "; 330 String Cnumber = " "; 331 int Tprice = 0; 332 for(i = 0;i < customers.size()-1;i++) { 333 for(j = 0;j < customers.size() - i - 1;j++) { 334 if(customers.get(j).name.compareToIgnoreCase(customers.get(j+1).name) > 0) { 335 Cname = customers.get(j).name; 336 customers.get(j).name = customers.get(j+1).name; 337 customers.get(j+1).name = Cname; 338 Cnumber = customers.get(j).number; 339 customers.get(j).number = customers.get(j+1).number; 340 customers.get(j+1).number = Cnumber; 341 Tprice = customers.get(j).TotalPrice; 342 customers.get(j).TotalPrice = customers.get(j+1).TotalPrice; 343 customers.get(j+1).TotalPrice = Tprice; 344 } 345 346 } 347 } 348 for(i = 0;i < customers.size();i++) { 349 if(flags[i] == 0) { 350 System.out.println(customers.get(i).name+" "+ 351 customers.get(i).number+" "+customers.get(i).TotalPrice); 352 } 353 } 354 355 } 356 357 358 /// 359 public static boolean judge(int nian,int yue,int tian) { 360 boolean count=false; 361 if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) { 362 if(tian<=31) { 363 //// 364 double calcula = 22; 365 calcula =calcula+ 22; 366 //calcula++; 367 //// 368 count = true;} 369 else { 370 count = false; 371 } 372 } 373 else if(yue<1||yue>12) { 374 //////// 375 //double percen = percentage(1,2,3); 376 /////// 377 count=false;} 378 379 else if(yue==2) { 380 if(nian%400==0||(nian%4==0&&nian%100!=0)) { 381 if(tian>29) { 382 ///// 383 double calca = 22; 384 calca = calca+3; 385 ///// 386 count=false; 387 } 388 else { 389 count = true; 390 } 391 } 392 else { 393 if(tian>28) { 394 count=false; 395 } 396 else{ 397 count=true; 398 } 399 } 400 } 401 else { 402 403 if(tian>30) { 404 count = false; 405 } 406 else{ 407 count = true; 408 } 409 } 410 return count; 411 } 412 /// 413 414 /// 415 public static double calculateMoney(int month, double originalPrice, String classLevel){ 416 double currntPrice = 0; 417 switch(month){ 418 case 5: 419 case 6: 420 case 7: 421 case 8: 422 case 9: 423 case 10: 424 if(classLevel.equals("经济舱")){ 425 currntPrice = originalPrice*0.85; 426 break; 427 }else if(classLevel.equals("头等舱")){ 428 currntPrice = originalPrice*0.9; 429 break; 430 }else{ 431 //System.out.println("你输入信息有误"); 432 return -1; 433 } 434 case 11: 435 case 12: 436 case 1: 437 case 2: 438 case 3: 439 case 4: 440 if(classLevel.equals("经济舱")){ 441 currntPrice = originalPrice*0.65; 442 break; 443 }else if(classLevel.equals("头等舱")){ 444 currntPrice = originalPrice*0.7; 445 //System.out.println(classLevel); 446 break; 447 }else{ 448 //System.out.println("你输入信息有误"); 449 return -1; 450 } 451 default: 452 //System.out.println("你输入的信息有误!"); 453 } 454 return currntPrice; 455 } 456 /// 457 458 459 460 } 461 class Customer{ 462 String name; 463 String number; 464 // Table[] table = new Table[100]; 465 int TotalPrice = 0; 466 public Customer() { 467 468 } 469 public Customer(String name,String number) { 470 this.name = name; 471 this.number = number; 472 473 } 474 } 475 class Table{ 476 String tableNum;//桌子序号 477 String customerName; 478 String number; 479 String date; 480 String time; 481 Order order = new Order(); 482 483 public Table(){ 484 485 } 486 public Table(String tableNum,String customerName,String number,String date,String time){ 487 this.tableNum = tableNum; 488 this.customerName = customerName; 489 this.number = number; 490 this.date = date; 491 this.time = time; 492 } 493 Order getOrder() { 494 // order = new Order(); 495 return this.order; 496 } 497 public static int weekday(int year, int month, int day){ 498 Calendar cal = Calendar.getInstance(); 499 //月份要减一,在西方周日是一周的第1天(日期也需要减一) 500 cal.set(year,month-1,day-1); 501 return cal.get(Calendar.DAY_OF_WEEK); 502 } 503 } 504 class Dish{ 505 String name;//菜名 506 String type = " ";//菜系 507 int unit_price = 0;//菜品单价 508 public Dish(){ 509 510 } 511 public Dish(String name,int unit_price){ 512 this.name = name; 513 this.unit_price = unit_price; 514 } 515 public Dish(String name,String type,int unit_price) { 516 this.name = name; 517 this.type = type; 518 this.unit_price = unit_price; 519 } 520 public String getName(){ 521 return name; 522 } 523 public void setName(String name){ 524 this.name = name; 525 } 526 public String getType(){ 527 return type; 528 } 529 public int getPrice(int portion){ 530 int price = 0; 531 if(portion == 1){ 532 price = (int)unit_price; 533 } 534 else if(portion == 2){ 535 price = (int)(1.5*unit_price+0.5); 536 } 537 else if(portion == 3){ 538 price = (int)(2*unit_price); 539 } 540 return price; 541 } 542 543 } 544 class Menu{ 545 ArrayList<Dish> dishs = new ArrayList<>(); 546 public Menu(){ 547 548 } 549 int i = 0; 550 int searthDish(String dishName){ 551 for(i = 0;i < dishs.size();i++) 552 if((dishs.get(i).name).equals(dishName)){ 553 break; 554 } 555 if(i < dishs.size()) 556 return i; 557 else return -1; 558 } 559 String checkType(String dishName) { 560 for(i = 0;i < dishs.size();i++) 561 if((dishs.get(i).name).equals(dishName)){ 562 break; 563 } 564 return dishs.get(i).type; 565 } 566 void addDish(String dishName,int unit_price){ 567 Dish dish = new Dish(dishName,unit_price); 568 dishs.add(dish); 569 } 570 void addSpecialDish(String dishName,String type,int unit_price) { 571 Dish dish = new Dish(dishName,type,unit_price); 572 dishs.add(dish); 573 } 574 } 575 class Record{ 576 int orderNum;//序号 577 Dish d;//菜品 578 int lever = 0;//口味度 579 int portion;//份额 580 int num;//份数 581 double discount; 582 int flag = 0; 583 int sign = 0; 584 int sign2 = 0; 585 public Record(){ 586 587 } 588 public Record(int orderNum,Dish d,int portion,int num,double discount){ 589 this.orderNum = orderNum; 590 this.d = d; 591 this.portion = portion; 592 this.num = num; 593 this.discount = discount; 594 } 595 public Record(int orderNum,Dish d,int lever,int portion,int num,double discount){ 596 this.orderNum = orderNum; 597 this.d = d; 598 this.lever = lever; 599 this.portion = portion; 600 this.num = num; 601 this.discount = discount; 602 } 603 public Record(int orderNum,Dish d,int lever,int portion,int num,double discount,int sign){ 604 this.orderNum = orderNum; 605 this.d = d; 606 this.lever = lever; 607 this.portion = portion; 608 this.num = num; 609 this.discount = discount; 610 this.sign = sign; 611 } 612 public Record(int sign2,int orderNum,Dish d,int lever,int portion,int num,double discount){ 613 this.sign2 = sign2; 614 this.orderNum = orderNum; 615 this.d = d; 616 this.lever = lever; 617 this.portion = portion; 618 this.num = num; 619 this.discount = discount; 620 } 621 622 int getPrice(){//计价,计算本条记录的价格 623 return d.getPrice(portion)*num; 624 } 625 int getDiscountPrice() { 626 return (int)(d.getPrice(portion)*num*discount+0.5); 627 } 628 public void showRecord() { 629 630 System.out.println(orderNum+" "+d.name+" "+getPrice()); 631 } 632 int getLever() { 633 return num * lever; 634 } 635 } 636 637 638 /// 639 class hun{ 640 private double d; 641 private boolean b; 642 643 public double getD() { 644 return d; 645 } 646 public void setD(double d) { 647 this.d = d; 648 } 649 public boolean isB() { 650 return b; 651 } 652 public void setB(boolean b) { 653 this.b = b; 654 } 655 public void w() { 656 d = (int)(d*0.36); 657 } 658 } 659 /// 660 661 662 class Order { 663 int totalprice = 0; 664 int total; 665 int Lever = 0; 666 double dishNum = 0; 667 int i = 0,k = 0,a= 0,b = 0; 668 ArrayList<Record> records = new ArrayList<>(); 669 int getTotalPrice(){//计算订单的总价 670 totalprice = 0; 671 for(i = 0;i < records.size();i++) { 672 if(records.get(i).sign == 0) { 673 a = records.get(i).getPrice(); 674 totalprice += a; 675 } 676 } 677 return totalprice; 678 } 679 int getDiscountTotalPrice() { 680 totalprice = 0; 681 for(i = 0;i < records.size();i++) { 682 if(records.get(i).sign == 0) { 683 a = records.get(i).getDiscountPrice(); 684 totalprice += a; 685 } 686 } 687 return totalprice; 688 } 689 int getAverageLever(String type) {//输出指定菜系的口味值 690 Lever = 0; 691 if(type.equals("川菜")) 692 for(i = 0;i < records.size();i++) { 693 if(records.get(i).sign2 == 0) { 694 if(records.get(i).d.type.equals(type)) 695 Lever = Lever + records.get(i).getLever(); 696 } 697 } 698 else if(type.equals("晋菜")) { 699 for(i = 0;i < records.size();i++) { 700 if(records.get(i).sign2 == 0) { 701 if(records.get(i).d.type.equals(type)) 702 Lever = Lever + records.get(i).getLever(); 703 } 704 } 705 } 706 else if(type.equals("浙菜")) { 707 for(i = 0;i < records.size();i++) { 708 if(records.get(i).sign2 == 0) { 709 if(records.get(i).d.type.equals(type)) 710 Lever = Lever + records.get(i).getLever(); 711 } 712 } 713 } 714 return Lever; 715 } 716 double getDishNum(String type) {//输出指定菜系的总份数 717 dishNum = 0; 718 if(type.equals("川菜")) { 719 for(i = 0;i < records.size();i++) { 720 if(records.get(i).sign2 == 0) { 721 if(records.get(i).d.type.equals(type)) 722 dishNum = dishNum + records.get(i).num; 723 } 724 } 725 } 726 if(type.equals("晋菜")) { 727 for(i = 0;i < records.size();i++) { 728 if(records.get(i).sign2 == 0) { 729 if(records.get(i).d.type.equals(type)) 730 dishNum = dishNum + records.get(i).num; 731 } 732 } 733 } 734 if(type.equals("浙菜")) { 735 for(i = 0;i < records.size();i++) { 736 if(records.get(i).sign2 == 0) { 737 if(records.get(i).d.type.equals(type)) 738 dishNum = dishNum + records.get(i).num; 739 } 740 } 741 } 742 return dishNum; 743 744 } 745 746 void addARecord(int orderNum,Dish d,int portion,int num,double discount){ 747 748 Record record = new Record(orderNum,d,portion,num,discount); 749 records.add(record); 750 }//添加一条菜品信息到订单中。 751 void addARecord(int orderNum,Dish d,int lever,int portion,int num,double discount){ 752 753 Record record = new Record(orderNum,d,lever,portion,num,discount); 754 records.add(record); 755 }//添加一条菜品信息到订单中。 756 void addARecord(int orderNum,Dish d,int lever,int portion,int num,double discount,int sign){ 757 758 Record record = new Record(orderNum,d,lever,portion,num,discount,sign); 759 records.add(record); 760 }//添加一条菜品信息到订单中。 761 void addARecord(int sign2,int orderNum,Dish d,int lever,int portion,int num,double discount){ 762 763 Record record = new Record(sign2,orderNum,d,lever,portion,num,discount); 764 records.add(record); 765 }//添加一条菜品信息到订单中。 766 767 void delARecordByOrderNum(int orderNum){ 768 records.remove(orderNum-1); 769 }//根据序号删除一条记录 770 771 boolean findRecordByNum(int orderNum){//根据序号查找一条记录 772 for(i = 0;i < records.size();i++) 773 if(records.get(i).orderNum == orderNum){ 774 break; 775 } 776 if(i == records.size()) { 777 return false; 778 } 779 else return true; 780 } 781 }View Code
分析:
有了菜单计价程序4的经验,在做菜单计价程序5时没有当时那么手忙脚乱,所以结果上得分也要高于第四次迭代,菜单计价程序5增加了菜系与口味,个人觉得比4好些一点。在理清逻辑,分清楚各自的功能职责后对程序的实现就没有那么困难了
PowerDesigner的类图:
SourceMonitor的报表内容:
三、踩坑心得
1、先构思!!先构思!!在写代码的时候经常急于求成导致在中途或者末尾出现错误,导致之前写的思路方法大改特改。极大的浪费了时间和精力。 2、在做代码量比较大的题目中,所写代码一定要格式规范且要备注!!!备注是一个非常好的习惯,很多时候在你写了很久的代码后回头看之前的某一个功能发现自己很难看懂,很难去理清语句之间的逻辑。在相率上来讲这是非常不利的。所以要养成作备注的习惯,自变量、方法、类的命名也要规范,方便之后检索。 3、输入输出格式看仔细(曾经因为多打一个空格埋头苦思一小时)不要马虎误事 四、主要困难和改进意见 1、Java是一种面向对象的语言,因此理解OOP的概念和原则,如封装、继承和多态,对于编写有效的Java代码非常重要。初学者可能对这些概念感到困惑,甚至不确定如何在实际代码中使用它们。 建议通过阅读有关OOP的书籍和文章,或者参加相关的编程课程来深入理解OOP。此外,尝试创建一些简单的Java类并使用OOP的特性,如封装、继承和多态,可以帮助加深理解。 2、Java有一个庞大的标准库和各种第三方库和框架,如Spring和Hibernate,它们可以大大简化编程任务。然而,掌握这些库和框架可能需要大量的时间和努力。对于Java库和框架的学习,建议首先理解库或框架的基本概念和工作原理,然后通过阅读示例代码和在线教程来熟悉其使用。 五、总结 前两次迭代的程序难度尚可,后两次迭代对我来说难度很大,我在网上学习了很多新的知识点也参考了同学的代码才能得一些点分。说明我对于Java语言的掌握还很不熟练,还有很多值得提升的点,有很多需要去学习的知识。很多类与类之间的关系没有很清楚的认知,今后应该在程序编写上多花功夫,争取在下次遇见难题的时候能够顺利攻克。标签:空格,get,int,记录,BLOG,菜品,table From: https://www.cnblogs.com/cw-yyds/p/17842531.html