PTA菜单计价4,5以及期中考试总结

发布时间 2023-11-16 21:05:45作者: Kaceyluck
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轴的坐标值(实型数),求得该矩形的面积。类设计如下图:


image.png

输入格式:

分别输入两个坐标点的坐标值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();
    }
}