一前言

  题目集四主要考察的是对LocalDate,ArrayList,HashSet等Java自带类的使用

  题目集五主要考察的是对正则表达式的使用,以及对其题目集三的时间题目的进行类结构的改变

  题目集六只有一道题,主要是对题目集四的第一题进行加大难度

  总的来说这几次的题目量比前面几次都要少,但是题目难度开始加深。

二设计与分析

   由于部分题目过于简单,所以这里主要是对题目集四的7-1,题目集五的7-5,7-6,题目集六的7-1进行分析

   题目集四7-1:当时见到这道题时认为难度较大且复杂,所以在这次题目集时放弃了写这道题,但由于题目集六的7-1题目是在此基础上的加深所以主要在后面分析

   题目集五7-5:此题目主要是我们将前面题目集三的7-3的进行如下类图的类结构更改

所以我们主要是对类图进行分析,我们发现各个类之间是聚合的关系,每一个类与类之间聚合,所以我们按照此类图设计类时应该由year到month到day到DateUtil之间一个个写。最后的题目要求的主要功能则在DateUtil这里实现,因为这里是最后一个聚合。

代码如下:

   

  1 import java.util.Scanner;
  2 public class Main {
  3     public static void main(String[] args) {
  4         Scanner input = new Scanner(System.in);
  5         int year = 0;
  6         int month = 0;
  7         int day = 0;
  8 
  9         int choice = input.nextInt();
 10 
 11         if (choice == 1) { // test getNextNDays method
 12             int m = 0;
 13             year = Integer.parseInt(input.next());
 14             month = Integer.parseInt(input.next());
 15             day = Integer.parseInt(input.next());
 16 
 17             DateUtil date = new DateUtil(year, month, day);
 18 
 19             if (!date.checkInputValidity()) {
 20                 System.out.println("Wrong Format");
 21                 System.exit(0);
 22             }
 23 
 24             m = input.nextInt();
 25 
 26             if (m < 0) {
 27                 System.out.println("Wrong Format");
 28                 System.exit(0);
 29             }
 30             System.out.println(date.getNextNDays(m).showDate());
 31         } else if (choice == 2) { // test getPreviousNDays method
 32             int n = 0;
 33             year = Integer.parseInt(input.next());
 34             month = Integer.parseInt(input.next());
 35             day = Integer.parseInt(input.next());
 36 
 37             DateUtil date = new DateUtil(year, month, day);
 38 
 39             if (!date.checkInputValidity()) {
 40                 System.out.println("Wrong Format");
 41                 System.exit(0);
 42             }
 43 
 44             n = input.nextInt();
 45 
 46             if (n < 0) {
 47                 System.out.println("Wrong Format");
 48                 System.exit(0);
 49             }
 50             System.out.println(date.getPreviousNDays(n).showDate());
 51         } else if (choice == 3) {    //test getDaysofDates method
 52             year = Integer.parseInt(input.next());
 53             month = Integer.parseInt(input.next());
 54             day = Integer.parseInt(input.next());
 55 
 56             int anotherYear = Integer.parseInt(input.next());
 57             int anotherMonth = Integer.parseInt(input.next());
 58             int anotherDay = Integer.parseInt(input.next());
 59 
 60             DateUtil fromDate = new DateUtil(year, month, day);
 61             DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
 62 
 63             if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
 64                 System.out.println(fromDate.getDaysofDates(toDate));
 65             } else {
 66                 System.out.println("Wrong Format");
 67                 System.exit(0);
 68             }
 69         }
 70         else{
 71             System.out.println("Wrong Format");
 72             System.exit(0);
 73         }
 74     }
 75 public static class Day {
 76     int value;
 77     int mon_maxnum[]= new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};//数组储存各月份天数
 78     Month month = new Month();
 79     Day(){
 80 
 81     }
 82     Day(int yearValue,int monthValue,int dayValue){
 83         value = dayValue;
 84         month = new Month( yearValue, monthValue);
 85     }
 86 
 87     public void setValue(int value) {
 88         this.value = value;
 89     }
 90 
 91     public int getValue() {
 92         return value;
 93     }
 94 
 95     public Month getMonth() {
 96         return month;
 97     }
 98 
 99     public void setMonth(Month month) {
100         this.month = month;
101     }
102     public void resetMin(){
103         value = 1;
104     }
105     public void resetMax(){
106           if(month.year.isLeapYear()){
107             mon_maxnum[2]=29;
108         }else{
109               mon_maxnum[2]=28;
110           }
111         value = mon_maxnum[month.value];
112     }
113     boolean validate(){
114         if(value>mon_maxnum[month.value]||value<1){
115             return false;
116         }else{
117             return true;
118         }
119     }
120     public void dayIncrement(){
121         value++;
122     }
123     public void dayReduction(){
124         value--;
125     }
126 }
127 public static class Month {
128     int value;
129     Year year = new Year();
130     Month(){
131 
132     }
133     Month(int yearValue,int monthValue){
134              value = monthValue;
135              year.setValue(yearValue);
136     }
137 
138     public void setValue(int value) {
139         this.value = value;
140     }
141 
142     public int getValue() {
143         return value;
144     }
145 
146     public Year getYear() {
147         return year;
148     }
149 
150     public void setYear(Year year) {
151         this.year = year;
152     }
153     public void resetMin(){
154         value = 1;
155     }
156     public  void resetMax(){
157         value = 12;
158     }
159     boolean validate(){
160         if(value>12||value<1){
161             return false;
162         }else{
163             return true;
164         }
165     }
166     public void monthIncrement(){
167         value++;
168     }
169     public void montReduction(){
170         value--;
171     }
172 }
173 public static class Year {
174     int value;
175       Year(){
176 
177       }
178       Year(int value){
179           this.value = value;
180       }
181 
182     public int getValue() {
183         return value;
184     }
185 
186     public void setValue(int value) {
187         this.value = value;
188     }
189     boolean validate(){
190         if(value>2050||value<1900){
191             return false;
192         }else{
193             return true;
194         }
195     }
196     boolean isLeapYear(){
197         if((value%4==0&&value%100!=0)||value%400==0){
198             return true;
199         }
200         return false;
201     }
202     void yearIncrement(){
203           value++;
204     }
205     void yearReduction(){
206           value--;
207     }
208 }
209 public static class DateUtil {
210     Day day = new Day();
211     DateUtil(){
212 
213     }
214     DateUtil(int y,int m,int d){
215         day = new Day(y,m,d);
216     }
217 
218     public Day getDay() {
219         return day;
220     }
221 
222     public void setDay(Day day) {
223         this.day = day;
224     }
225     boolean checkInputValidity(){
226         if(day.month.year.isLeapYear()){
227             day.mon_maxnum[2]=29;
228         }
229         if(day.month.year.value<1900||day.month.year.value>2050||day.month.value<1||day.month.value>12||day.value<1||day.value>day.mon_maxnum[day.month.value]){
230             return false;
231         }
232         else{
233             return true;
234         }
235     }
236     boolean compareDates(DateUtil date){
237         if(this.day.month.year.value>date.day.month.year.value){
238             return true;
239         }else if(this.day.month.year.value==date.day.month.year.value){
240             if(this.day.month.value>date.day.month.value){
241                 return true;
242             }else if(this.day.month.value==date.day.month.value){
243                 if(this.day.value>date.day.value){
244                     return true;
245                 }else{
246                     return false;
247                 }
248             }
249         }else if(this.day.month.year.value<date.day.month.year.value){
250             return false;
251         }
252         return false;
253     }
254     boolean equalTwoDates(DateUtil date){
255         if(this.day.month.year.value==date.day.month.year.value&&this.day.month.value==date.day.month.value&&this.day.value==date.day.value){
256             return true;
257         }else{
258             return false;
259         }
260     }
261 
262     DateUtil getNextNDays(int n){
263         int i;
264         for(i=0;i<n;i++) {
265             if (day.month.year.isLeapYear()) {
266                 day.mon_maxnum[2] = 29;
267             } else {
268                 day.mon_maxnum[2] = 28;
269             }
270             if (day.value != day.mon_maxnum[day.month.value]) {
271                 day.dayIncrement();
272 
273             } else {
274                 if (day.month.value == 12) {
275                     day.month.resetMin();
276                     day.resetMin();
277                     day.month.year.yearIncrement();
278                 } else {
279                     day.resetMin();
280                     day.month.monthIncrement();
281                 }
282             }
283         }
284         return this;
285     }
286     DateUtil getPreviousNDays(int n){
287         int i;
288         for(i=0;i<n;i++){
289             if(day.month.year.isLeapYear()){
290                 day.mon_maxnum[2]=29;
291             }else{
292                 day.mon_maxnum[2]=28;
293             }
294             if(day.value!=1){
295                 day.dayReduction();//判断月份是否需要变化
296 
297             }else{
298                 if(day.month.value==1){//判断年份是否需要变化
299                     day.month.value=12;
300                     day.value=31;
301                     day.month.year.yearReduction();
302                 }else{
303                     day.month.montReduction();
304                     day.value = day.mon_maxnum[day.month.value];
305                 }
306             }
307         }
308         return this;
309     }
310     int getDaysofDates(DateUtil date){
311         int i,n=0;
312         int j=365,k=366;
313         if(this.compareDates(date)){//比较两个日期判断是否进行进行更换操作
314             if(this.day.month.year.value==date.day.month.year.value){
315                 if(day.month.year.isLeapYear()){
316                     day.mon_maxnum[2]=29;
317                 }else{
318                     day.mon_maxnum[2]=28;
319                 }
320                 for(i=date.day.month.value+1;i<this.day.month.value;i++){
321                     n=n+day.mon_maxnum[i];
322                 }
323                 n=n+day.mon_maxnum[date.day.month.value]-date.day.value+this.day.value;
324             }else{
325                 for(i=date.day.month.year.value+1;i<this.day.month.year.value;i++){
326                     Year flag = new Year(i);
327                     if(flag.isLeapYear()){
328                         n=n+k;
329                     }else{
330                         n=n+j;
331                     }
332                 }
333                 for(i=date.day.month.value+1;i<=12;i++){
334                     if(day.month.year.isLeapYear()){
335                         day.mon_maxnum[2]=29;
336                     }else{
337                         day.mon_maxnum[2]=28;
338                     }
339                     n=n+day.mon_maxnum[i];
340                 }
341                 for(i=1;i<this.day.month.value;i++){
342                     if(day.month.year.isLeapYear()){
343                         day.mon_maxnum[2]=29;
344                     }else{
345                         day.mon_maxnum[2]=28;
346                     }
347                     n=n+day.mon_maxnum[i];
348                 }
349                 n=n+day.mon_maxnum[date.day.month.value]-date.day.value+this.day.value;
350             }
351         }else{
352             int z,x,c;//中间变量更换日期
353             z=this.day.month.year.value;
354             x=this.day.month.value;
355             c=this.day.value;
356             this.day.month.year.value=date.day.month.year.value;
357             this.day.month.value=date.day.month.value;
358             this.day.value=date.day.value;
359             if(this.day.month.year.value==z){
360                 if(day.month.year.isLeapYear()){
361                     day.mon_maxnum[2]=29;
362                 }else{
363                     day.mon_maxnum[2]=28;
364                 }
365                 if(this.day.value==c){//判断是否日期相等
366                     n=0;
367                 }else {
368                     for(i=x+1;i<this.day.month.value;i++){
369                     n=n+day.mon_maxnum[i];
370                        }
371                   n=n+day.mon_maxnum[x]-c+this.day.value;
372                 }
373             }else{
374                 for(i=z+1;i<this.day.month.year.value;i++){
375                     Year flag = new Year(i);
376                     if(flag.isLeapYear()){
377                         n=n+k;
378                     }else{
379                         n=n+j;
380                     }
381                 }
382                 for(i=x+1;i<=12;i++){
383                     if(day.month.year.isLeapYear()){
384                         day.mon_maxnum[2]=29;
385                     }else{
386                         day.mon_maxnum[2]=28;
387                     }
388                     n=n+day.mon_maxnum[i];
389                 }
390                 for(i=1;i<this.day.month.value;i++){
391                     if(day.month.year.isLeapYear()){
392                         day.mon_maxnum[2]=29;
393                     }else{
394                         day.mon_maxnum[2]=28;
395                     }
396                     n=n+day.mon_maxnum[i];
397                 }
398                 n=n+day.mon_maxnum[x]-c+this.day.value;
399             }
400 
401         }
402         return n;
403     }
404     String showDate(){
405         String showDate;
406         showDate=day.month.year.value+"-"+day.month.value+"-"+day.value;
407         return showDate;
408     }
409 
410 }
411 }

 

题目集五7-6

这题与前面题目相差不多主要是按照题目要求的类图结构进行更改

 

我们对类图进行分析,我们发现这题与前面的题目相似的是:类之间的关系仍然是聚合,不一样的是:类聚合不在是一个类一个类的聚合而是别的类聚合一个主要菜单实现功能的类。

代码如下:

  1 import java.util.Scanner;
  2 public class Main {
  3     public static void main(String[] args) {
  4         Scanner input = new Scanner(System.in);
  5         int year = 0;
  6         int month = 0;
  7         int day = 0;
  8 
  9         int choice = input.nextInt();
 10 
 11         if (choice == 1) { // test getNextNDays method
 12             int m = 0;
 13             year = Integer.parseInt(input.next());
 14             month = Integer.parseInt(input.next());
 15             day = Integer.parseInt(input.next());
 16 
 17             DateUtil date = new DateUtil(year, month, day);
 18 
 19             if (!date.checkInputValidity()) {
 20                 System.out.println("Wrong Format");
 21                 System.exit(0);
 22             }
 23 
 24             m = input.nextInt();
 25 
 26             if (m < 0) {
 27                 System.out.println("Wrong Format");
 28                 System.exit(0);
 29             }
 30 
 31             System.out.print(date.year.value + "-" + date.month.value + "-" + date.day.value + " next " + m + " days is:");
 32             System.out.println(date.getNextNDays(m).showDate());
 33         } else if (choice == 2) { // test getPreviousNDays method
 34             int n = 0;
 35             year = Integer.parseInt(input.next());
 36             month = Integer.parseInt(input.next());
 37             day = Integer.parseInt(input.next());
 38 
 39             DateUtil date = new DateUtil(year, month, day);
 40 
 41             if (!date.checkInputValidity()) {
 42                 System.out.println("Wrong Format");
 43                 System.exit(0);
 44             }
 45 
 46             n = input.nextInt();
 47 
 48             if (n < 0) {
 49                 System.out.println("Wrong Format");
 50                 System.exit(0);
 51             }
 52 
 53             System.out.print(
 54                     date.year.value + "-" + date.month.value + "-" + date.day.value + " previous " + n + " days is:");
 55             System.out.println(date.getPreviousNDays(n).showDate());
 56         } else if (choice == 3) {    //test getDaysofDates method
 57             year = Integer.parseInt(input.next());
 58             month = Integer.parseInt(input.next());
 59             day = Integer.parseInt(input.next());
 60 
 61             int anotherYear = Integer.parseInt(input.next());
 62             int anotherMonth = Integer.parseInt(input.next());
 63             int anotherDay = Integer.parseInt(input.next());
 64 
 65             DateUtil fromDate = new DateUtil(year, month, day);
 66             DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
 67 
 68             if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
 69                 System.out.println("The days between " + fromDate.showDate() +
 70                         " and " + toDate.showDate() + " are:"
 71                         + fromDate.getDaysofDates(toDate));
 72             } else {
 73                 System.out.println("Wrong Format");
 74                 System.exit(0);
 75             }
 76         }
 77         else{
 78             System.out.println("Wrong Format");
 79             System.exit(0);
 80         }
 81     }
 82     public static class Day {
 83     Day(){
 84 
 85     }
 86     Day(int value){
 87 
 88     }
 89     int value;
 90 
 91     public void setValue(int value) {
 92         this.value = value;
 93     }
 94 
 95     public int getValue() {
 96         return value;
 97     }
 98     void dayIncrement(){
 99         value++;
100     }
101     void dayReduction(){
102         value--;
103     }
104 }
105 public static class Year {
106         int value;
107         Year(){
108 
109         }
110         Year(int value){
111             this.value = value;
112         }
113 
114         public int getValue() {
115             return value;
116         }
117 
118         public void setValue(int value) {
119             this.value = value;
120         }
121         boolean validate(){
122             if(value>2020||value<1820){
123                 return false;
124             }else{
125                 return true;
126             }
127         }
128         boolean isLeapYear(){
129             if((value%4==0&&value%100!=0)||value%400==0){
130                 return true;
131             }
132             return false;
133         }
134         void yearIncrement(){
135             value++;
136         }
137         void yearReduction(){
138             value--;
139         }
140     }
141     public static class Month {
142       Month(){
143 
144       }
145       Month(int value){
146           this.value = value;
147       }
148       int value;
149 
150     public int getValue() {
151         return value;
152     }
153 
154     public void setValue(int value) {
155         this.value = value;
156     }
157     boolean validate(){
158         if(value>12||value<1){
159             return false;
160         }else{
161             return true;
162         }
163     }
164     public void monthIncrement(){
165         value++;
166     }
167     public void montReduction(){
168         value--;
169     }
170     public void resetMin(){
171         value = 1;
172     }
173     public  void resetMax(){
174         value = 12;
175     }
176 }
177 public static class DateUtil {
178      Day day = new Day();
179      Month month = new Month();
180      Year year = new Year();
181     int mon_maxnum[]= new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};//数组储存各月份天数
182     DateUtil(){
183 
184     }
185     DateUtil(int y, int m,int d){
186         this.day.value = d;
187         this.month.value = m;
188         this.year.value = y;
189     }
190 
191     public Year getYear() {
192         return year;
193     }
194 
195     public void setYear(Year year) {
196         this.year = year;
197     }
198 
199     public Month getMonth() {
200         return month;
201     }
202 
203     public void setMonth(Month month) {
204         this.month = month;
205     }
206 
207     public Day getDay() {
208         return day;
209     }
210 
211     public void setDay(Day day) {
212         this.day = day;
213     }
214     public void setDayMin(){
215         day.value = 1;
216     }
217     public  void setDayMax(){
218         if(year.isLeapYear()){
219             mon_maxnum[2] = 29;
220         }else{
221             mon_maxnum[2] = 28;
222         }
223         day.value = mon_maxnum[month.value];
224     }
225     public boolean checkInputValidity(){
226         if(year.isLeapYear()){
227             mon_maxnum[2] = 29;
228         }else{
229             mon_maxnum[2] = 28;
230         }
231         if(year.validate()&&month.validate()&&day.value>=1&&day.value<=mon_maxnum[month.value]){
232             return true;
233         }else {
234             return false;
235         }
236     }
237     DateUtil getNextNDays(int n){
238         int i;
239         for(i=0;i<n;i++) {
240             if (year.isLeapYear()) {
241                 mon_maxnum[2] = 29;
242             } else {
243                 mon_maxnum[2] = 28;
244             }
245             if (day.value != mon_maxnum[month.value]) {
246                 day.dayIncrement();
247 
248             } else {
249                 if (month.value == 12) {
250                     month.resetMin();
251                     setDayMin();
252                     year.yearIncrement();
253                 } else {
254                     setDayMin();
255                     month.monthIncrement();
256                 }
257             }
258         }
259         return this;
260     }
261     DateUtil getPreviousNDays(int n){
262         int i;
263         for(i=0;i<n;i++){
264             if(year.isLeapYear()){
265                 mon_maxnum[2]=29;
266             }else{
267                 mon_maxnum[2]=28;
268             }
269             if(day.value!=1){
270                 day.dayReduction();
271 
272             }else{
273                 if(month.value==1){
274                     month.value=12;
275                     day.value=31;
276                     year.yearReduction();
277                 }else{
278                     month.montReduction();
279                     day.value = mon_maxnum[month.value];
280                 }
281             }
282         }
283         return this;
284     }
285     boolean compareDates(DateUtil date) {
286         if (this.year.value > date.year.value)
287             return true;
288         else if (this.year.value == date.year.value) {
289             if (this.month.value > date.month.value)
290                 return true;
291             else if (this.month.value == date.month.value) {
292                 if (this.day.value > date.day.value)
293                     return true;
294                 else
295                     return false;
296             }
297         } else if (this.year.value < date.year.value)
298             return false;
299         return false;
300     }
301     boolean equalTwoDates(DateUtil date){
302         if(this.year.value==date.year.value&&this.month.value==date.month.value&&this.day.value==date.day.value){
303             return true;
304         }else{
305             return false;
306         }
307     }
308     int getDaysofDates(DateUtil date){
309         int i,n=0;
310         int j=365,k=366;
311         if(this.compareDates(date)){//比较两个日期判断是否进行进行更换操作
312             if(this.year.value==date.year.value){
313                 if(this.year.isLeapYear()){
314                     mon_maxnum[2]=29;
315                 }else{
316                     mon_maxnum[2]=28;
317                 }
318                 for(i=date.month.value+1;i<this.month.value;i++){
319                     n=n+mon_maxnum[i];
320                 }
321                 n=n+mon_maxnum[date.month.value]-date.day.value+this.day.value;
322             }else{
323                 for(i=date.year.value+1;i<this.year.value;i++){
324                     Year flag = new Year(i);
325                     if(flag.isLeapYear()){
326                         n=n+k;
327                     }else{
328                         n=n+j;
329                     }
330                 }
331                 for(i=date.month.value+1;i<=12;i++){
332                     if(year.isLeapYear()){
333                         mon_maxnum[2]=29;
334                     }else{
335                         mon_maxnum[2]=28;
336                     }
337                     n=n+mon_maxnum[i];
338                 }
339                 for(i=1;i<this.month.value;i++){
340                     if(year.isLeapYear()){
341                         mon_maxnum[2]=29;
342                     }else{
343                         mon_maxnum[2]=28;
344                     }
345                     n=n+mon_maxnum[i];
346                 }
347                 n=n+mon_maxnum[date.month.value]-date.day.value+this.day.value;
348             }
349         }else{
350             int z,x,c;//中间变量更换日期
351             z=this.year.value;
352             x=this.month.value;
353             c=this.day.value;
354             this.year.value=date.year.value;
355             this.month.value=date.month.value;
356             this.day.value=date.day.value;
357             if(this.year.value==z){
358                 if(year.isLeapYear()){
359                     mon_maxnum[2]=29;
360                 }else{
361                     mon_maxnum[2]=28;
362                 }
363                 if(this.day.value==c){//判断是否日期相等
364                     n=0;
365                 }else {
366                     for(i=x+1;i<this.month.value;i++){
367                         n=n+mon_maxnum[i];
368                     }
369                     n=n+mon_maxnum[x]-c+this.day.value;
370                 }
371             }else{
372                 for(i=z+1;i<this.year.value;i++){
373                     Year flag = new Year(i);
374                     if(flag.isLeapYear()){
375                         n=n+k;
376                     }else{
377                         n=n+j;
378                     }
379                 }
380                 for(i=x+1;i<=12;i++){
381                     if(year.isLeapYear()){
382                         mon_maxnum[2]=29;
383                     }else{
384                         mon_maxnum[2]=28;
385                     }
386                     n=n+mon_maxnum[i];
387                 }
388                 for(i=1;i<this.month.value;i++){
389                     if(year.isLeapYear()){
390                         mon_maxnum[2]=29;
391                     }else{
392                         mon_maxnum[2]=28;
393                     }
394                     n=n+mon_maxnum[i];
395                 }
396                 n=n+mon_maxnum[x]-c+this.day.value;
397             }
398 
399         }
400         return n;
401     }
402     String showDate(){
403         String showDate;
404         showDate=year.value+"-"+month.value+"-"+day.value;
405         return showDate;
406     }
407 }
408 }

题目集六 7-1

  此题与前面的题目集四7-1的大体相同,但是加入了带点菜功能,特色菜和各种异常情况处理,所以这道题是及其复杂的,但是我们首先明白一个程序的运行离不开的是输入,进行运行,输出。所以我们一步一步慢慢来就行。

  首先我们对题目进行分析我们发现这个题目的输入方式为直到输入end才会结束,所以显而易见的我们这里要用一个循环输入,且要判断输入end的时候结束循环,所以我们要以end为标识符作为首要判断,根据题目的空格输入我们就应该明白这里我们要使用split方法,进行去空格产生字符数组,根据数组的大小内容进行判断进行相应方法。

  代码如下:

  while (true){
        String s1 = input.nextLine();
        s = s1.split(" ");
            if(s1.equals("end")){
                break;
              }
            flag = s.length;
            if(flag == 2){
                if(s[1].equals("delete")){
                    a1 = Integer.parseInt(s[0]);
                    if (table[a4].order.findRecordByNum(a1)!=null) {
                        if(table[a4].order.findRecordByNum(a1).portion != 0) {
                            a6 = table[a4].order.findRecordByNum(a1).getPrice();
                            table[a4].order.findRecordByNum(a1).portion = 0;
                            if(table[a4].order.findRecordByNum(a1).d.flag!=0) {
                                table[a4].sum = table[a4].sum - a6;
                                table[a4].order.findRecordByNum(a1).portion = 0;
                            }else {
                                float h = a6*0.7f;
                                table[a4].sum = table[a4].sum - Math.round(h);
                            }
                        }else {
                            System.out.println("deduplication "+a1);
                        }

                    }else {
                        System.out.println("delete error");
                    }
                }else{
                    if(table[a4] == null) {
                        dishName = s[0];
                        if( s[1].matches(ruller)) {
                            a1 = Integer.parseInt(s[1]);
                            menu.dishs[a5] = menu.addDish(dishName, a1);
                            a5++;
                        }else {
                            System.out.println("wrong format");
                        }
                    }else {
                        System.out.println("invalid dish");
                    }
                }
            }
            else if (flag == 3){
                 if(s[2].equals("T")){
                     dishName = s[0];
                     a1 = Integer.parseInt(s[1]);
                     menu.dishs[a5] = menu.addDish(dishName,a1);
                     menu.dishs[a5].flag = 0;
                     a5++;
                 }
            } else if (flag == 4) {
                if(s[0].equals("table")){
                   if( s[1].matches(ruller)) {
                       a4 = Integer.parseInt(s[1]);
                       if(a4<=55&&a4>=1) {
                           table[a4] = new Table(a4);
                           table[a4].Doing(s[2], s[3]);
                           if (table[a4].checkTime()) {
                               System.out.println("table" + " " + table[a4].tableNum + ":" + " ");
                           } else {
                               System.out.println(a4 + " date error");
                           }
                       }else {
                           System.out.println(s[1]+" table num out of range");
                       }
                   }else {
                       System.out.println("wrong format");
                   }
                }else {
                    a1 = Integer.parseInt(s[0]);
                    dishName = s[1];
                    a2 = Integer.parseInt(s[2]);
                    a3 = Integer.parseInt(s[3]);
                    if (table[a4] != null) {
                        if (a2 >= 1 && a2 <= 3 && a3 > 0 && a3 <= 15) {
                            Dish otherDish = menu.searthDish(dishName);
                            if (otherDish != null) {
                                table[a4].order.addARecord(a1, dishName, a2, a3);
                                table[a4].order.findRecordByNum(a1).d = otherDish;
                                a7 = table[a4].order.findRecordByNum(a1).getPrice();
                                if (table[a4].order.findRecordByNum(a1).d.flag == -1) {
                                    float k = a7 * table[a4].discount;
                                    int  t = Math.round(k);
                                    table[a4].sum += t;
                                } else {
                                    if (table[a4].week <= 5 && table[a4].week >= 1) {
                                       float v = a7 * 0.7f;
                                        table[a4].sum += Math.round(v);
                                    } else if (table[a4].week == 6 || table[a4].week == 7) {
                                        table[a4].sum += a7;
                                    }
                                }
                                System.out.println(a1 + " " + dishName + " " + table[a4].order.findRecordByNum(a1).getPrice());
                            } else {

                            }
                        } else if (a2 < 1 || a2 > 3 && a3 > 0 && a3 <= 15) {
                            System.out.println(a1 + " portion out of range " + a2);
                        } else if (a3 < 0 || a3 > 15) {
                            System.out.println(a1 + " num out of range " + a3);
                        }
                    }else {

                    }
                }
            } else if (flag ==5) {
                
            }else {
                System.out.println("wrong format");
            }
        }

我们对输入数据进行判断后我们应该要进行对主要方法的实现,所以我们要开始对其他类的设计,如dish,tabale等类

我们首先判断类与类之间的关系,我们可以知道各个类之间的关系为依赖,所以可以开始对各个类进行实现,代码如下

  

  1 class Dish {
  2  String name = " " ;//菜品名称
  3 
  4      int unit_price = 0; //单价
  5      int flag = -1;
  6      int portion;
  7     Dish(){
  8 
  9     }
 10     Dish(String name,int unit_price){
 11         this.name = name;
 12         this.unit_price = unit_price;
 13     }
 14     int getPrice(int portion){
 15         int p2 = 0;
 16         if(portion == 1){
 17             p2 = this.unit_price;
 18         }else if (portion == 2){
 19             float p1  = (float) (this.unit_price * 1.5);
 20             p2 = Math.round(p1);
 21         }else if (portion == 3){
 22            float p1  = this.unit_price * 2;
 23            p2 = Math.round(p1);
 24         }else {
 25 
 26         }
 27         return  p2;
 28     }//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
 29 
 30     public void setName(String name) {
 31         this.name = name;
 32     }
 33 
 34     public String getName() {
 35         return name;
 36     }
 37 
 38     public int getUnit_price() {
 39         return unit_price;
 40     }
 41 
 42     public void setUnit_price(int unit_price) {
 43         this.unit_price = unit_price;
 44     }
 45 }
 46 class Menu {
 47     Dish[] dishs = new Dish[10];//菜品数组,保存所有菜品信息
 48     int count = 0;
 49     Dish searthDish(String dishName){
 50         Dish temd = null;
 51         for(int i=count-1;i>=0;i--){
 52             if(dishName.equals(dishs[i].name)){
 53                 temd = dishs[i];
 54                 break;
 55             }
 56         }
 57         if(temd==null){
 58             System.out.println(dishName+" does not exist");
 59         }
 60         return temd;
 61     }//根据菜名在菜谱中查找菜品信息,返回Dish对象。
 62     Dish addDish(String dishName,int unit_price){
 63         Dish dh = new Dish();
 64         dh.name = dishName;
 65         dh.unit_price = unit_price;
 66         count++;
 67         return dh;
 68     }//添加一道菜品信息
 69 }
 70 class Record {
 71     int orderNum;//序号
 72     int Num = 1;//份额
 73     Dish d = new Dish();//菜品\\
 74     int portion = 0;//份额(1/2/3代表小/中/大份)
 75     Record(){
 76 
 77     }
 78     Record(int orderNum,int num,int portion){
 79 
 80         this.orderNum = orderNum;
 81         this.Num = num;
 82         this.portion = portion;
 83     }
 84 
 85 
 86 
 87     int getPrice(){
 88       return   d.getPrice(portion)*Num;
 89     }//计价,计算本条记录的价格
 90 
 91     public Dish getD() {
 92         return d;
 93     }
 94 
 95     public int getNum() {
 96         return Num;
 97     }
 98 
 99     public int getOrderNum() {
100         return orderNum;
101     }
102 
103     public int getPortion() {
104         return portion;
105     }
106 
107     public void setD(Dish d) {
108         d = new Dish();
109         this.d = d;
110     }
111 
112     public void setNum(int num) {
113         Num = num;
114     }
115 
116     public void setOrderNum(int orderNum) {
117         this.orderNum = orderNum;
118     }
119 
120     public void setPortion(int portion) {
121         this.portion = portion;
122     }
123 
124 }
125 class Table {
126     int mon_maxnum[]= new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};//数组储存各月份天数
127     Table(){
128 
129     }
130     Table(int tableNum){
131         this.tableNum = tableNum;
132     }
133     Table(Order order){
134         this.order = order;
135     }
136     Order order = new Order();
137     String time;
138     int week;
139     int hour,minute,second,year,month,day;
140     float discount = -1;
141     int sum = 0;
142     int tableNum = -1;
143     //处理时间
144     public  void processTime(String time1,String time2){
145         DateTimeFormatter JEFormatter = DateTimeFormatter.ofPattern("yyyy/M/d");
146         LocalDate l1 = LocalDate.parse(time1,JEFormatter);
147         week = l1.getDayOfWeek().getValue();
148         String[] time3 = time2.split("/");
149         hour = Integer.parseInt(time3[0]);
150         minute = Integer.parseInt(time3[1]);
151         second = Integer.parseInt(time3[2]);
152         String[] time4 = time1.split("/");
153         year = Integer.parseInt(time4[0]);
154         month = Integer.parseInt(time4[1]);
155         day = Integer.parseInt(time4[2]);
156     }
157     public void setDiscount(){
158         if(week<=5&&week>=1){
159             if(hour>=17&&hour<20)
160                 discount=0.8F;
161             else if(hour==20&&minute<30)
162                 discount=0.8F;
163             else if(hour==20&&minute==30&&second==0)
164                 discount=0.8F;
165             else if(hour>=11&&hour<=13||hour==10&&minute>=30)
166                 discount=0.6F;
167             else if(hour==14&&minute<30)
168                 discount=0.6F;
169             else if(hour==14&&minute==30&&second==0)
170                 discount=0.6F;
171         }else{
172             if(hour>=10&&hour<=20)
173                 discount= 1.0F;
174             else if(hour==9&&minute>=30)
175                 discount= 1.0F;
176             else if(hour==21&&minute<30||hour==21&&minute==30&&second==0)
177                 discount= 1.0F;
178         }
179     }
180         public int getMoney(){
181         return Math.round(sum * discount);
182     }
183     public void Doing(String time1,String time2){
184         processTime(time1,time2);
185         setDiscount();
186 
187     }
188 
189     public void setTableNum(int tableNum) {
190         this.tableNum = tableNum;
191     }
192 
193     public void setOrder(Order order) {
194         this.order = order;
195     }
196 
197     public Order getOrder() {
198         return order;
199     }
200     public void setSum(){
201         sum = this.order.getTotalPrice();
202     }
203     void Gettottalprice(){
204         if(discount>0){
205             System.out.println("table " + tableNum + ": " + this.order.getTotalPrice()+" "+ sum);
206         }else {
207             System.out.println("table " + tableNum + " out of opening hours");
208         }
209     }
210     boolean checkTime(){
211         if(year<1000||month<1||month>12||day<0||day>mon_maxnum[month]||hour<1||hour>24||minute<0||minute>60||second<0||second>60){
212             return  false;
213         }else {
214             return true;
215         }
216     }
217     boolean checkTimeRange(){
218         if(year<2022||year>2023){
219             return false;
220         }else {
221             return true;
222         }
223     }
224     public int getWeek() {
225         return week;
226     }
227 }
228 class Order {
229     private List<Record> records = new ArrayList<>(); //保存订单上每一道的记录
230     int totalPrice;
231     int tableNum;
232     Menu menu = new Menu();
233     int getTotalPrice(){
234         for(Record record : records){
235             totalPrice = record.getPrice()+totalPrice;
236         }
237         return totalPrice;
238     }//计算订单的总价
239 
240     Record addARecord(int orderNum,String dishName,int portion,int num){
241           Record record = new Record(orderNum,num,portion);
242           record.d.setName(dishName);
243           records.add(record);
244           return  record;
245     }//添加一条菜品信息到订单中。
246 
247     void  delARecordByOrderNum(int orderNum){
248           for(Record record : records){
249               if(record.getOrderNum() == orderNum){
250                   records.remove(record);
251               }
252           }
253     }//根据序号删除一条记录
254 
255     Record   findRecordByNum(int orderNum){
256        for(Record record : records){
257            if(record.getOrderNum() == orderNum){
258                return record;
259            }
260        }
261        return  null;
262    }//根据序号查找一条记录
263 
264     public int getTableNum() {
265         return tableNum;
266     }
267 
268     public void setRecords(ArrayList<Record> records) {
269         this.records = records;
270     }
271 
272     public void setTableNum(int tableNum) {
273         this.tableNum = tableNum;
274     }
275 
276     public List<Record> getRecords() {
277         return  records;
278     }
279 
280     public void setMenu(Menu menu) {
281         this.menu = menu;
282     }

在各个类中我设置了各个类数组,有用Arreylist数组可以简单的实现添加删除功能,以及对输入的时间处理时用的时间类LocalDate处理得到星期数,对时间的处理,和对价格的具体处理则这里不进行赘述请观察代码。

最后我们对题目在进一步深入剖解,发现我们这道题可以一个个输出,及每输入一个内容就输出一个结果,因为每个部分正好切合,感觉是出题老师的降低难度,不然应该是保存每一个输入再进行输出,这里由于我想着简单点所以就使用一个个输出,代码请观察上面的循环输入代码。

这题的算法并不难,主要考察的是我们对题目的剖析能力,能不能理解题目的意思以及考虑全面,对各个情况的分析,这道题由于自己过于放松导致时间不足只拿到了36分,并没有实现带点菜功能和部分异常情况使得我有点后悔,因为在后面看来这道题目的难度真的不是做不出来的地步,主要是自己不愿意花时间不说满分,但是80分肯定是可以拿到的。

三 踩坑心得

  这里对题目集五的7-5和7-6题不进行说明,因为主要是对类结构的更改,并没有出现错误。

  题目集六7-1:

   1 出现空指针的情况:

     

 

 

 进行相关错误查找发现是在设置menu类的数组时发现menu类中的dish数组有时并没有设置,即为空,这里我就把使用arrylist数组改为使用正常数组

更改前:

 1  public static class Menu {
 2         private ArrayList<Dish> dishs = new ArrayList<>();//菜品数组,保存所有菜品信息
 3 
 4         Dish searthDish(String dishName){
 5             for(Dish dish : dishs){
 6                 if(dish.getName() == dishName){
 7                     return dish;
 8                 }
 9             }
10             return null;
11         }//根据菜名在菜谱中查找菜品信息,返回Dish对象。
12 
13         Dish addDish(String dishName,int unit_price){
14             for(Dish dish : dishs){
15                 if(dish.getName() == dishName){
16                     dish.setUnit_price(unit_price);
17                 }
18                 return dish;
19             }
20             Dish dish = new Dish(dishName,unit_price);
21             dishs.add(dish);
22             return dish;
23         }//添加一道菜品信息
24     }

   更改后:

 

 1 class Menu {
 2     Dish[] dishs = new Dish[10];//菜品数组,保存所有菜品信息
 3     int count = 0;
 4     Dish searthDish(String dishName){
 5         Dish temd = null;
 6         for(int i=count-1;i>=0;i--){
 7             if(dishName.equals(dishs[i].name)){
 8                 temd = dishs[i];
 9                 break;
10             }
11         }
12         if(temd==null){
13             System.out.println(dishName+" does not exist");
14         }
15         return temd;
16     }//根据菜名在菜谱中查找菜品信息,返回Dish对象。
17     Dish addDish(String dishName,int unit_price){
18         Dish dh = new Dish();
19         dh.name = dishName;
20         dh.unit_price = unit_price;
21         count++;
22         return dh;
23     }//添加一道菜品信息
24 }

 

   2 计算的算法出现错误

  经过测试计算每个桌的价格都是错的,对代码查看,发现是我在得出价格的方法里直接乘以了折扣,但是特色菜的折扣不一样,所以应该在循环中进行折扣的计算而不是在table类里直接乘以折扣

   更改前的价格计算:

1     void Gettottalprice(){
2         if(discount>0){
3             System.out.println("table " + tableNum + ": " + this.order.getTotalPrice()+" "+ Math.round(sum*discount));
4         }else {
5             System.out.println("table " + tableNum + " out of opening hours");
6         }
7     }

         更改后的价格计算:

 1   if (a2 >= 1 && a2 <= 3 && a3 > 0 && a3 <= 15) {
 2                             Dish otherDish = menu.searthDish(dishName);
 3                             if (otherDish != null) {
 4                                 table[a4].order.addARecord(a1, dishName, a2, a3);
 5                                 table[a4].order.findRecordByNum(a1).d = otherDish;
 6                                 a7 = table[a4].order.findRecordByNum(a1).getPrice();
 7                                 if (table[a4].order.findRecordByNum(a1).d.flag == -1) {
 8                                     float k = a7 * table[a4].discount;
 9                                     int  t = Math.round(k);
10                                     table[a4].sum += t;
11                                 } else {
12                                     if (table[a4].week <= 5 && table[a4].week >= 1) {
13                                        float v = a7 * 0.7f;
14                                         table[a4].sum += Math.round(v);
15                                     } else if (table[a4].week == 6 || table[a4].week == 7) {
16                                         table[a4].sum += a7;
17                                     }
18                                 }

四 改进建议

   对于题目集五的两道题,我的算法过于简单导致代码行数冗杂,可以对算法部分进行更改使代码量减少。对于题目集六的这道题,我的主函数里的代码过多,应该使用MVC模式进行更改使主函数里不这么复杂,且应该使用存储输入的方式进行输出,这样更加高效且错误率低。

五 总结

  对于本三次题目集,我学会了对正则表达式的使用,学会了对类结构进一步认识,对聚合的使用。最重要的是体会到了不要对一道看起来难的题目放弃,只要逐渐剖析付出时间这道难题也会解决,在日后的学习中我要不能这么容易退缩,对于题目要多付出时间,来解决相应问题。