首页 > 编程语言 >java第二次blog

java第二次blog

时间:2023-06-29 09:11:46浏览次数:43  
标签:输出 return String int else blog java 第二次 public

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-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] , 设计类图如下:

类图.jpg

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

注意:严禁使用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] , 设计类图如下:

类图.jpg

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

注意:严禁使用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作业不是很好,尤其是在写类的封装实现相关题目时,自己不想去写,感觉代码量太大太复杂。
但写作业就是积累代码量的过程,希望以后自己加油,试着写一写。
而且需要对类和对象进行深入学习,学会合理设计类。
对正则表达式以及集合相关使用,应多加练习,熟练。






   

标签:输出,return,String,int,else,blog,java,第二次,public
From: https://www.cnblogs.com/xi-zhi/p/17513115.html

相关文章

  • 【后端面经-Java】AQS详解
    目录1.AQS是什么?2.AQS核心思想2.1基本框架2.1.1资源state2.1.2CLH双向队列2.2AQS模板3.源码分析3.1acquire(int)3.1.1tryAcquire(int)3.1.2addWaiter(Node.EXCLUSIVE)3.1.3acquireQueued(Nodenode,intarg)3.2release(int)3.2.1tryRelease(int)3.2.2unparkSuccess......
  • 题目集6-8的总结性Blog
    一、前言第6-8次的pta没有延续之前的菜单计价程序,主要是围绕课程成绩统计程序进行的。第六次大作业就是成绩统计程序,第七次大作业则增加了对HashMap和多态的一个考察,第八次大作业则是增加了对Arraylist部分知识点的考察。这三次作业不再是菜单的设计,而是改为学生成绩的统计,但还是......
  • 【转】Java 单元测试
    Java单元测试在测试方法上添加@Test注解:   ......
  • Blog PTA 6-9总结
    关于成绩统计程序类的结构理解(老师提供的结构代码)这里以课程成绩统计程序-3为代表,本质上三个题目的差别度不大,核心思想都没用太大处。尤其和前面的点菜系统有很强的相似性。输入结构课程名字性质考核方式权重的个数(1,2,4-9不等)考试两个成绩,两个权重考察一个成绩一个权......
  • blog-6-8次PTA题目集(成绩计算系列)
    (1)前言:第6次题目集课程成绩统计程序-1在规范性输入时涉及到了正则表达式,数组列表及其相关方法的使用,if-else,for,foreach循环的使用,以及字符串中的substring()方法,equals()方法的使用,Integer.toString等相关类型之间转化的方式,数据域的封装,Comparable接口的实现,Collections.sort......
  • Blog3
    PTA题目集6,7,8总结Blog一、前言大一下学期开始,我们开始学习Java这门编程语言。Java具有大多数编程语言共有的特性,是专门设计用于互联网分布式环境的。它的形式和感觉类似于C++,但相比C++更易于使用,并且完全采用了面向对象的编程方式。到目前为止,我们已经完成了八次Pta作业。除了......
  • blog-3
    今天这期blog是关于对之前发布的6-8次PTA题目集(成绩计算系列)进行的总结分析,但由于本人学识浅薄,只完成了部分代码 这是第一次课程成绩统计程序以下为代码importjava.util.Scanner;importjava.text.Collator;importjava.util.Locale;importjava.util.Arrays;classCourse{......
  • BLOG-2
    前言:第四次题目集:第四次题目集只有一道题目,是菜单计价系统4,该次计价系统在菜单计价系统3的基础上添加了特色菜功能,并且增加了一些对错误信息的输出语句,最后还改进了价格的输出方式,改为输出打折前的价格与打折后的价格。难度增加相对较小。第五次题目集:第五次题目集同样只有一道......
  • blog2
    本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。设计点菜计价程序,根据输入的信息,计算并输出总价格。输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。菜单由一条或多条菜品记录组成,每条记录一行每条菜品记录包含:菜名、基础价格两个信息。订单......
  • blog2
    PTA题目集4,5及期中考试总结Blog 一.前言;      大一下学期开始,我们开始接触java这门语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的形式和感觉,但它要比C++语言更易于使用,而且在编程时彻底采用了一种以对象为......