up bbbgk
1.前言:4~6次pta题目集难度上升,代码量增加,考察了对类的设计以及如何实现类间关系等。难度较大。涉及到了 去重 排序 循环遍历等。还有API接口,JAVA自带的实现类,包装类,成员方法等,涉及的知识面更广更难。
2.设计分析 :
7-1 菜单计价程序-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+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入格式:
桌号标识格式: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
题一开始我是嫌麻烦,因为题目长度太长,而且看到好多人都没得分,于是我就没写。
后面 第六次7-1写一半的类图
实现的类图
首先需要把题目弄懂,然后再写相关的类 ,此题难在对输入的数据进行处理,首先要对输入的字符进行判断,可以用split分割成数组,在遍历循环进行判断。
7-2 有重复的数据 分数 10 作者 翁恺 单位 浙江大学
在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。
你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES
”这三个字母;如果没有,则输出“NO
”。
输入格式:
你的程序首先会读到一个正整数n,n∈[1,100000],然后是n个整数。
输出格式:
如果这些整数中存在重复的,就输出:
YES
否则,就输出:
NO
答案:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []a=new int[n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
Arrays.sort(a);
if(n==1)System.out.print("NO");
else{
for(int i=0;i<n-1;i++){
if(a[i]==a[i+1]){
System.out.print("YES");
return;
}
}
System.out.println("NO");
}
}
}
思路;先对数组排序,在遍历数组,如果arr[i]=arr[i+1]则就有重复。
7-3 去掉重复的数据
分数 10
作者 翁恺
单位 浙江大学
在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。
你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,去掉所有重复的数字。最后按照输入顺序输出没有重复数字的数据。所有重复的数字只保留第一次出现的那份。
输入格式:
你的程序首先会读到一个正整数 n,1≤n≤100000。
然后是 n 个整数,这些整数的范围是 [1, 100000]。
输出格式:
在一行中按照输入顺序输出去除重复之后的数据。每两个数据之间有一个空格,行首尾不得有多余空格。
输入样例:
5
1 2 2 1 4
输出样例:
1 2 4
用LinkedHashSet去重+保证输入顺序 并用迭代器遍历 判断有没有空格
import java.lang.reflect.Array;
import java.util.*;
import java.util.Scanner;
import java.util.*;
public class ts2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x = sc.nextInt();
LinkedHashSet<Integer> lhs=new LinkedHashSet<>();
for (int i = 0; i < x; i++) {
lhs.add(sc.nextInt());
}
Iterator<Integer> it = lhs.iterator();
while (it.hasNext()){
Integer y = it.next();
if(it.hasNext()) System.out.print(y+" ");
else System.out.print(y);
}
}
}
7-4 单词统计与排序
分数 15
作者 张峰
单位 山东科技大学
从键盘录入一段英文文本(句子之间的标点符号只包括“,”或“.”,单词之间、单词与标点之间都以" "分割。
要求:按照每个单词的长度由高到低输出各个单词(重复单词只输出一次),如果单词长度相同,则按照单词的首字母顺序(不区分大小写,首字母相同的比较第二个字母,以此类推)升序输出。
输入格式:
一段英文文本。
输出格式:
按照题目要求输出的各个单词(每个单词一行)。
输入样例:
Hello, I am a student from China.
输出样例:
student
China
Hello
from
am
a
I
第一次写的:
先用HashSet去重 用Arrays.asList(str)将字符变为集合去重
String[] ss=hs.toArray(str)在将集合变为str;进行排序;
比较麻烦
import java.lang.reflect.Array;
import java.util.*;
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
s=s.replace(",","");
s=s.replace(".","");
String[] str = s.split(" ");
HashSet<String>hs=new HashSet<>(Arrays.asList(str));
String[] ss=hs.toArray(str);
String[]x=new String[hs.size()];
//防止元素为空
//用新数组读取不为空的元素,再重写加进原来的数组
for (int i = 0; i < ss.length ; i++) {
if(ss[i]==null){
break;
}
x[i]=ss[i];
}
ss=x;
for (int i = 0; i < ss.length; i++) {
for (int j = i ; j < ss.length; j++) {
if (ss[i].length() < ss[j].length()) {
String m = ss[i];
ss[i] = ss[j];
ss[j] = m;
}
else if(ss[i].length() == ss[j].length()) {
if (check(ss[i],ss[j])){
String m = ss[i];
ss[i] = ss[j];
ss[j] = m;
}
}
}
}
for (String sss:ss){
System.out.println(sss);
}
}
public static boolean check (String s1,String s2){
for (int i = 0; i < s1.length(); i++) {
if(s1.toLowerCase().charAt(i)==s2.toLowerCase().charAt(i)) continue;
else if(s1.toLowerCase().charAt(i)>s2.toLowerCase().charAt(i)) return true;
else break;
}
return false;
}
}
第二次写:用TreeSet<> 排序+去重
mport java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class ts {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
s=s.replace(",","");
s=s.replace(".","");
String[] split = s.split(" ");
TreeSet<String>ts=new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int i=o2.length()-o1.length();
i=i==0?o1.compareToIgnoreCase(o2):i;
return i;
}
});
for (String s1 : split) {
ts.add(s1);
}
for (String t : ts) {
System.out.println(t);
}
}
}
7-5 日期问题面向对象设计(聚合一) 分数 50 作者 段喜龙 单位 南昌航空大学
参考题目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
做这题需要先把类图里的属性和方法想清楚,而且需要搞清类与类之间的关系,这题的算法和逻辑和题目集3最后一题差不多,
只是要求我们使用聚合来实现,而且这题的结构不一样
import java.util.Objects;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int y= sc.nextInt();
int m= sc.nextInt();
int d=sc.nextInt();
DateUtil dateUtil=new DateUtil(y,m,d);
switch (a){
case 1:{
int n= sc.nextInt();
if(!dateUtil.checkInputValidity()||n<0)
System.out.println("Wrong Format");
else System.out.println(dateUtil.getNextDates(n).showDate());
break;
}
case 2:{
int n= sc.nextInt();
if(!dateUtil.checkInputValidity()||n<0)
System.out.println("Wrong Format");
else System.out.println(dateUtil.getPreviousDates(n).showDate());
break;
}
case 3:{
int yy= sc.nextInt();
int mm= sc.nextInt();
int dd=sc.nextInt();
DateUtil dateUtil2=new DateUtil(yy,mm,dd);
if(!dateUtil.checkInputValidity()||!dateUtil2.checkInputValidity())
System.out.println("Wrong Format");
else System.out.println(dateUtil.getDatesofDates(dateUtil2));
break;
}
default:
System.out.println("Wrong Format");
}
}
}
class DateUtil{
private Day day;
public DateUtil() {
}
public DateUtil(int y,int m,int d) {
day=new Day(y,m,d);
}
public Day getDay() {
return day;
}
public void setDay(Day day) {
this.day = day;
}
public String toString() {
return "DateUntil{day = " + day + "}";
}
public boolean checkInputValidity() {
//校验数据合法性
if(this.getDay().getMonth().getYear().validate()&&this.getDay().getMonth().validate()&&day.validate())//检验年月日
return true;
else
return false;
}
//public boolean comepareDates(DateUntil dateUtil ){}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DateUtil dateUntil = (DateUtil) o;
return Objects.equals(day, dateUntil.day);
}
public String showDate(){
return this.getDay().getMonth().getYear().getVaule()+"-"+this.getDay().getMonth().getValue()+"-"
+this.getDay().getValue();
}
public DateUtil getNextDates(int n){
DateUtil m=new DateUtil();
while (n!=0){
m= this.nextDay();
n--;
}
return m;
}
public DateUtil getPreviousDates(int n){
DateUtil m=new DateUtil();
while (n!=0){
m= this.beforeDay();
n--;
}
return m;
}
public DateUtil nextDay() {
int m = this.getDay().getMonth().getValue();
int d = this.getDay().getValue();
int y = this.getDay().getMonth().getYear().getVaule();
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 ) {
if (d != 31) {
m = m;
d += 1;
} else {
m += 1;
d = 1;
}
} else if (m == 2 ) {
if (getDay().getMonth().getYear().isLeapYear()) {
if (d != 29) d += 1;
else {
m += 1;
d = 1;
}
} else {
if (d != 28) d += 1;
else {
m += 1;
d = 1;
}
}
} else if (m == 12 ) {
if (d != 31) {
d += 1;
} else {
d = 1;
m = 1;
y += 1;
}
}
else if (m == 4 || m == 6 || m == 9 || m == 11 ) {
if (d != 30) {
d += 1;
} else {
d = 1;
m += 1;
}
}
//重新设置日期
this.getDay().setValue(d);
this.getDay().getMonth().setValue(m);
this.getDay().getMonth().getYear().setVaule(y);
return new DateUtil(y,m,d);
}
public DateUtil beforeDay() {
int m = this.getDay().getMonth().getValue();
int d = getDay().getValue();
int y = this.getDay().getMonth().getYear().getVaule();
if ((m == 12 || m == 5 || m == 7 || m == 10) ) {
if (d != 1) {
m = m;
d -= 1;
} else {
m -= 1;
d = 30;
}
} else if (m == 3 ) {
if (this.getDay().getMonth().getYear().isLeapYear()) {
if (d != 1) d -= 1;
else {
m -= 1;
d = 29;
}
} else {
if (d != 1) d -= 1;
else {
m -= 1;
d = 28;
}
}
} else if (m == 8 || m == 2 || m == 4 || m == 6 || m == 9 || m == 11) {
if (d != 1) {
d -= 1;
} else {
d = 31;
m -= 1;
}
} else if (m == 1 ) {
if (d != 1) {
d -= 1;
} else {
d = 31;
m = 12;
y -= 1;
}
}
//重新设置日期
this.getDay().setValue(d);
this.getDay().getMonth().setValue(m);
this.getDay().getMonth().getYear().setVaule(y);
return new DateUtil(y,m,d);
}
public int getDatesofDates(DateUtil date){
int arr[] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i, s = 0;
for ( i = 1; i < this.getDay().getMonth().getYear().getVaule(); i++) {
s += 365;
if (this.getDay().getMonth().getYear().isLeapYear(i)) {
s += 1;
}
}
if (this.getDay().getMonth().getYear().isLeapYear(i)){
arr[2] = 29;
}
for ( i = 1; i <this.getDay().getMonth().getValue(); i++) { //不取等 算的是间隔数
s += arr[i];
}
s += this.getDay().getValue();
int ls = 0;
for ( i = 1; i <date.getDay().getMonth().getYear().getVaule(); i++) { //不取等 算的是间隔数
ls += 365;
if (date.getDay().getMonth().getYear().isLeapYear(i)) {
ls += 1;
}
}
if (date.getDay().getMonth().getYear().isLeapYear(i)) {
arr[2] = 29;
}
for ( i = 1; i < date.getDay().getMonth().getValue(); i++) {
ls += arr[i];
}
ls += date.getDay().getValue();
if (ls > s) return ls - s;
else return s - ls;
}
}
class Day{
private int value;
private Month month;
int mon_maxnum[] = {31,28,31,30,31,30,31,31,30,31,30,31};
public Day() {
}
public Day(int yearvalue, int monthvalue, int dayvalue) {
this.value = dayvalue;
this.month = new Month(yearvalue,monthvalue);
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Month getMonth() {
return month;
}
public void setMonth(Month month) {
this.month = month;
}
public void resemin(){
value=1;
}
public void resemax(){
value=mon_maxnum[month.getValue()-1];
}
public boolean validate() {
//校验数据合法性
if(this.getMonth().getYear().isLeapYear())
mon_maxnum[1]=29;
if(value>=1&&value<=mon_maxnum[month.getValue()-1])
return true;
else
return false;
}
public void dayIncrement() {
//日期增1
value++;
}
public void dayReduction() {
//日期减1
value--;
}
}
class Month{
private int value;
private Year year;
public Month() {
}
public Month(int yearvaluse, int monthvalue) {
this.value = monthvalue;
this.year = new Year(yearvaluse);
}
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 reseMin(){
value=1;
}
public void reseMax(){
value=12;
}
public boolean validate(){
if(value<=12&&value>=1)
return true;
else return false;
}
public void monthIncrement() {
//月份增1
value++;
}
public void monthReduction() {
//月份减1
value--;
}
}
class Year{
private int vaule;
public Year() {
}
public Year(int vaule) {
this.vaule = vaule;
}
public int getVaule() {
return vaule;
}
public void setVaule(int vaule) {
this.vaule = vaule;
}
public boolean isLeapYear(){
if (vaule % 4 == 0 && vaule % 100 != 0 || vaule % 400 == 0)
return true;
else return false;
}
public boolean isLeapYear(int i){
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
return true;
else return false;
}
public boolean validate(){
if(vaule<=2050&&vaule>=1900)
return true;
else return false;
}
public void yearIncrement(){
vaule++;
}
public void yearReduction(){
vaule--;
}
}
7-6 日期问题面向对象设计(聚合二) 分数 34 作者 段喜龙 单位 南昌航空大学
参考题目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.Objects;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int y= sc.nextInt();
int m= sc.nextInt();
int d=sc.nextInt();
DateUtil dateUtil=new DateUtil(y,m,d);
switch (a){
case 1:{
int n= sc.nextInt();
if(!dateUtil.checkInputValidity()||n<0)
System.out.println("Wrong Format");
else System.out.println(dateUtil.showDate()+" next "+ n +" days is:"+dateUtil.getNextDates(n).showDate());
break;
}
case 2:{
int n= sc.nextInt();
if(!dateUtil.checkInputValidity()||n<0)
System.out.println("Wrong Format");
else System.out.println(dateUtil.showDate()+" previous "+ n +" days is:"+dateUtil.getPreviousDates(n).showDate());
break;
}
case 3:{
int yy= sc.nextInt();
int mm= sc.nextInt();
int dd=sc.nextInt();
DateUtil dateUtil2=new DateUtil(yy,mm,dd);
if(!dateUtil.checkInputValidity()||!dateUtil2.checkInputValidity())
System.out.println("Wrong Format");
else System.out.println("The days between "+ dateUtil.showDate() +" and "+dateUtil2.showDate()+" are:"+dateUtil.getDatesofDates(dateUtil2));
break;
}
default:
System.out.println("Wrong Format");
}
}
}
class DateUtil{
private Day day;
private Month month;
private Year year;
int [] mom={0,31,28,31,30,31,30,31,31,30,31,30,31};
public DateUtil() {
}
public DateUtil(int y,int m,int d) {
day=new Day(d);
month=new Month(m);
year=new Year(y);
}
public boolean checkInputValidity() {
//校验数据合法性
if(year.isLeapYear())mom[2]=29;
if(this.year.validate()&&this.month.validate()&&this.day.getValue()<=mom[month.getValue()])//检验年月日
return true;
else
return false;
}
//public boolean comepareDates(DateUntil dateUtil ){}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DateUtil dateUntil = (DateUtil) o;
return Objects.equals(day, dateUntil.day);
}
public String showDate(){
return year.getVaule()+"-"+month.getValue()+"-"
+day.getValue();
}
public DateUtil getNextDates(int n){
DateUtil m=new DateUtil();
if(n==0) m=this;
else while (n!=0){
m= this.nextDay();
n--;
}
return m;
}
public DateUtil getPreviousDates(int n){
DateUtil m=new DateUtil();
if(n==0) m=this;
else while (n!=0){
m= this.beforeDay();
n--;
}
return m;
}
public DateUtil nextDay() {
int m = this.month.getValue();
int d = this.day.getValue();
int y = this.year.getVaule();
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 ) {
if (d != 31) {
m = m;
d += 1;
} else {
m += 1;
d = 1;
}
} else if (m == 2 ) {
if (year.isLeapYear()) {
if (d != 29) d += 1;
else {
m += 1;
d = 1;
}
} else {
if (d != 28) d += 1;
else {
m += 1;
d = 1;
}
}
} else if (m == 12 ) {
if (d != 31) {
d += 1;
} else {
d = 1;
m = 1;
y += 1;
}
}
else if (m == 4 || m == 6 || m == 9 || m == 11 ) {
if (d != 30) {
d += 1;
} else {
d = 1;
m += 1;
}
}
//重新设置日期
this.day.setValue(d);
this.month.setValue(m);
this.year.setVaule(y);
return new DateUtil(y,m,d);
}
public DateUtil beforeDay() {
int m = this.month.getValue();
int d = this.day.getValue();
int y = this.year.getVaule();
if ((m == 12 || m == 5 || m == 7 || m == 10) ) {
if (d != 1) {
m = m;
d -= 1;
} else {
m -= 1;
d = 30;
}
} else if (m == 3 ) {
if (this.year.isLeapYear()) {
if (d != 1) d -= 1;
else {
m -= 1;
d = 29;
}
} else {
if (d != 1) d -= 1;
else {
m -= 1;
d = 28;
}
}
} else if (m == 8 || m == 2 || m == 4 || m == 6 || m == 9 || m == 11) {
if (d != 1) {
d -= 1;
} else {
d = 31;
m -= 1;
}
} else if (m == 1 ) {
if (d != 1) {
d -= 1;
} else {
d = 31;
m = 12;
y -= 1;
}
}
//重新设置日期
this.day.setValue(d);
this.month.setValue(m);
this.year.setVaule(y);
return new DateUtil(y,m,d);
}
public int getDatesofDates(DateUtil date){
int arr[] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i, s = 0;
for ( i = 1; i < this.year.getVaule(); i++) {
s += 365;
if (this.year.isLeapYear(i)) {
s += 1;
}
}
if (this.year.isLeapYear(i)){
arr[2] = 29;
}
for ( i = 1; i <this.month.getValue() ;i++) { //不取等 算的是间隔数
s += arr[i];
}
s += this.day.getValue();
int ls = 0;
for ( i = 1; i <date.year.getVaule(); i++) { //不取等 算的是间隔数
ls += 365;
if (date.year.isLeapYear(i)) {
ls += 1;
}
}
if (date.year.isLeapYear(i)) {
arr[2] = 29;
}
for ( i = 1; i < date.month.getValue(); i++) {
ls += arr[i];
}
ls += date.day.getValue();
if (ls > s) return ls - s;
else return s - ls;
}
}
class Day{
private int value;
public Day() {
}
public Day(int value ) {
this.value = value;
;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public void dayIncrement() {
//日期增1
value++;
}
public void dayReduction() {
//日期减1
value--;
}
}
class Month{
private int value;
private Year year;
public Month() {
}
public Month( int monthvalue) {
this.value = monthvalue;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public void reseMin(){
value=1;
}
public void reseMax(){
value=12;
}
public boolean validate(){
if(value<=12&&value>=1)
return true;
else return false;
}
public void monthIncrement() {
//月份增1
value++;
}
public void monthReduction() {
//月份减1
value--;
}
}
class Year{
private int vaule;
public Year() {
}
public Year(int vaule) {
this.vaule = vaule;
}
public int getVaule() {
return vaule;
}
public void setVaule(int vaule) {
this.vaule = vaule;
}
public boolean isLeapYear(){
if (vaule % 4 == 0 && vaule % 100 != 0 || vaule % 400 == 0)
return true;
else return false;
}
public boolean isLeapYear(int i){
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
return true;
else return false;
}
public boolean validate(){
if(vaule<=2020&&vaule>=1820)
return true;
else return false;
}
public void yearIncrement(){
vaule++;
}
public void yearReduction(){
vaule--;
}
}
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
这题难度较大,题目看到费劲,试着写了写,但毫无头绪,代码实现了一些,但对输入的内容如何分类处理无法有效实现。
写这题前,应该对java中 日期类相关成员方法的使用熟练,因为要判断日期依次定价。
建议使用LocalDate相关类。
写了一半代码的类图。
相关代码:
package 菜单计价;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws ParseException {
Scanner sc=new Scanner(System.in);
Menu menu=new Menu();
Order order=new Order();
String s=new String();
boolean isCaidan=true;
boolean isDingdan=false;
int j=0;
int q=0;
int k=0;
boolean fene=true;
boolean fenshu=true;
while (true){
s = sc.nextLine();
String arr[]=s.split(" ");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
if(isCaidan&&arr[i].matches("\\W+")) {
Dish m = new Dish(arr[i], Integer.parseInt(arr[i + 1]));
menu.dishs[j]=m;
j++;
}
if(arr[i].matches("[t][a][b][l][e]")) {
isCaidan=false;
isDingdan=true;
Table t=new Table(Integer.parseInt(arr[i+1]),arr[i+2],arr[i+3]);
order.tables[q]=t;
q++;
}
if(isDingdan&&arr[i].matches("\\W+")&&arr[i-1].matches("\\d")){
Record record=new Record(Integer.parseInt(arr[i-1]),menu.searthDish(arr[i]),
Integer.parseInt(arr[i+1]),Integer.parseInt(arr[i+2]));
if(Integer.parseInt(arr[i+1])>3){
//份额大于3
fene=false;
}
if( Integer.parseInt(arr[i+2])>=15) { //份数大于15
fene=false;
}
order.records[k]=record;
k++;
}
if(isDingdan&&arr[i].matches("[d][e][l][e][t][e]")){
order.delARecordByOrderNum(Integer.parseInt(arr[i-1]));
}
}
if(s.equals("end")){
break;
}
}
for (int i = 0; i < order.tables.length; i++) {
System.out.println("table"+" "+order.tables[i].tableNum+":");
for (int u = 0; u < order.records.length; u++) {
if (order.records[u] != null) {
System.out.println(order.records[u].orderNum + " " +
order.records[u].d.name + " " + order.records[u].getPrice());
}
}
}
System.out.println("wrong format");
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat sdf2=new SimpleDateFormat("HH/mm/ss");
Calendar c = Calendar.getInstance();
Date localTime=sdf2.parse(order.tables[0].localtime);
Date localDate=sdf.parse(order.tables[0].localdate);
c.setTime(localDate);
String start="17:00:00";
String end="20:30:00";
String start2="10:30:00";
String end2="14:30:00";
SimpleDateFormat sdf3=new SimpleDateFormat("HH:mm:ss");
Date date1=sdf3.parse(start);
Date date2=sdf3.parse(end);
long startTime = date1.getTime();
long endTime = date2.getTime();
Date date11=sdf3.parse(start2);
Date date22=sdf3.parse(end2);
long startTime2 = date11.getTime();
long endTime2 = date22.getTime();
double price=0;
if(1<=c.get(Calendar.DAY_OF_WEEK-1)&&c.get(Calendar.DAY_OF_WEEK)-1<=5){
if(startTime<=localTime.getTime()&&localTime.getTime()<=endTime){
price = order.getPrice(order.records);
price*=0.8;
}
else if(startTime2<=localTime.getTime()&&localTime.getTime()<=endTime2){
price = order.getPrice(order.records);
price*=0.6;
}
}
System.out.println("table"+" "+order.tables[0].tableNum+":"+" "+Math.round(price));
}
}
class Table {
int tableNum;//桌号
String localdate;//点餐时间
String localtime;//
int discount;//记录当前时间的折扣
boolean work = false;//判断当前是否在营业状态,1表示在营业
public Table() {
}
public Table(int tableNum, String localdate, String localtime ) {
this.tableNum = tableNum;
this.localdate = localdate;
this.localtime = localtime;
}
public int getTableNum() {
return tableNum;
}
public void setTableNum(int tableNum) {
this.tableNum = tableNum;
}
public String getLocaldate() {
return localdate;
}
public void setLocaldate(String localdate) {
this.localdate = localdate;
}
public String getLocaltime() {
return localtime;
}
public void setLocaltime(String localtime) {
this.localtime = localtime;
}
public int getDiscount() {
return discount;
}
public void setDiscount(int discount) {
this.discount = discount;
}
public boolean isWork() {
return work;
}
public void setWork(boolean work) {
this.work = work;
}
public String toString() {
return "Table{tableNum = " + tableNum + ", localdate = " + localdate + ", localtime = " + localtime + ", discount = " + discount + ", work = " + work + "}";
}
}
class Dish { //菜品类:对应菜谱上一道菜的信息。
String name;//菜品名称
int unit_price; //单价
public Dish() {
}
public Dish(String name, int unit_price) {
this.name = name;
this.unit_price = unit_price;
}
int getPrice(int portion){ //计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
if(portion==1)return unit_price;
else if(portion==2) return unit_price*3/2;
else if(portion==3) return unit_price*2;
else return 0;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getUnit_price() {
return unit_price;
}
public void setUnit_price(int unit_price) {
this.unit_price = unit_price;
}
public String toString() {
return "Dish{name = " + name + ", unit_price = " + unit_price + "}";
}
}
class Menu { //菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Dish[] dishs=new Dish[11];
;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName) { //根据菜名在菜谱中查找菜品信息,返回Dish对象。
int i;
for(i=0;i<dishs.length;i++)
{
if(dishName.equals(dishs[i].name))
return dishs[i];
}
System.out.println(dishName +"does not exist");
return null;
}
// void addDish(String dishName,int unit_price){//添加一道菜品信息
// Dish dish=new Dish (dishName,unit_price);
//
// for (int i = 0; i < dishs.length; i++) {
// if(dishs[i]==null){
// dishs[i]=dish;
//
// }
// }
//
// }
}
class Record { //点菜记录类:保存订单上的一道菜品记录
int orderNum;//序号
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int num;//份数
public Record() {
}
public Record(int orderNum, Dish d, int portion,int num) {
this.orderNum = orderNum;
this.d = d;
this.portion = portion;
this.num=num;
}
int getPrice(){
return d.getPrice(portion)*num;
};//计价,计算本条记录的价格
public int getOrderNum() {
return orderNum;
}
}
class Order {
Record[] records=new Record[10];
//保存订单上每一道的记录
Table tables[]=new Table[10];
int getTotalPrice(){//计算订单的总价
int sum=0;
for (int i = 0; i < records.length; i++) {
if(records[i]!=null){
sum+=records[i].getPrice();
}
}
return sum;
}
int getPrice(Record[] records){
int sum=0;
for (int i = 0; i < records.length; i++) {
if(records[i]!=null){
sum+=records[i].getPrice();
}
}
return sum;
}
Record addARecord(int orderNum,String dishName,int portion,int num){//添加一条菜品records信息到订单中。
Menu u=new Menu();
Dish d=u.searthDish(dishName);
if(d==null){
System.out.println(dishName+" "+"does not exist");
return null;
}
Record record=new Record(orderNum,d,portion,num);
for (int i = 0; i < records.length; i++) {
if(records[i]==null){
records[i]=record;
return record;
}
}
return null;
}
void delARecordByOrderNum(int orderNum){ //根据序号删除一条记录
for (int i = 0; i < records.length; i++) {
if(records[i].orderNum==orderNum&&records[i]!=null){
records [i]=null;
return;
}
else break;
}
System.out.println("delete error");
}
Record findRecordByNum(int orderNum){//根据序号查找一条记录
for (int i = 0; i < records.length; i++) {
if(records[i].orderNum==orderNum){
return records[i];
}
}
return null;
}
}
3.踩坑心得:
1.学会使用集合在写PTA会方便很多。
2.自己应学会看图设计,在日期类中,不同类图对应不同设计模式。
3.学会JAVA定义好的API类的使用,会方便很多。
4.学会使用正则表达式。但正则表达式太灵活,自己还掌握不够熟练。
5.代码可读性不高,类间关系复杂。不明确。
4.改进建议:
学会熟练使用正则表达式,掌握类的关系,学会按照迪米特发展进行分类。
提高代码量,不要见到复杂的题目就放弃,可能试一试就写出来了。
学习要自己主动,不能被人催着学。大学如此,计算机更是如此。
在写代码时,没有对属性进行封装,并且不会对相关的方法前面赋予public,
而且很多时候代码格式没有依据驼峰的格式和命名规则。
5:总结
第4到6次的PTA作业不是很好,尤其是在写类的封装实现相关题目时,自己不想去写,感觉代码量太大太复杂。
但写作业就是积累代码量的过程,希望以后自己加油,试着写一写。
而且需要对类和对象进行深入学习,学会合理设计类。
对正则表达式以及集合相关使用,应多加练习,熟练。
标签:输出,6Blog,return,String,int,else,public
From: https://www.cnblogs.com/bbbgk/p/17360511.html