JAVA第二次Blog作业

前言

       好久不见,本次Blog主要总结这几个月来的大作业情况、期中考试以及学习情况,话不多说,直接开始。

       大作业:这两次的大作业仍然是菜单类型的迭代,考点主要还是设计思路,相比于前几次菜单大作业,这两次新增知识点,我个人认为主要有正则表达式的主要使用、继承类的使用。难度而言,在多次迭代后,这两次大作业的难度主体不大,难点在于对于数据的处理然后给出相应的输出、以及对于数据计算的处理。

       期中考试:本次期中考试比较简单,也没遇到什么困难点,就主要聊聊考点。本次期中考试考点主要为这段时间学习的知识点,如类的构建以及封装、类的继承以及抽象类的运用、类的接口。本次考试主要难点在于最后一题,本题难点主要在于考察了新的类和方法“Comparable”、“naturOrder()”和“compareTo()”,要发现后两个方法的关联性,但在无敌的IDEA的debug功能面前,比较容易发现,故本次期中考试难度不高。

      学习总结:最近学习的东西较多,故这次学习总结很有必要。首先我们主要学习设计思路,了解什么样的设计才是好设计,如要提高代码的复用性、对象之间的联系应该要少、代码的耦合度要降低、设计if等表达语句的时候,要尽量降低代码的复杂度,减少出现bug的概率、类的职责要保持单一、设计过程中要保留代码的可扩展性、程序最好要保持高内聚、低耦合特性......然后我们又学习了类的关系:组合、聚合、关联、依赖。以下解释按照我的个人理解。依赖:指某个类的方法的使用需要传入其他类作为参数,否则无法调用。关联:指某一个类是另一个类的关联变量。聚合:指整体和个体之间的关系,意味着类A的对象包含类B的对象。整体和个体是可以分离的,他们具有各自的生命周期,个体可以属于多个对象,也可以被多个对象共享。组合:相比于聚合,某类中作为属性的类是直接在该类中生成的,与该类同时存在同时消失,具有一样的生命周期。然后学习了继承与接口以及抽象类。继承指子类继承父类的属性与方法,同时一个子类只能有一个父类。接口指子类通过多个接口获得属于自己特性的方法,一个子类可以有多个接口。抽象类主要运用于继承与接口(接口本身即为抽象类),继承了的子类要对其的方法进行覆写。最后初步学习了JAVA的图形化界面,包括如何配置javaFX的环境,以及简单的方法。

前言到这里结束了,接下来是两次大作业的详细分析---

设计与分析

 

第四次大作业

7-1 菜单计价程序-4
分数 100
作者 蔡轲
单位 南昌航空大学

本体大部分内容与菜单计价程序-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
 

其他用例请参考公开的测试用例

代码长度限制
50 KB
时间限制
1000 ms
内存限制
64 MB
 
  1 import java.io.BufferedReader;
  2 import java.io.IOException;
  3 import java.io.InputStreamReader;
  4 import java.time.LocalDate;
  5 import java.util.ArrayList;
  6 public class Main {
  7     public static void main(String[] args) throws IOException {
  8         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  9         Dish[] dishes = new Dish[10];
 10         SpecialDish[] specialDishes = new SpecialDish[10];
 11         ArrayList<Table> tables = new ArrayList<>();
 12         Table table = new Table();
 13         Record[] records = new Record[10];
 14         Order order = new Order();
 15         Menu menu = new Menu();
 16         lastPrint print = new lastPrint();
 17         int x = 0 , y = 0 , z = 0 , z1 = 0 , tableNum , dishNum , portion , num , unit_price , deleteNum;
 18         String menuName , dayTime , hourTime , name;
 19         boolean isRightTable = false ,isDish = false , v = false;
 20         for(;;){
 21             String input = in.readLine();
 22             if(input.equals("end")){
 23                 if(x!=0 && isRightTable){
 24                     table.order = order;
 25                     tables.add(x-1 , table);
 26                 }
 27                 print.tables = tables;
 28                 print.print();
 29                 break;
 30             }
 31             String[] getInput = input.split(" ");
 32             if(getInput[0].equals("table")){
 33                 if(input.matches("^(table)( )([1-9][0-9]*)( )([0-9]{4})(/)([0-9]|[0-9]{2})(/)([0-9]|[0-9]{2})( )([0-9]|[0-9]{2})(/)([0-9]|[0-9]{2})(/)([0-9]|[0-9]{2})$")) {
 34                     if(x != 0 && isRightTable) {
 35                         table.order = order;
 36                         tables.add(x-1 , table);
 37                         table = new Table();
 38                         y = 0;
 39                     }
 40                     isRightTable = true;
 41                     tableNum = Integer.parseInt(getInput[1]);
 42                     dayTime = getInput[2];
 43                     hourTime = getInput[3];
 44                     if(tableNum>55){
 45                         isRightTable = false;
 46                         System.out.println(tableNum +" table num out of range");
 47                         continue;
 48                     }
 49                     table.tableNum = tableNum;
 50                     table.mainTime = dayTime;
 51                     table.remainTime = hourTime;
 52                     if(!table.timeJudgement()){
 53                         isRightTable = false;
 54                         System.out.println(table.tableNum+" date error");
 55                         continue;
 56                     }
 57                     if(!table.isRange()){
 58                         isRightTable = false;
 59                         System.out.println("not a valid time period");
 60                         continue;
 61                     }
 62                     if(!table.timeJudgement1()){
 63                         isRightTable = false;
 64                         System.out.println("table " +table.tableNum + " out of opening hours");
 65                         continue;
 66                     }
 67                     v = false;
 68                     order = new Order();
 69                     isDish = true;
 70                     records = new Record[10];
 71                     System.out.println("table "+tableNum+": ");
 72                     x++;
 73                 }
 74                 else{
 75                     v = true;
 76                     System.out.println("wrong format");
 77                 }
 78             }
 79             else if(v){
 80                 continue;
 81             }
 82             else if(input.matches("^(\\S+)( )([1-9][0-9]*)$")){
 83                 if(isDish){
 84                     if(isRightTable){
 85                         System.out.println("invalid dish");
 86                     }
 87                     continue;
 88                 }
 89                 int i = 0;
 90                 menuName = getInput[0];
 91                 unit_price = Integer.parseInt(getInput[1]);
 92                 if(unit_price>=300){
 93                     System.out.println(menuName+" price out of range "+unit_price);
 94                     continue;
 95                 }
 96                 if(z == 0) {
 97                     dishes[0] = menu.addDish(menuName , unit_price);
 98                     z++;
 99                 }
100                 else{
101                     for(;i < z ; i++) {
102                         if(menuName.equalsIgnoreCase(dishes[i].name)) {
103                             dishes[i].unit_price = unit_price;
104                             break;
105                         }
106                     }
107                 }
108                 if(i == z){
109                     dishes[z] = menu.addDish(menuName , unit_price);
110                     z++;
111                 }
112                 menu.dishes = dishes;
113                 menu.dishNum = z;
114             }
115             else if(input.matches("^(\\S+)( )([1-9][0-9]*)( )(T)$")){
116                 if(isDish){
117                     if(isRightTable){
118                         System.out.println("invalid dish");
119                     }
120                     continue;
121                 }
122                 int i = 0;
123                 menuName = getInput[0];
124                 unit_price = Integer.parseInt(getInput[1]);
125                 if(unit_price>=300){
126                     System.out.println(menuName+" price out of range "+unit_price);
127                 }
128                 if(z1 == 0) {
129                     specialDishes[0] = menu.addSpecialDish(menuName , unit_price);
130                     z1++;
131                 }
132                 else{
133                     for(;i < z1 ; i++) {
134                         if(menuName.equalsIgnoreCase(specialDishes[i].name)) {
135                             specialDishes[i].unit_price = unit_price;
136                             break;
137                         }
138                     }
139                 }
140                 if(i == z1){
141                     specialDishes[z1] = menu.addSpecialDish(menuName , unit_price);
142                     z1++;
143                 }
144                 menu.specialDishes = specialDishes;
145                 menu.dishNum1 = z1;
146             }
147             else if(input.matches("^([1-9][0-9]*)( )(\\S+)( )([1-9][0-9]*)( )([1-9][0-9]*)$")){
148                 if(isRightTable){
149                     dishNum = Integer.parseInt(getInput[0]);
150                     name = getInput[1];
151                     portion = Integer.parseInt(getInput[2]);
152                     num = Integer.parseInt(getInput[3]);
153                     if(y>0){
154                         if(records[y-1].orderNum>=dishNum){
155                             System.out.println("record serial number sequence error");
156                             continue;
157                         }
158                     }
159                     if(menu.searthDish(name) != null) {
160                         if((portion==1||portion==2||portion==3)&&num<=15){
161                             records[y] = new Record();
162                             records[y] = order.addARecord(dishNum , name , portion , num , menu);
163                             records[y].isSpecialDish = false;
164                             System.out.println(records[y].orderNum+" "+records[y].d.name+" "+records[y].getPrice());
165                             y++;
166                             order.records = records;
167                             order.dishNum = y;
168                         }
169                     }
170                     else if(menu.searthSpecialDish(name) != null) {
171                         if((portion==1||portion==2||portion==3)&&num<=15){
172                             records[y] = new Record();
173                             records[y] = order.addASpecialRecord(dishNum , name , portion , num , menu);
174                             records[y].isSpecialDish = true;
175                             System.out.println(records[y].orderNum+" "+records[y].d.name+" "+records[y].getPrice());
176                             y++;
177                             order.records = records;
178                             order.dishNum = y;
179                         }
180                     }
181                     else{
182                         System.out.println(name+" does not exist");
183                         continue;
184                     }
185                     if(portion!=1&&portion!=2&&portion!=3){
186                         System.out.println(dishNum+" portion out of range "+portion);
187                         continue;
188                     }
189                     if(num>15){
190                         System.out.println(dishNum+" num out of range "+num);
191                     }
192                 }
193             }
194             else if(input.matches("([1-9][0-9]*)( )(delete)")) {
195                 if(!isRightTable){
196                     continue;
197                 }
198                 deleteNum = Integer.parseInt(getInput[0]);
199                 if(order.findRecordByNum(deleteNum) == 1){
200                     order.delARecordByOrderNum(deleteNum);
201                 }
202                 else
203                     System.out.println("delete error;");
204             }
205             else if(input.matches("^([1-9][0-9]*)( )([1-9][0-9]*)( )(\\S+)( )([1-9][0-9]*)( )([1-9][0-9]*)$")) {
206                 if(!isRightTable){
207                     continue;
208                 }
209                 int t = Integer.parseInt(getInput[0]);
210                 dishNum = Integer.parseInt(getInput[1]);
211                 name = getInput[2];
212                 portion = Integer.parseInt(getInput[3]);
213                 num = Integer.parseInt(getInput[4]);
214                 for(int i = 0;i<x-1;i++){
215                     if(tables.get(i).tableNum == t){
216                         if(menu.searthDish(name) != null) {
217                             records[y] = new Record();
218                             records[y] = order.addARecord(dishNum , name , portion , num , menu);
219                             records[y].isSpecialDish = false;
220                             System.out.println(dishNum+" table "+table.tableNum+" pay for table "+t+" "+records[y].getPrice());
221                             y++;
222                             order.records = records;
223                             order.dishNum = y;
224                         }
225                         else if(menu.searthSpecialDish(name) != null) {
226                             records[y] = new Record();
227                             records[y] = order.addASpecialRecord(dishNum , name , portion , num , menu);
228                             records[y].isSpecialDish = true;
229                             System.out.println(dishNum+" table "+table.tableNum+" pay for table "+t+" "+records[y].getPrice());
230                             y++;
231                             order.records = records;
232                             order.dishNum = y;
233                         }
234                         
235                         else{
236                             System.out.println(name+" does not exist");
237                         }
238                         break;
239                     }
240                     if(i == x-2){
241                       System.out.println("Table number :"+t+" does not exist");
242                         }
243                 }
244                 if(x-1 == 0){
245                     System.out.println("Table number :"+t+" does not exist");
246                 }
247             }
248             else {
249                 System.out.println("wrong format");
250             }
251         }
252     }
253 }
254 class Dish{
255     String name;
256     int unit_price;
257     public int getPrice(int portion){
258         double getPrice=0;
259         if(portion==1)
260             getPrice=unit_price;
261         else if(portion==2)
262             getPrice=unit_price*1.5;
263         else if(portion==3)
264             getPrice=unit_price*2;
265         return (int) Math.round(getPrice);
266     }
267 }
268 class SpecialDish extends Dish{
269 
270 }
271 
272 class Menu{
273     Dish[] dishes;
274     SpecialDish[] specialDishes;
275     int dishNum;
276     int dishNum1;
277     public Dish searthDish(String dishName){
278         for(int k=0;k<dishNum;k++) {
279             if(dishName.equals(dishes[k].name)){
280                 return dishes[k];
281             }
282         }
283         return null;
284     }
285     public SpecialDish searthSpecialDish(String dishName){
286         for(int k=0;k<dishNum1;k++) {
287             if(dishName.equals(specialDishes[k].name)){
288                 return specialDishes[k];
289             }
290         }
291         return null;
292     }
293     public Dish addDish(String dishName,int unit_price){
294         Dish addDish=new Dish();
295         addDish.name=dishName;
296         addDish.unit_price=unit_price;
297         return addDish;
298     }
299     public SpecialDish addSpecialDish(String dishName,int unit_price){
300         SpecialDish addDish=new SpecialDish();
301         addDish.name=dishName;
302         addDish.unit_price=unit_price;
303         return addDish;
304     }
305 }
306 class Record{
307     int orderNum;
308     Dish d;
309     int portion;
310     int num;
311     boolean isSpecialDish;
312     public int getPrice() {
313         return d.getPrice(portion)*num;
314     }
315 }
316 class Order {
317     int dishNum;
318     int allCommonPrice;
319     int allSpecialPrice;
320     Record[] records;
321     public void addPortion() {
322         for(int k = 0;k < dishNum-1;k++){
323             for(int l = k+1;l<dishNum;l++){
324                 if(records[k].d.name.equals(records[l].d.name)&&records[k].portion == records[l].portion){
325                     records[k].num+=records[l].num;
326                     records[l].num = 0;
327                 }
328             }
329         }
330     }
331     public void getTotalPrice(){
332         this.addPortion();
333         for(int k=0;k<dishNum;k++) {
334             if(!records[k].isSpecialDish)
335                 allCommonPrice+=records[k].getPrice();
336             else
337                 allSpecialPrice+=records[k].getPrice();
338         }
339     }
340     public Record addARecord(int orderNum,String dishName,int portion,int num , Menu menu){
341         Record x=new Record();
342         x.d=menu.searthDish(dishName);
343         x.orderNum=orderNum;
344         x.portion=portion;
345         x.num=num;
346         return x;
347     }
348     public Record addASpecialRecord(int orderNum,String dishName,int portion,int num , Menu menu){
349         Record x=new Record();
350         x.d=menu.searthSpecialDish(dishName);
351         x.orderNum=orderNum;
352         x.portion=portion;
353         x.num=num;
354         return x;
355     }
356     public void delARecordByOrderNum(int orderNum){
357         for(int k=0;k<dishNum;k++) {
358             if(orderNum==records[k].orderNum) {
359                 if(records[k].num == 0)
360                     System.out.println("deduplication "+orderNum);
361                 else
362                     records[k].num=0;
363             }
364         }
365     }
366     public int findRecordByNum(int orderNum){
367         for(int k = 0; k<dishNum; k++) {
368             if(records[k].orderNum==orderNum) {
369                 return 1;
370             }
371         }
372         return 0;
373     }
374 }
375 class Table{
376     int tableNum;
377     String mainTime;
378     String remainTime;
379     Order order;
380     double commonDiscount;
381     double specialDiscount;
382     int year;
383     int month;
384     int day;
385     double hour;
386     double minute;
387     double second;
388     LocalDate date;
389     public void getTime(){
390         String[] x = remainTime.split("/");
391         String[] y = mainTime.split("/");
392         year = Integer.parseInt(y[0]);
393         month = Integer.parseInt(y[1]);
394         day = Integer.parseInt(y[2]);
395         hour = Double.parseDouble(x[0]);
396         minute = Double.parseDouble(x[1]);
397         second = Double.parseDouble(x[2]);
398     }
399     public boolean isRange(){
400         this.getTime();
401         date = LocalDate.of(year , month , day );
402         LocalDate date1 = LocalDate.of(2022 , 1 , 1 );
403         LocalDate date2 = LocalDate.of(2023 , 12 , 31 );
404         return (date.isAfter(date1) && date.isBefore(date2)) || date.isEqual(date1) || date.isEqual(date2);
405     }
406     public boolean timeJudgement() {
407         if(mainTime.matches("^([0-9]{4})(/)(0[1-9]|[1-9]|1[0-2])(/)(0[1-9]|[1-9]|1[0-9]|2[0-9]|3[0-1])$")){
408             this.getTime();
409             if(month == 4||month == 6||month == 9||month == 11){
410                 if(day>30){
411                     return false;
412                 }
413             }
414             else if(month == 2){
415                 if(day >29)
416                     return false;
417                 if(!((year%4==0&&year%100!=0)||year%400==0))
418                     if (day > 28) {
419                         return false;
420                     }
421             }
422         }
423         else{
424             return false;
425         }
426         return remainTime.matches("^(0[0-9]|[0-9]|1[0-9]|2[0-3])(/)(0[0-9]|[0-9]|[1-5][0-9])(/)(0[0-9]|[0-9]|[1-5][0-9])$");
427     }
428     public boolean timeJudgement1(){
429         this.getTime();
430         int weekOfDay = date.getDayOfWeek().getValue();
431         if (weekOfDay == 6 || weekOfDay == 7) {
432             if (hour >= 10 && hour < 21 || hour == 9 && minute >= 30 || hour == 21 && minute < 30 ||hour == 21 && minute == 30 && second == 0) {
433                 specialDiscount = commonDiscount = 1;
434                 return true;
435             }
436             else {
437                 return false;
438             }
439         }
440         if (weekOfDay >= 1 && weekOfDay <= 5) {
441             if (hour > 17 && hour < 20 || hour == 17 && minute >= 0 || hour == 20 && minute < 30 || hour == 20 && minute == 30 && second == 0) {
442                 commonDiscount = 0.8;
443                 specialDiscount = 0.7;
444                 return true;
445             }
446             else if (hour > 10 && hour < 14 || hour == 10 && minute >= 30 || hour == 14 && minute < 30 || hour == 14 && minute == 30 && second == 0) {
447                 commonDiscount = 0.6;
448                 specialDiscount = 0.7;
449                 return true;
450             }
451             else {
452                 return false;
453             }
454         }
455         return false;
456     }
457     public int tablePrice() {
458         return (int)Math.round(this.order.allCommonPrice*commonDiscount)+(int)Math.round(this.order.allSpecialPrice*specialDiscount);
459     }
460     public boolean isOneTable(Table a){
461         this.getTime();
462         a.getTime();
463         if(this.date.equals(a.date)){
464             if(date.getDayOfWeek().getValue() >=1&&date.getDayOfWeek().getValue() <=5){
465                 if ((hour >= 17 && hour <= 20)&&(a.hour >= 17 && a.hour <= 20)){
466                     return true;
467                 }
468                 else return (hour >= 10 && hour <= 14) && (a.hour >= 10 && a.hour <= 14);
469             }
470             else if(date.getDayOfWeek().getValue() ==6||date.getDayOfWeek().getValue() == 7){
471                 return Math.abs((a.hour - hour) * 3600 + (a.minute - minute) * 60 + (a.second - second)) < 3600;
472             }
473         }
474         return false;
475     }
476 }
477 class lastPrint{
478     ArrayList<Table> tables = new ArrayList<>();
479     public void print(){
480         for(int i = 0;i<tables.size();i++){
481             tables.get(i).order.getTotalPrice();
482             for(int j = i+1;j<tables.size();j++){
483                 if(tables.get(i).tableNum==tables.get(j).tableNum&&i!=j){
484                     if(tables.get(j).timeJudgement()&&tables.get(j).isRange()&&tables.get(j).timeJudgement1()&&tables.get(j).tableNum<=55&&tables.get(i).isOneTable(tables.get(j))){
485                         tables.get(j).order.getTotalPrice();
486                         tables.get(i).order.allCommonPrice+=tables.get(j).order.allCommonPrice;
487                         tables.get(i).order.allSpecialPrice+=tables.get(j).order.allSpecialPrice;
488                         tables.remove(j);
489                         j--;
490                     }
491                 }
492 
493             }
494             System.out.println("table " + tables.get(i).tableNum + ": " + (tables.get(i).order.allCommonPrice+tables.get(i).order.allSpecialPrice) + " " + tables.get(i).tablePrice());
495         }
496     }
497 }

 

Metrics Details For File 'Main.java'
--------------------------------------------------------------------------------------------

Parameter Value
========= =====
Project Directory D:\java\untitled\src\
Project Name 777777
Checkpoint Name Baseline
File Name Main.java
Lines 497
Statements 360
Percent Branch Statements 26.4
Method Call Statements 131
Percent Lines with Comments 0.0
Classes and Interfaces 8
Methods per Class 2.75
Average Statements per Method 13.55
Line Number of Most Complex Method 7
Name of Most Complex Method Main.main()
Maximum Complexity 57
Line Number of Deepest Block 103
Maximum Block Depth 7
Average Block Depth 4.03
Average Complexity 8.20

--------------------------------------------------------------------------------------------
Most Complex Methods in 7 Class(es): Complexity, Statements, Max Depth, Calls

Dish.getPrice() 4, 8, 3, 1
lastPrint.print() 10, 11, 7, 22
Main.main() 57, 51, 7, 24
Menu.addDish() 1, 4, 3, 0
Menu.addSpecialDish() 1, 4, 3, 0
Menu.searthDish() 3, 4, 5, 1
Menu.searthSpecialDish() 3, 4, 5, 1
Order.addARecord() 1, 6, 3, 0
Order.addASpecialRecord() 1, 6, 3, 0
Order.addPortion() 5, 5, 6, 1
Order.delARecordByOrderNum() 5, 6, 5, 1
Order.findRecordByNum() 3, 4, 5, 0
Order.getTotalPrice() 4, 6, 4, 1
Record.getPrice() 1, 1, 3, 1
Table.getTime() 1, 8, 3, 8
Table.isOneTable() 11, 11, 6, 12
Table.isRange() 4, 5, 3, 8
Table.tablePrice() 1, 1, 3, 2
Table.timeJudgement() 14, 14, 7, 3
Table.timeJudgement1() 34, 20, 5, 2

--------------------------------------------------------------------------------------------
Block Depth Statements

0 6
1 8
2 61
3 76
4 62
5 77
6 32
7 38
8 0
9+ 0
--------------------------------------------------------------------------------------------

 

分析:

       本题是菜单三的迭代,相较于上次,新增的内容主要是对于各种数据的处理,这里我的解决方法是用正则表达式排除格式错误的数据,再加入2个布尔参数,用于判断不同情况下的不同输出。同时还增加了特殊菜的订单,合并桌的处理以及计算价格的方式发生了改变。本题主要难点即对于不同数据的处理:首先要通过正则表达式筛选出格式正确的数据,对于格式错误的数据要输出“wrong format”,但是这样操作会出现一个问题,即本题要求当前面是第一个新建桌并且发生错误的时候,后面的数据要全部忽略,直到出现一个新的正确的桌号,我的处理方法为增加一个布尔false类型,当识别到有正确桌号创立后就会变为true类型,通过这个方法来处理数据是否忽略;但题目还要求在创立桌号后,后续创立的菜单数据要全部忽略,并输出“invalid dish”,故对于菜单数据的判断,除了上述布尔数据,我还创建了另一个布尔数据,当创建桌号后,它变为false,意为菜单输入结束;对于第17条要求,我的处理方法是把输入数据按照空格切割,当第一个数据是“table”时,就会进入一个正则表达式判断后续数据是否正确,这样就可以对不同情况进行不同的处理。第二个主要问题在于数据计算处理:此问题解决较为简单,按照题目提供的流程操作即可,主要难点在于相同订单记录的合并以及最后桌的合并,我的解决方法为在Order类中增加合并订单的addPortion方法,以及lastPrint类用于输出总计,其中包含合并桌的操作。本题并没有什么主要卡点,接下来我来分析我的类构建思路。在题目所给的类思路基础上,继承Dish类构建特殊菜specialDish类,在Menu类中聚合SpecialDish[] specialDishes类,方法分别构建关于特殊菜的处理,Order类中增加合并菜addPortion类并增加普通总价commonPrice属性合specialPrice属性,并将计算总价方法改成计算前两属性的方法,再构建Table类,包括对于时间处理的方法,以及2桌是否能合并的判断方法,最后构建lastPrint类,用于计算总价。

 

第五次大作业

 

7-1 菜单计价程序-5
分数 100
作者 蔡轲
单位 南昌航空大学

本题在菜单计价程序-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
 
代码长度限制
50 KB
时间限制
1000 ms
内存限制
64 MB
 
  1 import java.io.BufferedReader;
  2 import java.io.IOException;
  3 import java.io.InputStreamReader;
  4 import java.time.LocalDate;
  5 import java.util.ArrayList;
  6 public class Main {
  7     public static void main(String[] args) throws IOException {
  8         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  9         Dish[] dishes = new Dish[20];
 10         SpecialDish[] specialDishes = new SpecialDish[20];
 11         ArrayList<Table> tables = new ArrayList<>();
 12         Table table = new Table();
 13         Record[] records = new Record[20];
 14         PersonPay[] personPays = new PersonPay[10];
 15         Order order = new Order();
 16         Menu menu = new Menu();
 17         lastPrint print = new lastPrint();
 18         int x = 0 , y = 0 , z = 0 , z1 = 0 , p = 0 , tableNum , dishNum , portion , num , unit_price , deleteNum , tasteNum;
 19         String menuName , dayTime , hourTime , name , tableName , telephoneNum , taste;
 20         boolean isHaveTable = false , forOther = false;
 21         for(;;){
 22             String input = in.readLine();
 23             if(input.equals("end")){
 24                 if(x!=0){
 25                     table.order = order;
 26                     tables.add(x-1 , table);
 27                 }
 28                 print.tables = tables;
 29                 print.personPays = personPays;
 30                 print.print();
 31                 print.payPrint();
 32                 break;
 33             }
 34             String[] getInput = input.split(" ");
 35             if(input.matches("^(table)( )([1-9][0-9]*)( )(:)( )(\\S+)( )((136|133|135|180|181|189)[0-9]{8})( )([0-9]{4})(/)([0-9]|[0-9]{2})(/)([0-9]|[0-9]{2})( )([0-9]|[0-9]{2})(/)([0-9]|[0-9]{2})(/)([0-9]|[0-9]{2})$")) {
 36                 if(x != 0) {
 37                     table.order = order;
 38                     tables.add(x-1 , table);
 39                     table = new Table();
 40                     y = 0;
 41                 }
 42                 isHaveTable = true;
 43                 tableNum = Integer.parseInt(getInput[1]);
 44                 tableName = getInput[3];
 45                 telephoneNum = getInput[4];
 46                 dayTime = getInput[5];
 47                 hourTime = getInput[6];
 48                 table.tableNum = tableNum;
 49                 table.tableName = tableName;
 50                 table.telephoneNum = telephoneNum;
 51                 table.mainTime = dayTime;
 52                 table.remainTime = hourTime;
 53                 if(!table.timeJudgement1()){
 54                     isHaveTable = false;
 55                     System.out.println("table " +table.tableNum + " out of opening hours");
 56                     continue;
 57                 }
 58                 order = new Order();
 59                 records = new Record[10];
 60                 if(x==0){
 61                     personPays[p] = new PersonPay();
 62                     personPays[p].name = tableName;
 63                     personPays[p].telephoneNum = telephoneNum;
 64                     p++;
 65                     print.p = p;
 66                 }
 67                 else{
 68                     for(int i=0;i<p;i++){
 69                         if(personPays[i].name.equals(tableName)&&personPays[i].telephoneNum.equals(telephoneNum))
 70                             break;
 71                         if(i==p-1){
 72                             personPays[p] = new PersonPay();
 73                             personPays[p].name = tableName;
 74                             personPays[p].telephoneNum = telephoneNum;
 75                             p++;
 76                             print.p = p;
 77                         }
 78                     }
 79                 }
 80                 System.out.println("table "+tableNum+": ");
 81                 x++;
 82             }
 83             else if(input.matches("^(\\S+)( )([1-9][0-9]*)$")){
 84                 int i = 0;
 85                 menuName = getInput[0];
 86                 unit_price = Integer.parseInt(getInput[1]);
 87                 if(z == 0) {
 88                     dishes[0] = menu.addDish(menuName , unit_price);
 89                     z++;
 90                 }
 91                 else{
 92                     for(;i < z ; i++) {
 93                         if(menuName.equalsIgnoreCase(dishes[i].name)) {
 94                             dishes[i].unit_price = unit_price;
 95                             break;
 96                         }
 97                     }
 98                 }
 99                 if(i == z){
100                     dishes[z] = menu.addDish(menuName , unit_price);
101                     z++;
102                 }
103                 menu.dishes = dishes;
104                 menu.dishNum = z;
105             }
106             else if(input.matches("^(\\S+)( )(\\S+)( )([1-9][0-9]*)( )(T)$")){
107                 int i = 0;
108                 menuName = getInput[0];
109                 taste = getInput[1];
110                 unit_price = Integer.parseInt(getInput[2]);
111                 if(z1 == 0) {
112                     specialDishes[0] = menu.addSpecialDish(menuName , unit_price , taste);
113                     z1++;
114                 }
115                 else{
116                     for(;i < z1 ; i++) {
117                         if(menuName.equalsIgnoreCase(specialDishes[i].name)) {
118                             specialDishes[i].unit_price = unit_price;
119                             break;
120                         }
121                     }
122                 }
123                 if(i == z1){
124                     specialDishes[z1] = menu.addSpecialDish(menuName , unit_price , taste);
125                     z1++;
126                 }
127                 menu.specialDishes = specialDishes;
128                 menu.dishNum1 = z1;
129             }
130             else if(input.matches("^([1-9][0-9]*)( )(\\S+)( )([1-9][0-9]*)( )([1-9][0-9]*)$")){
131                 if(!isHaveTable)
132                     continue;
133                 dishNum = Integer.parseInt(getInput[0]);
134                 name = getInput[1];
135                 portion = Integer.parseInt(getInput[2]);
136                 num = Integer.parseInt(getInput[3]);
137                 if(menu.searthDish(name) != null) {
138                     records[y] = new Record();
139                     records[y] = order.addARecord(dishNum , name , portion , num , menu);
140                     records[y].isSpecialDish = false;
141                     System.out.println(records[y].orderNum+" "+records[y].d.name+" "+records[y].getPrice());
142                     y++;
143                     order.records = records;
144                     order.dishNum = y;
145                 }
146                 else{
147                     System.out.println(name+" does not exist");
148                 }
149             }
150             else if(input.matches("^([1-9][0-9]*)( )(\\S+)( )([0-9]+)( )([1-9][0-9]*)( )([1-9][0-9]*)$")){
151                 if(!isHaveTable)
152                     continue;
153                 dishNum = Integer.parseInt(getInput[0]);
154                 name = getInput[1];
155                 tasteNum = Integer.parseInt(getInput[2]);
156                 portion = Integer.parseInt(getInput[3]);
157                 num = Integer.parseInt(getInput[4]);
158                 if(menu.searthSpecialDish(name) != null) {
159                     if(((menu.searthSpecialDish(name).taste.equals("川菜") && tasteNum >= 0 && tasteNum <= 5) || (menu.searthSpecialDish(name).taste.equals("晋菜") && tasteNum>=0 && tasteNum <= 4) || (menu.searthSpecialDish(name).taste.equals("浙菜") && tasteNum>=0 && tasteNum <= 3))){
160                         records[y] = new Record();
161                         records[y] = order.addASpecialRecord(dishNum , name , portion , num , menu , tasteNum , forOther);
162                         records[y].isSpecialDish = true;
163                         System.out.println(records[y].orderNum+" "+records[y].d.name+" "+records[y].getPrice());
164                         y++;
165                         order.records = records;
166                         order.dishNum = y;
167                     }
168                 }
169                 else{
170                     System.out.println(name+" does not exist");
171                     continue;
172                 }
173                 if(menu.searthSpecialDish(name).taste.equals("川菜")){
174                     if(tasteNum<0||tasteNum>5)
175                         System.out.println("spicy num out of range :"+tasteNum);
176                 }
177                 if(menu.searthSpecialDish(name).taste.equals("晋菜")){
178                     if(tasteNum<0||tasteNum>4)
179                         System.out.println("acidity num out of range :"+tasteNum);
180                 }
181                 if(menu.searthSpecialDish(name).taste.equals("浙菜")){
182                     if(tasteNum<0||tasteNum>3)
183                         System.out.println("sweetness num out of range :"+tasteNum);
184                 }
185             }
186             else if(input.matches("([1-9][0-9]*)( )(delete)")) {
187                 if(!isHaveTable)
188                     continue;
189                 deleteNum = Integer.parseInt(getInput[0]);
190                 if(order.findRecordByNum(deleteNum) == 1){
191                     order.delARecordByOrderNum(deleteNum);
192                 }
193                 else
194                     System.out.println("delete error;");
195             }
196             else if(input.matches("^([1-9][0-9]*)( )([1-9][0-9]*)( )(\\S+)( )([1-9][0-9]*)( )([1-9][0-9]*)$")) {
197                 if(!isHaveTable)
198                     continue;
199                 int t = Integer.parseInt(getInput[0]);
200                 dishNum = Integer.parseInt(getInput[1]);
201                 name = getInput[2];
202                 portion = Integer.parseInt(getInput[3]);
203                 num = Integer.parseInt(getInput[4]);
204                 for(int i = 0;i<x-1;i++){
205                     if(tables.get(i).tableNum == t){
206                         if(menu.searthDish(name) != null) {
207                             records[y] = new Record();
208                             records[y] = order.addARecord(dishNum , name , portion , num , menu);
209                             records[y].isSpecialDish = false;
210                             System.out.println(dishNum+" table "+table.tableNum+" pay for table "+t+" "+records[y].getPrice());
211                             y++;
212                             order.records = records;
213                             order.dishNum = y;
214                         }
215                         break;
216                     }
217                 }
218             }
219             else if(input.matches("^([1-9][0-9]*)( )([1-9][0-9]*)( )(\\S+)( )([0-9]*)( )([1-9][0-9]*)( )([1-9][0-9]*)$")) {
220                 if(!isHaveTable)
221                     continue;
222                 int t = Integer.parseInt(getInput[0]);
223                 dishNum = Integer.parseInt(getInput[1]);
224                 name = getInput[2];
225                 tasteNum = Integer.parseInt(getInput[3]);
226                 portion = Integer.parseInt(getInput[4]);
227                 num = Integer.parseInt(getInput[5]);
228                 for(int i = 0;i<x-1;i++){
229                     if(tables.get(i).tableNum == t){
230                         if(menu.searthSpecialDish(name) != null) {
231                             if(((menu.searthSpecialDish(name).taste.equals("川菜") && tasteNum >= 1 && tasteNum <= 5) || (menu.searthSpecialDish(name).taste.equals("晋菜") && tasteNum <= 4) || (menu.searthSpecialDish(name).taste.equals("浙菜") && tasteNum <= 3))){
232                                 records[y] = new Record();
233                                 records[y] = order.addASpecialRecord(dishNum , name , portion , num , menu , tasteNum , !forOther);
234                                 records[y].isSpecialDish = true;
235                                 System.out.println(dishNum+" table "+table.tableNum+" pay for table "+t+" "+records[y].getPrice());
236                                 tables.get(i).giveTaste(name,num,tasteNum,menu);
237                                 y++;
238                                 order.records = records;
239                                 order.dishNum = y;
240                             }
241                         }
242 
243                         break;
244                     }
245                 }
246             }
247             else {
248                 System.out.println("wrong format");
249             }
250         }
251     }
252 }
253 class Dish{
254     String name;
255     int unit_price;
256     public int getPrice(int portion){
257         double getPrice=0;
258         if(portion==1)
259             getPrice=unit_price;
260         else if(portion==2)
261             getPrice=unit_price*1.5;
262         else if(portion==3)
263             getPrice=unit_price*2;
264         return (int) Math.round(getPrice);
265     }
266 }
267 class SpecialDish extends Dish{
268     String taste;
269 }
270 class Menu{
271     Dish[] dishes;
272     SpecialDish[] specialDishes;
273     int dishNum;
274     int dishNum1;
275     public Dish searthDish(String dishName){
276         for(int k=0;k<dishNum;k++) {
277             if(dishName.equals(dishes[k].name)){
278                 return dishes[k];
279             }
280         }
281         return null;
282     }
283     public SpecialDish searthSpecialDish(String dishName){
284         for(int k=0;k<dishNum1;k++) {
285             if(dishName.equals(specialDishes[k].name)){
286                 return specialDishes[k];
287             }
288         }
289         return null;
290     }
291     public Dish addDish(String dishName,int unit_price){
292         Dish addDish=new Dish();
293         addDish.name=dishName;
294         addDish.unit_price=unit_price;
295         return addDish;
296     }
297     public SpecialDish addSpecialDish(String dishName,int unit_price,String taste){
298         SpecialDish addDish=new SpecialDish();
299         addDish.name=dishName;
300         addDish.unit_price=unit_price;
301         addDish.taste=taste;
302         return addDish;
303     }
304 }
305 class Record{
306     int orderNum;
307     Dish d;
308     int portion;
309     int num;
310     int spicy;
311     int acidity;
312     int sweetness;
313     boolean isSpecialDish;
314     public int getPrice() {
315         return d.getPrice(portion)*num;
316     }
317 }
318 class Order {
319     int dishNum;
320     int allCommonPrice;
321     int allSpecialPrice;
322     Record[] records;
323     public void addPortion() {
324         for(int k = 0;k < dishNum-1;k++){
325             for(int l = k+1;l<dishNum;l++){
326                 if(records[k].d.name.equals(records[l].d.name)&&records[k].portion == records[l].portion){
327                     records[k].num+=records[l].num;
328                     records[l].num = 0;
329                 }
330             }
331         }
332     }
333     public void getTotalPrice(){
334         for(int k=0;k<dishNum;k++) {
335             if(!records[k].isSpecialDish)
336                 allCommonPrice+=records[k].getPrice();
337             else
338                 allSpecialPrice+=records[k].getPrice();
339         }
340     }
341     public int getTotalPrice(double commonDiscount,double specialDiscount){
342         int all = 0;
343         for(int k=0;k<dishNum;k++) {
344             if(!records[k].isSpecialDish)
345                 all+=Math.round(records[k].getPrice()*commonDiscount);
346             else
347                 all+=Math.round(records[k].getPrice()*specialDiscount);
348         }
349         return all;
350     }
351     public Record addARecord(int orderNum,String dishName,int portion,int num , Menu menu){
352         Record x=new Record();
353         x.d=menu.searthDish(dishName);
354         x.orderNum=orderNum;
355         x.portion=portion;
356         x.num=num;
357         return x;
358     }
359     public Record addASpecialRecord(int orderNum,String dishName,int portion,int num ,Menu menu,int tasteNum , boolean forOther){
360         Record x=new Record();
361         x.d=menu.searthSpecialDish(dishName);
362         x.orderNum=orderNum;
363         x.portion=portion;
364         x.num=num;
365         if(!forOther){
366             if(menu.searthSpecialDish(dishName).taste.equals("川菜")){
367                 x.spicy = tasteNum;
368                 x.acidity = -1;
369                 x.sweetness = -1;
370             }
371             if(menu.searthSpecialDish(dishName).taste.equals("晋菜")){
372                 x.spicy = -1;
373                 x.acidity = tasteNum;
374                 x.sweetness = -1;
375             }
376             if(menu.searthSpecialDish(dishName).taste.equals("浙菜")){
377                 x.spicy = -1;
378                 x.acidity = -1;
379                 x.sweetness = tasteNum;
380             }
381         }
382         else{
383             x.spicy = -1;
384             x.acidity = -1;
385             x.sweetness = -1;
386         }
387         return x;
388     }
389     public void delARecordByOrderNum(int orderNum){
390         for(int k=0;k<dishNum;k++) {
391             if(orderNum==records[k].orderNum) {
392                 records[k].num=0;
393             }
394         }
395     }
396     public int findRecordByNum(int orderNum){
397         for(int k = 0; k<dishNum;k++) {
398             if(records[k].orderNum==orderNum) {
399                 return 1;
400             }
401         }
402         return 0;
403     }
404 }
405 class Table{
406     int tableNum;
407     String tableName;
408     String telephoneNum;
409     String mainTime;
410     String remainTime;
411     Order order;
412     double commonDiscount;
413     double specialDiscount;
414     int averageSpicy;
415     int averageAcidity;
416     int averageSweetness;
417     double spicyNum;
418     double acidityNum;
419     double sweetnessNum;
420     public boolean timeJudgement1(){
421         String[] x = remainTime.split("/");
422         String[] y = mainTime.split("/");
423         int year = Integer.parseInt(y[0]);
424         int month = Integer.parseInt(y[1]);
425         int day = Integer.parseInt(y[2]);
426         double hour = Double.parseDouble(x[0]);
427         double minute = Double.parseDouble(x[1]);
428         double second = Double.parseDouble(x[2]);
429         LocalDate date = LocalDate.of(year,month,day);
430         int weekOfDay = date.getDayOfWeek().getValue();
431         if (weekOfDay == 6 || weekOfDay == 7) {
432             if (hour >= 10 && hour < 21 || hour == 9 && minute >= 30 || hour == 21 && minute < 30 ||hour == 21 && minute == 30 && second == 0) {
433                 specialDiscount = commonDiscount = 1;
434                 return true;
435             }
436             else {
437                 return false;
438             }
439         }
440         if (weekOfDay >= 1 && weekOfDay <= 5) {
441             if (hour > 17 && hour < 20 || hour == 17 && minute >= 0 || hour == 20 && minute < 30 || hour == 20 && minute == 30 && second == 0) {
442                 commonDiscount = 0.8;
443                 specialDiscount = 0.7;
444                 return true;
445             }
446             else if (hour > 10 && hour < 14 || hour == 10 && minute >= 30 || hour == 14 && minute < 30 || hour == 14 && minute == 30 && second == 0) {
447                 commonDiscount = 0.6;
448                 specialDiscount = 0.7;
449                 return true;
450             }
451             else {
452                 return false;
453             }
454         }
455         return false;
456     }
457     public int tablePrice(){
458         return this.order.getTotalPrice(commonDiscount,specialDiscount);
459     }
460     public void getTaste(){
461         for(int k = 0;k<this.order.dishNum;k++){
462             if(order.records[k].isSpecialDish){
463                 if(order.records[k].spicy!=-1){
464                     averageSpicy+=order.records[k].spicy*order.records[k].num;
465                     spicyNum=order.records[k].num+spicyNum;
466                 }
467                 if(order.records[k].acidity!=-1){
468                     averageAcidity+=order.records[k].acidity*order.records[k].num;
469                     acidityNum=order.records[k].num+acidityNum;
470                 }
471                 if(order.records[k].sweetness!=-1){
472                     averageSweetness+=order.records[k].sweetness*order.records[k].num;
473                     sweetnessNum=order.records[k].num+sweetnessNum;
474                 }
475             }
476         }
477         if(spicyNum!=0){
478             averageSpicy=(int)Math.round(averageSpicy/spicyNum);
479         }
480         if(acidityNum!=0){
481             averageAcidity=(int)Math.round(averageAcidity/acidityNum);
482         }
483         if(sweetnessNum!=0){
484             averageSweetness=(int)Math.round(averageSweetness/sweetnessNum);
485         }
486     }
487     public String spicyLevel(){
488         if(averageSpicy==0)
489             return "不辣";
490         if(averageSpicy==1)
491             return "微辣";
492         if(averageSpicy==2)
493             return "稍辣";
494         if(averageSpicy==3)
495             return "辣";
496         if(averageSpicy==4)
497             return "很辣";
498         if(averageSpicy==5)
499             return "爆辣";
500         return null;
501     }
502     public String acidityLevel(){
503         if(averageAcidity==0)
504             return "不酸";
505         if(averageAcidity==1)
506             return "微酸";
507         if(averageAcidity==2)
508             return "稍酸";
509         if(averageAcidity==3)
510             return "酸";
511         if(averageAcidity==4)
512             return "很酸";
513         return null;
514     }
515     public String sweetnessLevel(){
516         if(averageSweetness==0)
517             return "不甜";
518         if(averageSweetness==1)
519             return "微甜";
520         if(averageSweetness==2)
521             return "稍甜";
522         if(averageSweetness==3)
523             return "甜";
524         return null;
525     }
526     public void giveTaste(String name , int num , int tasteLevel , Menu menu){
527         if(menu.searthSpecialDish(name).taste.equals("川菜")){
528             averageSpicy+=tasteLevel*num;
529             spicyNum+=num;
530         }
531         if(menu.searthSpecialDish(name).taste.equals("晋菜")){
532             averageAcidity+=tasteLevel*num;
533             acidityNum+=num;
534         }
535         if(menu.searthSpecialDish(name).taste.equals("浙菜")){
536             averageSweetness+=tasteLevel*num;
537             sweetnessNum+=num;
538         }
539     }
540 }
541 class lastPrint{
542     ArrayList<Table> tables = new ArrayList<>();
543     PersonPay[] personPays;
544     int p;
545     public void print(){
546         for (Table table : tables) {
547             table.order.getTotalPrice();
548             table.getTaste();
549             if(table.spicyNum==0&&table.acidityNum==0&&table.sweetnessNum==0)
550                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice()+" ");
551             if(table.spicyNum!=0&&table.acidityNum==0&&table.sweetnessNum==0)
552                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice() + " 川菜 " +(int)table.spicyNum+" "+table.spicyLevel());
553             if(table.spicyNum==0&&table.acidityNum!=0&&table.sweetnessNum==0)
554                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice() + " 晋菜 " +(int)table.acidityNum+" "+table.acidityLevel());
555             if(table.spicyNum==0&&table.acidityNum==0&&table.sweetnessNum!=0)
556                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice() + " 浙菜 " +(int)table.sweetnessNum+" "+table.sweetnessLevel());
557             if(table.spicyNum!=0&&table.acidityNum!=0&&table.sweetnessNum==0)
558                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice() + " 川菜 " +(int)table.spicyNum+" "+table.spicyLevel()+" 晋菜 "+(int)table.acidityNum+" "+table.acidityLevel());
559             if(table.spicyNum!=0&&table.acidityNum==0&&table.sweetnessNum!=0)
560                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice() + " 川菜 " +(int)table.spicyNum+" "+table.spicyLevel()+" 浙菜 "+(int)table.sweetnessNum+" "+table.sweetnessLevel());
561             if(table.spicyNum==0&&table.acidityNum!=0&&table.sweetnessNum!=0)
562                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice() + " 晋菜 " +(int)table.acidityNum+" "+table.acidityLevel()+" 浙菜 "+(int)table.sweetnessNum+" "+table.sweetnessLevel());
563             if(table.spicyNum!=0&&table.acidityNum!=0&&table.sweetnessNum!=0)
564                 System.out.println("table " + table.tableNum + ": " + (table.order.allCommonPrice + table.order.allSpecialPrice) + " " + table.tablePrice() + " 川菜 " +(int)table.spicyNum+" "+table.spicyLevel()+" 晋菜 "+(int)table.acidityNum+" "+table.acidityLevel()+" 浙菜 "+(int)table.sweetnessNum+" "+table.sweetnessLevel());
565         }
566     }
567     public void payPrint(){
568         for(int k=0;k<p;k++){
569             for(Table table:tables){
570                 if(table.tableName.equals(personPays[k].name)){
571                     personPays[k].payPrice+=table.tablePrice();
572                 }
573             }
574         }
575         for(int k=0;k<p-1;k++){
576             for(int l=k+1;l<p;l++){
577                     if(personPays[k].name.toLowerCase().compareTo(personPays[l].name.toLowerCase())>0) {
578                         PersonPay x;
579                         x=personPays[l];
580                         personPays[l]=personPays[k];
581                         personPays[k]=x;
582                     }
583             }
584         }
585         for(int k=0;k<p;k++){
586             System.out.println(personPays[k].name+" "+personPays[k].telephoneNum+" "+personPays[k].payPrice);
587         }
588     }
589 }
590 class PersonPay{
591     String name;
592     String telephoneNum;
593     int payPrice;
594 }

 

Metrics Details For File 'Main.java'
--------------------------------------------------------------------------------------------

Parameter Value
========= =====
Project Directory D:\java\javademo\src\
Project Name 7777
Checkpoint Name Baseline
File Name Main.java
Lines 596
Statements 384
Percent Branch Statements 25.5
Method Call Statements 113
Percent Lines with Comments 0.0
Classes and Interfaces 7
Methods per Class 2.57
Average Statements per Method 17.83
Line Number of Most Complex Method 7
Name of Most Complex Method Main.main()
Maximum Complexity 54
Line Number of Deepest Block 232
Maximum Block Depth 8
Average Block Depth 3.28
Average Complexity 8.12

--------------------------------------------------------------------------------------------
Most Complex Methods in 6 Class(es): Complexity, Statements, Max Depth, Calls

Dish.getPrice() 4, 8, 2, 1
Main.main() 54, 183, 8, 92
Menu.addDish() 1, 4, 2, 0
Menu.addSpecialDish() 1, 5, 2, 0
Menu.searthDish() 3, 4, 4, 1
Menu.searthSpecialDish() 3, 4, 4, 1
Order.addARecord() 1, 6, 2, 0
Order.addASpecialRecord() 6, 23, 4, 6
Order.delARecordByOrderNum() 3, 3, 4, 0
Order.findRecordByNum() 3, 4, 4, 0
Order.getTotalPrice() 4, 7, 3, 0
Order.getTotalPrice() 4, 5, 3, 0
Record.getPrice() 1, 1, 2, 1
Table.getTaste() 9, 17, 5, 0
Table.spicyLevel() 6, 11, 2, 0
Table.tablePrice() 1, 1, 2, 1
Table.timeJudgement1() 34, 28, 4, 10

--------------------------------------------------------------------------------------------
Block Depth Statements

0 12
1 51
2 93
3 39
4 106
5 48
6 13
7 14
8 8
9+ 0
--------------------------------------------------------------------------------------------

 

分析:
       本题仍然是菜单三的迭代,本题的主要难点在于对于特殊菜味道的处理,以及特殊代点菜对于价格和味道的处理和最后价格的统计。首先关于特殊菜味道的处理:在Order中增加三种不同的味道,当订单中含有特殊菜的时候会赋值给其中一种味道数据,没有则都赋值-1,这样最后处理味道只需要简单的计算即可。对于代点菜价格和味道的处理:在我上一个建立的框架上,如若仍然按照普通菜处理代点菜的方式处理肯定会出错,所以本题我在Table类中增加giveTaste方法,在Main类中对于数据进行处理,若识别到代点特殊菜,则会执行该方法,同时当前桌仍按普通菜处理,并且不给此特殊菜的味道赋值,这样就能达到题目要求的效果,关于计价,仍按照题目要求的方式即可。最后价格:对于此方式,我的解决方式为在桌号信息处理过程中若出现新个人信息,则创建新的personPay,用于储存用户信息,最后将名字与电话号信息相同的桌号价格求和即可。本题同样没有较大的卡点,唯一问题即当输出某桌信息时,若本桌的味道没有,则输出语句的最后有一个空格,注意即可。本题的设计思路:我在菜单四的基础上删除了原有的对数据的处理方法,在特殊菜类中增加了用于判断味道的String数据,在Record类中加入关于一桌菜的味道的计算,在Table中加入对于味道判断的方法,最后价格的计算放在personPay类中。
 

期中考试

 前三题过于简单就不分析啦~
 
7-4 测验4-抽象类与接口
分数 40
作者 段喜龙
单位 南昌航空大学

在测验3的题目基础上,重构类设计,实现列表内图形的排序功能(按照图形的面积进行排序)。
提示:题目中Shape类要实现Comparable接口。

其中,Main类源码如下(可直接拷贝使用):

public class Main {
    public static void main(String\[\] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        ArrayList<Shape> list = new ArrayList<>();    

        int choice = input.nextInt();

        while(choice != 0) {
            switch(choice) {
            case 1://Circle
                double radiums = input.nextDouble();
                Shape circle = new Circle(radiums);
                list.add(circle);
                break;
            case 2://Rectangle
                double x1 = input.nextDouble();
                double y1 = input.nextDouble();
                double x2 = input.nextDouble();
                double y2 = input.nextDouble();            
                Point leftTopPoint = new Point(x1,y1);
                Point lowerRightPoint = new Point(x2,y2);
                Rectangle rectangle = new Rectangle(leftTopPoint,lowerRightPoint);
                list.add(rectangle);
                break;
            }
            choice = input.nextInt();
        }    

        list.sort(Comparator.naturalOrder());//正向排序

        for(int i = 0; i < list.size(); i++) {
            System.out.print(String.format("%.2f", list.get(i).getArea()) + " ");
        }    
    }    
}

 

输入格式:

输入图形类型(1:圆形;2:矩形;0:结束输入)

输入图形所需参数

输出格式:

按升序排序输出列表中各图形的面积(保留两位小数),各图形面积之间用空格分隔。

输入样例:

在这里给出一组输入。例如:

1
2.3
2
3.2
3
6
5
1
2.3
0
 

输出样例:

在这里给出相应的输出。例如:

5.60 16.62 16.62 
 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
 
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        ArrayList<Shape> list = new ArrayList<>();
        int choice = input.nextInt();
        while(choice != 0) {
            switch(choice) {
                case 1:
                    double radium = input.nextDouble();
                    Shape circle = new Circle(radium);
                    list.add(circle);
                    break;
                case 2:
                    double x1 = input.nextDouble();
                    double y1 = input.nextDouble();
                    double x2 = input.nextDouble();
                    double y2 = input.nextDouble();
                    Point leftTopPoint = new Point(x1,y1);
                    Point lowerRightPoint = new Point(x2,y2);
                    Rectangle rectangle = new Rectangle(leftTopPoint,lowerRightPoint);
                    list.add(rectangle);
                    break;
            }
            choice = input.nextInt();
        }
        list.sort(Comparator.naturalOrder());//正向排序
        for(int i = 0; i < list.size(); i++) {
            System.out.print(String.format("%.2f", list.get(i).getArea()) + " ");
        }
    }
}

abstract class Shape implements Comparable<Shape> {
    Shape(){

    }
    abstract double getArea();

    public abstract int compareTo(Shape a);
}
class Point {
    private double x;
    private double y;
    Point(){

    }
    Point(double x , double y){
        setX(x);
        setY(y);
    }
    public double getX(){
        return x;
    }
    public double getY(){
        return y;
    }
    public void setX(double x){
        this.x = x;
    }
    public void setY(double y){
        this.y = y;
    }
}
class Rectangle extends Shape{
    Point topLeftPoint;
    Point lowerRightPoint;
    Rectangle(){

    }
    Rectangle(Point topLeftPoint , Point lowerRightPoint){
        setTopLeftPoint(topLeftPoint);
        setLowerRightPoint(lowerRightPoint);
    }
    public Point getTopLeftPoint(){
        return topLeftPoint;
    }

    public Point getLowerRightPoint() {
        return lowerRightPoint;
    }
    public void setTopLeftPoint(Point topLeftPoint){
        this.topLeftPoint = topLeftPoint;
    }
    public void setLowerRightPoint(Point lowerRightPoint){
        this.lowerRightPoint = lowerRightPoint;
    }
    public double getLength(){
       return Math.abs(lowerRightPoint.getX()-topLeftPoint.getX());
    }
    public double getHeight(){
        return Math.abs(lowerRightPoint.getY()-topLeftPoint.getY());
    }
    public double getArea(){
        return getHeight()*getLength();
    }

    @Override
    public int compareTo(Shape a) {
        if (a.getArea()<this.getArea()){
            return 1;
        }
        return -1;
    }
}
class Circle extends Shape{
    private double radium = 0;
    Circle(){

    }
    Circle(double radium){
        setRadium(radium);
    }
    public void setRadium(double radium){
        this.radium = radium;
    }
    public double getRadium(){
        return radium;
    }
    @Override
    double getArea() {
        return Math.PI*radium*radium;
    }
    @Override
    public int compareTo(Shape a) {
        if (a.getArea()<this.getArea()){
            return 1;
        }
        return -1;
    }
}

  

分析:

本题的难度较为简单,主要难点在于Comparator.naturalOrder()方法与Comparable接口的compareTo()方法之间的关系,关系主要通过编译器的debug找到,可以发现Comparator.naturalOrder()是一个排序方法,排序规则则是覆写后的compareTo()方法,compareTo()方法是一个int类型方法,对于符合规则的输出正数,反之输出负数,掌握好这些规则则可以很好的解决该题。

 

第二模块顺利结束了,接下来是模块三~~
 

踩坑心得

(1) 第四次大作业:
1.最开始没有使用正则表达式判断数据,导致多个测试点出现问题。(当时代码还存在其他问题,故不给出修改后运行结果)

2. 对于Table桌存在但是后续数据结果出现问题的情况没考虑,修改在table正则表达式前先判断是否存在table即可。

3. 关于桌子的合法处理出现问题,我在处理该情况时,我在判断table格式合法后就将判断条件(用于判断table后续输入是否处理)为false,但忽略了时间不合法也会导致桌号不合法的情况,导致输出出现问题。

4. 关于代点菜的输出数据出现问题,导致卡了很久,因此在处理读数据题目时,要注意输出数据是否正确。

 

(2) 第五次大作业:
1. 输出错误:本题对于桌号没有味道的测试点输出内容最后有一个空格。

  2. 没有考虑特殊菜味道可以为0的情况。

 3. 对于错误信息的处理出现问题,当第一个桌号出现错误时,后面直到第二个桌号前的信息要忽略,故我增加了判断语句来处理输出情况。

 (3) 期中考试:

7-4:

1. 忘记了compareTo方法的输出规则,导致后续排序出现问题。

2. 对于Compara类作为接口时,没有强制定义为Shape,导致方法传参只能传Object类。

 

主要困难及改进建议

主要困难:综上所述,个人认为本两次大作业的难点不在于语法,主要在于对于不同数据的处理以及代码的算法设计。如第一次大作业,在对错误信息处理的同时,我要满足错误信息输出"wrong format",但是还要做到没有正确桌号存在时要忽略点菜信息,同时还要保证菜单输入不受影响,还要保证当正确桌号创建后要忽略后续的菜单输入同时要输出错误语句。后面对于桌号合并以及订单合并也是一个难点,主要问题体现在计价问题上,需要大概计价结果,容易疏忽。第二题难点在于如何处理好桌号订单味道以及在代点特殊菜存在的情况下,如何保证价格计算在当前桌但是味道计算在代点桌同时不能计算在当前桌。我运用了最笨的方法,通过在订单类中加入味道值属性,当点单特殊菜时相应赋值,但在代点特殊菜时,提取数据然后按照普通菜处理,但是不给其订单味道赋值,在用单独的方法把味道赋值给代点桌。再来聊聊关于期中的主要困难,此次期中考试较为简单,难点在最后一题对于Compara类的接口,以及对comePare方法的覆写,难点在于对新知识的不熟悉,解决方法为运用编译器的debug功能查找关系即可。

改进建议:虽然菜单题目可能没有迭代了,但是还是得分析我的代码的改进方向。菜单四:本题在正则表达式识别完数据后,后续对于数据的处理过于冗杂,我个人认为可以新建一个数据类,当识别到不同的操作后相应调用方法进行数据的进一步处理,后续还可增加一个输出类,把输出总和在一起,将代码进一步拆分,再可以把对于普通价格计算和特殊菜价格计算方法合并,避免代码过于冗杂。菜单五:在菜单四的基础上,可以将lastPrint计个人总价的功能放在personPay类中。

 

总结

本次博客终于接近尾声啦!!!!接下来是第四、第五次大作业以及期中考试的总结。

收获:这两次大作业我在设计的过程中更多的是为了完成测试点而设计代码,导致这两次大作业的设计思路显得过于混乱,如果面对未来的迭代,可能要重新设计,故此次收获主要在后续的反思。这两次设计我犯了一个设计上的错误,代码的可拓展性低、代码耦合度较高,修改思路主要在改进建议中。同时,这两次大作业以及期中考试很好地考察了我对于类的关系的处理,如依赖(大量存在于大作业四和五中,如大作业四判断是否同一桌的方法,大作业五中代点特殊菜赋值味道方法)、聚合(大量存在,如作业四和五中菜单类中聚合Dish类),以及类的继承和接口,以及抽象类的运用。最后,谈谈我个人悟到的设计思路,在进行设计的过程中,要先想好设计的大致方向,在对设计需要的功能进行碎片化设计,尽量降低代码耦合度,最后将代码拼装好。

 

好了,本次博客到此结束,下次再见,拜拜~

 

posted on 2023-05-17 00:06  一坨答辩  阅读(54)  评论(0编辑  收藏  举报