一.前言
这一次的作业,总体来说是有一定难度的,主要考察了类与对象的关系,java封装的技术特性,字符串的使用和正则表达式的使用等,还有java类的设计原则,题量比之前的作业减少了,但是难度在慢慢上升。特别是习题六,代码的数量上来了,关于类的设计就要谨慎。
二.设计与分析
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"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.util.*; public class Main public static void main (String[] args) // Scanner input = new Scanner(System.in); // int i = 0; // Dish dish[] = new Dish(); // do // dish[i].name = input.next(); // dish[i].unit_price = input.nextInt(); // class Dish String name;//菜品名称 int unit_price;//单价 Dish() Dish(String name,int unit_price) this.name = name; this.unit_price = unit_price; public int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) if(portion == 1) return unit_price*1; if(portion == 2) return unit_price*1.5; if(portion == 3) return unit_price*2; class Menu Dish[] dishs;//菜品数组,保存所有菜品信息 public Dish searchDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。 for(int i = 0;i < dishs.length;i++) if(dishs[i].equals(dishName)) return dishs[i]; public Dish addDish(String dishName,int unit_price)//添加一道菜品信息 // dishs[dishs.length] = new Dish(dishName,unit_price); class Record int orderNum;//序号 Dish d;//菜品 int portion;//份额(1/2/3代表小/中/大份) Record() //Record(int orderNum,String dishName,int portion,int portion // this.orderNUm = orderNum; // d.dishName = dishName; // // d.portion // public int getPrice()//计价,计算本条记录的价格\\\\ int result ; if(portion == 1) result = d.unit_price*1; if(portion == 2) result =(int) ( d.unit_price*1.5); if(portion == 3) result = d.unit_price*2; // class Order // Record[] records;//保存订单上每一道的记录 // int getTotalPrice()//计算订单的总价 // int sum = 0; // for(i = 0; i < records.length;i++) // sum += records[i].getPrice(); // // // Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息 // this.orderNum = orderNum; // d.dishName = dishName; // d.portion = portion; // this.num = num; // // delARecordByOrderNum(int orderNum)//根据序号删除一条记录 // Record[num] = // // findRecordByNUm(int orderNum)////根据序号查找一条记录 // //
可以看到笔者的代码还不完整,还有一些功能没有完善,仅仅只有一些框架,按照题目意思:menu类里有dish对象,order里有record对象。这些类之间为依赖关系,测试如下:
可以看到只得了一分。
后面就不知道怎么做了,总在纠结要不要用二维数组来存储输入的信息,然后后面的具体方法的实现就没怎么写,最够也没写出这道题。
生成的类图如下:
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
- 当输入有误时,输出格式如下:
Wrong Format
- 当第一个数字为1且输入均有效,输出格式如下:
year-month-day
- 当第一个数字为2且输入均有效,输出格式如下:
year-month-day
- 当第一个数字为3且输入均有效,输出格式如下:
天数值
输入样例1:
在这里给出一组输入。例如:
3 2014 2 14 2020 6 14
输出样例1:
在这里给出相应的输出。例如:
2312
输入样例2:
在这里给出一组输入。例如:
2 1935 2 17 125340
输出样例2:
在这里给出相应的输出。例如:
1591-12-17
输入样例3:
在这里给出一组输入。例如:
1 1999 3 28 6543
输出样例3:
在这里给出相应的输出。例如:
2017-2-24
输入样例4:
在这里给出一组输入。例如:
0 2000 5 12 30
输出样例4:
在这里给出相应的输出。例如:
Wrong Format
源码如下:
import java.util.Scanner; public class Main public static void main(String[] args) Scanner input = new Scanner(System.in); String str = input.nextLine(); String[] str1 = str.split(" "); switch(str1[0]) case "1": int y = Integer.valueOf(str1[1]); int m = Integer.valueOf(str1[2]); int d = Integer.valueOf(str1[3]); int n = Integer.valueOf(str1[4]); DateUtil date = new DateUtil(d,m,y); if(date.checkInputValidity()) System.out.println(date.getNextNDays(n).showDate()); else System.out.println("Wrong Format"); break; case "2": int y = Integer.valueOf(str1[1]); int m = Integer.valueOf(str1[2]); int d = Integer.valueOf(str1[3]); int n = Integer.valueOf(str1[4]); DateUtil date = new DateUtil(d,m,y); if(date.checkInputValidity()) System.out.println(date.getPreviousNDays(n).showDate()); else System.out.println("Wrong Format"); break; case "3": int y1 = Integer.valueOf(str1[1]); int m1 = Integer.valueOf(str1[2]); int d1 = Integer.valueOf(str1[3]); int y2 = Integer.valueOf(str1[4]); int m2 = Integer.valueOf(str1[5]); int d2 = Integer.valueOf(str1[6]); DateUtil date1 = new DateUtil(d1,m1,y1); DateUtil date2 = new DateUtil(d2,m2,y2); int n = date1.getDaysofDates(date2); System.out.println(n); break; default: //switch class DateUtil private Day day = new Day(); DateUtil() DateUtil(int d, int m, int y) day.setValue(d); day.getMonth().setValue(m); day.getMonth().getYear().setValue(y); public Day getDay() return day; public void setDay(Day d) this.day = d; public boolean checkInputValidity() if(day.getMonth().getYear().validate()) if(day.getMonth().validate()) if(day.validate()) return true; else return false; else return false; else return false; public boolean compareDates(DateUtil date) if(day.getMonth().getYear().getValue() > date.getDay().getMonth().getYear().getValue()) return true; else if(day.getMonth().getYear().getValue() < date.getDay().getMonth().getYear().getValue()) return false; else if(day.getMonth().getValue() > date.getDay().getMonth().getValue()) return true; else if(day.getMonth().getValue() < date.getDay().getMonth().getValue()) return false; else if(day.getValue() > date.getDay().getValue()) return true; else return false; public boolean equalTwoDates(DateUtil date) if(day.getValue() == date.getDay().getValue() && day.getMonth().getValue() == date.getDay().getMonth().getValue() && day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()) return true; else return false; public String showDate() String str = "" + day.getMonth().getYear().getValue() + "-" + day.getMonth().getValue() + "-" + day.getValue(); return str; public DateUtil getNextNDays(int n) for( ; n > 0 ; n--) if(day.getMonth().getValue() != 12) if(day.getMonth().getValue() == 2) if(day.getMonth().getYear().isLeapYear()) if(day.getValue() != 29) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else//不是闰年 if(day.getValue() != 28) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); //2月 else//不是二月 if(day.getMonth().getValue() == 1 || day.getMonth().getValue() == 3 || day.getMonth().getValue() == 5 || day.getMonth().getValue() == 7 || day.getMonth().getValue() == 8 || day.getMonth().getValue() == 10) if(day.getValue() != 31) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else if(day.getValue() != 30) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else //是12月 if(day.getValue() != 31) day.dayIncrement(); else day.resetMin(); day.getMonth().resetMin(); day.getMonth().getYear().yearIncrement(); //n DateUtil newDate = new DateUtil(day.getValue(),day.getMonth().getValue(),day.getMonth().getYear().getValue()); return newDate; public DateUtil getPreviousNDays(int n) for( ; n > 0 ; n--) if(day.getMonth().getValue() == 1) if(day.getValue() == 1) day.resetMax(); day.getMonth().resetMax(); day.getMonth().getYear().yearReduction(); else day.dayReduction(); else if(day.getValue() == 1) day.getMonth().monthReduction(); day.resetMax(); else day.dayReduction(); DateUtil newDate = new DateUtil(day.getValue(),day.getMonth().getValue(),day.getMonth().getYear().getValue()); return newDate; public int getDaysofDates(DateUtil date) int n = 0;int flag = 0; if(compareDates(date) ) flag = 1; else flag = 0; if(flag == 0) for( ; this.equalTwoDates(date) == false ; n++) if(day.getMonth().getValue() != 12) if(day.getMonth().getValue() == 2) if(day.getMonth().getYear().isLeapYear()) if(day.getValue() != 29) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else//不是闰年 if(day.getValue() != 28) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); //2月 else//不是二月 if(day.getMonth().getValue() == 1 || day.getMonth().getValue() == 3 || day.getMonth().getValue() == 5 || day.getMonth().getValue() == 7 || day.getMonth().getValue() == 8 || day.getMonth().getValue() == 10) if(day.getValue() != 31) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else if(day.getValue() != 30) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else //是12月 if(day.getValue() != 31) day.dayIncrement(); else day.resetMin(); day.getMonth().resetMin(); day.getMonth().getYear().yearIncrement(); else for( ; this.equalTwoDates(date) == false ; n++ ) if(day.getMonth().getValue() == 1) if(day.getValue() == 1) day.resetMax(); day.getMonth().resetMax(); day.getMonth().getYear().yearReduction(); else day.dayReduction(); else if(day.getValue() == 1) day.getMonth().monthReduction(); day.resetMax(); else day.dayReduction(); return n; class Day private int value; private Month month = new Month(); private int[] mon_maxnum = 31,28,31,30,31,30,31,31,30,31,30,31; Day() Day(int yearValue, int monthValue, int dayValue) value = dayValue; month.setValue(monthValue); month.getYear().setValue(dayValue); public int getValue() return value; public void setValue(int value) this.value = value; public Month getMonth() return month; public void setMonth(Month value) this.month = value; public void resetMin() value = 1; public void resetMax() if(month.getYear().isLeapYear()) if(month.getValue() == 2) value = 29; else value = mon_maxnum[month.getValue()-1]; else if(month.getValue() == 2) value = 28; else value = mon_maxnum[month.getValue()-1]; public boolean validate() if(month.getValue() == 2) if(month.getYear().isLeapYear()) if(value >= 1 && value <= 29) return true; else return false; else if(value >= 1 && value <= 28) return true; else return false; else if(value >= 1 && value <= mon_maxnum[month.getValue()-1]) return true; else return false; public void dayIncrement() value++; public void dayReduction() value--; class Month private int value; private Year year = new Year(); Month() Month(int yearValue, int monthValue) value = monthValue; year.setValue(yearValue); public int getValue() return value; public void setValue(int value) this.value = value; public Year getYear() return year; public void setYear(Year year) this.year = year; public void resetMin() value = 1; public void resetMax() value = 12; public boolean validate() if(value >= 1 && value <= 12) return true; else return false; public void monthIncrement() value++; public void monthReduction() value--; class Year private int value; Year() Year(int value) this.value = value; public int getValue() return value; public void setValue(int value) this.value = value; public boolean isLeapYear() if((value % 4 == 0 && value % 100 != 0) || value % 400 == 0) return true; else return false; public boolean validate() if(value >= 1900 && value <= 2050) return true; else return false; public void yearIncrement() value++; public void yearReduction() value--;
运行结果如下:
这题的话,在DateUtil类中有Day类对象,Day类中有Month对象,在Month类中有Year对象,这些类之间的关系都是聚合关系;这个题目更好解释了类与类之间的关系,如下图:
day对象调用month对象,month对象再调用year对象,year对象调用setValue方法,从而实现改变年份。我写的时候对年份的判定老是出现错误,其实参照习题四的题目就行了。在下写求两个日期的之间的天数,我用的是循环的方法,若前面的日期更小,则调用下N天的函数,循环N次;若前面的日期较大,则调用求上N天的方法,循环N次,这样就得到了两个日期之间的天数。相应的代码如下:
public int getDaysofDates(DateUtil date) int n = 0;int flag = 0; if(compareDates(date) ) flag = 1; else flag = 0; if(flag == 0) for( ; this.equalTwoDates(date) == false ; n++) if(day.getMonth().getValue() != 12) if(day.getMonth().getValue() == 2) if(day.getMonth().getYear().isLeapYear()) if(day.getValue() != 29) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else//不是闰年 if(day.getValue() != 28) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); //2月 else//不是二月 if(day.getMonth().getValue() == 1 || day.getMonth().getValue() == 3 || day.getMonth().getValue() == 5 || day.getMonth().getValue() == 7 || day.getMonth().getValue() == 8 || day.getMonth().getValue() == 10) if(day.getValue() != 31) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else if(day.getValue() != 30) day.dayIncrement(); else day.resetMin(); day.getMonth().monthIncrement(); else //是12月 if(day.getValue() != 31) day.dayIncrement(); else day.resetMin(); day.getMonth().resetMin(); day.getMonth().getYear().yearIncrement(); else for( ; this.equalTwoDates(date) == false ; n++ ) if(day.getMonth().getValue() == 1) if(day.getValue() == 1) day.resetMax(); day.getMonth().resetMax(); day.getMonth().getYear().yearReduction(); else day.dayReduction(); else if(day.getValue() == 1) day.getMonth().monthReduction(); day.resetMax(); else day.dayReduction(); return n;
这个题目将一个功能交给一个方法实现,体现了java中的单一职责原则,代码实现过程也更好写。
生成的类图如下:
生成的类图,由于都在一个java文件中,main与其他类都有依赖关系,不完全符合题目的要求。
参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
- 当输入有误时,输出格式如下:
Wrong Format
- 当第一个数字为1且输入均有效,输出格式如下:
year1-month1-day1 next n days is:year2-month2-day2
- 当第一个数字为2且输入均有效,输出格式如下:
year1-month1-day1 previous n days is:year2-month2-day2
- 当第一个数字为3且输入均有效,输出格式如下:
The days between year1-month1-day1 and year2-month2-day2 are:值
输入样例1:
在这里给出一组输入。例如:
3 2014 2 14 2020 6 14
输出样例1:
在这里给出相应的输出。例如:
The days between 2014-2-14 and 2020-6-14 are:2312
输入样例2:
在这里给出一组输入。例如:
2 1834 2 17 7821
输出样例2:
在这里给出相应的输出。例如:
1834-2-17 previous 7821 days is:1812-9-19
输入样例3:
在这里给出一组输入。例如:
1 1999 3 28 6543
输出样例3:
在这里给出相应的输出。例如:
1999-3-28 next 6543 days is:2017-2-24
输入样例4:
在这里给出一组输入。例如:
0 2000 5 12 30
输出样例4:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String[] str1 = str.split(" ");
switch(str1[0])
case "1":
int y = Integer.valueOf(str1[1]);
int m = Integer.valueOf(str1[2]);
int d = Integer.valueOf(str1[3]);
int n = Integer.valueOf(str1[4]);
DateUtil date = new DateUtil(d,m,y);
if(date.checkInputValidity())
System.out.println(date.getYear().getValue() + "-" + date.getMonth().getValue() + "-" + date.getDay().getValue() + " next " + n + " days is:" + date.getNextNDays(n).showDate());
else
System.out.println("Wrong Format");
break;
case "2":
int y = Integer.valueOf(str1[1]);
int m = Integer.valueOf(str1[2]);
int d = Integer.valueOf(str1[3]);
int n = Integer.valueOf(str1[4]);
DateUtil date = new DateUtil(d,m,y);
if(date.checkInputValidity())
System.out.println(date.getYear().getValue() + "-" + date.getMonth().getValue() + "-" + date.getDay().getValue() + " previous " + n + " days is:" + date.getPreviousNDays(n).showDate());
else
System.out.println("Wrong Format");
break;
case "3":
int y1 = Integer.valueOf(str1[1]);
int m1 = Integer.valueOf(str1[2]);
int d1 = Integer.valueOf(str1[3]);
int y2 = Integer.valueOf(str1[4]);
int m2 = Integer.valueOf(str1[5]);
int d2 = Integer.valueOf(str1[6]);
DateUtil date1 = new DateUtil(d1,m1,y1);
DateUtil date2 = new DateUtil(d2,m2,y2);
System.out.print("The days between " + date1.getYear().getValue() + "-" + date1.getMonth().getValue() + "-" + date1.getDay().getValue() + " and " + date2.getYear().getValue() + "-" + date2.getMonth().getValue() + "-" + date2.getDay().getValue() + " are:");
int n = date1.getDaysofDates(date2);
System.out.print(n);
break;
default:
System.out.println("Wrong Format");
//switch
class DateUtil
private Year year = new Year();
private Month month = new Month();
private Day day = new Day();
private int[] mon_maxnum = 31,28,31,30,31,30,31,31,30,31,30,31;
DateUtil()
DateUtil(int d, int m, int y)
year.setValue(y);
month.setValue(m);
day.setValue(d);
public Year getYear()
return year;
public void setYear(Year year)
this.year = year;
public Month getMonth()
return month;
public void setMonth(Month month)
this.month = month;
public Day getDay()
return day;
public void setDay(Day day)
this.day = day;
public void setDayMin()
day.setValue(1);
public void setDayMax()
if(year.isLeapYear())
if(month.getValue() == 2)
day.setValue(29);
else
day.setValue(mon_maxnum[month.getValue()-1]);
else
if(month.getValue() == 2)
day.setValue(28);
else
day.setValue(mon_maxnum[month.getValue()-1]) ;
public boolean checkInputValidity()
if(year.validate())
if(month.validate())
if(month.getValue() == 2)
if(year.isLeapYear())
if(day.getValue() >= 1 && day.getValue() <= 29)
return true;
else
return false;
else
if(day.getValue() >= 1 && day.g第二次pta作业
6-7 删除字符串中数字字符
1.设计思路
(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。
第二部;设计简单的函数,执行题中所需功能。
第三部:上机运行程序,检查程序对错。
(2)流程图
#include "stdio.h"
void delnum(char *s);
int main ()
{ char item[80];
gets(item);
delnum(item);
printf("%s\\n",item);
return 0;
}
void delnum(char *s)
{
int i,j;
for(i=0;*(s+i)!=‘\\0‘;i++)
{
if(*(s+i)>=‘0‘&&*(s+i)<=‘9‘)
{
for(j=i;*(s+j)!=‘\\0‘;j++)
{
*(s+j)=*(s+j+1);
}
i--;
}
}
}
https://coding.net/u/aggresiver/p/123/git/blob/master/6-7
6-8 统计子串在母串出现的次数
1.设计思路
(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。
第二部;设计简单的函数,执行题中所需功能。
第三部:上机运行程序,检查程序对错。
(2)流程图
#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
int n;
n=fun(str,substr);
printf("n=%d\\n",n);
return 0;
}
int fun(char *str,char *substr)
{
int i,j,count=0,t;
for(i=0;*(str+i)!=‘\\0‘;i++)
{
t=1;
if(*(str+i)==*substr)
{
for(j=0;*(substr+j)!=‘\\0‘;j++)
{
if(*(str+i+j)!=*(substr+j))
{
t=0;
break;
}
}
if(t==1)
count++;
}
}
return count;
}
https://coding.net/u/aggresiver/p/123/git/blob/master/6-8
6-9 字符串中除首尾字符外的其余字符按降序排列
1.设计思路
(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。
第二部;设计简单的函数,执行题中所需功能。
第三部:上机运行程序,检查程序对错。
(2)流程图
#include <stdio.h>
int fun(char *s,int num);
int main()
{
char s[10];
gets(s);
fun(s,7);
printf("%s",s);
return 0;
}
int fun(char *s,int num)
{
int i,j;
char t;
for(i=1;i<num-1;i++)
{
for(j=num-2;j>i;j--)
{
if(*(s+j)>*(s+j-1))
{
t=*(s+j);
*(s+j)=*(s+j-1);
*(s+j-1)=t;
}
}
}
}
https://coding.net/u/aggresiver/p/123/git/blob/master/6-9
7-0输出学生成绩
1.设计思路
(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。
第二部;设计简单的函数,执行题中所需功能。
第三部:上机运行程序,检查程序对错。
(2)流程图
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N,i;
double sum=0,max,min,ag,*p;
scanf("%d",&N);
if((p=(double *)calloc(N,sizeof(double)))==NULL)
{
printf("Not able to allocate memory.\\n");
exit(1);
}
for(i=0;i<N;i++)
{
scanf("%lf",p+i);
sum=sum+*(p+i);
}
max=*p,min=*p;
for(i=0;i<N;i++)
{
if(*(p+i)>max)
max=*(p+i);
if(*(p+i)<min)
min=*(p+i);
}
ag=sum*1.0/N;
printf("average = %.2lf\\nmax = %.2lf\\nmin = %.2lf\\n",ag,max,min);
free(p);
}
https://coding.net/u/aggresiver/p/123/git/blob/master/7-0
以上是关于关于PTA第二次大作业的总结的主要内容,如果未能解决你的问题,请参考以下文章