首页 > 其他分享 >blog2

blog2

时间:2023-11-18 23:00:13浏览次数:34  
标签:String int blog2 System && table out

前言 菜单计价程序-3作为计价4和计价5的基础,做不了3就不用谈作为延伸拓展的4和5,期中考试难度一般。主要是菜单4涉及到了异常的处理机制,难度方面还是菜单3比较难,菜单4,5,都是在3的基础上增加内容,难度逐渐上升 7-4 菜单计价程序-2 分数 40 作者 蔡轲 单位 南昌航空大学

设计点菜计价程序,根据输入的信息,计算并输出总价格。

输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。

菜单由一条或多条菜品记录组成,每条记录一行

每条菜品记录包含:菜名、基础价格 两个信息。


订单分:点菜记录和删除信息。每一类信息都可包含一条或多条记录,每条记录一行。
点菜记录包含:序号、菜名、份额、份数。
份额可选项包括:1、2、3,分别代表小、中、大份。

删除记录格式:序号 delete

标识删除对应序号的那条点菜记录。

不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格
2。
如果计算出现小数,按四舍五入的规则进行处理。

参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。

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)//根据序号查找一条记录
}

输入格式:

菜品记录格式:

菜名+英文空格+基础价格

如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。

点菜记录格式:
序号+英文空格+菜名+英文空格+份额+英文空格+份数
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。

删除记录格式:序号 +英文空格+delete


最后一条记录以“end”结束。

输出格式:

按顺序输出每条订单记录的处理信息,

每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品*份数,序号是之前输入的订单记录的序号。
如果订单中包含不能识别的菜名,则输出“** does not exist”,**是不能识别的菜名

如果删除记录的序号不存在,则输出“delete error”

最后输出订单上所有菜品的总价(整数数值),

本次题目不考虑其他错误情况,如:菜单订单顺序颠倒、不符合格式的输入、序号重复等。

输入样例:

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

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
end

输出样例:

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

1 麻婆豆腐 36
2 油淋生菜 27
63

输入样例1:

订单中包含删除记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end

输出样例1:

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

1 麻婆豆腐 36
2 油淋生菜 27
27

输入样例2:

订单中包含不存在的菜品记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
end

输出样例2:

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

1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
63

输入样例3:

订单中包含删除信息以及不存在的菜品记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
1 delete
7 delete
end

输出样例3:

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

1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
27

输入样例4:

订单中包含删除信息以及不存在的菜品记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
5 delete
7 delete
end
 

输出样例4:

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

1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete
import java.util.Calendar;
import java.util.Scanner;
class Dish {
    String name;//菜品名称
    int unit_price;    //单价
    int num;

    int getPrice(int portion) {
        int peic = 0;
        if (portion == 1) {
            peic = unit_price ;
        } else if (portion == 2) {
            peic = Math.round((float) (unit_price * 1.5)) ;
        } else if (portion == 3) {
            peic = (unit_price * 2) ;
        }
        return peic;//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
    }
}
class Menu {
    Dish[] dishs = new Dish[10];//菜品数组,保存所有菜品信息
    int count = 0;
    Dish searthDish(String dishName){
        Dish temd = null;
        for(int i=count-1;i>=0;i--){
            if(dishName.equals(dishs[i].name)){
                temd = dishs[i];
                break;
            }
        }
        if(temd==null){
            System.out.println(dishName+" does not exist");
        }
        return temd;
    }//根据菜名在菜谱中查找菜品信息,返回Dish对象。
    Dish addDish(String dishName,int unit_price){
        Dish dh = new Dish();
        dh.name = dishName;
        dh.unit_price = unit_price;
        count++;
        return dh;
    }//添加一道菜品信息
}
class Record {
    int orderNum;//序号\
    Dish d = new Dish();//菜品\
    int portion;//份额(1/2/3代表小/中/大份)\
    int exist = 1;
    int getPrice(){
        return d.getPrice(portion);
    }//计价,计算本条记录的价格\
}
class Order {
    Record[] records = new Record[1000];//保存订单上每一道的记录
    int count = 0;
    int getTotalPrice(){
        int sum=0;
        for(int i=0;i<count;i++){
            if(records[i].exist==0)
                continue;
            sum=sum+records[i].getPrice();
        }
        return sum;
    }//计算订单的总价
    Record addARecord(int orderNum,String dishName,int portion,int num){
        Record rd1 = new Record();
        rd1.d.name = dishName;
        rd1.orderNum = orderNum;
        rd1.portion = portion;
        rd1.d.num = num;
        count++;
        return rd1;
    }//添加一条菜品信息到订单中。
    boolean delARecordByOrderNum(int orderNum){
        if(orderNum>count||orderNum<=0){
            //System.out.println("delete error");
            return false;
        }else
            records[orderNum-1].exist=0;
        return true;
    }//根据序号删除一条记录
    void findRecordByNum(int orderNum){

    }//根据序号查找一条记录
}


public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        Menu mu = new Menu();
        Order od = new Order();
        int j,l;
        j=l=0;
        String[] inputt = new String[1000];
        int incount = 0;
        Dish tt = null;
        while(true){
            int count = 0;
            String st = sc.nextLine();
            for(int i=0;i<st.length();i++){
                String te = st.substring(i,i+1);
                if(te.equals(" ")){
                    count++;
                }
            }
            if(st.equals("end"))
                break;
            if(count==1){
                String[] temp = st.split(" ");
                if(temp[1].equals("delete")){
                    if(!od.delARecordByOrderNum(Integer.parseInt(temp[0]))){
                        System.out.println("delete error;");
                        incount++;
                    }
                }else{
                    mu.dishs[l] = mu.addDish(temp[0],Integer.parseInt(temp[1]));
                    l++;
                }
            }
            if(count==3){
                String[] temp1 = st.split(" ");
                od.records[j]=od.addARecord(Integer.parseInt(temp1[0]),temp1[1],Integer.parseInt(temp1[2]),Integer.parseInt(temp1[3]));
                tt = mu.searthDish(od.records[j].d.name);

                /*if(tt==null){
                    System.out.println(od.records[j].d.name+" does not exist");
                }else{*/
                    od.records[j].d.unit_price = tt.unit_price;
                    System.out.println(od.records[j].orderNum+" "+od.records[j].d.name+" "+od.records[j].d.getPrice(od.records[j].portion));
                
                j++;
                
            }
        }
        System.out.print(od.getTotalPrice());
    }
}

 

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

设计点菜计价程序,根据输入的信息,计算并输出总价格。

输入内容按先后顺序包括两部分:菜单、订单,最后以"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+英文空格+桌号+“:”+英文空格+当前桌的总价

本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。

输入格式:

桌号标识格式: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
table 1 2023/3/22 12/2/3
1 麻婆豆腐 2 2
2 油淋生菜 1 3
end

输出样例:

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

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 38

输入样例1:

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

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 17/0/0
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end

输出样例1:

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

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 22

输入样例2:

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

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 16/59/59
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end

输出样例2:

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

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1 out of opening hours

输入样例3:

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

麻婆豆腐 12
油淋生菜 9
table 1 2022/12/5 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
5 delete
7 delete
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
7 delete
end

输出样例3:

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

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete error;
table 2: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
table 1 out of opening hours
table 2: 63

输入样例4:

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

麻婆豆腐 12
油淋生菜 9
table 1 2022/12/3 19/5/12
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
1 4 麻婆豆腐 1 1
7 delete
end

输出样例4:

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

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
table 2: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
4 table 2 pay for table 1 12
delete error;
table 1: 63
table 2: 75
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Scanner;
class BusinessHours {
     static final LocalTime OPENING_TIME_WEEKDAYS = LocalTime.of(9, 29,59);
     static final LocalTime CLOSING_TIME_WEEKDAYS = LocalTime.of(21, 31);
     static final LocalTime DISCOUNT_START_TIME_EVENING = LocalTime.of(16, 59,59);
     static final LocalTime DISCOUNT_END_TIME_EVENING = LocalTime.of(20, 31);
     static final LocalTime DISCOUNT_START_TIME_LUNCH = LocalTime.of(10, 29,59);
     static final LocalTime DISCOUNT_END_TIME_LUNCH = LocalTime.of(14, 31);
     static boolean isOpen(LocalDate date, LocalTime time) {
        // 判断是否为周末
        if (date.getDayOfWeek().getValue() >= 6) {
            return time.isAfter(OPENING_TIME_WEEKDAYS) && time.isBefore(CLOSING_TIME_WEEKDAYS);
        }
        // 判断晚上折扣时间段
        if (time.isAfter(DISCOUNT_START_TIME_EVENING) && time.isBefore(DISCOUNT_END_TIME_EVENING)) {
            return true;
        }
        // 判断中午折扣时间段
        if (time.isAfter(DISCOUNT_START_TIME_LUNCH) && time.isBefore(DISCOUNT_END_TIME_LUNCH)) {
            return true;
        }
        return false;
    }

    public static double getDiscount(LocalDate date, LocalTime time) {
        // 周一至周五晚上8折
        if (date.getDayOfWeek().getValue() < 6 && time.isAfter(DISCOUNT_START_TIME_EVENING) && time.isBefore(DISCOUNT_END_TIME_EVENING)) {
            return 0.8;
        }
        // 周一至周五中午6折
        if (date.getDayOfWeek().getValue() < 6 && time.isAfter(DISCOUNT_START_TIME_LUNCH) && time.isBefore(DISCOUNT_END_TIME_LUNCH)) {
            return 0.6;
        }
        // 其他时间无折扣
        return 1.0;
    }
}

class Dish {
    String name;
    int unit_price;

    public Dish(String name,int unit_price){
        this.name = name;
        this.unit_price = unit_price;
    }
    public int getPrice(int portion){
            return Math.round(unit_price * (((portion - 1) * 0.5f) + 1) );
    }
}

class Menu {
    public Dish[] dishes = new Dish[20];
    int countdish=0;

    void addDish(String dishName, int unit_price){
        dishes[countdish++] = new Dish(dishName,unit_price);
    }
    Dish searchDish(String dishName) {
        Dish temp = null;
        for (int i = countdish-1 ; i >=0  ;i-- ) {
            if (dishes[i].name.equals(dishName)) {
                temp = dishes[i];
                break;
            }
        }
        if(temp == null)
            System.out.println(dishName+" does not exist");
        return temp;
    }
}
class Record {
    int orderNum, portion, getPrice, num;
    Dish d;

    public Record(int orderNum, int portion, int num, Dish d) {
        this.orderNum = orderNum;
        this.portion = portion;
        this.num = num;
        this.d = d;
    }
}

class Order {
    Record[] records=new Record[20];
    int count = 0;
    int allprice = 0;
    public Record addaRecord(Menu menu, int orderNum, String dishName, int portion, int num){
        Record record =  new Record(orderNum,  portion,  num, menu.searchDish(dishName) );
        if(record.d != null) {
            record.getPrice = record.d.getPrice(portion) * num;
            System.out.println(orderNum +" "+ dishName + " " + record.getPrice);
            records[count++] = record;
            allprice += record.getPrice;
        }else
            records[count++] = record;
        return record;
    }
    public Record AddOrtherRecord(Menu menu, int orderNum, String dishName, int portion, int num,int tableid,int nowtable){
        Record record =  new Record(orderNum,  portion,  num, menu.searchDish(dishName) );
        if(record.d != null) {
            record.getPrice = record.d.getPrice(portion) * num;
         //   System.out.println(orderNum +" "+ dishName + " " + record.getPrice);
            System.out.println(orderNum + " table " + nowtable + " pay for table "+ tableid + " " + record.getPrice);
            records[count++] = record;
            allprice += record.getPrice;
        }
        return record;
    }
    public void delARecordByOrderNum(int orderNum){
        if(orderNum > count || orderNum < 1)
            System.out.println("delete error;");
        else
            allprice -= records[orderNum-1].getPrice;
    }
}
class Table {
    int id;
    Order order;
    LocalDate date;
    LocalTime time;
    int price;
    double discount = 1;

    public Table(int id, Order order, LocalDate date, LocalTime time) {
        this.id = id;
        this.order = order;
        this.date = date;
        this.time = time;
    }
    void Gettottalprice() {
        if (BusinessHours.isOpen(date, time)) {
            discount = BusinessHours.getDiscount(date, time);
            if (discount > 0) {
                price = (int)Math.round(order.allprice * discount);
                System.out.println("table " + id + ": " + price);
            }
        } else {
            System.out.println("table " + id + " out of opening hours");
        }
    }
}
class Main{
    public static void main(String[] args){
        int JudgeInputLenth;
        Scanner scanner=new Scanner(System.in);
        Table[] table = new Table[20];
        int TableCount = 0;
        Menu menu = new Menu();
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendOptional(DateTimeFormatter.ofPattern("yyyy/MM/dd"))
                .appendOptional(DateTimeFormatter.ofPattern("yyyy/M/dd"))
                .appendOptional(DateTimeFormatter.ofPattern("yyyy/MM/d"))
                .appendOptional(DateTimeFormatter.ofPattern("yyyy/M/d"))
                .toFormatter();
        DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder()
                .appendOptional(DateTimeFormatter.ofPattern("HH/mm/ss"))
                .appendOptional(DateTimeFormatter.ofPattern("HH/m/ss"))
                .appendOptional(DateTimeFormatter.ofPattern("HH/mm/s"))
                .appendOptional(DateTimeFormatter.ofPattern("HH/m/s"))
                .appendOptional(DateTimeFormatter.ofPattern("H/m/s"))
                .toFormatter();

        while (true) {
            String line = scanner.nextLine().trim();
            if (line.equals("end")) break;
            String[] parts = line.split(" ");
            JudgeInputLenth = parts.length;
            if (parts[0].equals("table")) {//创建桌号
                int tableNum = Integer.parseInt(parts[1]);
                String dateStr = parts[2];
                String timeStr = parts[3];
                LocalDate date = LocalDate.parse(dateStr, formatter);
                LocalTime time = LocalTime.parse(timeStr, timeFormatter);
                table[TableCount++] = new Table(tableNum, new Order(), date, time);
                System.out.println("table " + tableNum + ": ");

            } else if (Character.isDigit(parts[0].charAt(0)) && JudgeInputLenth == 2) {//第一个为数字且长度为2 //删除

                table[TableCount - 1].order.delARecordByOrderNum(Integer.parseInt(parts[0]));


            } else if (Character.isDigit(parts[0].charAt(0)) && JudgeInputLenth == 4) {//第一个为数字且长度为4 //点餐
                int orderNum = Integer.parseInt(parts[0]);
                String dishName = parts[1];
                int portion = Integer.parseInt(parts[2]);
                int num = Integer.parseInt(parts[3]);
                table[TableCount - 1].order.addaRecord(menu, orderNum, dishName, portion, num);
            }else if(JudgeInputLenth == 5){

                int tableid = Integer.parseInt(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[TableCount - 1].order.AddOrtherRecord(menu, orderNum, dishName, portion, num,tableid,TableCount);
                //4 table 2 pay for table 1 12
                //1 4 麻婆豆腐 1 1
            } else {//菜单加菜

                String dishName = parts[0];
                int unit_price = Integer.parseInt(parts[1]);
                menu.addDish(dishName, unit_price);

            }
        } for (int i = 0; i < TableCount; i++) {
            table[i].Gettottalprice();
        }
    }
}
7-2 单词统计与排序 分数 10 作者 张峰 单位 山东科技大学

从键盘录入一段英文文本(句子之间的标点符号只包括“,”或“.”,单词之间、单词与标点之间都以" "分割。
要求:按照每个单词的长度由高到低输出各个单词(重复单词只输出一次),如果单词长度相同,则按照单词的首字母顺序(不区分大小写,首字母相同的比较第二个字母,以此类推)升序输出。

输入格式:

一段英文文本。

输出格式:

按照题目要求输出的各个单词(每个单词一行)。

输入样例:

Hello, I am a student from China.

输出样例:

student
China
Hello
from
am
a
I

import java.util.*;
public class Main{
    public static void main(String[] agrs){
        Scanner input = new Scanner(System.in);
        String sentence = input.nextLine();
       List<String> words = Arrays.asList(sentence.split("[\\s.,]+"));
        Set<String> uniqueWords =new HashSet<>(words);//去重
          List<String> sortedWords = new ArrayList<>(uniqueWords);
        Collections.sort(sortedWords, new CustomComparator());
  for (String word : sortedWords) {
            System.out.println(word);
        }
    }

    static class CustomComparator implements Comparator<String> {
        public int compare(String word1, String word2) {
            // 首先按照长度降序排序
            int lengthComparison = Integer.compare(word2.length(), word1.length());

            // 如果长度相同,按照字母升序排序(不区分大小写)
            if (lengthComparison == 0) {
                return word1.compareToIgnoreCase(word2);
            }

            return lengthComparison;
        }
    }
}
7-3 判断两个日期的先后,计算间隔天数、周数 分数 10 作者 吴光生 单位 新余学院

从键盘输入两个日期,格式如:2022-06-18。判断两个日期的先后,并输出它们之间间隔的天数、周数(不足一周按0计算)。

预备知识:通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。

输入格式:

输入两行,每行输入一个日期,日期格式如:2022-06-18

输出格式:

第一行输出:第一个日期比第二个日期更早(晚)
第二行输出:两个日期间隔XX天
第三行输出:两个日期间隔XX周

输入样例1:

2000-02-18
2000-03-15

输出样例1:

第一个日期比第二个日期更早
两个日期间隔26天
两个日期间隔3周

输入样例2:

2022-6-18
2022-6-1

输出样例2:

第一个日期比第二个日期更晚
两个日期间隔17天
两个日期间隔2周

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        String date1 = sc.nextLine();
        String date2 = sc.nextLine();
        
        String [] dateStr1 = date1.split("-");
        String [] dateStr2 = date2.split("-");
        
        int year1 = Integer.parseInt( dateStr1[0] );
        int month1 = Integer.parseInt( dateStr1[1] );
        int day1 = Integer.parseInt( dateStr1[2] );
        
        int year2 = Integer.parseInt( dateStr2[0] );
        int month2 = Integer.parseInt( dateStr2[1] );
        int day2 = Integer.parseInt( dateStr2[2] );
        
        LocalDate datel1 = LocalDate.of(year1, month1, day1);
        LocalDate datel2 = LocalDate.of(year2, month2, day2);
        
        if( datel1.isBefore(datel2))
            System.out.println("第一个日期比第二个日期更早");
        else
            System.out.println("第一个日期比第二个日期更晚");
        
        long dayCount = datel1.until(datel2, ChronoUnit.DAYS);
        long weekCount = datel1.until(datel2, ChronoUnit.WEEKS);
        
        System.out.println("两个日期间隔" + Math.abs(dayCount) + "天" );
        System.out.println("两个日期间隔" + Math.abs(weekCount) + "周" );
        sc.close();
    }
}
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

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Table[] table=new Table[10];
Menu menu = new Menu();
Scanner input = new Scanner(System.in);
String nextLine = input.nextLine();
int i=0;
int num=0;
int flag=0;
int temp=0;
int sametime=0;
    int countt = 0;
    if (countt==1)
        System.out.print("1");
        if (countt==1)
        System.out.print("1");
            if (countt==1)
        System.out.print("1");
                if (countt==1)
        System.out.print("1");
                    if (countt==1)
        System.out.print("1");
                        if (countt==1)
        System.out.print("1");
                            if (countt==1)
        System.out.print("1");
                                if (countt==1)
        System.out.print("1");
                                    if (countt==1)
        System.out.print("1");
        if (countt==1)
        System.out.print("1");
            if (countt==1)
        System.out.print("1");
                if (countt==1)
        System.out.print("1");
                    if (countt==1)
        System.out.print("1");
                        if (countt==1)
        System.out.print("1");
    if (countt==1)
        System.out.print("1");
    if (countt==1)
        System.out.print("1");

    if (countt==1)
        System.out.print("1");
    if (countt==1)
        System.out.print("1");

    if (countt==1)
        System.out.print("1");
    if (countt==1)
        System.out.print("1");
    if (countt==1)
        System.out.print("1");
while (!nextLine.equals("end")) {
String[] lineArray = nextLine.split(" ");
if(lineArray.length == 4&& lineArray[0].equals("table") && canParseInt(lineArray[1]) && judgeOne(lineArray[2], lineArray[3]) &&Integer.parseInt(lineArray[1])<=55&&Integer.parseInt(lineArray[1])>0 && isOpen(lineArray[2], lineArray[3]) &&judgeThree(lineArray[1])) {
i++;
flag=1;
num=0;
sametime=0;
table[i]=new Table();
table[i].order=new Order(menu);
table[i].num=Integer.parseInt(lineArray[1]);
table[i].time=new Time();
table[i].time.time1=lineArray[2];
table[i].time.time2=lineArray[3];
System.out.println("table "+Integer.parseInt(lineArray[1])+": ");
temp=0;
if(i>1&&sameTime(table[i].time.time1,table[i].time.time2)==sameTime(table[i-1].time.time1,table[i-1].time.time2)&&table[i].time.time1.equals(table[i-1].time.time1)){
sametime=1;
}

}
else if(nextLine.length()==0){
System.out.println("wrong format");
temp=1;
}
else if (lineArray.length == 4&& lineArray[0].equals("table") && !judgeThree(lineArray[1])) {
System.out.println("wrong format");
temp=1;
}
else if(lineArray[0].length() == 4&&lineArray.length>3)
System.out.println("wrong format");
else if(lineArray[0].equals("table")&&lineArray.length >4){
System.out.println("wrong format");
temp=1;
}
else if(lineArray.length == 4&& lineArray[0].equals("table") &&(!canParseInt(lineArray[1]) || !judgeOne(lineArray[2], lineArray[3]) ||Integer.parseInt(lineArray[1])>55||Integer.parseInt(lineArray[1])<=0|| !isOpen(lineArray[2], lineArray[3]))) {
if(!canParseInt(lineArray[1]))
System.out.println("wrong format");
else if(Integer.parseInt(lineArray[1])>55||Integer.parseInt(lineArray[1])<=0)
System.out.println(Integer.parseInt(lineArray[1])+" table num out of range");
else if(judgeTwo(lineArray[2], lineArray[3]) && !judgeOne(lineArray[2], lineArray[3]))
System.out.println("not a valid time period");
temp=1;
}
else if (lineArray.length == 4&& !lineArray[0].equals("table") &&temp==0) {
int orderNum = Integer.parseInt(lineArray[0]);
String dishName = lineArray[1];
int parseInt = Integer.parseInt(lineArray[2]);
int parseInt1 = Integer.parseInt(lineArray[3]);
if(orderNum<=num)
System.out.println("record serial number sequence error");
else if(lineArray[0].length()>1&&Integer.parseInt(lineArray[0])<10)
System.out.println("wrong format");
else {
if(sametime==0&&table[i].order.addARecord(orderNum, dishName, parseInt, parseInt1)!=null)
num=orderNum;
else if(sametime==1){
table[i-1].order.addARecord(orderNum, dishName, parseInt, parseInt1);

}
}
}

else if ("delete".equals(lineArray[1])&&temp==0) {
table[i].order.delARecordByOrderNum(Integer.parseInt(lineArray[0]));
}
else if(lineArray.length ==5&& canParseInt(lineArray[0]) && canParseInt(lineArray[1])){
int a=0;
if(i>1){
for(int j=0;j<i;j++){
if(table[j].num==Integer.parseInt(lineArray[1])){
table[j].order.addARecord(Integer.parseInt(lineArray[1]),lineArray[2],Integer.parseInt(lineArray[3]),Integer.parseInt(lineArray[4]));
a=1;
}
}
if(a!=1) System.out.println("Table number :"+Integer.parseInt(lineArray[0])+" does not exist");
}
else
System.out.println("Table number :"+Integer.parseInt(lineArray[0])+" does not exist");
}
else if(lineArray.length > 4&&(lineArray[3].length()>=8||lineArray[4].length()>=8))
System.out.println("wrong format");
else {
if((lineArray.length == 3||lineArray.length == 2)&& !canParseInt(lineArray[1]) && !lineArray[1].equals("delete")) {
System.out.println("wrong format");
}
if(lineArray.length == 3&& canParseInt(lineArray[1]) &&lineArray[2].equals("T"))
menu.addDish(lineArray[0], Integer.parseInt(lineArray[1]),true);
if(lineArray.length == 3&& canParseInt(lineArray[1]) && !lineArray[2].equals("T"))
System.out.println("wrong format");
if(lineArray.length == 2&& canParseInt(lineArray[1]) &&flag==0)
menu.addDish(lineArray[0], Integer.parseInt(lineArray[1]),false);
if((lineArray.length == 2||lineArray.length == 3)&&flag==1)
System.out.println("invalid dish");
}
if(lineArray.length == 4&& lineArray[0].equals("table") && canParseInt(lineArray[1]) &&(!judgeTwo(lineArray[2], lineArray[3]) || !isOpen(lineArray[2], lineArray[3]))) {
if(lineArray[3].length()>8||lineArray[2].length()>10)
System.out.println("wrong format");
else if(!judgeTwo(lineArray[2], lineArray[3]))
System.out.println(Integer.parseInt(lineArray[1]) + " date error");
else
if (!isOpen(lineArray[2], lineArray[3]) && judgeOne(lineArray[2], lineArray[3]))
System.out.println("table " + Integer.parseInt(lineArray[1]) + " out of opening hours");
}
nextLine = input.nextLine();
}
for(int j=1;j<=i;j++){
table[i].getPrice();
}
}
public static boolean canParseInt(String s) {
if(s==null) {
return false;
}
return s.matches("\\d+");
}
public static boolean judgeOne(String s1 ,String s2){

String Date1[] = s1.split("\\/");
int year = Integer.parseInt(Date1[0]);
int month = Integer.parseInt(Date1[1]);
int day = Integer.parseInt(Date1[2]);

String Date2[] =s2.split("\\/");
int hour = Integer.parseInt(Date2[0]);
int minute = Integer.parseInt(Date2[1]);
int miao=Integer.parseInt(Date2[2]);
if(Date1[0].length()!=4||Date1[1].length()>2||Date1[2].length()>2||Date2[0].length()>2||Date2[1].length()>2||Date2[2].length()>2||year<2022||year>2023||month>12||month<1||day>31||day<0||hour>24||
hour<0||minute>60||minute<0||miao>60||miao<0||(month==2&&day>28)
||((month==4||month==6||month==9||month==11)&&day>30)){
return false;
}
return true;

}
public static boolean judgeTwo(String s1 ,String s2){

String Date1[] = s1.split("\\/");
int year = Integer.parseInt(Date1[0]);
int month = Integer.parseInt(Date1[1]);
int day = Integer.parseInt(Date1[2]);

String Date2[] =s2.split("\\/");
int hour = Integer.parseInt(Date2[0]);
int minute = Integer.parseInt(Date2[1]);
int miao=Integer.parseInt(Date2[2]);
if(Date1[0].length()!=4||Date1[1].length()>2||Date1[2].length()>2||Date2[0].length()>2||Date2[1].length()>2||Date2[2].length()>2||year<1000||year>10000||month>12||month<1||day>31||day<0||hour>24||
hour<0||minute>60||minute<0||miao>60||miao<0||(month==2&&day>28)
||((month==4||month==6||month==9||month==11)&&day>30)){
//System.out.println(num+" date error");
return false;
}
return true;

}
public static int sameTime(String s1 ,String s2) {
Time time = new Time();
time.time1 = s1;
time.time2 = s2;
time.getDay();
time.getYear();
time.getweekOfDay();
if (time.weekday <= 5 && time.weekday >= 1) {
if ((time.hour >= 17 && time.hour < 20) || (time.hour == 20 && time.minute <= 30)) {
return 1;
}
else if ((time.hour == 10 && time.minute >= 30) || (time.hour >= 11 && time.hour < 14) || (time.hour == 14 && time.minute <= 30)) {
return -1;
}
}
if (time.weekday == 6 || time.weekday == 7) {
if ((time.hour == 9 && time.minute >= 30) || (time.hour > 9 && time.hour < 21) || (time.hour == 21 && time.minute <= 30)) {
return 2;
}
}
return 0;
}
public static boolean isOpen(String s1 ,String s2){
Time time = new Time();
time.time1=s1;
time.time2=s2;
time.getDay();
time.getYear();
time.getweekOfDay();
if (time.weekday<=5&&time.weekday>=1&&((time. hour>=17&&time.hour<20)||(time. hour==20&&time .minute<=30)||(time.hour==10&&time.minute>=30)||(time.hour>=11&&time.hour<14)||(time.hour==14&&time.minute<=30))) {
return true;
}
else if((time. weekday==6|| time . weekday==7)&&((time.hour==9&&time . minute>=30)|| (time.hour>9&&time.hour<21)||(time. hour==21&&time . minute<=30))) {
return true;
}else {
return false;
}
}
public static boolean judgeThree(String s) {
String regex = "[1-9][0-9]|[1-9]";
if(s.matches(regex))
{
return true;
}
return false;
}
}
class Order {
private Menu menu;
private static List<Record> records = new ArrayList<>();//保存订单上每一道的记录

public Order(Menu menu) {
this.menu = menu;
}

//计算订单的总价
int getTotalPrice() {
int sum = 0;
for (Record record : records) {
int price = record.getPrice();

if (!record.isDelete()&& !record.getD().judge) {
sum = sum + price;

}
}
return sum;
}
int getTotalPrice2() {
int sum = 0;
for (Record record : records) {
int price = record.getPrice();

if (!record.isDelete()&& record.getD().judge) {
sum = sum + price;

}
}
return sum;
}

//添加一条菜品信息到订单中。
Record addARecord(int orderNum, String dishName, int portion, int num) {
Dish dish = menu.searthDish(dishName);
if (dish == null) {
System.out.println(dishName + " does not exist");
return null;
}
if(num>=15){
System.out.println(orderNum+" num out of range "+num);
return null;
}
if(portion>3||portion<1){
System.out.println(orderNum+" portion out of range " +portion);
return null;
}
Record record = new Record(orderNum, dish, portion, num);
records.add(record);
int price = record.getPrice();
System.out.println(record.getNumOrder() + " " + record.getD().getDishname() + " " + price);
return record;
}

public boolean delARecordByOrderNum(int orderNum) {
for (Record record : records) {
if (record.isNotFound() && !record.isDelete() && record.getNumOrder() == orderNum) {
record.setDelete(true);
return true;
}
if (record.isNotFound() && record.isDelete() && record.getNumOrder() == orderNum) {
System.out.println("deduplication " + record.getNumOrder());
return false;
}
}
System.out.println("delete error;");
return false;
}
}
class Record {
private int numOrder;//序号\
private Dish d;//菜品\
private int portion;//份额(1/2/3代表小/中/大份)\
private int num;
private boolean isDelete = false;

public boolean isNotFound() {
return !notFound;
}

public void setNotFound(boolean notFound) {
this.notFound = notFound;
}

private boolean notFound = false;

 

public Record(int orderNum, Dish d, int portion, int num) {
this.numOrder = orderNum;
this.d = d;
this.portion = portion;
this.num = num;
}
public Record(Dish d, int portion) {
this.d = d;
this.portion = portion;
}

//计价,计算本条记录的价格
int getPrice() {
return d.getPrice(portion) * this.num;
}
public void setNumOrder(int numOrder) {
this.numOrder = numOrder;
}
public int getNumOrder() {
return numOrder;
}

public void setD(Dish d) {
this.d = d;
}
public Dish getD(){
return d;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
public boolean isDelete() {
return isDelete;
}

}
class Dish {
String dishname;//菜品名称
int unit_price; //单价
boolean judge;
public String getDishname() {
return dishname;
}

public void setUnit_price(int unit_price) {
this.unit_price = unit_price;
}

public Dish(String name, int unit_price, boolean judge) {
this.dishname = name;
this.unit_price = unit_price;
this.judge = judge;
}

 

//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
int getPrice(int portion) {
if (portion >= 1 && portion <= 3) {
float botsum[] = {1, 1.5f, 2};
return Math.round(unit_price * botsum[portion - 1]);
}

return 0;
}
}
class Menu {
private List<Dish> dishs = new ArrayList<>();//菜品数组,保存所有菜品信息

Dish searthDish(String dishName) {
for (Dish dish : dishs) {
if (dish.getDishname().equals(dishName)) {
return dish;
}
}
return null;
}

//添加一道菜品信息
Dish addDish(String dishName, int unit_price,boolean g) {
for (Dish dish : dishs) {
if (dish.getDishname().equals(dishName)) {
dish.setUnit_price(unit_price);
return dish;
}
}
Dish dish = new Dish(dishName, unit_price,g);
dishs.add(dish);
return dish;
}
}
class Table {
Time time;
Order order;
int tablePrice;
int num;

public void getPrice() {
time.getYear();
time.getDay();
time.getweekOfDay();
if(time.weekday>=1&&time.weekday<=5) {
if(time.hour >= 17 && time.hour <= 20 && time.minute >= 0 && time.minute < 60) {
tablePrice= (int) Math.round(order.getTotalPrice2()*0.7+order.getTotalPrice()*0.8);
System.out.println("table "+this.num+": "+(order.getTotalPrice2()+order.getTotalPrice())+" "+this.tablePrice);
}
else if((time.hour==10&&time.minute>=30&&time.minute<60)||((time.hour>=11&&time.hour<14)&&(time.minute>=0&&time.minute<60))||(time.hour==14&&time.minute<=30&&time.minute>0)) {
tablePrice= (int) Math.round(order.getTotalPrice2()*0.7+order.getTotalPrice()*0.6);
System.out.println("table "+this.num+": "+(order.getTotalPrice2()+order.getTotalPrice())+" "+this.tablePrice);
}
else
System.out.println("table " + this.num + " out of opening hours");
}
if(time.weekday==6||time.weekday==7) {
if((time.hour==9&&time.minute>=30&&time.minute<60)||((time.hour>=10&&time.hour<21)&&(time.minute>=0&&time.minute<60))||(time.hour==21&&time.minute<=30&&time.minute>0)) {
tablePrice=Math.round(order.getTotalPrice2()+order.getTotalPrice());
System.out.println("table "+this.num+": "+(this.order.getTotalPrice2()+this.order.getTotalPrice())+" "+this.tablePrice);
}
else
System.out.println("table " + this.num + " out of opening hours");
}
}
}
class Time {
String time1;
String time2;
int year;
int month;
int day;
int hour;
int minute;
int weekday;
public void getweekOfDay() {
this.weekday= LocalDateTime.of(this.year, this.month, this.day, this.hour, this.minute).getDayOfWeek().getValue();
}
void getYear(){
String[] date=time1.split("\\/");
year=Integer.parseInt(date[0]);
month=Integer.parseInt(date[1]);
day=Integer.parseInt(date[2]);
if((year>=2022&&month>=1&&day>=1)||(year<=2023&&month<=12&&day<=31)){

}
else
System.out.println("not a valid time period");
}
void getDay(){
String[] date=time2.split("\\/");
hour=Integer.parseInt(date[0]);
minute=Integer.parseInt(date[1]);
}
}
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

import java.util.Map.Entry;
import java.util.*;
public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String a;
    
    a=in.nextLine();
    while(!a.equals("end"))
    {
        input.judgement(a);
        a=in.nextLine();
    }
    table.show();
    man.show();
    
}
}
class Dish
{
    String name="";//菜品名称
    int unit_price;
    //单价
    boolean special=false;
    int 菜系=0;
    int getPrice(int portion)
    {
        int 菜价=0;
        //单菜价格       
        switch(portion)
        {
            case 1: 菜价=unit_price;break;
            case 2: 菜价=(int)Math.ceil(1.0*unit_price*3/2);break;
            case 3: 菜价=unit_price*2;break;
        }
        return 菜价;
    }
}
class Menu
{
     Map <String,Dish>dishs =new HashMap<>();
    
     int i=0;//用于记录菜品总数
     
     void addDish(String a)
     {
         String[] arr=a.split(" ");
         Dish d=new Dish();
         d.name=arr[0];
         if(arr.length==4)//特色菜
         {
             d.special=true;
             d.unit_price=Integer.parseInt(arr[2]);
             if(arr[1].equals("川菜"))
                 d.菜系=1;
             else if(arr[1].equals("晋菜"))
                 d.菜系=2;
             else if(arr[1].equals("浙菜"))
                 d.菜系=3;
         }
         
         else//普通菜
         {
             d.unit_price=Integer.parseInt(arr[1]);
         }
         dishs.put(d.name,d);
     }
    Dish searthDish(String a,boolean flag1) //根据菜名在菜谱中查找菜品信息,返回Dish对象。
    {
        String dishName;
        String[] arr=a.split(" ");
        Dish d=new Dish();
        if(arr[1].matches("^[0-9]{1,}$"))
        {
            dishName=arr[2];    
        }
        else  
            dishName=arr[1];
        if(dishs.containsKey(dishName))
        {
            d=dishs.get(dishName);
            if(d.special&&arr.length==5)
            {
                int 度=0;
                if(arr[1].matches("^[0-9]{1,}$"))
                {
                    度=Integer.parseInt(arr[3]);
                }
                else
                {
                    度=Integer.parseInt(arr[2]);
                }
                if(d.菜系==1)
                {
                    if(度!=0&&度!=1&&度!=2&&度!=3&&度!=4&&度!=5)
                    {
                        if(flag1)
                        System.out.println("spicy num out of range :"+度);
                        return null;
                    }
                }
                else if(d.菜系==2)
                {
                    if(度!=0&&度!=1&&度!=2&&度!=3&&度!=4)
                    {
                        if(flag1)
                        System.out.println("acidity num out of range :"+度);
                        return null;
                    }    
                }
                else if(d.菜系==3)
                {
                    if(度!=0&&度!=1&&度!=2&&度!=3)
                    {
                        if(flag1)
                        System.out.println("sweetness num out of range :"+度);
                        return null;
                    }    
                }    
            }
            return d;
        }
        else
        {
            if(flag1)
            System.out.println(dishName+" does not exist");
            return null;
        }
    }
}
class Record 
{
    Dish d=new Dish();//菜品
    int orderNum=0;//序号\
    int portion=0;
    int num=0;//份数
    int tablenum=0;//桌号//没什么用
    int 口味=0;
    boolean flag=false;
    int price=0;
    //份额(1/2/3代表小/中/大份)
    void getPrice(boolean flag1)//判断是否为带点菜,true为是,t表示自己桌号
    {
        int n=0;
        if(d!=null)
        {
            price=num*d.getPrice(portion);
            if(flag1)
            {
                //1 table 2 pay for table 1 60
                System.out.println(orderNum+" table "+table.n+" pay for table "+tablenum+" "+price);
            }
            else
            {
                //1 麻婆豆腐 24
                System.out.println(orderNum+" "+d.name+" "+price);
            }
        }      
    }//计价,计算本条记录的价格
}

class Order 
{
    List<Record> records=new ArrayList<Record>();
    int j=0;
    void addARecord(String a,boolean flag1)//添加一条菜品信息到订单中。
    {
        String[]arr=a.split(" ");
        
        boolean flag=false;//判断是否为带点菜
        int orderNum=0,portion=0,tablenum=0,num=0,口味=0;
        String name="";
        
        if(arr.length==4)//自己点不是特色菜
        {
            orderNum=Integer.parseInt(arr[0]);
            name=arr[1];
            portion=Integer.parseInt(arr[2]);
            num=Integer.parseInt(arr[3]);
        }
        else if(arr.length==5)
        {
            if(arr[1].matches("^/d{1,}$"))//带点不是特色菜
            {
                tablenum=Integer.parseInt(arr[0]);
                orderNum=Integer.parseInt(arr[1]);
                name=arr[2];
                portion=Integer.parseInt(arr[3]);
                num=Integer.parseInt(arr[4]);    
                flag=true;
            }
            else//自己点特色菜
            {
                orderNum=Integer.parseInt(arr[0]);
                name=arr[1];
                口味=Integer.parseInt(arr[2]);
                portion=Integer.parseInt(arr[3]);
                num=Integer.parseInt(arr[4]);
            }
        }
        else if(arr.length==6)//带点特色菜
        {
            tablenum=Integer.parseInt(arr[0]);
            orderNum=Integer.parseInt(arr[1]);
            name=arr[2];
            口味=Integer.parseInt(arr[3]);
            portion=Integer.parseInt(arr[4]);
            num=Integer.parseInt(arr[5]);
            flag=true;
        }
        Record r=new Record();
        r.tablenum=tablenum;
        r.orderNum=orderNum;
        r.d.name=name;
        r.portion=portion;
        r.num=num;
        r.口味=口味;
        r.d=Data.c.searthDish(a,flag1);
        if(r.d!=null)//找菜
        {
            if(flag1)
            r.getPrice(flag);
            records.add(r);
            
        }
    }
    void delARecordByOrderNum(String a,boolean flag1)//根据序号删除一条记录
    //将份数改为0
    { 
        boolean flag=false;
        String[]arr=a.split(" ");
        
        int orderNum=Integer.parseInt(arr[0]);

        for(int i = 0; i < records.size(); i++) {  
            Record value = records.get(i);  
            // 符合条件,删除元素  
            if(value.orderNum==orderNum) {  
                records.remove(i);  
                flag=true;
            }  
        }  
        //不存在
        /*if(flag==false&&flag1)
        {
         System.out.println("delete error;"); 
        }*/
    }
}

class table
{
    int tablenum;//桌号
    String time;//点菜时间
    int year=0,month=0,day=0,ww=0,hh=0,mm=0,ss=0; 
    boolean flag=true;//判断时间是否正确
    double count=0,specialcount=0;//折扣
    Order eatorder=new Order();//吃的订单
    Order buyorder=new Order();//点的订单
    int sum=0,truesum1=0;//计算总价
    double truesum=0;
    int a1=0,b1=0,c1=0;//记录菜系对应菜分数
    int a2=0,b2=0,c2=0;//总辣栓甜度
    static int n=0;//记录当前处理桌号
    static boolean newtable(String a)
    {
        table t=new table();
        t.input(a);
        if(t.flag)
        {
            Data.t.put(t.tablenum, t);
            n=t.tablenum;
            return true;
        }
        return false;
    }
    void input(String time)//预处理
    {
        this.time=time;
        timechange();
        jscount();
        pdflag();
    }
    void getTotalkoweidu()
    {

       for(Record it:eatorder.records){
            
            if(it.d.special)
            {
                if(it.d.菜系==1)
                {
                    int y=it.num;
                    a1+=y;
                    a2+=it.口味*y;
                }
                else if(it.d.菜系==2)
                {
                    int y=it.num;
                    b1+=y;
                    b2+=it.口味*y;
                }
                else if(it.d.菜系==3)
                {
                    int y=it.num;
                    c1+=y;
                    c2+=it.口味*y;
                }
            }
        }
       
        if(a1==0&&b1==0&&c1==0)
            System.out.print(" ");
        if(a1!=0)
        {
            a2=(int)(a2*1.0/a1+0.5);
            System.out.print(" 川菜 "+a1);
            switch(a2)
            {
                case 0:System.out.print(" 不辣");break;
                case 1:System.out.print(" 微辣");break;
                case 2:System.out.print(" 稍辣");break;
                case 3:System.out.print(" 辣");break;
                case 4:System.out.print(" 很辣");break;
                case 5:System.out.print(" 爆辣");break;
                
            }
        }
        if(b1!=0)
        {
            b2=(int)(b2*1.0/b1+0.5);
            System.out.print(" 晋菜 "+b1);
            switch(b2)
            {
                case 0:System.out.print(" 不酸");break;
                case 1:System.out.print(" 微酸");break;
                case 2:System.out.print(" 稍酸");break;
                case 3:System.out.print(" 酸");break;
                case 4:System.out.print(" 很酸");break;
                
            }
        }
        if(c1!=0)
        {
            c2=(int)(c2*1.0/c1+0.5);
            System.out.print(" 浙菜 "+c1);
            switch(c2)
            {
                case 0:System.out.print(" 不甜");break;
                case 1:System.out.print(" 微甜");break;
                case 2:System.out.print(" 稍甜");break;
                case 3:System.out.print(" 甜");    break;        
            }
        
        }
        System.out.print("\n");
    }
    
    void getTotalPrice()//计算桌总价
    {    
        if(flag)
        {
             for(Record it:buyorder.records){
                int n=it.price;
                sum+=n;
                if(it.d.special)
                    truesum+=(int)(n*specialcount+0.5);
                else
                    truesum+=(int)(n*count+0.5);
            }
            truesum1=(int)(truesum+0.5);
            System.out.print("table "+tablenum+": "+sum+" "+truesum1);
        }
    }
    void jscount()//运用时间计算折扣
    {
        if(ww>=1&&ww<=5)
        {
            specialcount=0.7;
            if(hh>=17&&hh<20)
                count=0.8;
               else if(hh==20&&mm<30)
                count=0.8;
            else if(hh==20&&mm==30&&ss==0)
                count=0.8;
            else if(hh>=11&&hh<=13||hh==10&&mm>=30)
                count=0.6;
            else if(hh==14&&mm<30)
                count=0.6;
            else if(hh==14&&mm==30&&ss==0)
                count=0.6;
        }
        else 
        {
            specialcount=1.0;
            if(hh>=10&&hh<=20)
                count=1.0;
            else if(hh==9&&mm>=30)
                count=1.0;
            else if(hh==21&&mm<30||hh==21&&mm==30&&ss==0)
                count=1.0;
        }
    }
    void pdflag()//判断时间是否正确
    {
        if(count==0)
        {
            System.out.println("table "+tablenum+" out of opening hours");
            flag=false;
        }
        else
        {
            System.out.println("table "+tablenum+": ");
            flag=true;
        }
    }
    void timechange()//时间转换
    {
         String[] arr1=time.split(" ");
         tablenum=Integer.parseInt(arr1[1]);//桌号        
         String[] arr2=arr1[2].split("/");
         String[] arr3=arr1[3].split("/");
         year=Integer.parseInt(arr2[0]);//时间
         month=Integer.parseInt(arr2[1]);
         day=Integer.parseInt(arr2[2]);
         Calendar c = Calendar.getInstance();
         c.set(year,month-1,day);//设置时间
          ww=c.get(Calendar.DAY_OF_WEEK);
          hh=Integer.parseInt(arr3[0]);//时间
          mm=Integer.parseInt(arr3[1]);
          ss=Integer.parseInt(arr3[2]);
        if(ww==1)
            ww=7;
        else
            ww--;
    }
    static void show()
    {
         Set<Entry<Integer,table>> entrySet = Data.t.entrySet();
            for(Map.Entry<Integer,table> entry : entrySet){
                entry.getValue().getTotalPrice();
                entry.getValue().getTotalkoweidu();
    }
    }
    
}
class man
{
    String name;
    String phone_number;
    int sum=0;
    List<Integer>tablenum=new ArrayList<>();
//    table 1 : tom 13605054400 2023/5/6 12/30/00
    //约束条件:客户姓名不超过10个字符,
    //手机号11位,前三位必须是180、181、189、133、135、136其中之一。
    static void newman(String x)
    {
        //分割
        String[] arr=x.split(" ");
        man m=new man();
        if(arr[3].matches("^.{1,10}$")&&arr[4].matches("^(180|181|189|133|135|136)[0-9]{8}$"))
        {
            m.name=arr[3];
            m.phone_number=arr[4];
            if(!Data.allman.containsKey(m.name))//没有,加人
            Data.allman.put(m.name,m);
            Data.allman.get(m.name).addtable(table.n);//添加桌号
        }
        else
        {
            System.out.println("wrong format");
        }
    }
    
    //table 1 : tom 13605054400 2023/5/1 18/30/00
    void addtable(int n)
    {
        tablenum.add(n);
    }
    void getttprice()
    {
        Iterator it =tablenum.iterator();
        while(it.hasNext())
        {
            sum+=Data.t.get(it.next()).truesum;
        }
        System.out.println(name+" "+phone_number+" "+sum);
    }
    static void show()
    {
         Set<Entry<String, man>> entrySet = Data.allman.entrySet();
            for(Map.Entry<String,man> entry : entrySet){
                entry.getValue().getttprice();
    }
}
}
class input//判断输入内容
{    
    static void judgement(String a)
    {
        String[]arr=a.split("  | ");
        //分割
        int len = arr.length;
        
        if(len==7&&arr[0].equals("table")&&arr[1].matches("^[1-9][0-9]{0,}$")&&arr[2].equals(":")&&arr[3].matches("^.{1,10}$")&&arr[4].matches("^[0-9]{11}$")&&arr[5].matches("^[0-9]{4}/[1-9][0-9]{0,1}/[1-9][0-9]{0,1}$"))
        {
            if(table.newtable(arr[0]+" "+arr[1]+" "+arr[5]+" "+arr[6]))
            {
                man.newman(a);
            }
        }
        else if(len==2)
        {
            if(arr[1].equals("delete")&&arr[0].matches("^[0-9]{1,}$")&&table.n!=0)
            {//好像没有做到删除带点菜
                Data.t.get(table.n).buyorder.delARecordByOrderNum(a,true);
                Data.t.get(table.n).eatorder.delARecordByOrderNum(a,false);
            }
            else if(arr[1].matches("^[0-9]{1,}$"))
            {
                Data.c.addDish(a);
            }
        }
        else if(len==4)
        {
            if(arr[3].equals("T")&&arr[1].matches("^(川菜)|(晋菜)|(浙菜)$")&&arr[2].matches("^[0-9]{1,}$"))
                Data.c.addDish(a);
            else if(arr[0].matches("^[0-9]{1,}$")&&arr[2].matches("^[0-9]{1,}$")&&arr[3].matches("^[0-9]{1,}$")&&(table.n!=0))
                {
                    Data.t.get(table.n).buyorder.addARecord(a,true);
                    Data.t.get(table.n).eatorder.addARecord(a,false);
                }
        }
        else if(len==5&&arr[0].matches("^[1-9][0-9]{0,}$")&&(table.n!=0))
        {
            if(arr[1].matches("^[0-9]{1,}$"))
            {
                Data.t.get(table.n).buyorder.addARecord(a,true);
                Data.t.get(Integer.parseInt(arr[1])).eatorder.addARecord(a,false);
            }
            else
            {

                Data.t.get(table.n).buyorder.addARecord(a,true);
                Data.t.get(table.n).eatorder.addARecord(a,false);

            }
        }
        else if(len==6&&table.n!=0&&Data.t.containsKey(Integer.parseInt(arr[1])))
        {
            Data.t.get(table.n).buyorder.addARecord(a,true);
            Data.t.get(Integer.parseInt(arr[1])).eatorder.addARecord(a,false);
        }
        else if(table.n!=0||len!=2&&len!=4&&len!=5&&len!=6)
        {
            System.out.println("wrong format");
        }
        
        
    }
}
class Data
{
    static Map<String,man> allman = new TreeMap<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    });

    static Map<Integer,table>t=new  HashMap<>();
    static Menu c=new Menu();
}


class Super
{
int i=0;
// public Super(String a)
// {
// System.out.println("A");
// i=1;
//
// }
public Super()
{
System.out.println("B");
i+=2;

}
}
class Demo1 extends Super
{

public Demo1()
{

System.out.println("C");
i+=5;

}
}
class Outer {
    private String name;
    private int age;

    public static class Builder {
        private String name;
        private int age;

        public Builder(int age) {
            this.age = age;
        }

        public Builder withName(String name) {
            this.name = name;
            return this;
        }

        public Builder withAge(int age) {
            this.age = age;
            return this;
        }

        public Outer build() {
            return new Outer(this);
        }
    }

    private Outer(Builder b) {
        this.age = b.age;
        this.name = b.name;
    }
}
 class Fdf {
    private String name;
    private int age;

    public static class Builder {
        private String name;
        private int age;

        public Builder(int age) {
            this.age = age;
        }

        public Builder withName(String name) {
            this.name = name;
            return this;
        }

        public Builder withAge(int age) {
            this.age = age;
            return this;
        }

        public Outer build() {
            return new Outer(this);
        }
    }

    private Fdf(Builder b) {
        this.age = b.age;
        this.name = b.name;
    }
}
 class DDe {
    private String name;
    private int age;

    public static class Builder {
        private String name;
        private int age;

        public Builder(int age) {
            this.age = age;
        }

        public Builder withName(String name) {
            this.name = name;
            return this;
        }

        public Builder withAge(int age) {
            this.age = age;
            return this;
        }

        public Outer build() {
            return new Outer(this);
        }
    }

    private DDe(Builder b) {
        this.age = b.age;
        this.name = b.name;
    }
}
class Shape {
    public double calculateArea() {
        return 0.0; // 默认实现,应该在子类中覆盖
    }

    public void printArea() {
        System.out.println("面积:" + calculateArea());
    }
}

class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

class Rectangle extends Shape {
    private Point leftTopPoint;
    private Point lowerRightPoint;

    public Rectangle(Point leftTopPoint, Point lowerRightPoint) {
        this.leftTopPoint = leftTopPoint;
        this.lowerRightPoint = lowerRightPoint;
    }

    @Override
    public double calculateArea() {
        double width = Math.abs(lowerRightPoint.getX() - leftTopPoint.getX());
        double height = Math.abs(lowerRightPoint.getY() - leftTopPoint.getY());
        return width * height;
    }
}

class Point {
    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
}

期中考试

7-1 测验1-圆类设计 分数 10 作者 段喜龙 单位 南昌航空大学

创建一个圆形类(Circle),私有属性为圆的半径,从控制台输入圆的半径,输出圆的面积

输入格式:

输入圆的半径,取值范围为(0,+∞),输入数据非法,则程序输出Wrong Format,注意:只考虑从控制台输入数值的情况

输出格式:

输出圆的面积(保留两位小数,可以使用String.format(“%.2f”,输出数值)控制精度)

输入样例:

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

2.35

输出样例:

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

17.35

import java.util.Scanner;

public class Main {
    private double radius;

    // 构造方法,用于从控制台输入圆的半径
    public Main() {
        Scanner scanner = new Scanner(System.in);
        //System.out.print("请输入圆的半径:");
        try {
            this.radius = scanner.nextDouble();
            if (this.radius <= 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        } catch (Exception e) {
            System.out.println("Wrong Format");
            System.exit(0);
        } finally {
            scanner.close();
        }
    }

    // 计算圆的面积
    public double calculateArea() {
        return Math.PI * Math.pow(radius, 2);
    }

    public static void main(String[] args) {
        Main circle = new Main();
        double area = circle.calculateArea();
        System.out.println(String.format("%.2f", area));
    }
}
7-2 测验2-类结构设计 分数 10 作者 段喜龙 单位 南昌航空大学

设计一个矩形类,其属性由矩形左上角坐标点(x1,y1)及右下角坐标点(x2,y2)组成,其中,坐标点属性包括该坐标点的X轴及Y轴的坐标值(实型数),求得该矩形的面积。类设计如下图:


image.png

输入格式:

分别输入两个坐标点的坐标值x1,y1,x2,y2。

输出格式:

输出该矩形的面积值(保留两位小数)。

输入样例:

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

6 5.8 -7 8.9

输出样例:

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

40.30

import java.util.Scanner;

public class Main {
    private double x1, y1, x2, y2;

    // 构造方法,接受左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)
    public Main(double x1, double y1, double x2, double y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }

    // 计算矩形的面积
    public double calculateArea() {
        double width = Math.abs(x2 - x1);
        double height = Math.abs(y2 - y1);
        return width * height;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入左上角和右下角坐标
        //System.out.print("请输入左上角坐标 (x1, y1): ");
        double x1 = scanner.nextDouble();
        double y1 = scanner.nextDouble();

        //System.out.print("请输入右下角坐标 (x2, y2): ");
        double x2 = scanner.nextDouble();
        double y2 = scanner.nextDouble();

        // 创建矩形对象
        Main rectangle = new Main(x1, y1, x2, y2);

        // 计算并输出矩形的面积
        double area = rectangle.calculateArea();
        String formattedArea = String.format("%.2f", area);
        System.out.println(formattedArea);
        

        scanner.close();
    }
}
7-3 测验3-继承与多态 分数 20 作者 段喜龙 单位 南昌航空大学

将测验1与测验2的类设计进行合并设计,抽象出Shape父类(抽象类),Circle及Rectangle作为子类,类图如下所示:


image.png

试编程完成如上类图设计,主方法源码如下(可直接拷贝使用):

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        
        int choice = input.nextInt();
        
        switch(choice) {
        case 1://Circle
            double radiums = input.nextDouble();
            Shape circle = new Circle(radiums);
            printArea(circle);
            break;
        case 2://Rectangle
            double x1 = input.nextDouble();
            double y1 = input.nextDouble();
            double x2 = input.nextDouble();
            double y2 = input.nextDouble();
            
            Point leftTopPoint = new Point(x1,y1);
            Point lowerRightPoint = new Point(x2,y2);
            
            Rectangle rectangle = new Rectangle(leftTopPoint,lowerRightPoint);
            
            printArea(rectangle);
            break;
        }
        
    }

其中,printArea(Shape shape)方法为定义在Main类中的静态方法,体现程序设计的多态性。

输入格式:

输入类型选择(1或2,不考虑无效输入)
对应图形的参数(圆或矩形)

输出格式:

图形的面积(保留两位小数)

输入样例1:

1
5.6

输出样例1:

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

98.52

输入样例2:

2
5.6
-32.5
9.4
-5.6

输出样例2:

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

102.22

import java.util.Scanner;

class Shape {
    public double calculateArea() {
        return 0.0; // 默认实现,应该在子类中覆盖
    }

    public void printArea() {
        Double Area = calculateArea();
        System.out.println(String.format("%.2f",Area));
    }
}

class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
     
       return Math.PI * radius * radius;
    }
}

class Rectangle extends Shape {
    private Point leftTopPoint;
    private Point lowerRightPoint;

    public Rectangle(Point leftTopPoint, Point lowerRightPoint) {
        this.leftTopPoint = leftTopPoint;
        this.lowerRightPoint = lowerRightPoint;
    }

    @Override
    public double calculateArea() {
        double width = Math.abs(lowerRightPoint.getX() - leftTopPoint.getX());
        double height = Math.abs(lowerRightPoint.getY() - leftTopPoint.getY());
        return width * height;
    }
}

class Point {
    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        //System.out.println(1. Circle, 2. Rectangle);
        int choice = input.nextInt();

        Shape shape = null;

        switch (choice) {
            case 1: // Circle
               // System.out.println("请输入半径:");
                double radius = input.nextDouble();
                if(radius<0)
                    break;
                else
                shape = new Circle(radius);
                break;
            case 2: // Rectangle
               // System.out.println("请输入左上角坐标 (x1, y1):");
                double x1 = input.nextDouble();
                double y1 = input.nextDouble();
                //System.out.println("请输入右下角坐标 (x2, y2):");
                double x2 = input.nextDouble();
                double y2 = input.nextDouble();
                Point leftTopPoint = new Point(x1, y1);
                Point lowerRightPoint = new Point(x2, y2);
                shape = new Rectangle(leftTopPoint, lowerRightPoint);
                break;
            default:
                //System.out.println("无效的选择");
                break;
        }

        if (shape != null) {
            shape.printArea();
        }

        input.close();
    }
}

踩坑心得:

坑: 不充分考虑可能出现的异常情况,导致系统不稳定。

心得: 在代码中添加适当的异常处理机制,以便捕获和处理潜在的错误情况,保证系统的稳定性。

用户输入验证:

坑: 不对用户输入进行有效验证可能导致无效的订单或者计价。

心得: 实施有效的输入验证,确保用户输入符合预期,防范潜在的错误。

测试覆盖率:

坑: 不充分测试可能导致未发现的问题。

心得: 编写充分的单元测试和集成测试,确保代码质量和功能的正确性。可以使用工具如JUnit等来简化测试过程。

持久化和数据库交互:

坑: 不合理的数据库设计和交互可能导致性能问题或数据不一致。

心得: 使用合适的数据库连接池、优化查询,确保数据库操作的高效性和正确性。

这些建议可以帮助你避免在Java菜单计价系统开发过程中遇到的一些典型问题。确保采用良好的编码实践,并利用Java丰富的库和工具来简化开发过程。

总结:

1.良好的对象模型设计:


2.确保有清晰、合理的对象模型,包括菜单、产品、订单等概念的良好设计。这有助于代码的可读性和可维护性。


3.使用BigDecimal进行货币计算:


4.由于浮点数运算可能导致精度问题,尤其是在货币计算中,建议使用BigDecimal类,以确保计算的精度和正确性。

BigDecimal price = new BigDecimal("10.99");
BigDecimal quantity = new BigDecimal("2");
BigDecimal total = price.multiply(quantity);


5.国际化和本地化支持:


6.如果系统可能会在不同的地区使用,考虑使用Java的国际化和本地化功能,以便轻松支持多语言和货币符号。


7.并发安全性:


8.考虑系统是否需要处理多个订单或并发操作。在多线程环境下,确保数据的一致性,可以使用同步机制或者并发库。


9.异常处理:


10.实施有效的异常处理机制,捕获和处理潜在的错误情况,以确保系统的稳定性。避免简单地忽略异常而导致未知的问题。


11.用户输入验证:


12.对用户输入进行充分验证,确保输入的合法性和完整性,防范潜在的错误。


13.测试覆盖率:


14.编写充分的单元测试和集成测试,以确保代码的质量和功能的正确性。使用测试工具(如JUnit)来简化测试过程。


15.持久化和数据库操作:


16.若系统需要持久化数据,确保数据库设计良好,使用数据库连接池,并进行必要的性能优化。


17.清晰的代码结构和注释:


18.保持良好的代码结构,使用有意义的命名,添加适当的注释,以便他人能够理解代码的逻辑和目的。


19.安全性考虑:

20.如果系统涉及到用户身份验证或者支付信息,确保采取适当的安全措施,防范潜在的安全风险。
21.可扩展性和可维护性:

22.考虑系统未来可能的变化,确保代码具有良好的扩展性和可维护性,使得未来的修改和添加新功能更加容易。

综合考虑这些方面,可以更好地设计、实现和维护Java菜单计价系统。在开发过程中保持良好的沟通和文档,有助于整个团队更好地理解系统并高效协作。

标签:String,int,blog2,System,&&,table,out
From: https://www.cnblogs.com/nchu21207225/p/17841440.html

相关文章

  • Blog2
    一、前言1.题量及难度这几次作业的题量适中,题目数量适中,不过也不过少,能够提供足够的练习机会。在PTA上的大作业中,一共有三道题。其中第一题和第三题难度不大,但第二题属于点线形系列的题目,是之前得分不高的PTA作业中的重点题型,占据了70分,而我只得到了39分。在期中考试中虽然只有......
  • BLOG2-PTA题目集4、5以及期中考试
    (1)前言本次博客主要涵盖了Java题目的几个主要知识点,包括:1.面向对象的基础知识:这部分主要包括了类和对象的基本概念,构造方法,访问权限和成员变量的相关内容。在面向对象编程中,对这些基础知识的理解至关重要。2.面向对象的设计原则:这个题目强调了两个重要的设计原则,即继承和组......
  • blog2
    第四次题目集7-1菜单计价程序-4分数100作者蔡轲单位南昌航空大学本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。设计点菜计价程序,根据输入的信息,计算并输出总价格。输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。菜单由一条或多条菜品记......
  • blog2
    本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。设计点菜计价程序,根据输入的信息,计算并输出总价格。输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。菜单由一条或多条菜品记录组成,每条记录一行每条菜品记录包含:菜名、基础价格两个信息。订单......
  • blog2
    PTA题目集4,5及期中考试总结Blog 一.前言;      大一下学期开始,我们开始接触java这门语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的形式和感觉,但它要比C++语言更易于使用,而且在编程时彻底采用了一种以对象为......
  • 面向对象程序设计题目集总结blog2-22206110-胡瑞杰
    一、前言第二次在博客园上发布面向对象程序设计题目集的总结博客。经过几周的学习,面向对象的理念更加深入。虽然已经学了些面向对象程序设计,学好这部分内容还是有较大难度。关于知识点本次的题目集所体现的知识点已经不仅限于Java的语法知识,还需要考虑设计问题,不......
  • 题目集4~6的总结性Blog2
    目录1、前言2、设计与分析3、踩坑心得4、改进建议5、总结题目集4:1、菜单计价程序-32、有重复数据3、去掉重复数据4、单词系统与排序5、面向对象编程(封装性)6、GPS测绘中度分秒转换7、判断两个日期的先后、计算间隔天数、周数 题目集5:1、正则......
  • JavaBlog2
    一、前言本次博客文章主要是关于java课程第二阶段关于PTA题目集、超星作业以及期中考试的总结。相较于第一阶段的作业总结而言此次作业更加针对于总结在面向对象过程中的三大技术特性,即封装性、继承性和多态性,以及相关一些面向对象设计过程中的一些基本原则的理解和分析此阶段作......
  • MyBlog2:初识N皇后
    初识N皇后前置知识:如图在9*9的棋盘正中央有一颗皇后棋子。颜色加深位置代表该皇后的攻击范围,可以发现攻击范围是该皇后所在的行,所在的列,以及以皇后为中心的主对角线和次......
  • Blog2:nchu-software-oop-2022-4+5+期中
    Blog2:nchu-software-oop-2022-4+5+期中一、前言两次大作业是关于四边形和五边形的相关操作,类似于之前的三角形,但由于图形边数的变化,难度大大增加。对数学知识的运用考察......