FC第二次博客作业

Felix-C / 2023-05-03 / 原文

一、前言

oop训练集四中主要考察了字符串的操作,array数组,排序方法,一些自带方法,封装等。

oop训练集五中主要考察了正则表达式,字符串的基本操作和面对对象中的聚合等。

oop训练集六中综合考察了面对对象编程和字符串处理等能力。

 

二、设计与分析

1、oop4中的7-1

菜单计价程序-3

这道题当时我没有做出来,我认为有以下原因:

1、没有认真仔细的阅读题目要求,很多细节出错导致程序运行出错并且找不到错误所在

2、没有成熟的字符串处理方式,算法累赘

之后的学习我会注重这两方面,冷静阅读题目要求,增强字符串的处理能力

 

2、oop5中7-5

日期问题面向对象设计(聚合一)

题目要求如下:

 这道题的求n天的几个方法在前面的oop训练集中写过,这里不做赘述,在前一次blog中有分析过,这次题目主要考察聚合关系,在DateUtil类中new Day类,在Day类中new Month类,在Month类中new Year类,在每个类中写相应的需要的方法,在DateUtil中用方法实现功能。

代码如下:

 

import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
int year = 0;
int month = 0;
int day = 0;
if(choice==1){ // test getNextNDays method
int m = 0;
year = sc.nextInt();
month = sc.nextInt();
day = sc.nextInt();
DateUtil date = new DateUtil(year, month, day);
DateUtil dateF = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = sc.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
if(m==0){
System.out.println(dateF.showDate()+" next "+m+" days is:"+dateF.showDate());
System.exit(0);
}
DateUtil dateNextN = date.getNextNDays(m);
System.out.println(dateF.showDate()+" next "+m+" days is:"+dateNextN.showDate());
} else if (choice==2) {
int m = 0;
year = sc.nextInt();
month = sc.nextInt();
day = sc.nextInt();
DateUtil date = new DateUtil(year, month, day);
DateUtil dateF = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = sc.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
if(m==0){
System.out.println(dateF.showDate()+" next "+m+" days is:"+dateF.showDate());
System.exit(0);
}
DateUtil datePreviousN = date.getPreviousNDays(m);
System.out.println(dateF.showDate()+" previous "+m+" days is:"+datePreviousN.showDate());
} else if (choice==3) {
year = sc.nextInt();
month = sc.nextInt();
day = sc.nextInt();
DateUtil date = new DateUtil(year, month, day);
int year1 = sc.nextInt();
int month1 = sc.nextInt();
int day1 = sc.nextInt();
DateUtil date1 = new DateUtil(year1, month1, day1);
if (date.checkInputValidity() && date1.checkInputValidity()) {
int n = date.getDaysofDates(date1);
System.out.println("The days between "+date.showDate()+" and "+date1.showDate()+" are:"+n);
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}


class Day{
private int value;

public Day() {
}

public Day(int value){
this.value = value;
}

public int getValue() {
return this.value;
}

public void setValue(int value) {
this.value = value;
}

public void dayIncrement(){
this.value+=1;
}

public void dayReduction(){
this.value-=1;
}
}

class Year{
private int value;

public Year(int value) {
this.value = value;
}

public int getValue() {
return this.value;
}

public void setValue(int value) {
this.value = value;
}

public boolean isLeapYear(){
if(this.value%400==0||(this.value%4==0&&this.value%100!=0)){
return true;
}else{
return false;
}
}

public boolean validate(){
if(this.value<1820||this.value>2020){
return false;
}else{
return true;
}
}

public void yearIncrement(){
this.value+=1;
}

public void yearReduction(){
this.value-=1;
}
}

class Month{
private int value;

public Month(int value) {
this.value = value;
}

public int getValue() {
return this.value;
}

public void setValue(int value) {
this.value = value;
}

public void resetMin(){
this.value = 1;
}

public void resetMax(){
this.value = 12;
}

public boolean validate(){
if(this.value<1||this.value>12){
return false;
}else{
return true;
}
}

public void monthIncrement(){
this.value+=1;
}

public void monthReduction(){
this.value-=1;
}
}

class DateUtil{
private Year year;
private Month month;
private Day day;
private int[] mon_maxnum = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};

public DateUtil(int y,int m,int d) {
year = new Year(y);
month = new Month(m);
day = new Day(d);
}

public Year getYear() {
return this.year;
}

public void setYear(Year year) {
this.year = year;
}

public Month getMonth() {
return this.month;
}

public void setMonth(Month month) {
this.month = month;
}

public Day getDay() {
return this.day;
}

public void setDay(Day day) {
this.day = day;
}

public void setDayMin(){
this.day.setValue(1);
}

public void setDayMax(){
this.day.setValue(12);
}

public boolean checkInputValidity(){
if(this.year.isLeapYear()){
mon_maxnum[1]=29;
}else{
mon_maxnum[1]=28;
}
if (this.year.validate() && this.month.validate()) {
if (this.day.getValue() >= 0 && this.day.getValue() <= mon_maxnum[this.month.getValue() - 1]) {
return true;
} else {
return false;
}
} else {
return false;
}
}

public DateUtil getNextNDays(int n) {
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}

if ((long)n + this.day.getValue() <= mon_maxnum[this.month.getValue() - 1]) {
this.day.setValue(this.day.getValue() + n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
} else {
while ((long)n + this.day.getValue() > mon_maxnum[this.month.getValue() - 1]) {
n = n - mon_maxnum[this.month.getValue() - 1] + this.day.getValue();
this.day.setValue(0);
if (this.month.getValue() == 12) {
this.year.setValue(this.year.getValue() + 1);
this.month.resetMin();
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}
} else {
this.month.setValue(this.month.getValue() + 1);
}
}
this.day.setValue(n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
}
}

public DateUtil getPreviousNDays(int n) {
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}

if (this.day.getValue() - (long)n> 0) {
this.day.setValue(this.day.getValue() - n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
} else {
while (this.day.getValue() - (long)n <= 0) {
n = n - this.day.getValue();
if (this.month.getValue() != 1) {
this.month.setValue(this.month.getValue() - 1);
this.day.setValue(mon_maxnum[this.month.getValue() - 1]);
} else {
this.month.resetMax();
this.year.setValue(this.year.getValue() - 1);
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}
this.day.setValue(mon_maxnum[this.month.getValue() - 1]);
}
}
this.day.setValue(this.day.getValue() - n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
}
}

public boolean compareDates(DateUtil date) {
if (this.year.getValue() > date.year.getValue()){
return true;
}else if (this.year.getValue() < date.year.getValue()) {
return false;
} else {
if (this.month.getValue() > date.month.getValue()) {
return true;
} else if (this.month.getValue() < date.month.getValue()) {
return false;
} else {
if (this.day.getValue() > date.day.getValue()) {
return true;
} else {
return false;
}
}
}
}

public boolean equalTwoDates(DateUtil date){
if(this.day.getValue()==date.day.getValue()&&this.month.getValue()==date.month.getValue()&&this.year.getValue()==date.year.getValue()){
return true;
}else{
return false;
}
}

public int getDaysofDates(DateUtil date){
DateUtil young;
DateUtil old;
if(this.compareDates(date)){
young = new DateUtil(date.year.getValue(),date.month.getValue(),date.day.getValue());
old = new DateUtil(this.year.getValue(),this.month.getValue(),this.day.getValue());
}else{
young = new DateUtil(this.year.getValue(),this.month.getValue(),this.day.getValue());
old = new DateUtil(date.year.getValue(),date.month.getValue(),date.day.getValue());
}
int days = 0;
for (int y = young.year.getValue(); y < old.year.getValue(); y++) {
if (y%400==0||(y%4==0&&y%100!=0)) {
days += 366;
} else {
days += 365;
}
}
for(int i = 0;i<old.month.getValue()-1;i++){
if(old.year.isLeapYear()){
mon_maxnum[1] = 29;
}else{
mon_maxnum[1] = 28;
}
days+=mon_maxnum[i];
}
days+=old.day.getValue();
for(int i = 0;i<young.month.getValue()-1;i++){
if(young.year.isLeapYear()){
mon_maxnum[1] = 29;
}else{
mon_maxnum[1] = 28;
}
days-=mon_maxnum[i];
}
days-=young.day.getValue();
return days;
}

public String showDate(){
String str = String.valueOf(this.year.getValue()+"-"+this.month.getValue()+"-"+this.day.getValue());
return str;
}
}

 

3、oop5中7-6

日期问题面向对象设计(聚合二)

题目要求如下:

 

 分析:这题与上题不同的地方在于Year、Month和Day之间关系减弱,在DateUtil中调用所有类并实现所需功能,这样做简单方便,容易后期修改。

代码如下:


import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
int year = 0;
int month = 0;
int day = 0;
if(choice==1){ // test getNextNDays method
int m = 0;
year = sc.nextInt();
month = sc.nextInt();
day = sc.nextInt();
DateUtil date = new DateUtil(year, month, day);
DateUtil dateF = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = sc.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
if(m==0){
System.out.println(dateF.showDate()+" next "+m+" days is:"+dateF.showDate());
System.exit(0);
}
DateUtil dateNextN = date.getNextNDays(m);
System.out.println(dateF.showDate()+" next "+m+" days is:"+dateNextN.showDate());
} else if (choice==2) {
int m = 0;
year = sc.nextInt();
month = sc.nextInt();
day = sc.nextInt();
DateUtil date = new DateUtil(year, month, day);
DateUtil dateF = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = sc.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
if(m==0){
System.out.println(dateF.showDate()+" next "+m+" days is:"+dateF.showDate());
System.exit(0);
}
DateUtil datePreviousN = date.getPreviousNDays(m);
System.out.println(dateF.showDate()+" previous "+m+" days is:"+datePreviousN.showDate());
} else if (choice==3) {
year = sc.nextInt();
month = sc.nextInt();
day = sc.nextInt();
DateUtil date = new DateUtil(year, month, day);
int year1 = sc.nextInt();
int month1 = sc.nextInt();
int day1 = sc.nextInt();
DateUtil date1 = new DateUtil(year1, month1, day1);
if (date.checkInputValidity() && date1.checkInputValidity()) {
int n = date.getDaysofDates(date1);
System.out.println("The days between "+date.showDate()+" and "+date1.showDate()+" are:"+n);
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}


class Day{
private int value;

public Day() {
}

public Day(int value){
this.value = value;
}

public int getValue() {
return this.value;
}

public void setValue(int value) {
this.value = value;
}

public void dayIncrement(){
this.value+=1;
}

public void dayReduction(){
this.value-=1;
}
}

class Year{
private int value;

public Year(int value) {
this.value = value;
}

public int getValue() {
return this.value;
}

public void setValue(int value) {
this.value = value;
}

public boolean isLeapYear(){
if(this.value%400==0||(this.value%4==0&&this.value%100!=0)){
return true;
}else{
return false;
}
}

public boolean validate(){
if(this.value<1820||this.value>2020){
return false;
}else{
return true;
}
}

public void yearIncrement(){
this.value+=1;
}

public void yearReduction(){
this.value-=1;
}
}

class Month{
private int value;

public Month(int value) {
this.value = value;
}

public int getValue() {
return this.value;
}

public void setValue(int value) {
this.value = value;
}

public void resetMin(){
this.value = 1;
}

public void resetMax(){
this.value = 12;
}

public boolean validate(){
if(this.value<1||this.value>12){
return false;
}else{
return true;
}
}

public void monthIncrement(){
this.value+=1;
}

public void monthReduction(){
this.value-=1;
}
}

class DateUtil{
private Year year;
private Month month;
private Day day;
private int[] mon_maxnum = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};

public DateUtil(int y,int m,int d) {
year = new Year(y);
month = new Month(m);
day = new Day(d);
}

public Year getYear() {
return this.year;
}

public void setYear(Year year) {
this.year = year;
}

public Month getMonth() {
return this.month;
}

public void setMonth(Month month) {
this.month = month;
}

public Day getDay() {
return this.day;
}

public void setDay(Day day) {
this.day = day;
}

public void setDayMin(){
this.day.setValue(1);
}

public void setDayMax(){
this.day.setValue(12);
}

public boolean checkInputValidity(){
if(this.year.isLeapYear()){
mon_maxnum[1]=29;
}else{
mon_maxnum[1]=28;
}
if (this.year.validate() && this.month.validate()) {
if (this.day.getValue() >= 0 && this.day.getValue() <= mon_maxnum[this.month.getValue() - 1]) {
return true;
} else {
return false;
}
} else {
return false;
}
}

public DateUtil getNextNDays(int n) {
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}

if ((long)n + this.day.getValue() <= mon_maxnum[this.month.getValue() - 1]) {
this.day.setValue(this.day.getValue() + n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
} else {
while ((long)n + this.day.getValue() > mon_maxnum[this.month.getValue() - 1]) {
n = n - mon_maxnum[this.month.getValue() - 1] + this.day.getValue();
this.day.setValue(0);
if (this.month.getValue() == 12) {
this.year.setValue(this.year.getValue() + 1);
this.month.resetMin();
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}
} else {
this.month.setValue(this.month.getValue() + 1);
}
}
this.day.setValue(n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
}
}

public DateUtil getPreviousNDays(int n) {
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}

if (this.day.getValue() - (long)n> 0) {
this.day.setValue(this.day.getValue() - n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
} else {
while (this.day.getValue() - (long)n <= 0) {
n = n - this.day.getValue();
if (this.month.getValue() != 1) {
this.month.setValue(this.month.getValue() - 1);
this.day.setValue(mon_maxnum[this.month.getValue() - 1]);
} else {
this.month.resetMax();
this.year.setValue(this.year.getValue() - 1);
if (this.year.isLeapYear()) {
mon_maxnum[1] = 29;
} else {
mon_maxnum[1] = 28;
}
this.day.setValue(mon_maxnum[this.month.getValue() - 1]);
}
}
this.day.setValue(this.day.getValue() - n);
DateUtil dateUtil = new DateUtil(this.year.getValue(), this.month.getValue(), this.day.getValue());
return dateUtil;
}
}

public boolean compareDates(DateUtil date) {
if (this.year.getValue() > date.year.getValue()){
return true;
}else if (this.year.getValue() < date.year.getValue()) {
return false;
} else {
if (this.month.getValue() > date.month.getValue()) {
return true;
} else if (this.month.getValue() < date.month.getValue()) {
return false;
} else {
if (this.day.getValue() > date.day.getValue()) {
return true;
} else {
return false;
}
}
}
}

public boolean equalTwoDates(DateUtil date){
if(this.day.getValue()==date.day.getValue()&&this.month.getValue()==date.month.getValue()&&this.year.getValue()==date.year.getValue()){
return true;
}else{
return false;
}
}

public int getDaysofDates(DateUtil date){
DateUtil young;
DateUtil old;
if(this.compareDates(date)){
young = new DateUtil(date.year.getValue(),date.month.getValue(),date.day.getValue());
old = new DateUtil(this.year.getValue(),this.month.getValue(),this.day.getValue());
}else{
young = new DateUtil(this.year.getValue(),this.month.getValue(),this.day.getValue());
old = new DateUtil(date.year.getValue(),date.month.getValue(),date.day.getValue());
}
int days = 0;
for (int y = young.year.getValue(); y < old.year.getValue(); y++) {
if (y%400==0||(y%4==0&&y%100!=0)) {
days += 366;
} else {
days += 365;
}
}
for(int i = 0;i<old.month.getValue()-1;i++){
if(old.year.isLeapYear()){
mon_maxnum[1] = 29;
}else{
mon_maxnum[1] = 28;
}
days+=mon_maxnum[i];
}
days+=old.day.getValue();
for(int i = 0;i<young.month.getValue()-1;i++){
if(young.year.isLeapYear()){
mon_maxnum[1] = 29;
}else{
mon_maxnum[1] = 28;
}
days-=mon_maxnum[i];
}
days-=young.day.getValue();
return days;
}

public String showDate(){
String str = String.valueOf(this.year.getValue()+"-"+this.month.getValue()+"-"+this.day.getValue());
return str;
}
}

 

4、oop6中7-1

菜单计价程序-4

分析:在这道题中,我认为最主要考察的就是处理字符串的能力。在我的思路中,我认为首先要利用ArrayList将所有用户输入的字符串储存起来,再使用while循环一个一个处理,而在处理的时候,字符串是有固定格式进行输入,否则报错,因此我使用正则表达式进行字符串的分类处理。我认为这题需要注意的细节有:在删除订单的时候,不能覆盖删除,应该将订单中的num数量改为0,这样能在之后重复删除检测出来,同时不影响计算金额;在有两桌时,若第一桌桌号字符串输入错误,到第二桌号之前的所有字符串无效,这时我使用了recordRight进行判断,并在while循环的第一句中加入该判断,使得中间部分无效字符串不进行处理;在时间处理中会用到星期,而我使用了Calendar类进行时间处理,并判断星期。

我的不足:我没有写出多个桌号的相关代码,我当时没有想出用hashmap进行桌号和时间的同时存储,代码不够精炼,算法不够成熟,有很多累赘。

代码如下:

 

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Scanner;

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

ArrayList<String> allLine = new ArrayList<>(); //存储所有输入语句
while (true) {
String line = sc.nextLine();
if (line.equals("end")) {
break;
}
allLine.add(line);
}
Dish[] dishes = new Dish[0];
Menu menu = new Menu(dishes);

Record[] records = new Record[0];
Order order = new Order(records);

String table = new String();

int tableIndex = 0; //储存桌数
int recordIndex = 0; //储存订单数
boolean menuRight = true;
boolean recordRight = true;

for (String str : allLine) {
if (!str.matches("^table \\d+ \\d{4}/\\d{1,2}/\\d{1,2} \\d{1,2}/\\d{1,2}/\\d{1,2}$") && !recordRight) {
continue;
}
//处理菜品标识格式: 麻婆豆腐 12 T||null
if (str.matches("^[\\u4E00-\\u9FFF]+ [1-9]\\d* T$")) {
if (menuRight) {
String[] segments = str.split(" ");
if (Integer.parseInt(segments[1]) <= 0 || Integer.parseInt(segments[1]) >= 300) {
System.out.println(segments[0] + " price out of range " + segments[1]);
continue;
}
menu.addDish(segments[0], Integer.parseInt(segments[1]), 'T');
} else {
System.out.println("invalid dish");
}
} else if (str.matches("^[\\u4E00-\\u9FFF]+ [1-9]\\d*$")) {
if (menuRight) {
String[] segments = str.split(" ");
if (Integer.parseInt(segments[1]) < 0 || Integer.parseInt(segments[1]) > 300) {
System.out.println(segments[0] + " price out of range " + segments[1]);
continue;
}
Dish dish = menu.addDish(segments[0], Integer.parseInt(segments[1]), 'F');
} else {
System.out.println("invalid dish");
}
}


//处理桌号标识格式:table 55 2023/3/31 12/00/00
else if (str.matches("^table [1-9]\\d* \\d{4}/\\d{1,2}/\\d{1,2} \\d{1,2}/\\d{1,2}/\\d{1,2}$")) {
if (tableIndex != 0) {
String[] segments = table.split(" ");
System.out.println("table " + segments[0] + ": " + order.getTotalPrice() + " " + order.lastPrice(segments[1], segments[2]));
}
recordRight = true;
menuRight = false;
String[] segments = str.split(" ");

if(Integer.parseInt(segments[1])<1||Integer.parseInt(segments[1])>55){
System.out.println(segments[1]+" table num out of range");
recordRight = false;
continue;
}

if (!isDateDayRight(segments[2], segments[3])) {
System.out.println(segments[1] + " date error");
recordRight = false;
continue;
}
if (!isDateRight(segments[2])) {
System.out.println("not a valid time period");
recordRight = false;
continue;
}

if (!isInRun(segments[2], segments[3])) {
System.out.println("table " + segments[1] + " out of opening hours");
recordRight = false;
continue;
}

if (recordRight) {
table = String.valueOf(segments[1] + " " + segments[2] + " " + segments[3]);
tableIndex++;
System.out.println("table " + segments[1] + ": ");
}
} else if (!str.matches("^table \\d+ \\d{4}/\\d{1,2}/\\d{1,2} \\d{1,2}/\\d{1,2}/\\d{1,2}$") && str.startsWith("table")) {
System.out.println("wrong format");
recordRight = false;
}

// 处理点菜记录格式:1 麻婆豆腐 1 1 0-9\\d*
else if (str.matches("^\\d+ [\\u4E00-\\u9FFF]+ \\d [1-9]\\d*$")) {
String[] segments = str.split(" ");
if (Integer.parseInt(segments[0]) <= recordIndex) {
System.out.println("record serial number sequence error");
} else {
boolean rightLine = true;
if (menu.searchDish(segments[1]) != null) {
if (Integer.parseInt(segments[2]) > 3) {
System.out.println(segments[0] + " portion out of range " + segments[2]);
rightLine = false;
recordIndex++;
continue;
}
if (Integer.parseInt(segments[3]) > 15) {
System.out.println(segments[0] + " num out of range " + segments[3]);
rightLine = false;
recordIndex++;
continue;
}
if (rightLine) {
Record record = order.addARecord(Integer.parseInt(segments[0]), segments[1], Integer.parseInt(segments[2]), Integer.parseInt(segments[3]), menu);
System.out.println(segments[0] + " " + segments[1] + " " + record.getPrice());
recordIndex++;
}
} else {
System.out.println(segments[1] + " does not exist");
}
}
}
// 处理删除记录格式:2 delete
else if (str.matches("^\\d+ delete$")) {
String[] segments = str.split(" ");
boolean rightDNum = false;
if (Integer.parseInt(segments[0]) <= recordIndex) {
for (int i = 0; i < order.records.length; i++) {
if (Integer.parseInt(segments[0]) == order.records[i].orderNum) {
if (order.records[i].num != 0) {
order.delARecordByOrderNum(Integer.parseInt(segments[0]));

} else {
System.out.println("deduplication " + segments[0]);
}
rightDNum = true;
}
}
if (!rightDNum) {
System.out.println("delete error");
}
} else {
System.out.println("wrong format");
}
}

// 处理代点菜信息格式:桌号+ +序号+ +菜品名称+ +份额+ +分数
else if (str.matches("^\\d+ \\d+ [\\u4E00-\\u9FFF]+ \\d [1-9]\\d*$")) {
String[] segments = str.split(" ");
if (Integer.parseInt(segments[1]) <= recordIndex) {
System.out.println("record serial number sequence error");
} else {
boolean rightLine = true;
if (menu.searchDish(segments[2]) != null) {
if (Integer.parseInt(segments[3]) > 3) {
System.out.println(segments[1] + " portion out of range " + segments[3]);
rightLine = false;
recordIndex++;
}
if (menu.searchDish(segments[2]).special == 'T' && Integer.parseInt(segments[3]) == 2) {
System.out.println(segments[1] + " portion out of range " + segments[3]);
rightLine = false;
recordIndex++;
}
if (Integer.parseInt(segments[4]) > 15) {
System.out.println(segments[1] + " num out of range " + segments[4]);
rightLine = false;
recordIndex++;
}
if (rightLine) {
String tableN = table.split(" ")[0];
Record record = order.addARecord(Integer.parseInt(segments[1]), segments[2], Integer.parseInt(segments[3]), Integer.parseInt(segments[4]), menu);
System.out.println(segments[1] + " table " + tableN + " pay for table " + segments[0] + " " + record.getPrice()); //4 table 2 pay for table 1 12
recordIndex++;
}
} else {
System.out.println(segments[2] + " does not exist");
}
}
}
//输入错误
else {
System.out.println("wrong format");
}
}
if (recordRight) {
String[] segments = table.split(" ");
System.out.println("table " + segments[0] + ": " + order.getTotalPrice() + " " + order.lastPrice(segments[1], segments[2]));
}


}

public static boolean isDateRight(String date) {
String[] segments = date.split("/");
if (Integer.parseInt(segments[0]) >= 2022 && Integer.parseInt(segments[0]) <= 2023 && Integer.parseInt(segments[1]) >= 1 && Integer.parseInt(segments[1]) <= 12 && isDayRight(Integer.parseInt(segments[1]), Integer.parseInt(segments[2]))) {
return true;
} else {
return false;
}
}

public static boolean isDayRight(int month, int day) {
int[] mon_max = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (day > mon_max[month] || day < 1) {
return false;
} else {
return true;
}
}

public static boolean isDateDayRight(String date, String time) {
String[] segments1 = date.split("/");

if (Integer.parseInt(segments1[1]) > 12 || Integer.parseInt(segments1[1]) < 1 || !isDayRight(Integer.parseInt(segments1[1]), Integer.parseInt(segments1[2]))) {
return false;
}
if (!time.matches("^([01]?[0-9]|2[0-3])/([0-5]?[0-9])/([0-5]?[0-9])$")) {
return false;
}
return true;
}

public static int weekNum(String date) {
String[] segments = date.split("/");
int year = Integer.parseInt(segments[0]);
int month = Integer.parseInt(segments[1]);
int day = Integer.parseInt(segments[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, day);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
return dayOfWeek;
}

public static boolean isInRun(String date, String time) {
int weekNum = weekNum(date);
String[] segments = time.split("/");
int timeNow = Integer.parseInt(segments[0]) * 60 * 60 + Integer.parseInt(segments[1]) * 60 + Integer.parseInt(segments[2]);
int time11 = 17 * 60 * 60;
int time12 = 20 * 3600 + 30 * 60;
int time21 = 10 * 3600 + 30 * 60;
int time22 = 14 * 3600 + 30 * 60;
int time31 = 9 * 3600 + 30 * 60;
int time32 = 21 * 3600 + 30 * 60;
if (weekNum > 1 && weekNum < 7) {
if ((timeNow >= time11 && timeNow <= time12) || (timeNow >= time21 && timeNow <= time22)) {
return true;
} else {
return false;
}
} else {
if (timeNow >= time31 && timeNow <= time32) {
return true;
} else {
return false;
}
}
}

}


class Dish {
String name;
int unit_price;
char special;

public Dish(String name, int unit_price, char special) {
this.name = name;
this.unit_price = unit_price;
this.special = special;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

public int getUnit_price() {
return this.unit_price;
}

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

public int getPrice(int portion) { //return 0 则为无匹配对象
switch (portion) {
case 1:
return this.unit_price;

case 2:
return (int) (this.unit_price * 1.5 + 0.5);

case 3:
return (int) (this.unit_price * 2);

}
return 0;
}

}

class Menu {
Dish[] dish;

public Menu(Dish[] dish) {
this.dish = dish;
}

public Dish searchDish(String dishName) { //return null 则为无匹配对象
for (int i = 0; i < this.dish.length; i++) {
if (this.dish[i].name.equals(dishName)) {
return this.dish[i];
}
}
return null;
}

public Dish addDish(String dishName, int unit_price, char special) {
Dish newDish = new Dish(dishName, unit_price, special);
if (searchDish(dishName) != null) {
for (int i = 0; i < this.dish.length; i++) {
if (this.dish[i].name.equals(dishName)) {
this.dish[i].special = special;
this.dish[i].unit_price = unit_price;
}
}
return newDish;
} else {
Dish[] newDishArray = new Dish[this.dish.length + 1];
for (int i = 0; i < this.dish.length; i++) {
newDishArray[i] = this.dish[i];
}
newDishArray[newDishArray.length - 1] = newDish;
this.dish = newDishArray;
return newDish;
}
}
}

class Record {
int orderNum;
Dish d;
int portion;
int num;

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

public int getPrice() {
return this.d.getPrice(this.portion) * this.num;
}

}

class Order {
Record[] records;

public Order(Record[] records) {
this.records = records;
}

public int getTotalPrice() {
int totalPrice = 0;
for (int i = 0; i < this.records.length; i++) {
totalPrice += this.records[i].getPrice();
}
return totalPrice;
}

public Record addARecord(int orderNum, String dishName, int portion, int num, Menu menu) {
Dish d = menu.searchDish(dishName);
Record newRecord = new Record(orderNum, d, portion, num);
Record[] newRecordsArray = new Record[this.records.length + 1];
for (int i = 0; i < this.records.length; i++) {
newRecordsArray[i] = this.records[i];
}
newRecordsArray[newRecordsArray.length - 1] = newRecord;
this.records = newRecordsArray;
return newRecord;
}

public void delARecordByOrderNum(int orderNum) {
Record[] newRecordsArray = new Record[this.records.length];
for (int i = 0, j = 0; i < this.records.length; i++, j++) {
if (this.records[i].orderNum == orderNum) {
this.records[i].num = 0;
}
newRecordsArray[j] = this.records[i];
}
this.records = newRecordsArray;
}

public void findRecordByNum(int orderNum) {
if (orderNum < this.records.length && orderNum >= 0) {
System.out.println(this.records[orderNum].orderNum + this.records[orderNum].d.name + "portion:" + this.records[orderNum].portion + "num:" + this.records[orderNum].num);
} else {
System.out.println("Wrong OrderNum!");
}
}

public int lastPrice(String date, String time) {
int total = 0;
String[] date1 = date.split("/");
int year = Integer.parseInt(date1[0]);
int month = Integer.parseInt(date1[1]);
int day = Integer.parseInt(date1[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, day);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
String[] time1 = time.split("/");
int timeNow = Integer.parseInt(time1[0]) * 60 * 60 + Integer.parseInt(time1[1]) * 60 + Integer.parseInt(time1[2]);
int timeNight1 = 17 * 60 * 60;
int timeNight2 = 20 * 60 * 60 + 30 * 60;
int timeNoon1 = 10 * 60 * 60 + 30 * 60;
int timeNoon2 = 14 * 60 * 60 + 30 * 60;

for (int i = 0; i < this.records.length; i++) {
if (this.records[i].d.special == 'T' && dayOfWeek > 1 && dayOfWeek < 7) {
total += (int) (this.records[i].getPrice() * 0.7 + 0.5);
} else {
if (dayOfWeek > 1 && dayOfWeek < 7 && timeNow >= timeNight1 && timeNow <= timeNight2) {
total += this.records[i].getPrice() * 0.8;
} else if (dayOfWeek > 1 && dayOfWeek < 7 && timeNow >= timeNoon1 && timeNow <= timeNoon2) {
total += this.records[i].getPrice() * 0.6;
} else {
total += this.records[i].getPrice();
}

}
}
return total;
}
}

 

 

 

 

三、踩坑心得

 1、粗心大意,没有注意细节,oop6中错误输出

 next应为previous

 

2、正则表达式在java中应为\\

3、类与类的关系尽量放小

 

四、改进建议

在oop6中7-1中

我应该使用hashmap进行table语句的储存,储存两个值 桌号 和 时间

以此写多个桌号的处理

 

五、总结

在这三次训练集当中,我认为我学会了很多以前遗漏的知识点,例如正则应该使用\\,类中属性应该尽量使用封装,同时我巩固了字符串的处理方法,类的聚合,正则表达式的使用和规则。同时,我也发现了我的很多错误和不足,我还是没有习惯随手写注释,代码依旧不够精练,很多方法例如哈希表等都不能熟练使用。