关于PTA第二次大作业的总结

Posted wwkblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于PTA第二次大作业的总结相关的知识,希望对你有一定的参考价值。

 

一.前言

这一次的作业,总体来说是有一定难度的,主要考察了类与对象的关系,java封装的技术特性,字符串的使用和正则表达式的使用等,还有java类的设计原则,题量比之前的作业减少了,但是难度在慢慢上升。特别是习题六,代码的数量上来了,关于类的设计就要谨慎。

二.设计与分析

7-1 菜单计价程序-3
分数 30
作者 蔡轲
单位 南昌航空大学

设计点菜计价程序,根据输入的信息,计算并输出总价格。

输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。

菜单由一条或多条菜品记录组成,每条记录一行

每条菜品记录包含:菜名、基础价格 两个信息。

订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。

桌号标识独占一行,包含两个信息:桌号、时间。

桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。

点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。

不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。

删除记录格式:序号 delete

标识删除对应序号的那条点菜记录。

如果序号不对,输出"delete error"

代点菜信息包含:桌号 序号 菜品名称 份额 分数

代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。

程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。

每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。

折扣的计算方法(注:以下时间段均按闭区间计算):

周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。

周末全价,营业时间:9:30-21:30

如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"

参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。

Dish

String name;//菜品名称

int unit_price; //单价

int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。

Menu

Dish\\[\\] dishs ;//菜品数组,保存所有菜品信息

Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。

Dish addDish(String dishName,int unit_price)//添加一道菜品信息

点菜记录类:保存订单上的一道菜品记录

Record

int orderNum;//序号\\\\

Dish d;//菜品\\\\

int portion;//份额(1/2/3代表小/中/大份)\\\\

int getPrice()//计价,计算本条记录的价格\\\\

订单类:保存用户点的所有菜的信息。

Order

Record\\[\\] records;//保存订单上每一道的记录

int getTotalPrice()//计算订单的总价

Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。

delARecordByOrderNum(int orderNum)//根据序号删除一条记录

findRecordByNum(int orderNum)//根据序号查找一条记录

### 输入格式:

桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)

菜品记录格式:

菜名+英文空格+基础价格

如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。

点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。

删除记录格式:序号 +英文空格+delete

代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数

最后一条记录以“end”结束。

### 输出格式:

按输入顺序输出每一桌的订单记录处理信息,包括:

1、桌号,格式:table+英文空格+桌号+”:”

2、按顺序输出当前这一桌每条订单记录的处理信息,

每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\\*\\* does not exist”,\\*\\*是不能识别的菜名

如果删除记录的序号不存在,则输出“delete error”

最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价

本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。

输入格式:

桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)

菜品记录格式:

菜名+英文空格+基础价格

如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。

点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。

删除记录格式:序号 +英文空格+delete

代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数

最后一条记录以“end”结束。

输出格式:

按输入顺序输出每一桌的订单记录处理信息,包括:

1、桌号,格式:table+英文空格+桌号+“:”

2、按顺序输出当前这一桌每条订单记录的处理信息,

每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\\*\\* does not exist”,\\*\\*是不能识别的菜名

如果删除记录的序号不存在,则输出“delete error”

最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价

本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。

输入样例:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 12/2/3
1 麻婆豆腐 2 2
2 油淋生菜 1 3
end
 

输出样例:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 38
 

输入样例1:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 17/0/0
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
 

输出样例1:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 22
 

输入样例2:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 16/59/59
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
 

输出样例2:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1 out of opening hours
 

输入样例3:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2022/12/5 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
5 delete
7 delete
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
7 delete
end
 

输出样例3:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete error;
table 2: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
table 1 out of opening hours
table 2: 63
 

输入样例4:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2022/12/3 19/5/12
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
1 4 麻婆豆腐 1 1
7 delete
end
 

输出样例4:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
table 2: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
4 table 2 pay for table 1 12
delete error;
table 1: 63
table 2: 75

刚开始看这道题目的时候,我是没什么头绪的,我是最后才来做这道题的。源码如下:
 import java.util.*;
 
 public class Main   
     public static void main (String[] args)
 //         Scanner input = new Scanner(System.in);
 //         int i = 0;
 //         Dish dish[] = new Dish();
 //        do
 //            dish[i].name = input.next();
 //            dish[i].unit_price = input.nextInt();
 //        
         
     
 
 class Dish 
     String name;//菜品名称
     int unit_price;//单价
    
     Dish()
         
     
     Dish(String name,int unit_price)
         this.name = name;
         this.unit_price = unit_price;
     
     
     public int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
         if(portion == 1)
             return unit_price*1;
         if(portion == 2)
             return unit_price*1.5;
         if(portion == 3)
             return unit_price*2;
     
 
 class Menu
     Dish[] dishs;//菜品数组,保存所有菜品信息
     
     public  Dish searchDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
         for(int i = 0;i < dishs.length;i++)
             if(dishs[i].equals(dishName))
                 return dishs[i];
             
         
     
     public Dish addDish(String dishName,int unit_price)//添加一道菜品信息
        // dishs[dishs.length] = new Dish(dishName,unit_price);
     
     
 
 class Record
     int orderNum;//序号
     Dish d;//菜品
     int portion;//份额(1/2/3代表小/中/大份)
     
     Record()
         
     
     //Record(int orderNum,String dishName,int portion,int portion
       //  this.orderNUm = orderNum;
 //         d.dishName = dishName;
 // //         d.portion
     //
 
     
     public int getPrice()//计价,计算本条记录的价格\\\\
        int result ;
        if(portion == 1)
            result = d.unit_price*1;
        
        if(portion == 2)
            result =(int) ( d.unit_price*1.5);
        if(portion == 3)
            result = d.unit_price*2;
     
 
 // class Order
 //     Record[] records;//保存订单上每一道的记录
     
 //     int getTotalPrice()//计算订单的总价
 //         int sum = 0;
 //         for(i = 0; i < records.length;i++)
 //             sum += records[i].getPrice();
 //         
 //     
 //     Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息
 //         this.orderNum = orderNum;
 //         d.dishName = dishName;
 //         d.portion = portion;
 //         this.num = num;
 //     
 //     delARecordByOrderNum(int orderNum)//根据序号删除一条记录
 //         Record[num] = 
 //     
 //     findRecordByNUm(int orderNum)////根据序号查找一条记录
        
 //     
 // 
可以看到笔者的代码还不完整,还有一些功能没有完善,仅仅只有一些框架,按照题目意思:menu类里有dish对象,order里有record对象。这些类之间为依赖关系,测试如下:
可以看到只得了一分。

                                                                       

       后面就不知道怎么做了,总在纠结要不要用二维数组来存储输入的信息,然后后面的具体方法的实现就没怎么写,最够也没写出这道题。

生成的类图如下:

 

 

7-5 日期问题面向对象设计(聚合一)
分数 50
作者 段喜龙
单位 南昌航空大学

参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

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

  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

源码如下:
 import java.util.Scanner;
 
 public class Main 
     public static void main(String[] args) 
         Scanner input = new Scanner(System.in);
         String str = input.nextLine();
         String[] str1 = str.split(" ");
         switch(str1[0])
             case "1":
                 int y = Integer.valueOf(str1[1]);
                 int m = Integer.valueOf(str1[2]);
                 int d = Integer.valueOf(str1[3]);
                 int n = Integer.valueOf(str1[4]);
                 DateUtil date = new DateUtil(d,m,y);
                 if(date.checkInputValidity())
                     System.out.println(date.getNextNDays(n).showDate());
                 else
                     System.out.println("Wrong Format");
             break;
             case "2":
                 int y = Integer.valueOf(str1[1]);
                 int m = Integer.valueOf(str1[2]);
                 int d = Integer.valueOf(str1[3]);
                 int n = Integer.valueOf(str1[4]);
                 DateUtil date = new DateUtil(d,m,y);
                 if(date.checkInputValidity())
                     System.out.println(date.getPreviousNDays(n).showDate());
                 else
                     System.out.println("Wrong Format");
             break;
             case "3":
                 int y1 = Integer.valueOf(str1[1]);
                 int m1 = Integer.valueOf(str1[2]);
                 int d1 = Integer.valueOf(str1[3]);
                 int y2 = Integer.valueOf(str1[4]);
                 int m2 = Integer.valueOf(str1[5]);
                 int d2 = Integer.valueOf(str1[6]);
                 DateUtil date1 = new DateUtil(d1,m1,y1);
                 DateUtil date2 = new DateUtil(d2,m2,y2);
                 int n = date1.getDaysofDates(date2);
                 System.out.println(n);
                 
             break;
             default:
                 
             
         //switch
     
 
 class DateUtil
     private Day day = new Day();
     
     
     DateUtil()
         
     
     DateUtil(int d, int m, int y)
         day.setValue(d);
         day.getMonth().setValue(m);
         day.getMonth().getYear().setValue(y);
     
     
     
     public Day getDay()
         return day;
     
     public void setDay(Day d)
         this.day = d;
     
     public boolean checkInputValidity()
           
         if(day.getMonth().getYear().validate())
             if(day.getMonth().validate())
                 if(day.validate())
                     return  true;
                 else
                     return false;
                           
             
             else
                 return false;
         
         else
             return false;
         
     
     public boolean compareDates(DateUtil date)
         if(day.getMonth().getYear().getValue() > date.getDay().getMonth().getYear().getValue()) 
             return true;
         
         else if(day.getMonth().getYear().getValue() < date.getDay().getMonth().getYear().getValue()) 
             return false;
         
         else 
             if(day.getMonth().getValue() > date.getDay().getMonth().getValue()) 
                 return true;
             
             else if(day.getMonth().getValue() < date.getDay().getMonth().getValue()) 
                 return false;
             
             else 
                 if(day.getValue() > date.getDay().getValue())
                     return true;
                 else
                     return false;
                     
             
         
      
     public boolean equalTwoDates(DateUtil date)
         if(day.getValue() == date.getDay().getValue() && day.getMonth().getValue() == date.getDay().getMonth().getValue() && day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue())
             return true;
         else
             return false;
     
     public String showDate()
         String str = "" + day.getMonth().getYear().getValue() + "-" + day.getMonth().getValue() + "-" + day.getValue();
         return str;
     
     public DateUtil getNextNDays(int n)
         for( ; n > 0 ; n--)
             if(day.getMonth().getValue() != 12)
                 if(day.getMonth().getValue() == 2)
                     if(day.getMonth().getYear().isLeapYear())
                         if(day.getValue() != 29)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                         
                     
                     else//不是闰年
                         if(day.getValue() != 28)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                     
                 //2月
                 else//不是二月
                     if(day.getMonth().getValue() == 1 || day.getMonth().getValue() == 3 || day.getMonth().getValue() == 5 || day.getMonth().getValue() == 7 || day.getMonth().getValue() == 8 || day.getMonth().getValue() == 10)
                         if(day.getValue() != 31)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                             
                     
                     else 
                         if(day.getValue() != 30)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                 
                         
                     
       
                 
             
             else //是12月
                 if(day.getValue() != 31)
                     day.dayIncrement();
                 else
                     day.resetMin();
                     day.getMonth().resetMin();
                     day.getMonth().getYear().yearIncrement();
                 
             
                
         //n
         DateUtil newDate = new DateUtil(day.getValue(),day.getMonth().getValue(),day.getMonth().getYear().getValue());
         return newDate;
     
     public DateUtil getPreviousNDays(int n)
          for( ; n > 0 ; n--)
              if(day.getMonth().getValue() == 1)
                  if(day.getValue() == 1)
                      day.resetMax();
                      day.getMonth().resetMax();
                      day.getMonth().getYear().yearReduction();
                  
                  else
                      day.dayReduction();
                  
               
              else 
                      if(day.getValue() == 1)
                          day.getMonth().monthReduction();
                          day.resetMax();
                      
                      else
                          day.dayReduction();
                  
          
 
         DateUtil newDate = new DateUtil(day.getValue(),day.getMonth().getValue(),day.getMonth().getYear().getValue());
         return newDate;
         
     
     public int getDaysofDates(DateUtil date)
         int n = 0;int flag = 0;
         if(compareDates(date) )
             flag = 1;
         
         else
             flag = 0;
         if(flag == 0)
             for( ; this.equalTwoDates(date) == false ; n++)
               if(day.getMonth().getValue() != 12)
                 if(day.getMonth().getValue() == 2)
                     if(day.getMonth().getYear().isLeapYear())
                         if(day.getValue() != 29)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                     
                     else//不是闰年
                         if(day.getValue() != 28)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                     
                 //2月
                 else//不是二月
                     if(day.getMonth().getValue() == 1 || day.getMonth().getValue() == 3 || day.getMonth().getValue() == 5 || day.getMonth().getValue() == 7 || day.getMonth().getValue() == 8 || day.getMonth().getValue() == 10)
                         if(day.getValue() != 31)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                             
                     
                     else 
                         if(day.getValue() != 30)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                     
       
                 
             
             else //是12月
                 if(day.getValue() != 31)
                     day.dayIncrement();
                 else
                     day.resetMin();
                     day.getMonth().resetMin();
                     day.getMonth().getYear().yearIncrement();
                 
             
          
         
         else 
             for( ; this.equalTwoDates(date) == false ; n++ )
                 if(day.getMonth().getValue() == 1)
                  if(day.getValue() == 1)
                      day.resetMax();
                      day.getMonth().resetMax();
                      day.getMonth().getYear().yearReduction();
                  
                  else
                      day.dayReduction();
                  
               
              else 
                      if(day.getValue() == 1)
                          day.getMonth().monthReduction();
                          day.resetMax();
                      
                      else
                          day.dayReduction();
                  
             
         
              
         return n;
     
 
 
 class Day
     private int value;
     private Month month = new Month();
     private int[] mon_maxnum = 31,28,31,30,31,30,31,31,30,31,30,31;
     
     Day()
         
     
     Day(int yearValue, int monthValue, int dayValue)
         value = dayValue;
         month.setValue(monthValue);
         month.getYear().setValue(dayValue);
     
     
     public int getValue()
         return value;
     
     public void setValue(int value)
         this.value = value;
     
     public Month getMonth()
         return month;
     
     public void setMonth(Month value)
         this.month = value;
     
     public void resetMin()
         value = 1;
     
     public void resetMax()
         if(month.getYear().isLeapYear())
             if(month.getValue() == 2)
                 value = 29;
             else
                 value = mon_maxnum[month.getValue()-1];
         
         else
             if(month.getValue() == 2)
                 value = 28;
             else
                 value = mon_maxnum[month.getValue()-1];
         
        
     
     public boolean validate()
         if(month.getValue() == 2)
             if(month.getYear().isLeapYear())
                 if(value >= 1 && value <= 29)
                     return true;
                 else
                     return false;
             
             else
                 if(value >= 1 && value <= 28)
                     return true;
                 else 
                     return false;
             
                 
         
         else
             if(value >= 1 && value <= mon_maxnum[month.getValue()-1])
                 return true;
             else
                 return false;
         
          
     
     public void dayIncrement()
         value++;
     
     public void dayReduction()
         value--;
     
 
 
 class Month
     private int value;
     private Year year = new Year();
     
     Month()
         
     
     Month(int yearValue, int monthValue)
         value = monthValue;
         year.setValue(yearValue);
     
     
     public int getValue()
         return value;
     
     public void setValue(int value)
          this.value = value; 
     
     public Year getYear()
         return year;
     
     public void setYear(Year year)
         this.year = year;
     
     public void resetMin()
         value = 1;
     
     public void resetMax()
         value = 12;
     
     public boolean validate()
         if(value >= 1 && value <= 12)
             return true;
         else
             return false;
     
     public void monthIncrement()
         value++;
     
     public void monthReduction()
         value--;
     
 
 
 class Year
     private int value;
     
     Year()
         
     
     Year(int value)
         this.value = value;
     
     
     public int getValue()
         return value;
     
     public void setValue(int value)
         this.value = value;
     
     public boolean isLeapYear()
         if((value % 4 == 0 && value % 100 != 0) || value % 400 == 0)
             return true;
         else
             return false;
     
     public boolean validate()
         if(value >= 1900 && value <= 2050)
             return true;
         else
             return false;
     
     public void yearIncrement()
         value++;
     
     public void yearReduction()
         value--;
     
 
         
         

运行结果如下:

 这题的话,在DateUtil类中有Day类对象,Day类中有Month对象,在Month类中有Year对象,这些类之间的关系都是聚合关系;这个题目更好解释了类与类之间的关系,如下图:

day对象调用month对象,month对象再调用year对象,year对象调用setValue方法,从而实现改变年份。我写的时候对年份的判定老是出现错误,其实参照习题四的题目就行了。在下写求两个日期的之间的天数,我用的是循环的方法,若前面的日期更小,则调用下N天的函数,循环N次;若前面的日期较大,则调用求上N天的方法,循环N次,这样就得到了两个日期之间的天数。相应的代码如下:

 public int getDaysofDates(DateUtil date)
         int n = 0;int flag = 0;
         if(compareDates(date) )
             flag = 1;
         
         else
             flag = 0;
         if(flag == 0)
             for( ; this.equalTwoDates(date) == false ; n++)
               if(day.getMonth().getValue() != 12)
                 if(day.getMonth().getValue() == 2)
                     if(day.getMonth().getYear().isLeapYear())
                         if(day.getValue() != 29)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                     
                     else//不是闰年
                         if(day.getValue() != 28)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                     
                 //2月
                 else//不是二月
                     if(day.getMonth().getValue() == 1 || day.getMonth().getValue() == 3 || day.getMonth().getValue() == 5 || day.getMonth().getValue() == 7 || day.getMonth().getValue() == 8 || day.getMonth().getValue() == 10)
                         if(day.getValue() != 31)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                             
                     
                     else 
                         if(day.getValue() != 30)
                             day.dayIncrement();
                         else
                             day.resetMin();
                             day.getMonth().monthIncrement();
                         
                     
       
                 
             
             else //是12月
                 if(day.getValue() != 31)
                     day.dayIncrement();
                 else
                     day.resetMin();
                     day.getMonth().resetMin();
                     day.getMonth().getYear().yearIncrement();
                 
             
          
         
         else 
             for( ; this.equalTwoDates(date) == false ; n++ )
                 if(day.getMonth().getValue() == 1)
                  if(day.getValue() == 1)
                      day.resetMax();
                      day.getMonth().resetMax();
                      day.getMonth().getYear().yearReduction();
                  
                  else
                      day.dayReduction();
                  
               
              else 
                      if(day.getValue() == 1)
                          day.getMonth().monthReduction();
                          day.resetMax();
                      
                      else
                          day.dayReduction();
                  
             
         
              
         return n;
     

这个题目将一个功能交给一个方法实现,体现了java中的单一职责原则,代码实现过程也更好写。

生成的类图如下:

生成的类图,由于都在一个java文件中,main与其他类都有依赖关系,不完全符合题目的要求。

 

 

7-6 日期问题面向对象设计(聚合二)
分数 34
作者 段喜龙
单位 南昌航空大学

参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

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

  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.Scanner;
 
 public class Main 
     public static void main(String[] args) 
         Scanner input = new Scanner(System.in);
         String str = input.nextLine();
         String[] str1 = str.split(" ");
         switch(str1[0])
             case "1":
                 int y = Integer.valueOf(str1[1]);
                 int m = Integer.valueOf(str1[2]);
                 int d = Integer.valueOf(str1[3]);
                 int n = Integer.valueOf(str1[4]);
                 
                 DateUtil date = new DateUtil(d,m,y);
                 if(date.checkInputValidity())
                     System.out.println(date.getYear().getValue() + "-" + date.getMonth().getValue() + "-" + date.getDay().getValue() + " next " + n + " days is:" + date.getNextNDays(n).showDate());
                 else
                     System.out.println("Wrong Format");
             break;
             case "2":
                 int y = Integer.valueOf(str1[1]);
                 int m = Integer.valueOf(str1[2]);
                 int d = Integer.valueOf(str1[3]);
                 int n = Integer.valueOf(str1[4]);
                 DateUtil date = new DateUtil(d,m,y);
                 if(date.checkInputValidity())
                     System.out.println(date.getYear().getValue() + "-" + date.getMonth().getValue() + "-" + date.getDay().getValue() + " previous " + n + " days is:" + date.getPreviousNDays(n).showDate());
                 else
                     System.out.println("Wrong Format");
             break;
             case "3":
                 int y1 = Integer.valueOf(str1[1]);
                 int m1 = Integer.valueOf(str1[2]);
                 int d1 = Integer.valueOf(str1[3]);
                 int y2 = Integer.valueOf(str1[4]);
                 int m2 = Integer.valueOf(str1[5]);
                 int d2 = Integer.valueOf(str1[6]);
                 DateUtil date1 = new DateUtil(d1,m1,y1);
                 DateUtil date2 = new DateUtil(d2,m2,y2);
                 System.out.print("The days between " + date1.getYear().getValue() + "-" + date1.getMonth().getValue() + "-" + date1.getDay().getValue() + " and " + date2.getYear().getValue() + "-" + date2.getMonth().getValue() + "-" + date2.getDay().getValue() + " are:");
                 int n = date1.getDaysofDates(date2);
                 System.out.print(n);
             break;
             default:
                 System.out.println("Wrong Format");
             
         //switch
     
 
 class DateUtil
     private Year year = new Year();
     private Month month = new Month();
     private Day day = new Day();
     private int[] mon_maxnum = 31,28,31,30,31,30,31,31,30,31,30,31;
     
     
     
     DateUtil()
         
     
     DateUtil(int d, int m, int y)
         year.setValue(y);
         month.setValue(m);
         day.setValue(d);
     
     public  Year getYear()
         return year;
     
     public void setYear(Year year)
         this.year = year;
     
     public Month getMonth()
         return month;
     
     public void setMonth(Month month)
         this.month = month;
     
     public Day getDay()
         return day;
     
     public void setDay(Day day)
         this.day = day;
     
     public void setDayMin()
         day.setValue(1);
     
     public void setDayMax()
        if(year.isLeapYear())
             if(month.getValue() == 2)
                 day.setValue(29); 
             else
                 day.setValue(mon_maxnum[month.getValue()-1]); 
         
         else
             if(month.getValue() == 2)
                 day.setValue(28);
             else
                 day.setValue(mon_maxnum[month.getValue()-1]) ;
         
        
     
     public boolean checkInputValidity()
         if(year.validate())
             if(month.validate())
                   if(month.getValue() == 2)
                 if(year.isLeapYear())
                     if(day.getValue() >= 1 && day.getValue() <= 29)
                         return true;
                     else
                         return false;
                 
                 else
                     if(day.getValue() >= 1 && day.g

第二次pta作业

6-7 删除字符串中数字字符

1.设计思路

(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。

第二部;设计简单的函数,执行题中所需功能。

第三部:上机运行程序,检查程序对错。

(2)流程图技术分享图片

#include "stdio.h"
void delnum(char *s);
int main ()
{ char item[80];
gets(item);
 delnum(item);
 printf("%s\\n",item);
 return 0;
}
void delnum(char *s)
{
    int i,j;
    for(i=0;*(s+i)!=\\0;i++)
    {
        if(*(s+i)>=0&&*(s+i)<=9)
        {
            for(j=i;*(s+j)!=\\0;j++)
            {
                *(s+j)=*(s+j+1);
            }
            i--;
        }
    } 
}

https://coding.net/u/aggresiver/p/123/git/blob/master/6-7

技术分享图片

6-8 统计子串在母串出现的次数

1.设计思路

(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。

第二部;设计简单的函数,执行题中所需功能。

第三部:上机运行程序,检查程序对错。

(2)流程图技术分享图片

#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
 int n;
 n=fun(str,substr);
 printf("n=%d\\n",n);
 return 0;
}
int fun(char *str,char *substr)
{
    int i,j,count=0,t;
    for(i=0;*(str+i)!=\\0;i++)
    {
        t=1;
        if(*(str+i)==*substr)
        {
            for(j=0;*(substr+j)!=\\0;j++)
            {
                if(*(str+i+j)!=*(substr+j))
                {
                    t=0;
                    break;
                }
            }
        if(t==1)
        count++;
        }
     }
    return count;
}

https://coding.net/u/aggresiver/p/123/git/blob/master/6-8

技术分享图片

6-9 字符串中除首尾字符外的其余字符按降序排列

1.设计思路

(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。

第二部;设计简单的函数,执行题中所需功能。

第三部:上机运行程序,检查程序对错。

(2)流程图技术分享图片

#include <stdio.h>
int fun(char *s,int num);
int main()
{
 char s[10];
 gets(s);
 fun(s,7);
 printf("%s",s);
 return 0;
 }
 int fun(char *s,int num)
{
    int i,j;
     char t;
    for(i=1;i<num-1;i++)
    {
        for(j=num-2;j>i;j--)
        {
            if(*(s+j)>*(s+j-1))
            {
               
                t=*(s+j);
                *(s+j)=*(s+j-1);
                *(s+j-1)=t;
             }
        }
    }
}

https://coding.net/u/aggresiver/p/123/git/blob/master/6-9

技术分享图片

7-0输出学生成绩

1.设计思路

(1)第一步:根据已知题意,观察已给程序,了解题中各个参数的意义。

第二部;设计简单的函数,执行题中所需功能。

第三部:上机运行程序,检查程序对错。

(2)流程图技术分享图片

 

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int N,i;
    double sum=0,max,min,ag,*p;
    scanf("%d",&N);
if((p=(double *)calloc(N,sizeof(double)))==NULL)
       {
        printf("Not able to allocate memory.\\n");
        exit(1);
        }
           for(i=0;i<N;i++)
           {
              scanf("%lf",p+i);
              sum=sum+*(p+i);
            }
                  max=*p,min=*p;
                  for(i=0;i<N;i++)
                         {
                              if(*(p+i)>max)
                              max=*(p+i);
                              if(*(p+i)<min)
                               min=*(p+i);
                           }
            ag=sum*1.0/N;
            printf("average = %.2lf\\nmax = %.2lf\\nmin = %.2lf\\n",ag,max,min);
            free(p);
}

 

https://coding.net/u/aggresiver/p/123/git/blob/master/7-0

技术分享图片

 

以上是关于关于PTA第二次大作业的总结的主要内容,如果未能解决你的问题,请参考以下文章

关于三次pta大作业的总结报告

第二次大作业-确定分工,确定目标

PTA第二次作业

第二次PTA作业

第二次pta作业

pta第二次作业