一:总结
pta4,5和期中的作业其实主要用于对所学知识的练习,第六次作业只有一到成绩题目有一定的难度,后两次作业的题目这相对简单一些。
作业尽力去完成,虽然有些不完美,但已经尽了全力。七,八次作业折相对简单一些,完成情况也相对好一点。
二:作业实现
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 MBimport java.text.ParseException; import java.text.SimpleDateFormat; import java.time.DateTimeException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) { return nowTime.getTime() > endTime.getTime() || nowTime.getTime() < beginTime.getTime(); } public static boolean judgeMIN(){ // 获取创建指定时间 try { } catch (DateTimeException g) { return false; } return true; } public static boolean table(int []a,int b,int c){ for(int i=0;i<b;i++)if(a[i]==c)return true; return false; } public static boolean SearchNumber(String a){ String regExp="^[0-9]*[1-9][0-9]*$"; //得到一个模式对象 Pattern pattern = Pattern.compile(regExp); //创建匹配器 Matcher matcher = pattern.matcher(a); return !matcher.matches(); } public static boolean SearchChinese(String a){ a = a.toLowerCase(); // 匹配的字符串的正则表达式 String regCharset = "[\\u4E00-\\u9FFF]+"; Pattern p = Pattern.compile(regCharset); Matcher matcher = p.matcher(a); return matcher.matches(); } public static boolean delete(int []a,int b,int c){ for(int i=0;i<b;i++)if(a[i]==c)return false; return true; } public static boolean special(String []nom,String dis,int nor){ for(int i=0;i<nor;i++){ if(nom[i].equals(dis))return false; } return true; } public static int week(int y, int m, int d) { int num; if (m == 1 || m == 2) { m += 12; y--; } int a = y / 100; int b = y % 100; num = (a / 4) - 2 * a + b + (b / 4) + (13 * (m + 1) / 5) + d - 1; return num % 7; } class mu{ String name; boolean crossRiver=false; boolean isAlive=true; boolean hasCross; public void showStatus(){ if(this.crossRiver) System.out.println("farmer has cross:true."); else System.out.println("farmer has cross:false."); } } public static void main(String[] args) throws ParseException { SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy/MM/dd"); Date date1=simpleDateFormat.parse("2022/1/1"); Date date2=simpleDateFormat.parse("2023/12/31"); Date date3=null; int year, month, day, hh, mm,ss=0; double ts = 0; Scanner input = new Scanner(System.in); String ds; int wek = 0; int cn = 1; String[] put = new String[100]; String t,pr; String num = ""; String time; String h = ""; String str; String []str1; int nor=0; String [] normal=new String[100]; HashMap<String, Integer> menu = new HashMap<>(); while (true) { str=input.nextLine(); str1=str.split(" "); if(str1.length>=2&&str1.length<=3) { ds = str1[0]; pr = str1[1]; if(SearchNumber(pr) ||!SearchChinese(ds)) { System.out.println("wrong format"); continue; } normal[nor++]=ds; if (menu.containsKey(ds)) { menu.put(ds, Integer.parseInt(pr)); } else { menu.put(ds, Integer.parseInt(pr)); } } else if(str1.length<2){ ds = str1[0]; if(ds.equals("end")) { t="0"; break; } System.out.println("wrong format"); continue; } else { ds=str1[0]; t="1"; break; } if(str1.length==3) { normal[--nor]=""; continue; } if (ds.equals("table") || ds.equals("1")) { t = "1"; break; } } for (Iterator<Map.Entry<String, Integer>> it = menu.entrySet().iterator(); it.hasNext(); ) { Map.Entry<String, Integer> item = it.next(); String key = item.getKey(); int value= item.getValue(); if(value>=300||value<=0) { System.out.println(key+" price out of range "+value); it.remove(); } } boolean wor=false; int []table=new int[50]; int tab=0; if(!ds.equals("table")){ cn--; ds=""; System.out.println("wrong format"); do { t = input.next(); } while (!t.equals("table")); } while (true) { int []delete=new int [150]; int order=0; int det=0; if (t.equals("table")) { ds=""; cn++; num = input.next(); if(SearchNumber(num) || !(1 <= Integer.parseInt(num) && Integer.parseInt(num) <= 55)) { wor=true; System.out.println("wrong format"); do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); cn--; continue; } table[tab++]=Integer.parseInt(num); time = input.nextLine().replaceAll("[/]", " "); String[] Tim = time.split(" "); year = Integer.parseInt(Tim[1]); month = Integer.parseInt(Tim[2]); day = Integer.parseInt(Tim[3]); String date=year+"/"+month+"/"+day; date3=simpleDateFormat.parse(date); hh = Integer.parseInt(Tim[4]); mm = Integer.parseInt(Tim[5]); ss=Integer.parseInt(Tim[6]); wek = week(year, month, day); ts = hh * 1.0 + mm / 60.0; if (wek == 0) wek = 7; t = "1"; if (wek >= 1 && wek <= 5 && (ts < 10.5 || ts > 14.5 && ts < 17 || ts > 20.5)) { System.out.println ("table" + " " + num + " out of opening hours"); do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); cn--; continue; } if (wek == 7 && (ts < 9.5 || ts > 21)) { System.out.println("table" + " " + num + " out of opening hours"); do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); cn--; continue; } if(belongCalendar(date3, date1, date2)){ System.out.println("not a valid time period"); cn--; do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); ds = ""; continue; } if (judgeMIN() && Tim[1].length() == 4 && Tim[2].length() <= 2 && Tim[3].length() <= 2 && Tim[4].length() <= 2 && Tim[5].length() <= 2) System.out.println("table" + " " + num + ": "); else { System.out.println(num + " date error"); cn--; do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); ds = ""; continue; } } if (t.equals("end") || h.equals("end")) break; if (t.equals("0")) { System.out.println(); return; } int [] specialprice=new int [100]; int spr=0; int cnt, sum = 0, max = 0; int[] recording = new int[100]; int re = 0, flag3 = 1, flag2 = 0; if (t.equals("1")) { if (ds.equals("table")) { wor = false; String[] Tim; num = str1[1]; if (SearchNumber(num) || !(1 <= Integer.parseInt(num) && Integer.parseInt(num) <= 55)) { System.out.println("wrong format"); wor = true; do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); cn--; continue; } table[tab++] = Integer.parseInt(num); String ti=str1[2]+"/"+str1[3]; time = ti.replaceAll("[/]", " "); Tim = time.split(" "); year = Integer.parseInt(Tim[0]); month = Integer.parseInt(Tim[1]); day = Integer.parseInt(Tim[2]); String date=year+"/"+month+"/"+day; date3=simpleDateFormat.parse(date); hh = Integer.parseInt(Tim[3]); mm = Integer.parseInt(Tim[4]); ss=Integer.parseInt(Tim[5]); wek = week(year, month, day); ts = hh * 1.0 + mm / 60.0; if (wek == 0) wek = 7; if (wek >= 1 && wek <= 5 && (ts < 10.5 || ts > 14.5 && ts < 17 || ts > 20.5)) { System.out.println("table" + " " + num + " out of opening hours"); do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); cn--; continue; } if (wek == 7 && (ts < 9.5 || ts > 21)) { System.out.println("table" + " " + num + " out of opening hours"); do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); cn--; continue; } if(belongCalendar(date3, date1, date2)){ System.out.println("not a valid time period"); cn--; do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); ds = ""; continue; } if (judgeMIN() && Tim[0].length() == 4 && Tim[1].length() <= 2 && Tim[2].length() <= 2 && Tim[3].length() <= 2 && Tim[4].length() <= 2) System.out.println("table" + " " + num + ": "); else { System.out.println(num + " date error"); cn--; do { t = input.next(); } while (!t.equals("table") && !t.equals("end")); ds = ""; continue; } } while (!t.equals("end")) { if (flag3 == 1 ) t = input.next(); if (t.equals("end") || t.equals("table")) break; if(t.length()>2) { String d= input.nextLine(); System.out.println("invalid dish"); continue; } if(SearchNumber(t) ||t.charAt(0)=='0') { String d= input.nextLine(); System.out.println("wrong format"); continue; } cnt = 0; int flag = 0; String dish = input.next(); if (dish.equals("delete")) { if (flag2 == 1 && flag3 == 0) t = h; int p = Integer.parseInt(t); if(!delete(delete,det,p)){ System.out.println("deduplication "+p); h = input.next(); flag3 = 0; if (h.equals("end")) break; flag2 = 1; t = h; continue; } delete[det++]=p; if (p < 1 || p > max || recording[p - 1] == 0) System.out.println("delete error;"); if (p >= 1 && p <= max && recording[p - 1] != 0) { sum -= recording[p - 1]; if(sum<0) { sum = 0; specialprice[spr++] = -recording[p - 1]; } recording[p - 1] = 0; } h = input.next(); flag3 = 0; if (h.equals("end")) break; flag2 = 1; t = h; continue; } else flag3 = 1; String size1 = input.next(); if (size1.length()!=1) { String a; int b; a = input.next(); b = input.nextInt(); if(!table(table,tab,Integer.parseInt(t))){ System.out.println("Table number :"+t+" does not exist"); continue; } if (menu.containsKey(size1)) { int price = menu.get(size1); switch (a) { case "1": cnt += price; break; case "2": if (price % 2 == 1) cnt += price / 2 + price + 1; else cnt += price / 2 + price; break; case "3": cnt += 2 * price; break; } cnt*=b; sum += cnt; System.out.println(dish + " table" + " " + num + " pay for " + "table" + " " + t + " " + cnt); } else {System.out.println(dish + " does not exist"); } continue; } boolean crossRiver=false; boolean isAlive=true; boolean hasCross; int b = input.nextInt(); boolean erros=false; if (!menu.containsKey(dish)){ erros=true; recording[re++] = 0; System.out.println(dish + " does not exist"); max++; }else { flag = 1; int price = menu.get(dish); switch (size1) { case "1": cnt += price; break; case "2": if (price % 2 == 1) cnt += price / 2 + price + 1; else cnt += price / 2 + price; break; case "3": cnt += 2 * price; break; default: System.out.println(t + " portion out of range " + size1); continue; } } if(b>15&&!erros){ recording[re++] = 0; max++; System.out.println(t+" num out of range "+b); continue; } int ord=Integer.parseInt(t); if(ord<=order){ System.out.println("record serial number sequence error"); do { t = input.next(); if (t.equals("table") || t.equals("end")) break; else { flag3 = 0; break; } } while (true); ds = ""; continue; }else if(!erros)order=ord; if (flag == 1) { if(special(normal,dish,nor)&&1<=wek&&wek<=5){ specialprice[spr++]=cnt*b; cnt*=b; max++; System.out.println(t + " " + dish + " " + cnt); recording[re++] = cnt; continue; } cnt *= b; sum += cnt; recording[re++] = cnt; System.out.println(t + " " + dish + " " + cnt); max++; } } int s=0; int initialPrice; for(int k=0;k<spr;k++)s+=specialprice[k]; initialPrice=s+sum; s=(int)Math.round(s*0.7); if ((wek == 7 || wek == 6) && !t.equals("0") && (ts >= 9.5) && (ts <= 21)) put[cn - 1] = ("table" + " " + num + ": " + initialPrice+" "+ (sum+s)); if ((wek >= 1 && wek <= 5) && !t.equals("0") && (ts >= 17) && (ts <= 20.5)) put[cn - 1] = ("table" + " " + num + ": " + initialPrice+" "+((Math.round(sum * 0.8)+s))); if ((wek >= 1 && wek <= 5) && !t.equals("0") && (ts >= 10.5) && (ts <= 14.5)) put[cn - 1] = ("table" + " " + num + ": " + initialPrice+" "+(Math.round(sum * 0.6)+s)); } } if(!wor) for (int j = 0; j < cn; j++) System.out.println(put[j]); } }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
import java.text.SimpleDateFormat; import java.time.DateTimeException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Scanner; public class Main { public static boolean isNumeric(String string) { //判断是否为数字 int intValue; try { intValue = Integer.parseInt(string); return true; } catch (NumberFormatException e) { return false; } } public static boolean searchCall(String threeCall) { String []CallNumber=new String[]{"180","181","189","133","135","136"}; for (String s : CallNumber) if (s.equals(threeCall)) return false; return true; } public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH/mm/ss"); //时间模板 Menu menu = new Menu(); HashMap<String ,String>hash=new HashMap<>(); String []customer=new String[30]; int cnt=0; ArrayList<Table> tables = new ArrayList<>(); Scanner input = new Scanner(System.in); String []zhe=new String[]{"不甜","微甜","稍甜","甜"}; String []jin=new String[]{"不酸","微酸","稍酸","酸","很酸"}; String []chuan=new String[]{"不辣","微辣","稍辣","辣","很辣","爆辣"}; int []tastedGrade=new int [100]; int []tastedNumber=new int [100]; String str1 = ""; String str2 = ""; String str3= ""; String []dish; String tb = null; int [][]taste=new int[20][7]; int table_count = 0; int i, flag = 0; int portion = 0, number = 0; //份额,份数 //str2="0";str3=" ";str1=" "; menu.dishes.add(menu.addDish("", 0," ")); while (true) {// 输入菜单 dish=input.nextLine().split(" "); if(dish.length>4&&!dish[0].equals("table")||dish.length==3) { System.out.println("wrong format"); continue; } if(dish.length>4){str1=dish[0]; tb=" "+dish[1]+" "+dish[2]+" "+dish[3]+" "+dish[4]+" "+dish[5]+" "+dish[6]; break;} if(dish.length==4){str1=dish[0];str2=dish[2];str3=dish[1];} if(dish.length==2){str1=dish[0];str2=dish[1];} if(dish.length==1&&dish[0].equals("end")){str1=dish[0];break;} if(dish.length == 1) { System.out.println("wrong format"); continue; } if (dish.length==4) { // 判断这道菜是否为特价菜 if(dish[3].equals("T")&&isNumeric(str2)&&!isNumeric(str3)) { menu.dishes.get(menu.dishes.size() - 1).isT = true; menu.dishes.get(menu.dishes.size() - 1).taste = str3; menu.dishes.get(menu.dishes.size() - 1).name = str1; menu.dishes.get(menu.dishes.size() - 1).price = Integer.parseInt(str2); } else { System.out.println("wrong format"); continue; } } else str3=" "; if(isNumeric(str1)||!isNumeric(str2)) { System.out.println("wrong format"); continue; } // 判断菜谱是否重复输入 for (i = 0; i < menu.dishes.size(); i++) { if (menu.dishes.get(i).equals(str1)) { menu.dishes.get(i).price = Integer.parseInt(str2); flag++; break; } } if (flag == 0) { menu.dishes.add(menu.addDish(str1, Integer.parseInt(str2),str3)); } flag = 0; } boolean first = false; if(str1.equals("end"))return ; while(!str1.equals("end")){ int chuanGrade=0; int chuanNumber=0; int zheGrade=0; int zheNumber=0; int jinGrade=0; int jinNumber=0; String []a; String ord; String call; String useName; Table tab= new Table(); if(first) ord = input.nextLine(); else { ord = tb; first=true; } a=ord.split(" "); str2=a[1]; useName=a[3]; call=a[4]; String threeCall=call.substring(0,3); if(useName.length()>10||call.length()!=11||searchCall(threeCall)){ System.out.println("wrong format"); break; } String[] Date = a[5].split("/"); String[] Time =a[6].split("/"); tab.num = Integer.parseInt(str2); int[] intDate = new int[3]; int[] intTime = new int[3]; for(i=0;i<3;i++) { intDate[i] = Integer.parseInt(Date[i]); intTime[i] = Integer.parseInt(Time[i]); } try { tab.time = LocalDateTime.of(intDate[0],intDate[1],intDate[2],intTime[0],intTime[1],intTime[2]); //时间判断 tables.add(tab); if(!tab.isOpen()) { System.out.println("table " + str2 + " out of opening hours"); do { str1 = input.next(); } while (!str1.equals("end") && !str1.equals("table")); continue; } }catch(DateTimeException e){ System.out.println( tab.num + " date error"); break; } System.out.println("table "+str2+": "); while (true) { str1 = input.next(); if (str1.equals("end")) break; if (str1.equals("table")) break; str2 = input.next(); // 判断是否为代点 if (isNumeric(str2)) { //判断代点桌号是否存在 boolean exist = false; for (Table table : tables) { if (table.num == Integer.parseInt(str1)) { exist = true; break; } } //若存在则完成代点 if(exist) { System.out.print(Integer.parseInt(str2) + " table " +tables.get(table_count).num + " pay for table " + Integer.parseInt(str1) + " "); String str=str1; Record treat = new Record(); str1 = input.next(); treat.ds = menu.dishes.get(menu.searchDish(str1)); if(menu.searchDish(str1)!=-1){ if (menu.dishes.get(menu.searchDish(str1)).isT) { str3 = input.next(); tastedGrade[Integer.parseInt(str)] = Integer.parseInt(str3); } else str3 = " "; }else { System.out.println(str1 + " does not exist"); str1=input.nextLine();continue; } portion = input.nextInt(); number = input.nextInt(); tastedNumber[Integer.parseInt(str)]=number; treat.portion = portion; treat.number = number; System.out.print(treat.getPrice() + "\n"); if(menu.dishes.get(menu.searchDish(str1)).taste.equals("晋菜")) { if(Integer.parseInt(str3)<0||Integer.parseInt(str3)>4){ System.out.println("acidity num out of range :"+jinGrade); str1=input.nextLine(); continue; } taste[Integer.parseInt(str)-1][1] += Integer.parseInt(str3)*number; taste[Integer.parseInt(str)-1][4]+=number; } if(menu.dishes.get(menu.searchDish(str1)).taste.equals("川菜")) { if(Integer.parseInt(str3)<0||Integer.parseInt(str3)>5){ System.out.println("spicy num out of range :"+str3); str1=input.nextLine(); continue; } taste[Integer.parseInt(str)-1][0] += Integer.parseInt(str3)*number; taste[Integer.parseInt(str)-1][3]+=number; } if(menu.dishes.get(menu.searchDish(str1)).taste.equals("浙菜")) { if(Integer.parseInt(str3)<0||Integer.parseInt(str3)>3){ System.out.println("sweetness num out of range :"+str3); str1=input.nextLine(); continue; } taste[Integer.parseInt(str)-1][2] += Integer.parseInt(str3)*number; taste[Integer.parseInt(str)-1][5]+=number; } tables.get(table_count).add(menu, "代点",str2, str1, portion, number); } //若不存在则输出内容 else { System.out.println("Table number :"+Integer.parseInt(str1)+" does not exist"); } } // 若不是代点 else { // 若不为删除订单,则读入份数和大小 if (!str2.equals("delete")) { boolean t=false; if(menu.searchDish(str2)!=-1) { if (menu.dishes.get(menu.searchDish(str2)).isT) { hash.put(str1, menu.dishes.get(menu.searchDish(str2)).taste); str3 = input.next(); portion = input.nextInt(); number = input.nextInt(); tastedGrade[Integer.parseInt(str1)] = Integer.parseInt(str3); tastedNumber[Integer.parseInt(str1)] = number; t = true; if (menu.dishes.get(menu.searchDish(str2)).taste.equals("晋菜")) { if (Integer.parseInt(str3) < 0 || Integer.parseInt(str3) > 4) { System.out.println("acidity num out of range :" + str3); str1 = input.nextLine(); continue; } jinGrade += Integer.parseInt(str3) * number; jinNumber += number; } if (menu.dishes.get(menu.searchDish(str2)).taste.equals("川菜")) { if (Integer.parseInt(str3) < 0 || Integer.parseInt(str3) > 5) { System.out.println("spicy num out of range :" + str3); str1 = input.nextLine(); continue; } chuanGrade += Integer.parseInt(str3) * number; chuanNumber += number; } if (menu.dishes.get(menu.searchDish(str2)).taste.equals("浙菜")) { if (Integer.parseInt(str3) < 0 || Integer.parseInt(str3) > 3) { System.out.println("sweetness num out of range :" + str3); str1 = input.nextLine(); continue; } zheGrade += Integer.parseInt(str3) * number; zheNumber += number; } } else str3 = " "; }else { System.out.println(str2 + " does not exist"); str1=input.nextLine();continue; } if(!t) { portion = input.nextInt(); number = input.nextInt(); } } tables.get(table_count).add(menu, str3,str1, str2, portion, number); if(str2.equals("delete")){ if(hash.get(str1).equals("晋菜")) { jinGrade -= tastedGrade[Integer.parseInt(str1)]; jinNumber -= tastedNumber[Integer.parseInt(str1)]; } if(hash.get(str1).equals("川菜")) { chuanGrade -= tastedGrade[Integer.parseInt(str1)]; chuanNumber -= tastedNumber[Integer.parseInt(str1)]; } if(hash.get(str1).equals("浙菜")) { zheGrade -= tastedGrade[Integer.parseInt(str1)]; zheNumber -= tastedNumber[Integer.parseInt(str1)]; } hash.put(str1,""); } } } taste[table_count][0]=chuanGrade; taste[table_count][1]=jinGrade; taste[table_count][2]=zheGrade; taste[table_count][3]=chuanNumber; taste[table_count][4]=jinNumber; taste[table_count][5]=zheNumber; // 本桌点菜结束,进入下一桌 tables.get(table_count).getSum(); int sum; String str=useName+" "+call+" "+tables.get(table_count).sum; String []b; if(table_count==0)customer[cnt++]=str; else { b = str.split(" "); boolean r=true; for (int l = 0; l < cnt; l++) { String[] c = customer[l].split(" "); if (b[0].equals(c[0])) { sum = Integer.parseInt(c[2]) + Integer.parseInt(b[2]); customer[l] = useName + " " + call + " " + sum; r=false; } } if(r)customer[cnt++]=str; } table_count++; } // 最终输出桌号订单信息 for (i = 0; i < table_count; i++) { if (tables.get(i).isOpen()) { System.out.print("table " + tables.get(i).num + ": " + tables.get(i).origSum+" "+tables.get(i).sum); for(int j=0;j<3;j++){ if(taste[i][j+3]!=0){ if(j==0){ System.out.print(" 川菜 "+taste[i][j+3]+" "+chuan[(int) Math.round(1.0*taste[i][j]/taste[i][j+3])]); } if(j==1){ System.out.print(" 晋菜 "+taste[i][j+3]+" "+jin[(int) Math.round(1.0*taste[i][j]/taste[i][j+3])]); } if(j==2){ System.out.print(" 浙菜 "+taste[i][j+3]+" "+zhe[(int) Math.round(1.0*taste[i][j]/taste[i][j+3])]); } } } System.out.println(); } else System.out.println("table " + tables.get(i).num + " out of opening hours"); } Arrays.sort(customer,0,cnt); for(int j=0;j<cnt;j++) { if(j<cnt-1) System.out.println(customer[j]); else System.out.print(customer[j]); } } } class Dish { //菜单格式 String name; int price; String taste; boolean isT = false; } class Record { //点菜 int orderNum; //序号 Dish ds; //菜品 int portion; //份额 int number; //份数 boolean isDeleted = false; int getPrice() { if (portion == 2) return (int) Math.round(1.5 * ds.price) * number; else if (portion == 3) return 2 * ds.price * number; else return ds.price * number; } } class Menu { //菜单 ArrayList<Dish> dishes = new ArrayList<>(); int searchDish(String dishName) { for (int i = 0; i < dishes.size(); i++) { if (dishName.equals(dishes.get(i).name)) { return i; } } return -1; } Dish addDish(String dishName, int price,String taste) { Dish newDish = new Dish(); newDish.name = dishName; newDish.price = price; newDish.taste=taste; return newDish; } } class Order { //点菜 ArrayList<Record> records = new ArrayList<>(); Record addARecord(String tasteGrade,int orderNum, String dishName, int portion, int number, Menu menu) { Record newRecord = new Record(); newRecord.orderNum = orderNum; newRecord.ds = menu.dishes.get(menu.searchDish(dishName)); newRecord.portion = portion; newRecord.number = number; if(!tasteGrade.equals("代点")) System.out.println(newRecord.orderNum + " " + newRecord.ds.name + " " + newRecord.getPrice()); return newRecord; } void delARecordByOrderNum(int orderNum) { int i, flag = 0; for (i = 0; i < records.size(); i++) { if (records.get(i).orderNum == orderNum) { if (!records.get(i).isDeleted) { records.get(i).isDeleted = true; } else { System.out.println("deduplication " + orderNum); } flag++; } } if (flag == 0) { System.out.println("delete error;"); } } } class Table { Order order = new Order(); int num; LocalDateTime time; long sum = 0; long origSum = 0; void add(Menu menu, String str3,String str1, String str2, int portion, int number) { //判断点菜的模式(是否存在,删除,添加) if (str2.equals("delete")) { order.delARecordByOrderNum(Integer.parseInt(str1)); } else { if (menu.searchDish(str2) != -1) { order.records.add(order.addARecord(str3,Integer.parseInt(str1), str2, portion, number, menu)); } else System.out.println(str2 + " does not exist"); } } void getSum() { double ts = time.getHour() + (double) time.getMinute() / 60; int wek = time.getDayOfWeek().getValue(); for (int i = 0; i < order.records.size(); i++) { if (!order.records.get(i).isDeleted) { origSum += order.records.get(i).getPrice(); if ((wek == 7 || wek == 6) && (ts >= 9.5) && (ts <= 21)) sum += order.records.get(i).getPrice(); if ((wek >= 1 && wek <= 5) && (ts >= 17) && (ts <= 20.5)) { if(!order.records.get(i).ds.isT) sum += Math.round(order.records.get(i).getPrice() * 0.8); else sum += Math.round(order.records.get(i).getPrice() * 0.7); } if ((wek >= 1 && wek <= 5) && (ts >= 10.5) && (ts <= 14.5)) { if(!order.records.get(i).ds.isT) sum += Math.round(order.records.get(i).getPrice() * 0.6); else sum += Math.round(order.records.get(i).getPrice() * 0.7); } } } } boolean isOpen() { //判断是否开门 int weekday = time.getDayOfWeek().getValue(); if (weekday > 0 && weekday < 6) { if (time.getHour() >= 17 && time.getHour() < 20) return true; if (time.getHour() == 20) { if (time.getMinute() <= 30) return true; } if (time.getHour() > 10 && time.getHour() < 14) return true; if (time.getHour() == 10) { if (time.getMinute() >= 30) return true; } if (time.getHour() == 14) { return time.getMinute() <= 30; } } else { if (time.getHour() > 9 && time.getHour() < 21) return true; if (time.getHour() == 9) { if (time.getMinute() >= 30) return true; } if (time.getHour() == 21) { return time.getMinute() <= 30; } } return false; } }
总结
- 基本语法:要学好Java,首先需要掌握Java的基本语法,包括数据类型、变量、运算符、控制流语句、方法等。这些是编写Java程序的基础。
- 面向对象编程:Java是面向对象的语言,因此必须熟悉面向对象编程概念,例如类、对象、继承、多态、抽象类、接口等。
-
在Java中,继承是一种重要的面向对象编程概念。以下是在使用Java继承时需要注意的要点:
-
单继承:Java只支持单继承,即一个类只能直接继承自一个父类。这是为了避免多继承可能带来的复杂性和冲突。
-
关键字:使用
extends
关键字来指定一个类的父类。例如,class ChildClass extends ParentClass
表示ChildClass继承自ParentClass。 -
父类方法的重用:通过继承,子类可以直接继承父类的非私有方法和字段,并且可以直接调用它们。这样可以避免重复编写相似的代码,提高代码的重用性。
-
方法覆盖:子类可以通过定义与父类方法名、返回类型和参数列表完全相同的方法来覆盖(override)父类的方法。方法覆盖可以实现多态性,并允许子类根据自身的需求来重写特定的方法。
-
super关键字:在子类中使用
super
关键字可以调用父类的构造方法、访问父类的成员变量和方法。例如,super.methodName()
可以调用父类的方法。 -
访问修饰符:子类中继承的方法和字段的访问修饰符可以更宽松,但不能更严格。例如,如果父类中的方法是
public
,则子类中可以选择保持为public
或改为protected
,但不能改为private
。 -
继承层次:通过多级继承,可以形成继承层次结构,使得子类可以继承祖先类的特性。需要注意继承链的合理性和设计的易维护性。
-
构造函数:子类必须调用父类的构造函数来初始化从父类继承的实例变量。使用
super()
关键字在子类中调用父类的构造函数。 -
对象类型转换:通过继承关系,可以进行向上转型(upcasting)和向下转型(downcasting)。向上转型将子类对象赋值给父类引用,而向下转型则需要使用显式的类型转换操作符。
以上是在使用Java继承时需要注意的要点。继承是面向对象编程中重要的概念,有助于代码的重用和扩展。在设计和使用继承关系时,请考虑良好的继承结构和遵循面向对象设计原则。
-
-
在Java中,多态是面向对象编程的重要概念,它允许使用统一的接口处理不同类型的对象。以下是在使用Java多态时需要注意的要点:
-
继承和方法覆盖:多态建立在继承和方法覆盖的基础上。子类可以通过方法覆盖来实现对父类方法的重新定义。
-
父类引用指向子类对象:在多态中,可以使用父类的引用变量来引用子类的对象。这意味着可以将子类对象赋值给父类引用变量,从而通过父类引用来访问子类对象的特性。
-
向上转型(Upcasting):将子类实例赋值给父类引用称为向上转型。这样做可以使父类引用只能访问父类定义的成员和方法,并且无法访问子类独有的成员和方法。
-
调用被覆盖的方法:在使用多态时,通过父类引用调用经过子类覆盖的方法时,实际执行的是子类中定义的方法。
-
运行时多态:多态是在程序运行时确定的,而不是在编译时确定的。即具体调用哪个方法取决于所引用的对象的运行时类型,而不是引用变量的声明类型。
-
instanceof运算符:可以使用
instanceof
运算符判断一个对象是否是某个类的实例。例如,obj instanceof ClassName
返回true
表示obj
是ClassName
类的实例。 -
向下转型(Downcasting):将父类引用变量强制转换为子类引用变量称为向下转型。在进行向下转型之前,需要先进行类型检查,以避免类型转换错误。
-
多态的应用:多态能够提高代码的可扩展性和复用性,可以通过定义父类的抽象方法和接口来实现对不同子类的统一处理。
请注意,在使用多态时要合理设计继承关系、方法覆盖和类型转换,并遵循面向对象的设计原则,如单一职责原则、依赖倒置原则等。
-
-
在Java中,接口是一种定义了一组方法签名但没有实现的抽象类型。通过接口,可以实现多重继承、解耦合、实现代码的可扩展性和灵活性。以下是在使用Java接口时需要注意的要点:
-
接口定义:使用关键字
interface
来定义接口。接口中的方法默认是抽象的,不能包含实例变量,只能包含常量(public static final
修饰的属性)。 -
接口实现:一个类可以通过
implements
关键字来实现一个或多个接口。一个类可以实现多个接口,实现接口时需要实现接口中定义的所有方法。 -
接口与类的关系:接口与类之间是一种合同关系。实现接口的类必须遵循接口定义的方法,并提供方法的具体实现。
-
默认方法(Default Methods):从Java 8开始,接口可以包含默认方法。默认方法是在接口中定义并有默认实现的方法。默认方法可以被实现类直接继承或覆盖,也可以在实现类中调用。
-
静态方法(Static Methods):从Java 8开始,接口可以包含静态方法。静态方法是在接口中定义并带有
static
修饰符的方法。可以直接通过接口名称调用静态方法,不需要实例化接口。 -
接口继承:一个接口可以继承多个接口,通过使用
extends
关键字实现接口的继承。接口继承可以帮助组织和重用代码,并提供更大的灵活性。 -
接口与抽象类的区别:接口只能定义方法,而抽象类既可以定义方法也可以包含实例变量。类可以通过继承一个抽象类来获取行为,但是可以实现多个接口。
-
接口的应用:接口通常用于定义模块之间的契约、规范,以及实现多态。通过使用接口,可以将各个模块解耦合,使得系统更加灵活和可扩展。
请注意,在使用接口时要根据具体情况设计合理的接口结构,遵循接口的命名规范,并注重接口与实现类之间的一致性。同时,接口的设计应符合单一职责原则和依赖倒置原则等面向对象设计原则。
-