OOP题目集4,5以及期中考试作业总结
OOP题目集4,5以及期中考试作业总结
一、前言
这三次的题目集的题目集难度逐次提升,题量适中,适合新手来进行训练,在第一次作业里,前面几题简单考察了一下变量定义、赋值、运算、选择分支语句和基本的输入输出等基础知识点,熟悉了一下Java的编程环境之后,就开始考察字符串运算的相关知识点,整体难度不大,但是过程一开始有点折磨,毕竟刚上手写java,ac的道路艰苦。第二次作业一上来感觉难度上了几个层次,前面两道题目直接写一个菜单程序,接着是一个日期的基本使用,最后一道也是一个比较难的动态规划,整体难度对于刚接触oopd的萌新我来说,不可谓不是一个巨大的挑战。第三次作业第一个依旧是爆炸的菜单程序设计,接着两道题目去重要用到set数据结构,接下来的单词统计也是用到了arrays.sort以及set去重,好在有一道简单的分秒转换题目来聊以自慰,最后依旧是日期转换结尾。
二、设计与分析
菜单7-4
本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 份额 分数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的桌号从小到大的顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计(本内容与计价程序之前相同,其他类根据需要自行定义):
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
本次课题比菜单计价系列-3增加的异常情况:
1、菜谱信息与订单信息混合,应忽略夹在订单信息中的菜谱信息。输出:"invalid dish"
2、桌号所带时间格式合法(格式见输入格式部分说明,其中年必须是4位数字,月、日、时、分、秒可以是1位或2位数),数据非法,比如:2023/15/16 ,输出桌号+" date error"
3、同一桌菜名、份额相同的点菜记录要合并成一条进行计算,否则可能会出现四舍五入的误差。
4、重复删除,重复的删除记录输出"deduplication :"+序号。
5、代点菜时,桌号不存在,输出"Table number :"+被点菜桌号+" does not exist";本次作业不考虑两桌记录时间不匹配的情况。
6、菜谱信息中出现重复的菜品名,以最后一条记录为准。
7、如果有重复的桌号信息,如果两条信息的时间不在同一时间段,(时段的认定:周一到周五的中午或晚上是同一时段,或者周末时间间隔1小时(不含一小时整,精确到秒)以内算统一时段),此时输出结果按不同的记录分别计价。
8、重复的桌号信息如果两条信息的时间在同一时间段,此时输出结果时合并点菜记录统一计价。前提:两个的桌号信息的时间都在有效时间段以内。计算每一桌总价要先合并符合本条件的饭桌的点菜记录,统一计价输出。
9、份额超出范围(1、2、3)输出:序号+" portion out of range "+份额,份额不能超过1位,否则为非法格式,参照第13条输出。
10、份数超出范围,每桌不超过15份,超出范围输出:序号+" num out of range "+份数。份数必须为数值,最高位不能为0,否则按非法格式参照第16条输出。
11、桌号超出范围[1,55]。输出:桌号 +" table num out of range",桌号必须为1位或多位数值,最高位不能为0,否则按非法格式参照第16条输出。
12、菜谱信息中菜价超出范围(区间(0,300)),输出:菜品名+" price out of range "+价格,菜价必须为数值,最高位不能为0,否则按非法格式参照第16条输出。
13、时间输入有效但超出范围[2022.1.1-2023.12.31],输出:"not a valid time period"
14、一条点菜记录中若格式正确,但数据出现问题,如:菜名不存在、份额超出范围、份数超出范围,按记录中从左到右的次序优先级由高到低,输出时只提示优先级最高的那个错误。
15、每桌的点菜记录的序号必须按从小到大的顺序排列(可以不连续,也可以不从1开始),未按序排列序号的输出:"record serial number sequence error"。当前记录忽略。(代点菜信息的序号除外)
16、所有记录其它非法格式输入,统一输出"wrong format"
17、如果记录以“table”开头,对应记录的格式或者数据不符合桌号的要求,那一桌下面定义的所有信息无论正确或错误均忽略,不做处理。如果记录不是以“table”开头,比如“tab le 55 2023/3/2 12/00/00”,该条记录认为是错误记录,后面所有的信息并入上一桌一起计算。
本次作业比菜单计价系列-3增加的功能:
菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+基础价格+"T"
例如:麻婆豆腐 9 T
菜价的计算方法:
周一至周五 7折, 周末全价。
注意:不同的四舍五入顺序可能会造成误差,请按以下步骤累计一桌菜的菜价:
计算每条记录的菜价:将每份菜的单价按份额进行四舍五入运算后,乘以份数计算多份的价格,然后乘以折扣,再进行四舍五入,得到本条记录的最终支付价格。
最后将所有记录的菜价累加得到整桌菜的价格。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“** does not exist”,**是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9 T
table 31 2023/2/1 14/20/00
1 麻婆豆腐 1 16
2 油淋生菜 1 2
2 delete
2 delete
end
输出样例:
在这里给出相应的输出。例如:
table 31: 
1 num out of range 16
2 油淋生菜 18
deduplication 2
table 31: 0 0
输入样例1:
份数超出范围+份额超出范围。例如:
麻婆豆腐 12
油淋生菜 9 T
table 31 2023/2/1 14/20/00
1 麻婆豆腐 1 16
2 油淋生菜 4 2
end
输出样例1:
份数超出范围+份额超出范围。例如:
table 31: 
1 num out of range 16
2 portion out of range 4
table 31: 0 0
输入样例2:
桌号信息错误。例如:
麻婆豆腐 12
油淋生菜 9 T
table a 2023/3/15 12/00/00
1 麻婆豆腐 1 1
2 油淋生菜 2 1
end
输出样例2:
在这里给出相应的输出。例如:
wrong format
输入样例3:
混合错误:桌号信息格式错误+混合的菜谱信息(菜谱信息忽略)。例如:
麻婆豆腐 12
油淋生菜 9 T
table 55 2023/3/31 12/000/00
麻辣香锅 15
1 麻婆豆腐 1 1
2 油淋生菜 2 1
end
输出样例3:
在这里给出相应的输出。例如:
wrong format
输入样例4:
错误的菜谱记录。例如:
麻婆豆腐 12.0
油淋生菜 9 T
table 55 2023/3/31 12/00/00
麻辣香锅 15
1 麻婆豆腐 1 1
2 油淋生菜 2 1
end
输出样例4:
在这里给出相应的输出。例如:
wrong format
table 55: 
invalid dish
麻婆豆腐 does not exist
2 油淋生菜 14
table 55: 14 10
输入样例5:
桌号格式错误(以“table”开头)+订单格式错误(忽略)。例如:
麻婆豆腐 12
油淋生菜 9 T
table a 2023/3/15 12/00/00
1 麻婆 豆腐 1 1
2 油淋生菜 2 1
end
输出样例5:
在这里给出相应的输出。例如:
wrong format
输入样例6:
桌号格式错误,不以“table”开头。例如:
麻婆豆腐 12
油淋生菜 9 T
table 1 2023/3/15 12/00/00
1 麻婆豆腐 1 1
2 油淋生菜 2 1
tab le 2 2023/3/15 12/00/00
1 麻婆豆腐 1 1
2 油淋生菜 2 1
end
输出样例6:
在这里给出相应的输出。例如:
table 1: 
1 麻婆豆腐 12
2 油淋生菜 14
wrong format
record serial number sequence error
record serial number sequence error
table 1: 26 17import java.text.ParseException;
import java.time.DateTimeException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
    public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) throws ParseException {
        if(nowTime.getTime()<=endTime.getTime() && nowTime.getTime()>=beginTime.getTime())
            return true;
        return false;
    }
    public static boolean judge(int a,int b,int c){
        if(b<1||b>12)return false;
        else if((a%4==0&&a%100!=0)||a%400==0){
            if(b==2)if(c<1||c>29)return false;
        }
        else {
            if(b==2)if(c<1||c>28)return false;
            if(b==1||b==3||b==5||b==8||b==7||b==10||b==12)if(c<1||c>31)return false;
            if(b==4||b==6||b==9||b==11)if(c<1||c>30)return false;
        }
        return true;
    }
    public static boolean judgeMIN(int a,int b,int c,int d,int e,int f){
// 获取创建指定时间
        try {
            LocalDateTime localDateTime = LocalDateTime.of(a,b,c,d,e,f);
        } 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);
        if(matcher.matches())return true;
        return false;
    }
    public static boolean SearchChinese(String  a){
        a = a.toLowerCase();
        // 匹配的字符串的正则表达式
        String regCharset = "[\\u4E00-\\u9FFF]+";
        Pattern p = Pattern.compile(regCharset);
        Matcher matcher = p.matcher(a);
        if(matcher.matches())return true;
        return false;
    }
    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 = 0;
        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;
    }
    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=0, month = 0, day = 0, hh = 0, mm=0,ss=0;
        double ts = 0;
        Scanner input = new Scanner(System.in);
        String ds = "";
        int  i = 0, wek = 0;
        int cn = 1;
        String[] put = new String[100];
        String t = "",pr="";
        String  num = "";
        String time;
        String h = "";
        String str="";
        String []str1=new String[5];
        int nor=0;
        String [] normal=new String[100];
        HashMap<String, Integer> menu = new HashMap<String, Integer>();
        while (true) {
            int rt = 1;
            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));
                    rt = 0;
                } else {
                    menu.put(ds, Integer.parseInt(pr));
                    i++;
                }
            }
            else if(str1.length<2){
                ds = str1[0];
                if(ds.equals("end")) {
                    t="0";
                    break;
                }
                System.out.println("wrong format");
                continue;
            }
            else if(str1.length>3){
                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(); ((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");
            while(true){
            t=input.next();
            if(t.equals("table"))break;
            }
        }
        while (true) {
            int []delete=new int [150];
            int order=0;
            int det=0;
            int flag4 = 1;
            if (t.equals("table")) {
                ds="";
                boolean errdate;
                cn++;
                flag4 = 0;
                num = input.next();
                if(!SearchNumber(num) || !(1 <= Integer.parseInt(num) && Integer.parseInt(num) <= 55))
                {
                    wor=true;
                    System.out.println("wrong format");
                    while(true){
                        errdate=true;
                        t=input.next();
                        if(t.equals("table")||t.equals("end"))break;
                    }
                    cn--;
                    if(errdate)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) && !t.equals("0") && (ts < 10.5 || (ts > 14.5 && ts < 17) || ts > 20.5)) {
                    System.out.println ("table" + " " + num + " out of opening hours");
                    while(true){
                        errdate=true;
                        t=input.next();
                        if(t.equals("table")||t.equals("end"))break;
                    }
                    cn--;
                    if(errdate)continue;
                }
                if (wek == 7 && !t.equals("0") && (ts < 9.5 || ts > 21)) {
                    System.out.println("table" + " " + num + " out of opening hours");
                    while(true){
                        errdate=true;
                        t=input.next();
                        if(t.equals("table")||t.equals("end"))break;
                    }
                    cn--;
                    if(errdate)continue;
                }
                if(!belongCalendar(date3,date1,date2)){
                    System.out.println("not a valid time period");
                    cn--;
                    while (true) {
                        errdate = true;
                        t = input.next();
                        if (t.equals("table") || t.equals("end")) break;
                    }
                    ds = "";
                    continue;
                }
                if (judgeMIN(year, month, day,hh,mm,ss) && 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--;
                    while (true) {
                        errdate = true;
                        t = input.next();
                        if (t.equals("table") || t.equals("end")) break;
                    }
                    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 = 0, 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 = new String[0];
                    if (flag4 == 1) {
                        num = str1[1];
                        if (!SearchNumber(num) || !(1 <= Integer.parseInt(num) && Integer.parseInt(num) <= 55)) {
                            System.out.println("wrong format");
                            wor = true;
                            boolean errdate;
                            while(true){
                                errdate=true;
                                t=input.next();
                                if(t.equals("table")||t.equals("end"))break;
                            }
                            cn--;
                            if(errdate)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;
                    boolean errdate;
                    if ((wek >= 1 && wek <= 5) && !t.equals("0") && (ts < 10.5 || (ts > 14.5 && ts < 17) || ts > 20.5)) {
                        System.out.println("table" + " " + num + " out of opening hours");
                        while (true) {
                            errdate = true;
                            t = input.next();
                            if (t.equals("table") || t.equals("end")) break;
                        }
                        cn--;
                        if (errdate) continue;
                    }
                    if (wek == 7 && !t.equals("0") && (ts < 9.5 || ts > 21)) {
                        System.out.println("table" + " " + num + " out of opening hours");
                        while (true) {
                            errdate = true;
                            t = input.next();
                            if (t.equals("table") || t.equals("end")) break;
                        }
                        cn--;
                        if (errdate) continue;
                    }
                    if(!belongCalendar(date3,date1,date2)){
                        System.out.println("not a valid time period");
                        cn--;
                        while (true) {
                            errdate = true;
                            t = input.next();
                            if (t.equals("table") || t.equals("end")) break;
                        }
                        ds = "";
                        continue;
                    }
                    if (judgeMIN(year, month, day,hh,mm,ss) && 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--;
                        while (true) {
                            t = input.next();
                            if (t.equals("table") || t.equals("end")) break;
                        }
                        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;
                            if (!h.equals("end")) {
                                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++] = 0 - recording[p - 1];
                            }
                            recording[p - 1] = 0;
                        }
                        h = input.next();
                        flag3 = 0;
                        if (h.equals("end"))
                            break;
                        if (!h.equals("end")) {
                            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);
                            if (a.equals("1"))
                                cnt += price;
                            else if (a.equals("2")) {
                                if (price % 2 == 1)
                                    cnt += price / 2 + price + 1;
                                else
                                    cnt += price / 2 + price;
                            }
                            else if (a.equals("3"))
                                cnt += 2 * price;
                            cnt*=b;
                            sum += cnt;
                            System.out.println(dish + " table" + " " + num + " pay for " + "table" + " " + t + " " + cnt);
                        } else
                        {System.out.println(dish + " does not exist");cnt=0;}
                        continue;
                    }
                    int b = input.nextInt();
                    boolean erros=false;
                    if (!menu.containsKey(dish)){
                        erros=true;
                        cnt=0;
                        recording[re++] = 0;
                        System.out.println(dish + " does not exist");
                        max++;
                    }else {
                        flag = 1;
                        int price = menu.get(dish);
                        if (size1.equals("1"))
                            cnt += price;
                        else if (size1.equals("2")) {
                            if (price % 2 == 1)
                                cnt += price / 2 + price + 1;
                            else
                                cnt += price / 2 + price;
                        }
                        else if (size1.equals("3"))
                            cnt += 2 * price;
                        else if(!erros){
                            erros=true;
                            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");
                        while (true) {
                            t = input.next();
                            if (t.equals("table") || t.equals("end")) break;
                            else {flag3=0;break;}
                        }
                        ds = "";
                        continue;
                    }else if(erros==false)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;
                            cnt= (int) Math.round(cnt*0.7);
                            continue;
                        }
                        cnt *= b;
                        sum += cnt;
                        recording[re++] = cnt;
                        System.out.println(t + " " + dish + " " + cnt);
                        max++;
                    }
                }
                int s=0;
                int initialPrice=0;
                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]);
    }
}
这个题目因为是我第一次接触菜单设计,我就按照我自己的想法来写,也因为不熟悉java的类等,这题目我就按照自己写C题目的思路想法,直接暴力来写,幸好这道题目并不是很难,具体写法就如同代码用equal来判断,套几个循环,在写几个判断变量,开一些数组来记录,总之并不复杂。
因为题目7-2题目和7-1差不多,我就不重复剖析了。
接下来继续说第三次题目集的7-5,以下是它的题目:
本题在菜单计价程序-3的基础上增加了部分内容,增加的内容用加粗字体标识。
注意不是菜单计价程序-4,本题和菜单计价程序-4同属菜单计价程序-3的两个不同迭代分支。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 三个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 口味度 份额 份数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\\
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)\\
int getPrice()//计价,计算本条记录的价格\\
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
### 输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
### 输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
以上为菜单计价系列-3的题目要求,加粗的部分是有调整的内容。本次课题相比菜单计价系列-3新增要求如下:
1、菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+口味类型+英文空格+基础价格+"T"
例如:麻婆豆腐 川菜 9 T
菜价的计算方法:
周一至周五 7折, 周末全价。
特色菜的口味类型:川菜、晋菜、浙菜
川菜增加辣度值:辣度0-5级;对应辣度水平为:不辣、微辣、稍辣、辣、很辣、爆辣;
晋菜增加酸度值,酸度0-4级;对应酸度水平为:不酸、微酸、稍酸、酸、很酸;
浙菜增加甜度值,甜度0-3级;对应酸度水平为:不甜、微甜、稍甜、甜;
例如:麻婆豆腐 川菜 9 T
输入订单记录时如果是特色菜,添加口味度(辣/酸/甜度)值,格式为:序号+英文空格+菜名+英文空格+口味度值+英文空格+份额+英文空格+份数
例如:1 麻婆豆腐 4 1 9
单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值,spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出,例如:
acidity num out of range : 5
输出一桌的信息时,按辣、酸、甜度的顺序依次输出本桌菜各种口味的口味度水平,如果没有某个类型的菜,对应的口味(辣/酸/甜)度不输出,只输出已点的菜的口味度。口味度水平由口味度平均值确定,口味度平均值只综合对应口味菜系的菜计算,不做所有菜的平均。比如,某桌菜点了3份川菜,辣度分别是1、3、5;还有4份晋菜,酸度分别是,1、1、2、2,辣度平均值为3、酸度平均值四舍五入为2,甜度没有,不输出。
一桌信息的输出格式:table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格+"川菜"+数量+辣度+英文空格+"晋菜"+数量+酸度+英文空格+"浙菜"+数量+甜度。
如果整桌菜没有特色菜,则只输出table的基本信息,格式如下,注意最后加一个英文空格:
table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格
例如:table 1: 60 36 川菜 2 爆辣 浙菜 1 微甜
计算口味度时要累计本桌各类菜系所有记录的口味度总和(每条记录的口味度乘以菜的份数),再除以对应菜系菜的总份数,最后四舍五入。
注:本题要考虑代点菜的情况,当前桌点的菜要加上被其他桌代点的菜综合计算口味度平均值。
2、考虑客户订多桌菜的情况,输入时桌号时,增加用户的信息:
格式:table+英文空格+桌号+英文空格+":"+英文空格+客户姓名+英文空格+手机号+日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
例如:table 1 : tom 13670008181 2023/5/1 21/30/00
约束条件:客户姓名不超过10个字符,手机号11位,前三位必须是180、181、189、133、135、136其中之一。
输出结果时,先按要求输出每一桌的信息,最后按字母顺序依次输出每位客户需要支付的金额。不考虑各桌时间段的问题,同一个客户的所有table金额都要累加。
输出用户支付金额格式:
用户姓名+英文空格+手机号+英文空格+支付金额
注意:不同的四舍五入顺序可能会造成误差,请按以下步骤累计一桌菜的菜价:
计算每条记录的菜价:将每份菜的单价按份额进行四舍五入运算后,乘以份数计算多份的价格,然后乘以折扣,再进行四舍五入,得到本条记录的最终支付价格。
将所有记录的菜价累加得到整桌菜的价格。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+口味类型+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+辣/酸/甜度值+英文空格+份额+英文空格+份数 注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。辣/酸/甜度取值范围见题目中说明。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称**+英文空格+辣/酸/甜度值+**英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+“:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
之后按输入顺序一次输出每一桌所有菜品的价格(整数数值),
格式:table+英文空格+桌号+“:”+英文空格+当前桌的计算折扣后总价+英文空格+辣度平均值+英文空格+酸度平均值+英文空格+甜度平均值+英文空格
最后按拼音顺序输出每位客户(不考虑客户同名或拼音相同的情况)的支付金额,格式: 用户姓名+英文空格+手机号+英文空格+支付总金额,按输入顺序排列。
输入样例1:
桌号时间超出营业范围。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 21/30/00
1 麻婆豆腐 3 1 2
2 油淋生菜 2 1
3 麻婆豆腐 2 3 2
end
输出样例1:
在这里给出相应的输出。例如:
table 1 out of opening hours
输入样例2:
一种口味的菜品。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 20/30/00
1 麻婆豆腐 2 1 2
2 油淋生菜 2 1
3 麻婆豆腐 2 3 2
end
输出样例2:
在这里给出相应的输出。例如:
table 1: 
1 麻婆豆腐 24
2 油淋生菜 14
3 麻婆豆腐 48
table 1: 86 62 川菜 4 稍辣
tom 13605054400 62
输入样例3:
辣度值超出范围。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 18/30/00
1 麻婆豆腐 6 1 2
2 油淋生菜 1 1
3 麻婆豆腐 5 3 2
end
输出样例3:
在这里给出相应的输出。例如:
table 1: 
spicy num out of range :6
2 油淋生菜 9
3 麻婆豆腐 48
table 1: 57 41 川菜 2 爆辣
tom 13605054400 41
输入样例4:
同一用户对应多桌菜。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 18/30/00
1 麻婆豆腐 1 1 2
2 油淋生菜 1 1
3 麻婆豆腐 2 2 2
table 2 : tom 13605054400 2023/5/6 18/30/00
1 麻婆豆腐 2 1 2
2 麻辣鸡丝 2 2
3 麻婆豆腐 2 1 1
end
输出样例4:
在这里给出相应的输出。例如:
table 1: 
1 麻婆豆腐 24
2 油淋生菜 9
3 麻婆豆腐 36
table 2: 
1 麻婆豆腐 24
2 麻辣鸡丝 30
3 麻婆豆腐 12
table 1: 69 49 川菜 4 稍辣
table 2: 66 66 川菜 3 稍辣
tom 13605054400 115
输入样例5:
多用户多桌菜。例如:
东坡肉 浙菜 25 T
油淋生菜 9
蜜汁灌藕 浙菜 10 T
刀削面 晋菜 10 T
醋浇羊肉 晋菜 30 T
麻婆豆腐 川菜 12 T
麻辣鸡丝 川菜 15 T
table 1 : tom 13605054400 2023/5/6 12/30/00
1 醋浇羊肉 4 1 1
3 刀削面 1 1 3
2 东坡肉 3 2 1
4 麻辣鸡丝 2 1 1
table 2 : jerry 18100334566 2023/5/1 12/30/00
1 醋浇羊肉 1 1 2
3 麻婆豆腐 2 2 1
4 麻辣鸡丝 2 3 3
table 3 : jerry 18100334566 2023/5/1 12/30/00
1 醋浇羊肉 2 1 1
3 蜜汁灌藕 1 1 2
2 东坡肉 2 2 1
4 麻辣鸡丝 5 1 1
end
输出样例5:
在这里给出相应的输出。例如:
table 1: 
1 醋浇羊肉 30
3 刀削面 30
2 东坡肉 38
4 麻辣鸡丝 15
table 2: 
1 醋浇羊肉 60
3 麻婆豆腐 18
4 麻辣鸡丝 90
table 3: 
1 醋浇羊肉 30
3 蜜汁灌藕 20
2 东坡肉 38
4 麻辣鸡丝 15
table 1: 113 113 川菜 1 稍辣 晋菜 4 稍酸 浙菜 1 甜
table 2: 168 118 川菜 4 稍辣 晋菜 2 微酸
table 3: 103 73 川菜 1 爆辣 晋菜 1 稍酸 浙菜 3 微甜
jerry 18100334566 191
tom 13605054400 113
输入样例6:
多用户多桌菜含代点菜。例如:
东坡肉 浙菜 25 T
油淋生菜 9
蜜汁灌藕 浙菜 10 T
刀削面 晋菜 10 T
醋浇羊肉 晋菜 30 T
麻婆豆腐 川菜 12 T
麻辣鸡丝 川菜 15 T
table 1 : tom 13605054400 2023/5/6 12/30/00
1 醋浇羊肉 4 1 1
3 刀削面 1 1 3
2 东坡肉 3 2 1
4 麻辣鸡丝 2 1 1
table 2 : jerry 18100334566 2023/5/1 12/30/00
1 1 醋浇羊肉 0 1 2
3 麻婆豆腐 2 2 1
4 麻辣鸡丝 2 3 3
table 3 : lucy 18957348763 2023/5/1 12/30/00
1 醋浇羊肉 2 1 1
3 蜜汁灌藕 1 1 2
2 东坡肉 2 2 1
4 麻辣鸡丝 5 1 1
end
输出样例6:
在这里给出相应的输出。例如:
table 1: 
1 醋浇羊肉 30
3 刀削面 30
2 东坡肉 38
4 麻辣鸡丝 15
table 2: 
1 table 2 pay for table 1 60
3 麻婆豆腐 18
4 麻辣鸡丝 90
table 3: 
1 醋浇羊肉 30
3 蜜汁灌藕 20
2 东坡肉 38
4 麻辣鸡丝 15
table 1: 113 113 川菜 1 稍辣 晋菜 6 微酸 浙菜 1 甜
table 2: 168 118 川菜 4 稍辣
table 3: 103 73 川菜 1 爆辣 晋菜 1 稍酸 浙菜 3 微甜
jerry 18100334566 118
lucy 18957348763 73
tom 13605054400 113
输入样例7:
错误的菜品记录和桌号记录,用户丢弃。例如:
东坡肉 25 T
油淋生菜 9
table 1 : tom 136050540 2023/5/1 12/30/00
2 东坡肉 3 2 1
end
输出样例7:
在这里给出相应的输出。例如:
wrong format
wrong format我的代码如图:
import java.text.ParseException;
import java.util.*;
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        List<Table> tables = new ArrayList<>();
        Menu menu = new Menu();
        String line = in.nextLine();
        Table curTable = null;
        while (!line.equals("end")) {
            String[] parts = line.split(" ");
            if (parts.length > 2) {
                if ("table".equals(parts[0])) {
                    Table table = new Table();
                    tables.add(table);
                    table.setTime(parts[2]);
                    table.setIndex(parts[1]);
                    table.setDayTime(parts[3]);
                    table.setOrder(new Order(menu, table));
                    curTable = table;
                } else if (parts.length == 4) {
                    int orderNum = Integer.parseInt(parts[0]);
                    String dishName = parts[1];
                    int portion = Integer.parseInt(parts[2]);
                    int num = Integer.parseInt(parts[3]);
                    assert curTable != null;
                    curTable.getOrder().addARecord(orderNum, dishName, portion, num, curTable.getIndex(), curTable.getIndex());
                } else if (parts.length == 5) {
                    for (Table table : tables) {
                        if (table.getIndex().equals(parts[0])) {
                            // 代點菜
                            int orderNum = Integer.parseInt(parts[1]);
                            String dishName = parts[2];
                            int portion = Integer.parseInt(parts[3]);
                            int num = Integer.parseInt(parts[4]);
                            table.getOrder().addARecord(orderNum, dishName, portion, num, curTable.getIndex(), parts[0]);
                            curTable.getOrder().addARecord(orderNum, dishName, portion, num, curTable.getIndex(), parts[0]);
                            break;
                        }
                    }
                }
            } else if ("delete".equals(parts[1])) {
                assert curTable != null;
                curTable.getOrder().delARecordByOrderNum(Integer.parseInt(parts[0]));
            } else {
                menu.addDish(parts[0], Integer.parseInt(parts[1]));
            }
            line = in.nextLine();
        }
        for (Table table : tables) {
            System.out.println("table " + table.getIndex() + ": ");
            Order order = table.getOrder();
            for (Record record : order.getRecords()) {
                String from = record.getFrom();
                String to = record.getTo();
                if (record.isAddError()) {
                    System.out.println(record.getD().getName() + " does not exist");
                } else if (record.isDelError()) {
                    System.out.println("delete error;");
                } else if (from.equals(table.getIndex())) {
                    if (to.equals(table.getIndex())) {
                        System.out.println(record.getOrderNum() + " " + record.getD().getName() + " " + record.getPrice());
                    } else {
                        System.out.println(record.getOrderNum() + " table " + from + " pay for table " + to + " " + record.getPrice());
                    }
                }
            }
        }
        for (Table table : tables) {
            Order order = table.getOrder();
            int sale = table.getSale();
            if (sale > 0) {
                System.out.println("table " + table.getIndex() + ": " + Math.round(order.getTotalPrice() * sale / 10f));
            } else {
                System.out.println("table " + table.getIndex() + " out of opening hours");
            }
        }
    }
}
class Table {
    private String index;
    private String dayTime;
    private String time;
    private Order order;
    public String getIndex() {
        return index;
    }
    public void setIndex(String index) {
        this.index = index;
    }
    public void setDayTime(String dayTime) {
        this.dayTime = dayTime;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public Order getOrder() {
        return order;
    }
    public void setOrder(Order order) {
        this.order = order;
    }
    private Calendar getTimeCalendar(String time) {
        String[] arr = time.split("/");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(arr[0]));
        cal.set(Calendar.MINUTE, Integer.parseInt(arr[1]));
        cal.set(Calendar.SECOND, Integer.parseInt(arr[2]));
        return cal;
    }
    public int getSale() {
        String[] dayArray = time.split("/");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 32);
//
//        calendar.set(Calendar.YEAR,Integer.parseInt(dayArray[0]));
//        calendar.set(Calendar.MONTH, Integer.parseInt(dayArray[1]) - 1);
//        calendar.set(Calendar.DATE,Integer.parseInt(dayArray[2]));
        calendar.set(Integer.parseInt(dayArray[0]), Integer.parseInt(dayArray[1])-1, Integer.parseInt(dayArray[2]));
        Calendar now = getTimeCalendar(dayTime);
        int weekDay = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        if (weekDay == 0 || weekDay == 6) {
            if (!now.before(getTimeCalendar("9/30/0")) && !now.after(getTimeCalendar("21/00/00"))) {
                return 10;
            }
        } else {
            if (!now.before(getTimeCalendar("17/00/00")) && !now.after(getTimeCalendar("20/30/00"))) {
                return 8;
            }
            if (!now.before(getTimeCalendar("10/30/00")) && !now.after(getTimeCalendar("14/30/00"))) {
                return 6;
            }
        }
        // 表示不营业
        return 0;
    }
}
class Menu {
    private final Map<String, Dish> dishs = new HashMap<>();//菜品数组,保存所有菜品信息
    Menu() {
    }
    Dish searchDish(String dishName) {
        return dishs.get(dishName);
    }
    //添加一道菜品信息
    void addDish(String dishName, int unit_price) {
        Dish dish = new Dish(dishName, unit_price);
        dishs.put(dishName, dish);
    }
}
class Dish {
    String name;//菜品名称
    int unit_price; //单价
    public Dish(String dishName) {
        this.name = dishName;
    }
    public String getName() {
        return name;
    }
    public Dish(String name, int unit_price) {
        this.name = name;
        this.unit_price = unit_price;
    }
    //计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
    int getPrice(int portion) {
        float b[] = {1, 1.5f, 2};
        return Math.round((unit_price * b[portion - 1]));
    }
}
class Record {
    private int orderNum;//序号\
    private Dish d;//菜品\
    private int portion;//份额(1/2/3代表小/中/大份)\
    private int num;
    private String from;
    private String to;
    private boolean isDelete = false;
    private boolean isAddError = false;
    private boolean isDelError = false;
    public Record() {
    }
    public Record(int orderNum, Dish d, int portion, int num, String from, String to) {
        this.orderNum = orderNum;
        this.d = d;
        this.portion = portion;
        this.num = num;
        this.from = from;
        this.to = to;
    }
    //计价,计算本条记录的价格
    int getPrice() {
        return d.getPrice(portion) * this.num;
    }
    public int getOrderNum() {
        return orderNum;
    }
    public Dish getD() {
        return d;
    }
    public void setD(Dish d) {
        this.d = d;
    }
    public boolean isDelete() {
        return isDelete;
    }
    public void setDelete(boolean delete) {
        isDelete = delete;
    }
    public boolean isAddError() {
        return isAddError;
    }
    public void setAddError(boolean addError) {
        isAddError = addError;
    }
    public boolean isDelError() {
        return isDelError;
    }
    public void setDelError(boolean delError) {
        isDelError = delError;
    }
    public String getFrom() {
        return from;
    }
    public String getTo() {
        return to;
    }
    public void setTo(String to) {
        this.to = to;
    }
}
class Order {
    private Menu menu;
    private Table table;
    public List<Record> getRecords() {
        return records;
    }
    private final List<Record> records = new ArrayList<>();//保存订单上每一道的记录
    public Order(Menu menu, Table table) {
        this.menu = menu;
        this.table = table;
    }
    //计算订单的总价
    int getTotalPrice() {
        int sum = 0;
        for (Record record : records) {
            if (!record.isDelete() && !record.isDelError() && !record.isAddError() && table.getIndex().equals(record.getFrom())) {
                int price = record.getPrice();
                sum = sum + price;
            }
        }
        return sum;
    }
    //添加一条菜品信息到订单中。
    void addARecord(int orderNum, String dishName, int portion, int num, String from, String to) {
        Dish dish = menu.searchDish(dishName);
        if (dish == null && table.getIndex().equals(from)) {
            Record record = new Record();
            record.setD(new Dish(dishName));
            record.setAddError(true);
            records.add(record);
            return;
        }
        Record record = new Record(orderNum, dish, portion, num, from, to);
        records.add(record);
    }
    public void delARecordByOrderNum(int orderNum) {
        for (Record record : records) {
            if (record.getOrderNum() == orderNum) {
                record.setDelete(true);
                return;
            }
        }
        Record record = new Record();
        record.setDelError(true);
        records.add(record);
    }
}
这道题目我开始尝试用类来进行写题目,因为运用的不太熟练,这道题目折磨了我好几天,写这道题目我的思路就是对订单进行分块处理,然后用类来进行处理。写这个题目我是先按照给的输入输出来进行构思主方法,然后再慢慢校对。耗费的时间比较久。
三、踩坑心得:

再写第一次作业的时候,我因为强制转换问题踩了坑,如图代码的float问题。
还有一个情况就是

在这个题目我一开始直接开了10000的空间用双重循环来写,但是会爆掉,想了好久才发现TLE了,要用数据结构set来去重,算是踩了坑。
接下来就是一个动态规划的题目
 
这个题目是一个经典的dp题目,但是这个题目时间卡的很紧,总是有三分过不了,身边的同学都有这种困惑,最后查找加资料才发现有一个输入输出同步流可以更快的运行编译,不过一般的题目不会这么卡时间。
四:主要困难以及改进建议
在解题过程中,我遇到的一个主要问题是理解题目中所描述的问题,特别是对于一些复杂或者抽象的概念,可能需要更多的时间来思考和理解题意。针对这种情况,我认为可以通过以下几个方面来改进:首先,在做题之前要仔细阅读题目,尤其是关键句子和需要注意的细节,确保对问题有一个清晰的认识。如果有疑惑,可以多看题目几遍或者向其他人请教,例如询问老师、同学或者网上论坛等。其次,在解题过程中应该善于利用一些调试技巧,例如打印输出语句、单步执行等方法,以便更好地理解代码的运行结构和逻辑。这样有助于我们发现代码中存在的错误,并更加快速地定位解决问题的法。通过不断实践,掌握编程的基本技能,逐渐积累经验。
五:总结
在完成本阶段的三次题目集的过程中,我深刻地认识到了编程能力对于计算机科学专业的重要性。通过不断的练习和思考,我对Java语言的基础知识有了更加深入的理解,并对编写高质量代码有了更清晰的认识。通过本阶段的学习,我意识到自己还需要进一步学习和研究的方面。首先,我希望能够掌握更多的数据结构和算法知识,以便应对更加复杂的问题和挑战;其次,我还需要提高自己的实践能力,在实际项目中应用所学知识、积累经验;最后,我也希望加强自己的代码风格和规范性,提高编码的效率和质量。针对教师、课程、作业、实验、课上及课下组织方式等方面,我对其中的一些方面提出改进建议:
- 
教师应该更多地注重培养学生的动手能力和实践能力,鼓励学生积极参加相关的实践项目和比赛活动; 
- 
作业的难度可以逐步增加,同时给出合理的批改反馈,以刺激学生不断地提升自身的编程能力; 
- 
在实验环节中,可以增加更多真实场景下的案例分析情境,帮助学生更好地掌握所学知识点的运用和实践; 
- 
课上的教学内容和形式可以有所丰富,如融入问题解决、编程练习和小组讨论等环节,以更好地激发学生的学习兴趣和积极性。 
总之,本阶段的学习对我的专业技能和职业素养的提升有着积极的影响。
本体大部分内容与菜单计价程序-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 
                    
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号