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
分析如下:根据输入信息的长度,可以分出来是菜单还是订单或者桌号,特色菜之类的东西,然后根据每个数据创建属于它本身的类,然后判断输入信息是否有错误,如果有则返回题目要求的错误返回,如果没有则进入保存的阶段。在根据每个桌子上的点单记录计算出每个桌子的价钱。
源码如下:
//package CAIDAN; import java.text.ParseException; import java.time.DateTimeException; import java.time.Duration; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { ArrayList<Table> tables = new ArrayList<Table>();//用链表收集桌子 Scanner input = new Scanner(System.in); String data ; Menu menu = new Menu();//菜单类 int portion, copies;//份额 int i; while (true) {// 输入菜单 Dish dish = new Dish(); data = input.nextLine(); if (data.matches("[\\S]* [1-9][\\d]*")||data.matches("[\\S]* [1-9][\\d]* T")) { //表示匹配任意数量的非空白字符(\S)后跟一个空格,再后面是至少一位数字,而且第一位不为0。 //表示匹配任意数量的非空白字符后跟一个空格,再后面是任意数量的数字和一个大写字母T。 //用正则表达式判断格式 String[] letters = data.split(" ");//用空格划分 dish.name = letters[0];//菜品名字 dish.unit_price = Integer.parseInt(letters[1]);//菜品单价 if (dish.unit_price > 300) {//如果大于300 System.out.println(dish.name + " price out of range " + dish.unit_price); //菜谱信息中菜价超出范围(区间(0,300)),输出:菜品名+" price out of range "+价格,菜价必须为数值,最高位不能为0 continue; } if(letters.length==2)//如果只有两个字符,则说明没有特殊菜标志 { dish.isSpecial = false;//标志位为false menu.dishes.add(dish);//用add()函数添加菜品信息 } else if (letters.length==3) {//如果是三个字符,则说明又特殊菜标志 dish.isSpecial = true;//标志位为true menu.dishes.add(dish);//同上 } } else if (data.equals("end")) {//如果是end则break break; } else if (data.matches("table.*")) {//检测是不是table开头 break; } else { System.out.println("wrong format");//返回错误信息wrong format continue; } } while (!data.equals("end")) {//当不是end时 Table table = new Table();//新建一个桌子类 if (data.matches("table.*")) { if (data.matches("table [1-9][\\d]* [\\d]*/[\\d][\\d]?/[\\d][\\d]? [\\d][\\d]?/[\\d][\\d]?/[\\d][\\d]?")) { //"table 数字 数字/数字/数字 数字/数字/数字"//判断一下输入格式 String[] letters = data.split(" ");//用letters数组接收用空格符分开的data String[] Date = letters[2].split("/");//年月日//用Date数组接收被/分开的年月日 String[] Time = letters[3].split("/");//时分秒//用Time数组接收被/分开的时分秒 int[] date = new int[3]; //用于把Date中的字符串修改成int类型 int[] times = new int[3]; //用于把Time中的字符串修改成int类型 for (i = 0; i < 3; i++) { date[i] = Integer.parseInt(Date[i]); //基于循环修改类型 times[i] = Integer.parseInt(Time[i]); //基于循环修改类型 } table.num = Integer.parseInt(letters[1]); if (table.num > 55||table.num<1) { System.out.println(table.num + " table num out of range"); //桌号超出范围[1,55]。输出:桌号 +" table num out of range",桌号必须为1位或多位数值,最高位不能为0, data = input.nextLine(); continue; } try { table.time = LocalDateTime.of(date[0], date[1], date[2], times[0], times[1], times[2]); table.setWeekDay(); table.setPhase(table.time); } catch (DateTimeException e) {//w问题处理 System.out.println(table.num + " date error"); //桌号所带时间格式合法(格式见输入格式部分说明,其中年必须是4位数字,月、日、时、分、秒可以是1位或2位数),数据非法,比如:2023/15/16 ,输出桌号+" date error" data= input.nextLine(); continue; } if (table.inRange()) { //如果时间输入有效但超出范围[2022.1.1-2023.12.31],输出:"not a valid time period" System.out.println("not a valid time period"); data = input.nextLine(); continue; } // 判断桌号是否重复 if (table.isOpen()) { table=table.isSamePhase(table); } } else { System.out.println("wrong format"); data = input.nextLine(); continue; } //如果上面都满足的话就开始本桌点菜// while (true) { data = input.nextLine(); if (data.matches("[1-9][\\d]* [\\S]* [\\d] [1-9][\\d]*")) { //数字 字符串 一位数字 数字 String[] token = data.split(" "); portion = Integer.parseInt(token[2]);//份额 copies = Integer.parseInt(token[3]);//份数 if (table.order.records.size() > 0) { //每桌的点菜记录的序号必须按从小到大的顺序排列(可以不连续,也可以不从1开始),未按序排列序号的输出:"record serial number sequence error"。当前记录忽略。(代点菜信息的序号除外) if (Integer.parseInt(token[0]) <= table.order.records.get(table.order.records.size() - 1).orderNum) { //如果满足就说明没有按照顺序来排 System.out.println("record serial number sequence error"); continue; } } if (menu.searchDish(token[1]) == null) { //代点菜时,桌号不存在,输出"Table number :"+被点菜桌号+" does not exist";本次作业不考虑两桌记录时间不匹配的情况。 System.out.println(token[1] + " does not exist"); continue; } if (portion > 3 || portion < 1) { //份额超出范围(1、2、3)输出:序号+" portion out of range "+份额,份额不能超过1位 System.out.println(Integer.parseInt(token[0]) + " portion out of range " + portion); continue; } if (copies > 15) { //份数超出范围,每桌不超过15份,超出范围输出:序号+" num out of range "+份数。份数必须为数值,最高位不能为0 System.out.println(Integer.parseInt(token[0]) + " num out of range " + copies); continue; } //如果都满足的话就记录此条信息 table.addRecords(menu, token[0], token[1], portion, copies); } //判断是否为删除订单 else if (data.matches("[1-9][\\d]* delete")) { //数字 delete String[] token = data.split(" "); table.order.delARecordByOrderNum(Integer.parseInt(token[0])); } // 判断是否为夹杂菜单 else if (data.matches("[\\S]* [\\d]*")) { //菜谱信息与订单信息混合,应忽略夹在订单信息中的菜谱信息。输出:"invalid dish" System.out.println("invalid dish"); continue; } else if (data.matches("[\\S]* [\\d]* T")) { //菜谱信息与订单信息混合,应忽略夹在订单信息中的菜谱信息。输出:"invalid dish" System.out.println("invalid dish"); continue; } // 判断是否为代点 else if (data.matches("[\\d]* [\\d]* [\\S]* [\\d] [1-9][\\d]*")) { String[] letters = data.split(" "); // 判断代点桌号是否存在 boolean exist = table.isExist(Integer.parseInt(letters[0])); if (exist) { System.out.print(Integer.parseInt(letters[1]) + " table " + table.num + " pay for table " + Integer.parseInt(letters[0]) + " "); Record insteadOrder = new Record(); copies = Integer.parseInt(letters[4]); portion = Integer.parseInt(letters[3]); insteadOrder.dish = menu.searchDish(letters[2]); insteadOrder.portion = portion; insteadOrder.copies =copies; System.out.print(insteadOrder.getPrice() + "\n"); table.discountSum += insteadOrder.getPrice(); } // 若不存在则输出内容 else { System.out.println("Table number :" + Integer.parseInt(letters[0]) + " does not exist"); } } else if (data.equals("end")) { break; } else if(data.matches("table.*")){ break; } else { System.out.println("wrong format"); continue; } } // 本桌点菜结束,进入下一桌 table.getSum(); tables.add(table); } else if (data.matches("t.*")) { System.out.println("wrong format"); if(tables.size()!=0) { table = tables.get(tables.size()-1); } while (true) { data = input.nextLine(); if (data.matches("[1-9][\\d]* [\\S]* [\\d] [1-9][\\d]*")) { String[] letters = data.split(" "); portion = Integer.parseInt(letters[2]); copies = Integer.parseInt(letters[3]); // 判断订单号是否由小到大排列 if (table.order.records.size() > 0) { if (Integer.parseInt( letters[0]) <= table.order.records.get(table.order.records.size() - 1).orderNum) { System.out.println("record serial number sequence error"); continue; } } if (menu.searchDish(letters[1]) == null) { System.out.println(letters[1] + " does not exist"); continue; } if (portion > 3 || portion < 1) { System.out.println(Integer.parseInt(letters[0]) + " portion out of range " + portion); continue; } if (copies > 15) { System.out.println(Integer.parseInt(letters[0]) + " num out of range " +copies); continue; } table.addRecords(menu, letters[0], letters[1], portion, copies); } // 判断是否为删除订单 else if (data.matches("[1-9][\\d]* delete")) { String[] token = data.split(" "); table.order.delARecordByOrderNum(Integer.parseInt(token[0])); } // 判断是否为夹杂菜单 else if (data.matches("[\\S]* [\\d]*")) { System.out.println("invalid dish"); continue; } else if (data.matches("[\\S]* [\\d]* T")) { System.out.println("invalid dish"); continue; } // 判断是否为代点 else if (data.matches("[\\d]* [\\d]* [\\S]* [\\d] [1-9][\\d]*")) { String[] token = data.split(" "); // 判断代点桌号是否存在 boolean exist = false; for (int j = 0; j < tables.size(); j++) { if (tables.get(j).num == Integer.parseInt(token[0])) { exist = true; break; } } if (exist) { System.out.print(Integer.parseInt(token[1]) + " table " + table.num + " pay for table " + Integer.parseInt(token[0]) + " "); Record insteadOrder = new Record(); insteadOrder.dish = menu.searchDish(token[2]); portion = Integer.parseInt(token[3]); copies = Integer.parseInt(token[4]); insteadOrder.portion = portion; insteadOrder.copies = copies; System.out.print(insteadOrder.getPrice() + "\n"); table.discountSum += insteadOrder.getPrice(); } // 若不存在则输出内容 else { System.out.println("Table number :" + Integer.parseInt(token[0]) + " does not exist"); } } else if (data.equals("end")) { break; } else { System.out.println("wrong format"); continue; } } if (tables.size() != 0) { tables.remove(tables.size() - 1); table.discountSum = 0; table.sum = 0; table.getSum(); tables.add(table); } } else { data = input.nextLine(); continue; } } // 最终输出桌号订单信息 for (i = 0; i < tables.size(); i++) { if (tables.get(i).isOpen()) { System.out .println("table " + tables.get(i).num + ": " + tables.get(i).sum + " " + tables.get(i).discountSum); } else System.out.println("table " + tables.get(i).num + " out of opening hours"); } } static class Dish { String name; int unit_price; boolean isSpecial = false; } static class Record { int orderNum; Dish dish; int portion; int copies; boolean isDeleted = false; int getPrice() { if (portion == 2) return (int) Math.round(1.5 * dish.unit_price) * copies; else if (portion == 3) return 2 * dish.unit_price * copies; else return dish.unit_price * copies; } } static class Menu { ArrayList<Dish> dishes = new ArrayList<Dish>(); Dish searchDish(String dishName) { for (int i = 0; i < dishes.size(); i++) { if (dishName.equals(dishes.get(i).name)) { return dishes.get(i); } } return null; } } static class Order { ArrayList<Record> records = new ArrayList<Record>(); Record record; Record addARecord(int orderNum, String dishName, int portion, int copies, Menu menu) { record = new Record(); record.orderNum = orderNum; record.dish = menu.searchDish(dishName); record.portion = portion; record.copies = copies; System.out.println(record.orderNum + " " + record.dish.name + " " + record.getPrice()); return record; } boolean delARecordByOrderNum(int orderNum) { int i = 0, flag = 0; for (i = 0; i < records.size(); i++) { if (records.get(i).orderNum == orderNum) { if (records.get(i).isDeleted == false) { records.get(i).isDeleted = true; } else { System.out.println("deduplication " + orderNum); } flag++; } } if (flag == 0) { System.out.println("delete error;"); return false; } return true; } } static class Table { Order order = new Order(); int num; LocalDateTime time; int phase;//时区,中午1,晚上2 int weekDay; long discountSum = 0; long sum = 0; ArrayList<Table> tables=new ArrayList<>(); void addRecords(Menu menu, String str1, String str2, int portion, int copies) { { order.records.add(order.addARecord(Integer.parseInt(str1), str2, portion, copies, menu)); } } void setWeekDay() { weekDay = time.getDayOfWeek().getValue(); } boolean inRange(){ if(!(time.isAfter(LocalDateTime.of(2022, 1, 1, 0, 0, 0)) &&time.isBefore(LocalDateTime.of(2024, 1, 1, 0, 0, 0)))) { return true; } return false; } void getSum() { for (Record record : order.records) { if (!record.isDeleted) { double price = record.getPrice(); sum += price; double discountPrice = getDiscountPrice(record, price); discountSum += discountPrice; } } } double getDiscountPrice(Record record, double price) { if (record.dish.isSpecial) { if (weekDay > 0 && weekDay < 6) { return Math.round(price * 0.7); } else { return price; } } else { if (weekDay > 0 && weekDay < 6) { if (time.getHour() >= 17 && time.getHour() < 20 || time.getHour() == 20 && time.getMinute() <= 30) { return Math.round(price * 0.8); } else if (time.getHour() >= 10 && time.getHour() < 14 || time.getHour() == 14 && time.getMinute() <= 30) { return Math.round(price * 0.6); } } return price; } } void setPhase(LocalDateTime time){ int phase=0; /**在中午*/ if(time.isAfter(LocalDateTime.of(time.getYear(), time.getMonth(), time.getDayOfMonth(), 10, 30, 0)) &&time.isBefore(LocalDateTime.of(time.getYear(), time.getMonth(), time.getDayOfMonth(), 14, 30, 0))) { phase=1; } /**在晚上*/ if(time.isAfter(LocalDateTime.of(time.getYear(), time.getMonth(), time.getDayOfMonth(), 17, 0, 0)) &&time.isBefore(LocalDateTime.of(time.getYear(), time.getMonth(), time.getDayOfMonth(), 20, 30, 0))) { phase= 2; } } boolean isOpen() { if (weekDay > 0 && weekDay < 6) { if ((time.getHour() >= 17 && time.getHour() < 20) || (time.getHour() == 20 && time.getMinute() <= 30) || (time.getHour() > 10 && time.getHour() < 14) || (time.getHour() == 10 && time.getMinute() >= 30) || (time.getHour() == 14 && time.getMinute() <= 30)) return true; } else { if ((time.getHour() > 9 && time.getHour() < 21) || (time.getHour() == 9 && time.getMinute() >= 30) || (time.getHour() == 21 && time.getMinute() <= 30)) return true; } return false; } Table isSamePhase(Table table){ int flag=-1; for (int i = 0; i < tables.size(); i++) { // 有重复的桌号 if (table.num == tables.get(i).num && tables.get(i).isOpen()) { Duration duration = Duration.between(table.time, tables.get(i).time); // 同一天 if (duration.toDays() == 0) { // 在周一到周五 if (table.weekDay > 0 && table.weekDay < 6) { // 在同一时间段 if (table.phase==tables.get(i).phase&&table.phase!=0) { flag=1; table = tables.get(i); return table; } } // 在周末 else { // 时间相差小于一小时 if (duration.toHours() < 3600) { flag=1; table = tables.get(i); return table; } } } } else if(table.num == tables.get(i).num && !tables.get(i).isOpen()){ System.out.println("table "+tables.get(i).num+" out of opening hours"); return table; } } //没有重复的在同一时段的桌号 if(flag==-1){ System.out.println("table " + table.num + ": "); } return table; } boolean isExist(int num){ for (int j = 0; j < tables.size(); j++) { if (tables.get(j).num == num) { return true; } } return false; } } }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
主要思路:跟菜单计价四很像,主要多了一些功能,处理特色菜的时候要多注意口味和地区菜的不同,只是多了一些判断,也比较好处理。另一个就是多了一个手机号的功能,也就是多了一些判断。
类图如下:
源码如下:
//package CAIDAN5; import java.util.Scanner; import java.util.ArrayList; import java.util.Calendar; public class Main{ public static void main(String[] args) { Menu menu = new Menu();//菜单类 int i,j = 0,k,f = 0,s,a = 0,b,c,flag = 0;//初始化定义 int average;//初始化定义 Scanner input = new Scanner(System.in); int[] flags = new int[100];//定义一个数组 double[] Specialdiscount = new double[100];//定义特色菜数组 double[] discount = new double[100];//定义discount数组 ArrayList<Table> tables = new ArrayList<>();//桌子链表 ArrayList<Customer> customers = new ArrayList<>();//顾客的链表 ArrayList<String> Data = new ArrayList<>();//输入的链表 for(i = 0;i<100;i++) { flags[i] = 0;//将flag数组全部赋值为0 } i = 0;//将i归0 String data = input.nextLine();//输入的东西存放在data里 while(!data.equals("end")) {//当data不是end时继续输入,否则停止 Data.add(data);//添加数据 data = input.nextLine();//继续输入 } Data.add(data);//输入信息 while(!Data.get(i).contains("table")) {//i从0开始自增,取出保存的每一句话,当这句话中不包含table时说明还在执行菜品的输入 String[] dish = Data.get(i).split(" ");//创建菜单,根据空格符分开这一输入 if (Data.get(i).matches(".+\\s[\\d]+")) {//整个正则表达式的含义是:匹配一个或多个任意字符,后面紧跟一个空白字符,然后后面是一个或多个数字字符。 //例如 麻辣鸡丝 10 int price = Integer.parseInt(dish[1]);//将价格保存在dish[1],并将价格赋值给price menu.addDish(dish[0], price);//菜名和单价,往菜单里加一道菜,调用函数 } else if (Data.get(i).matches(".+\\s.{2}\\s[\\d]+\\sT")) {//整个正则表达式的含义是:匹配一个或多个任意字符,后面紧跟一个空白字符,然后是任意两个字符,再后面是一个空白字符,紧接着是一个或多个数字字符,最后以一个空白字符和大写字母 "T" 结尾。 //例如 麻婆豆腐 川菜 12 T int price = Integer.parseInt(dish[2]); //此时的价格将会存在dish[2]中,转换成int格式赋值给price menu.addSpecialDish(dish[0], dish[1], price);//调用函数 } else System.out.println("wrong format");//如果都不符合则输出“wrong format”格式 i++;//i 自增 } int d = menu.dishs.size(); for(b = d - 1;b > 0;b--) { for(c = b-1;c >= 0;c--) { if(menu.dishs.get(b).name.equals(menu.dishs.get(c).name)) { menu.dishs.remove(c); } } } while(!Data.get(i).contains("end")) {//同上,当不是end时继续执行下面的语句 if(Data.get(i).contains("table")) {//此次是对含有table语句的处理 if(Data.get(i).matches("table\\s.+\\s\\:\\s[\\w]{1,10}" + "\\s(180|181|189|133|135|136)[\\d]{8}" + "\\s[1-9][\\d]{3}/[\\d]{1,2}/[\\d]{1,2}\\s" + "[\\d]{1,2}/[\\d]{1,2}/[\\d]{1,2}"))//例如 table 1 : tom 13605054400 2023/5/1 21/30/00 //整个正则表达式的含义是:匹配 "table" 后面紧跟一个空白字符, // 然后是一个或多个任意字符,再后面是一个冒号和一个空白字符, // 接着是 1 到 10 个单词字符的字符串,然后是中国大陆常见手机号段之一, // 然后是恰好 8 位数字,再后面是符合 yyyy/mm/dd 格式的日期, // 最后是符合 hh/mm/ss 时间格式的时间。 { String[] tables1 =Data.get(i).split(" ");//创建桌子 int num = Integer.parseInt(tables1[1]); String[] date = tables1[5].split("/");//时间 String[] time = tables1[6].split("/");//时间 int[] Date = new int[date.length]; int[] Time = new int[time.length]; for(k = 0;k < date.length;k++) Date[k] = Integer.parseInt(date[k]); for(k = 0;k < time.length;k++) Time[k] = Integer.parseInt(time[k]); Table table = new Table(tables1[1],tables1[3],tables1[4],tables1[5],tables1[6]); //对顾客的桌号,姓名,手机号,时间做记录 tables.add(table); //在tables链表中添加该数据 j++;//桌子数增加 flag = 1; a = 0; if(Table.weekday(Date[0],Date[1],Date[2]) >= 1&& Table.weekday(Date[0],Date[1],Date[2]) <= 5) { Specialdiscount[j-1] = 0.7;//周一至周五七折 if((Time[0] >= 17&&Time[0]<=19)||(Time[0] == 20&&Time[1] <= 29)|| (Time[0] == 20&&Time[1] == 30&&Time[2] == 0)) { discount[j-1] = 0.8;//周一至周五营业时间与折扣:晚上(17:00-20:30)8折, System.out.println("table "+num+": "); } else if((Time[0] >= 11&&Time[0] <= 13)|| ((Time[0] == 10||Time[0] == 14)&&Time[1] <= 29)|| ((Time[0] == 10||Time[0] == 14)&&Time[1] == 30&&Time[2] == 0)) { discount[j-1] = 0.6;//周一至周五中午(10:30--14:30)6折, System.out.println("table "+num+": "); } else { System.out.println("table " + num + " out of opening hours");//其余时间不营业 flags[f] = 1; } } else if(Table.weekday(Date[0],Date[1],Date[2]) == 6|| Table.weekday(Date[0],Date[1],Date[2]) == 7) { Specialdiscount[j-1] = 1;//全价 if((Time[0] >= 10&&Time[0] <= 20)) { discount[j-1] = 1; System.out.println("table "+num+": "); } else if(Time[0] == 21 && Time[1] <= 29 || Time[0] == 21 && Time[1] == 30 && Time[2] == 0){ discount[j-1] = 1; System.out.println("table "+num+": "); } else { System.out.println("table " + num + " out of opening hours");//其余时间不营业 flags[f] = 1; } } f++; } else {System.out.println("wrong format"); flag = 0; } } else if(flag == 1&&flags[f-1]==0){ if(Data.get(i).contains("delete")) {//处理包含delete信息的操作 String[] deletes = Data.get(i).split(" "); int num = Integer.parseInt(deletes[0]); if(tables.get(j-1).getOrder().findRecordByNum(num)){//找到该记录 tables.get(j-1).getOrder().delARecordByOrderNum(num); } else { System.out.println("delete error");//删除错误 } } else { String[] dishs1 =Data.get(i).split(" ");//存入一条点菜记录 if(dishs1.length == 4) { int Num = Integer.parseInt(dishs1[0]);//点菜序号 int portion = Integer.parseInt(dishs1[2]);//份量 int number = Integer.parseInt(dishs1[3]);//份数 if(menu.searthDish(dishs1[1]) != -1) {//该菜品存在 tables.get(j-1).getOrder().addARecord(Num, menu.dishs.get(menu.searthDish(dishs1[1])),portion,number,discount[j-1]);//添加一条菜品信息 System.out.println(tables.get(j-1).getOrder().records.get(a).orderNum//输出订单信息 +" "+tables.get(j-1).getOrder().records.get(a).d.name+" "+ tables.get(j-1).getOrder().records.get(a).getPrice()); a++; } else System.out.println(dishs1[1]+" does not exist"); } else if(dishs1.length == 5) { int Num = Integer.parseInt(dishs1[0]);//点菜序号 int lever = Integer.parseInt(dishs1[2]);//口味度 int portion = Integer.parseInt(dishs1[3]);//份量 int number = Integer.parseInt(dishs1[4]);//份数 if(menu.searthDish(dishs1[1]) != -1) {//该菜品存在 if((menu.checkType(dishs1[1]).equals("川菜") &&(lever<=5&&lever>=0))|| (menu.checkType(dishs1[1]).equals("晋菜") &&(lever<=4&&lever>=0))|| (menu.checkType(dishs1[1]).equals("浙菜") &&(lever<=3&&lever>=0))) { tables.get(j-1).getOrder().addARecord(Num, menu.dishs.get(menu.searthDish(dishs1[1])),lever,portion,number,Specialdiscount[j-1]);//添加一条菜品信息 System.out.println(tables.get(j-1).getOrder().records.get(a).orderNum//输出订单信息 +" "+tables.get(j-1).getOrder().records.get(a).d.name+" "+ tables.get(j-1).getOrder().records.get(a).getPrice()); a++; } else { if(menu.checkType(dishs1[1]).equals("川菜") &&!(lever<=5&&lever>=0)){ System.out.println("spicy num out of range :"+lever); } //单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值, // spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出, // 例如: //acidity num out of range : 5 else if(menu.checkType(dishs1[1]).equals("晋菜") &&!(lever<=4&&lever>=0)) { System.out.println("acidity num out of range :"+lever); } //单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值, // spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出, // 例如: //acidity num out of range : 5 else if(menu.checkType(dishs1[1]).equals("浙菜") &&!(lever<=3&&lever>=0)) { System.out.println("sweetness num out of range :"+lever); } //单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值, // spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出, // 例如: //acidity num out of range : 5 } } else System.out.println(dishs1[1]+" does not exist"); //否则输出 //如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名 } else {//代点菜 int subTableNum = Integer.parseInt(dishs1[0]); int Num = Integer.parseInt(dishs1[1]);//点菜序号 int lever = Integer.parseInt(dishs1[3]);//口味度 int portion = Integer.parseInt(dishs1[4]);//份量 int number = Integer.parseInt(dishs1[5]);//份数 int subOrder = 0; for(s = 0;s < tables.size();s++) { if(tables.get(s).tableNum.equals(dishs1[0])) { subOrder = s; } } if(menu.searthDish(dishs1[2]) != -1) {//该菜品存在 if((menu.checkType(dishs1[2]).equals("川菜") &&(lever<=5&&lever>=0))|| (menu.checkType(dishs1[2]).equals("晋菜") &&(lever<=4&&lever>=0))|| (menu.checkType(dishs1[2]).equals("浙菜") &&(lever<=3&&lever>=0))) { tables.get(subOrder).getOrder().addARecord(Num, menu.dishs.get(menu.searthDish(dishs1[2])),lever,portion,number,Specialdiscount[j-1],1);//添加一条菜品信息 tables.get(j-1).getOrder().addARecord(1,Num, menu.dishs.get(menu.searthDish(dishs1[2])),lever,portion,number,Specialdiscount[j-1]);//添加一条菜品信息 System.out.println(Num+" table "+tables.get(j-1).tableNum+" pay for table "+subTableNum+" "+ tables.get(j-1).getOrder().records.get(a).getPrice()); a++; } else { if(menu.checkType(dishs1[1]).equals("川菜") &&!(lever<=5&&lever>=0)){ System.out.println("spicy num out of range :"+lever); } //单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值, // spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出, // 例如: //acidity num out of range : 5 else if(menu.checkType(dishs1[1]).equals("晋菜") &&!(lever<=4&&lever>=0)) { System.out.println("acidity num out of range :"+lever); } //单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值, // spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出, // 例如: //acidity num out of range : 5 else if(menu.checkType(dishs1[1]).equals("浙菜") &&!(lever<=3&&lever>=0)) { System.out.println("sweetness num out of range :"+lever); } //单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值, // spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出, // 例如: //acidity num out of range : 5 } } else System.out.println(dishs1[2]+" does not exist"); // } } } } i++; } for(i = 0;i < tables.size();i++) { if(flags[i] == 0) { System.out.print("table "+tables.get(i).tableNum+": "+ tables.get(i).getOrder().getTotalPrice()+" "+ tables.get(i).getOrder().getDiscountTotalPrice()); if(tables.get(i).getOrder().getDishNum("川菜") != 0) { average = (int)(tables.get(i).getOrder().getAverageLever("川菜")/ tables.get(i).getOrder().getDishNum("川菜") +0.5); System.out.print(" 川菜 "+(int)tables.get(i).getOrder().getDishNum("川菜")); if(average == 0) System.out.print(" 不辣"); else if(average == 1) System.out.print(" 微辣"); else if(average == 2) System.out.print(" 稍辣"); else if(average == 3) System.out.print(" 辣"); else if(average == 4) System.out.print(" 很辣"); else if(average == 5) System.out.print(" 爆辣"); } if(tables.get(i).getOrder().getDishNum("晋菜") != 0) { average = (int)(tables.get(i).getOrder().getAverageLever("晋菜")/ tables.get(i).getOrder().getDishNum("晋菜") +0.5); System.out.print(" 晋菜 "+(int)tables.get(i).getOrder().getDishNum("晋菜")); if(average == 0) System.out.print(" 不酸"); else if(average == 1) System.out.print(" 微酸"); else if(average == 2) System.out.print(" 稍酸"); else if(average == 3) System.out.print(" 酸"); else if(average == 4) System.out.print(" 很酸"); } if(tables.get(i).getOrder().getDishNum("浙菜") != 0) { average = (int)(tables.get(i).getOrder().getAverageLever("浙菜")/ tables.get(i).getOrder().getDishNum("浙菜") +0.5); System.out.print(" 浙菜 "+(int)tables.get(i).getOrder().getDishNum("浙菜")); if(average == 0) System.out.print(" 不甜"); else if(average == 1) System.out.print(" 微甜"); else if(average == 2) System.out.print(" 稍甜"); else if(average == 3) System.out.print(" 甜"); } System.out.print("\n"); } //川菜增加辣度值:辣度0-5级;对应辣度水平为:不辣、微辣、稍辣、辣、很辣、爆辣; // //晋菜增加酸度值,酸度0-4级;对应酸度水平为:不酸、微酸、稍酸、酸、很酸; // //浙菜增加甜度值,甜度0-3级;对应酸度水平为:不甜、微甜、稍甜、甜; } for(i = 0;i < tables.size();i++){ for(j = 0;j < i;j++){ if(tables.get(i).customerName.equals(tables.get(j).customerName)) break;} if(i==j) { Customer customer = new Customer(tables.get(i).customerName,tables.get(i).number); customers.add(customer); } } for(i = 0;i < customers.size();i++) { for(j = 0;j < tables.size();j++) { if(customers.get(i).name.equals(tables.get(j).customerName)) { customers.get(i).TotalPrice = customers.get(i).TotalPrice + tables.get(j).getOrder().getDiscountTotalPrice(); } } } String Cname ; String Cnumber ; int Tprice; for(i = 0;i < customers.size()-1;i++) { for(j = 0;j < customers.size() - i - 1;j++) { if(customers.get(j).name.compareToIgnoreCase(customers.get(j+1).name) > 0) { Cname = customers.get(j).name; customers.get(j).name = customers.get(j+1).name; customers.get(j+1).name = Cname; Cnumber = customers.get(j).number; customers.get(j).number = customers.get(j+1).number; customers.get(j+1).number = Cnumber; Tprice = customers.get(j).TotalPrice; customers.get(j).TotalPrice = customers.get(j+1).TotalPrice; customers.get(j+1).TotalPrice = Tprice; } } } for(i = 0;i < customers.size();i++) { if(flags[i] == 0) { System.out.println(customers.get(i).name+" "+customers.get(i).number+" "+customers.get(i).TotalPrice); } } } } class Customer{ String name;//姓名 String number;//手机号 // Table[] table = new Table[100]; int TotalPrice = 0; public Customer(String name,String number) { this.name = name; this.number = number; } } class Table{ String tableNum;//桌子序号 String customerName;//顾客姓名 String number;//顾客手机号 String date; String time; Order order = new Order(); public Table(String tableNum,String customerName,String number,String date,String time){ this.tableNum = tableNum; this.customerName = customerName; this.number = number; this.date = date; this.time = time; } Order getOrder() { // order = new Order(); return this.order; } public static int weekday(int year, int month, int day){ Calendar cal = Calendar.getInstance(); //月份要减一,在西方周日是一周的第1天(日期也需要减一) cal.set(year,month-1,day-1); return cal.get(Calendar.DAY_OF_WEEK); } } class Dish{ String name;//菜名 String type = " ";//菜系 int unit_price;//菜品单价 public Dish(String name,int unit_price){ this.name = name; this.unit_price = unit_price; } public Dish(String name,String type,int unit_price) { this.name = name; this.type = type; this.unit_price = unit_price; } public int getPrice(int portion){ int price = 0; if(portion == 1){ price = unit_price; } else if(portion == 2){ price = (int)(1.5*unit_price+0.5); } else if(portion == 3){ price = (2*unit_price); } return price; } } class Menu{ ArrayList<Dish> dishs = new ArrayList<>(); public Menu(){ } int i = 0; int searthDish(String dishName){ for(i = 0;i < dishs.size();i++) if((dishs.get(i).name).equals(dishName)){ break; } if(i < dishs.size()) return i; else return -1; } String checkType(String dishName) { for(i = 0;i < dishs.size();i++) if((dishs.get(i).name).equals(dishName)){ break; } return dishs.get(i).type; } void addDish(String dishName,int unit_price){ Dish dish = new Dish(dishName,unit_price); dishs.add(dish); } void addSpecialDish(String dishName,String type,int unit_price) { Dish dish = new Dish(dishName,type,unit_price); dishs.add(dish); } } class Record{ int orderNum;//序号 Dish d;//菜品 int lever = 0;//口味度 int portion;//份额 int num;//份数 double discount; int sign = 0; int sign2 = 0; public Record(int orderNum,Dish d,int portion,int num,double discount){ this.orderNum = orderNum; this.d = d; this.portion = portion; this.num = num; this.discount = discount; } public Record(int orderNum,Dish d,int lever,int portion,int num,double discount){ this.orderNum = orderNum; this.d = d; this.lever = lever; this.portion = portion; this.num = num; this.discount = discount; } public Record(int sign2,int orderNum,Dish d,int lever,int portion,int num,double discount){ this.sign2 = sign2; this.orderNum = orderNum; this.d = d; this.lever = lever; this.portion = portion; this.num = num; this.discount = discount; } public Record(int orderNum,Dish d,int lever,int portion,int num,double discount,int sign){ this.orderNum = orderNum; this.d = d; this.lever = lever; this.portion = portion; this.num = num; this.discount = discount; this.sign = sign; } int getPrice(){//计价,计算本条记录的价格 return d.getPrice(portion)*num; } int getDiscountPrice() { return (int)(d.getPrice(portion)*num*discount+0.5); } int getLever() { return num * lever; } } class Order { int totalprice = 0; int Lever = 0; double dishNum = 0; int i = 0,a= 0; ArrayList<Record> records = new ArrayList<>(); int getTotalPrice(){//计算订单的总价 totalprice = 0; for(i = 0;i < records.size();i++) { if(records.get(i).sign == 0) { a = records.get(i).getPrice(); totalprice += a; } } return totalprice; } int getDiscountTotalPrice() { totalprice = 0; for(i = 0;i < records.size();i++) { if(records.get(i).sign == 0) { a = records.get(i).getDiscountPrice(); totalprice += a; } } return totalprice; } int getAverageLever(String type) {//输出指定菜系的口味值 Lever = 0; switch (type) { case "川菜": case"晋菜": case "浙菜": { for (i = 0; i < records.size(); i++) { if (records.get(i).sign2 == 0 && records.get(i).d.type.equals(type)) { Lever = Lever + records.get(i).getLever(); } } break; } default: return 0;// 如果不是"川菜"、"晋菜"或"浙菜",可以选择在这里处理默认情况 } return Lever; } double getDishNum(String type) {//输出指定菜系的总份数 dishNum = 0; switch (type) { case "川菜": case"晋菜": case "浙菜": { for(i = 0;i < records.size();i++) { if(records.get(i).sign2 == 0) { if(records.get(i).d.type.equals(type)) dishNum = dishNum + records.get(i).num; } } break; } default: return 0;// 如果不是"川菜"、"晋菜"或"浙菜",可以选择在这里处理默认情况 } return dishNum; } void addARecord(int orderNum,Dish d,int portion,int num,double discount){ Record record = new Record(orderNum,d,portion,num,discount); records.add(record); }//添加一条菜品信息到订单中。 void addARecord(int orderNum,Dish d,int lever,int portion,int num,double discount){ Record record = new Record(orderNum,d,lever,portion,num,discount); records.add(record); }//添加一条菜品信息到订单中。 void addARecord(int orderNum,Dish d,int lever,int portion,int num,double discount,int sign){ Record record = new Record(orderNum,d,lever,portion,num,discount,sign); records.add(record); }//添加一条菜品信息到订单中。 void addARecord(int sign2,int orderNum,Dish d,int lever,int portion,int num,double discount){ Record record = new Record(sign2,orderNum,d,lever,portion,num,discount); records.add(record); }//添加一条菜品信息到订单中。 void delARecordByOrderNum(int orderNum){ records.remove(orderNum-1); }//根据序号删除一条记录 boolean findRecordByNum(int orderNum){//根据序号查找一条记录 for(i = 0;i < records.size();i++) if(records.get(i).orderNum == orderNum){ break; } return i != records.size(); } }
期中考试:
7-1 测验1-圆类设计 分数 10 作者 段喜龙 单位 南昌航空大学创建一个圆形类(Circle),私有属性为圆的半径,从控制台输入圆的半径,输出圆的面积
输入格式:
输入圆的半径,取值范围为(0,+∞)
,输入数据非法,则程序输出Wrong Format
,注意:只考虑从控制台输入数值的情况
输出格式:
输出圆的面积(保留两位小数,可以使用String.format(“%.2f”,输出数值)控制精度)
输入样例:
在这里给出一组输入。例如:
2.35
输出样例:
在这里给出相应的输出。例如:
17.35
主要思路:此题比较简单
类图如下:
源码如下:
//package class_pta; import java.util.Scanner; class Circle { private double radius; Circle(double radius) { this.radius = radius; } double getArea() { return Math.PI * radius * radius; } } public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); double r = input.nextDouble(); if (r>0) { Circle circle = new Circle(r); System.out.print(String.format("%.2f", circle.getArea())); } else { System.out.print("Wrong Format"); } } }7-2 测验2-类结构设计 分数 10 作者 段喜龙 单位 南昌航空大学
设计一个矩形类,其属性由矩形左上角坐标点(x1,y1)及右下角坐标点(x2,y2)组成,其中,坐标点属性包括该坐标点的X轴及Y轴的坐标值(实型数),求得该矩形的面积。类设计如下图:
输入格式:
分别输入两个坐标点的坐标值x1,y1,x2,y2。
输出格式:
输出该矩形的面积值(保留两位小数)。
输入样例:
在这里给出一组输入。例如:
6 5.8 -7 8.9
输出样例:
在这里给出相应的输出。例如:
40.30
此题也比较简单:
//package class_pta; import java.util.*; public class Main { public static void main(String[] args) { double x1,x2,y1,y2; Scanner input = new Scanner(System.in); x1 = input.nextDouble(); y1 = input.nextDouble(); x2 = input.nextDouble(); y2 = input.nextDouble(); Point point1 = new Point(x1,y1); Point point2 = new Point(x2,y2); Rectangle rectangle = new Rectangle(point1,point2); System.out.print(String.format("%.2f", rectangle.getArea())); } } class Point{ Point(){ } Point(double x,double y){ setX(x); setY(y); } double x; double y; double getX(){ return this.x; } void setX(double x) { this.x = x; } double getY(){ return this.y; } void setY(double y){ this.y = y; } } class Rectangle{ Point topLeftPoint; Point lowerRightPoint; Rectangle(){ } Rectangle(Point topLeftPoint,Point lowerRightPoint){ setTopLeftPoint(topLeftPoint); setLowerRightPoint(lowerRightPoint); } Point getTopLeftPoint(){ return this.topLeftPoint; } void setTopLeftPoint(Point topLeftPoint){ this.topLeftPoint = topLeftPoint; } Point getLowerRightPoint(){ return this.lowerRightPoint; } void setLowerRightPoint(Point lowerRightPoint){ this.lowerRightPoint = lowerRightPoint; } double getLength(){ return Math.abs(getLowerRightPoint().getX() - getTopLeftPoint().getX()); } double getHeight(){ return Math.abs(getLowerRightPoint().getY() - getTopLeftPoint().getY()); } double getArea(){ return getHeight() * getLength(); } }
标签:输出,菜单,get,期中考试,PTA,int,num,table,out From: https://www.cnblogs.com/Kaceyluck/p/17837162.html