第二次Java大作业总结与分析

Posted aywj123123

tags:

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

第二次Java大作业总结与分析

一、前言

相对于前三次作业,这三次的作业难度提升很多,做起来困难重重,会花费很多时间,而且还不一定能够取得全对。第四次作业算是上一次的过渡,算是这次作业里面最简单的题集,除了7-1,其他的都是考察一些基本的语法知识,基本都没有涉及到类图的应用,可以用一个类就解决题目;第五次作业前面主要考察一个之前没有写过的东西--正则表达式,不过;也只要用一个类就完成,难题还是后面两题,和前面题目很相似的日期问题,需要用多个类,比较繁琐;第六次作业更为难,前面2题算热身,后面三题会花费非常多的时间,并且最后两题没有给出类图,需要自己设计,而我之前完全没有设计过类图,所以对于我来说难上加难。虽然这3次题集题目量相较于前面3次的题目少,但所花费时间却一点都没少,甚至还更多,可谓少而精,对于我来说非常有锻炼价值。

二、设计与分析

OOP04-7-1

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
 
 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
 
因为这题难度较大,我没有做出来,所以下面为网上查到的同学的代码,不过我理解了。
 
 
 

OOP05-7-5

参考题目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
 
代码长度限制
16 KB
时间限制
10000 ms
内存限制
64 MB

 

我写出的代码:

import java.util.Scanner;

public class Main 
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;
        int choice = input.nextInt();
        if (choice == 1)  // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());
            DateUtil date = new DateUtil(year,month,day);
            if (!date.checkInputValidity()) 
                System.out.println("Wrong Format");
                System.exit(0);
            
            m = input.nextInt();
            if (m < 0) 
                System.out.println("Wrong Format");
                System.exit(0);
            
            System.out.println(date.getNextNDays(m).showDate());
         else if (choice == 2)  // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());
            DateUtil date = new DateUtil(year, month, day);
            if (!date.checkInputValidity()) 
                System.out.println("Wrong Format");
                System.exit(0);
            
            n = input.nextInt();
            if (n < 0) 
                System.out.println("Wrong Format");
                System.exit(0);
            
            System.out.println(date.getPreviousNDays(n).showDate());
         else if (choice == 3)     //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());
            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());
            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) 
                System.out.println(fromDate.getDaysofDates(toDate));
             else 
                System.out.println("Wrong Format");
                System.exit(0);
            
        
        else
            System.out.println("Wrong Format");
            System.exit(0);
        
    



class Year
    private int value;
    public Year()//默认构造方法
    
    public Year(int value)//带参构造方法
        this.value = value;
    
    public int getValue()
        return this.value;
    
    public void setValue(int value)//得到年
        this.value = value;
    
    public boolean isLeapYear()//判断是否为闰年
        return ((value % 4 == 0) && (value % 100 != 0)) || value % 400 == 0;
    
    public boolean isLeapYear(int year)//判断是否为闰年
        return ((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0;
    
    public boolean validate()//判断日期是否合法
        return value >= 1900 && value <= 2050;
    
    public void yearIncrement()//年+1
        value += 1;
    
    public void yearReduction()//年-1
        value -= 1;
    


class Month 
    private int value;
    private Year year;
    public Month()
    public Month(int yearValue,int monthValue)//有参构造方法
        year=new Year(yearValue);
        value = monthValue;
    
    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()//月份复位为1
        value = 1;
    
    public void resetMax()//月份为12
        value = 12;
    
    public boolean validate()//检测月份合法
        return value >= 1 && value <= 12;
    
    public void monthIncrement()//月份+1
        value += 1;
    
    public void monthReduction()//月份-1
        value -= 1;
    

class Day 
    private int value;
    private Month month = new Month();
    public int[] mom_maxnum1 = 0,31,28,31,30,31,30,31,31,30,31,30,31;//平年
    public int[] mom_maxnum2 = 0,31,29,31,30,31,30,31,31,30,31,30,31;//闰年
    public int[] mom_maxnum = new int[13];//用来修改的天数
    public Day()
    public Day(int yearValue,int monthValue,int dayValue)//含参构造
        this.value = dayValue;
        month = new Month(yearValue,monthValue);
    
    public int getValue()
        return this.value;
    
    public void setValue(int value)
        this.value = value;
    
    public Month getMonth()
        return this.month;
    
    public void setMonth(Month month)
        this.month = new Month();
        this.month = month;
    
    public void resetMin()//日期复位
        value = 1;
    
    public void resetMax()//日期设为改月最大值
        value = 31;

    
    public boolean validate()//检测日期合法
        //下面为闰年
        if(month.getYear().isLeapYear()) 
            return value >= 1 && value <= mom_maxnum2[month.getValue()];
        
        else//这是平年
            return value >= 1 && value <= mom_maxnum1[month.getValue()];
        
    
    public void dayIncrement()//日期+1
        value += 1;
    
    public void dayReduction()//日期-1
        value -= 1;
    

class DateUtil 
    private Day day;
    int thisYear = 0;//一年的总天数
    public DateUtil()
    public DateUtil(int d,int m,int y)//含参构造
        day = new Day(d,m,y);
    
    public Day getDay()
        return day;
    
    public void setDay(Day d)
        this.day = new Day();
        this.day = d;
    
    public boolean checkInputValidity()//检测日期合法
        return day.validate() && day.getMonth().validate() && day.getMonth().getYear().validate();
    
    public boolean compareDates(DateUtil date)//比较两个日期大小,返回真则date大,年-月-日
        if(day.getMonth().getYear().getValue() > date.getDay().getMonth().getYear().getValue())
            return false;
        
        else if(day.getMonth().getYear().getValue() < date.getDay().getMonth().getYear().getValue()) 
            return true;
        
        else if(day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue())
            if(day.getMonth().getValue() > date.getDay().getMonth().getValue())
                return false;
            
            if(day.getMonth().getValue() < date.getDay().getMonth().getValue())
                return true;
            
            if(day.getMonth().getValue() == date.getDay().getMonth().getValue())
                return day.getValue() < date.getDay().getValue();
            
        
        return false;
    
    public boolean equalTwoDates(DateUtil date)//判断两个日期是否相同
        return day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()
                && day.getMonth().getValue() == date.getDay().getMonth().getValue()
                && day.getValue() == date.getDay().getValue();
    
    public String showDate()//日期格式化
        return (day.getMonth().getYear().getValue()+"-"+day.getMonth().getValue()+"-"+
                day.getValue());
    
    public DateUtil getNextNDays(int n)//求下n天
        while(n > 0)//一天天往里加
            day.dayIncrement();//天数加一
            yearDays();
            if(day.getValue() > day.mom_maxnum[day.getMonth().getValue()])//如果超过本月天数,则月份加一,天数变为1
                day.setValue(1);
                day.getMonth().monthIncrement();
            
            if(day.getMonth().getValue() > 12)//如果超过12个月,则进入下一年,月份天数均重置
                day.getMonth().getYear().yearIncrement();
                day.getMonth().resetMin();
                day.setValue(1);
            
            n--;
        
        return this;
    
   public DateUtil getPreviousNDays(int n)//求前n天
       yearDays();
       int allDay = 0;//总天数
       for(int i = 0; i <= day.getMonth().getValue() - 1; i++)//计算1.1到该日期的天数,本月不能计算
           allDay = allDay + day.mom_maxnum[i];
       
       allDay += day.getValue();
       int chaZhi1 = n - allDay;//可以判断是否往前退了一年,或者还在今年
       int chaZhi2 = 0;//继续用来算月
       if(chaZhi1 <= 0) //用n计算即可,在本年
       
       else//推出年份不在本年
           day.getMonth().getYear().yearReduction();//年减一
           n = chaZhi1;
           yearDays();
           while(n - thisYear > 0)
               day.getMonth().getYear().yearReduction();//年减一
               n -= thisYear;
               yearDays();
           
           day.getMonth().resetMax();//从年底开始计算
           day.resetMax();
       
       if (n - day.getValue() > 0) //往前推后不在本月
           n -= day.getValue();
           day.getMonth().monthReduction();
           chaZhi2 = day.mom_maxnum[day.getMonth().getValue()];
           while (n - chaZhi2 > 0) //循环减月份
               n -= day.mom_maxnum[day.getMonth().getValue()];
               day.getMonth().monthReduction();
               chaZhi2 = day.mom_maxnum[day.getMonth().getValue()];
               day.resetMin(); //日期复位
           
           day.setValue(day.mom_maxnum[day.getMonth().getValue()] - n);
       
       else//在本月
           day.setValue(day.getValue() - n);
       
       DateUtil date = new DateUtil();
       date.setDay(day);
       return date;
    
   public int getDaysofDates(DateUtil date)//求日期差
       int n = 0;//计算所得相差天数
       int m = 0;//记录闰年数量
       yearDays();
       int allDay1 = 0;//总天数
       for(int i = 1; i <= day.getMonth().getValue() - 1; i++)//计算1.1到该日期的天数,本月不能计算
           allDay1 = allDay1 + day.mom_maxnum[i];
       
       allDay1 += day.getValue();
       int surLastDay = allDay1;//当前日期为第几天的天数
      // date.getDay(),另一个日期的天数

       yearDays(date.getDay().getMonth().getYear().getValue());
       int allDay2 = 0;//总天数
       for(int i = 1; i <= date.getDay().getMonth() .getValue() - 1; i++)//计算1.1到该日期的天数,本月不能计算
           allDay2 = allDay2 + day.mom_maxnum[i];
       
       allDay2 += date.getDay().getValue();
       int surNowDay = allDay2;//现在日期的天数

       if (equalTwoDates(date)) //判断日期是否相等,否则没有求下去的必要
           return n;
       
       else 
           //计算相差年数与闰年数
           //date.yearDays(date.getDay().getMonth().getYear().getValue()),其为当年全天数
           if(!compareDates(date))//当前日期大
               n = n + surLastDay + date.yearDays(date.getDay().getMonth().getYear().getValue()) - surNowDay;
               for(int i = date.getDay().getMonth().getYear().getValue() + 1; i < day.getMonth().getYear().getValue(); i++)
                   if(day.getMonth().getYear().isLeapYear(i))
                       m++;//计算年数
                   
               
               n = n + (day.getMonth().getYear().getValue() - 1 - (date.getDay().getMonth().getYear().getValue() + 1) + 1) * 365 + m;
           
           else
               n = n + surNowDay + yearDays(day.getMonth().getYear().getValue()) - surLastDay;
               for(int i = day.getMonth().getYear().getValue() + 1; i < date.getDay().getMonth().getYear().getValue(); i++)
                   if(day.getMonth().getYear().isLeapYear(i))
                       m++;
                   
               
               n = n + (date.getDay().getMonth().getYear().getValue() - 1 - (day.getMonth().getYear().getValue() + 1) + 1) * 365 + m;
           
       
       return n;
    
    public int yearDays(int yearArg) 
        if (((yearArg % 4 == 0) && (yearArg % 100 != 0)) || (yearArg % 400 == 0)) 
            thisYear = 366;
            day.mom_maxnum = day.mom_maxnum2;
         else 
            thisYear = 365;
            day.mom_maxnum = day.mom_maxnum1;
        
        return thisYear;
    
    public void yearDays() //判断闰年并给月份赋值相应天数
        if(day.getMonth().getYear().isLeapYear())//判断闰年
            thisYear = 366;
            day.mom_maxnum = day.mom_maxnum2;
        
        else
            thisYear = 365;
            day.mom_maxnum = day.mom_maxnum1;
        
    

代码思路:

这个题目思路和之前做的日期问题题目思路一样,依照题目类图先写出基本的一些方法,里面写方法就是写前后n天难,不过可以直接用之前的,大致说一下之前是怎么求的:就是把n天一点一点分给现在日期,使日期改变,改变以月和年为改变点,先把n给日期使它的月份改变,若是n还有,则可以改变年。

下面是我写出的类图:

OOP05-7-6

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
 
代码长度限制
16 KB
时间限制
10000 ms
内存限制
64 MB
 
 
我的代码:
import java.util.Scanner;

public class Main 
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1)  // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) 
                System.out.println("Wrong Format");
                System.exit(0);
            

            m = input.nextInt();

            if (m < 0) 
                System.out.println("Wrong Format");
                System.exit(0);
            

            System.out.print(date.getYear().getValue() + "-" + date.getMonth().getValue() + "-" + date.getDay().getValue() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
         else if (choice == 2)  // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) 
                System.out.println("Wrong Format");
                System.exit(0);
            

            n = input.nextInt();

            if (n < 0) 
                System.out.println("Wrong Format");
                System.exit(0);
            

            System.out.print(
                    date.getYear().getValue() + "-" + date.getMonth().getValue() + "-" + date.getDay().getValue() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
         else if (choice == 3)     //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) 
                System.out.println("The days between " + fromDate.showDate() +
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
             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 dayValue)//含参构造
        this.value = dayValue;
    
    public int getValue()
        return this.value;
    
    public void setValue(int value)
        this.value = value;
    
    public void dayIncrement()//日期+1
        value += 1;
    
    public void dayReduction()//日期-1
        value -= 1;
    

class Month 
    private int value;
    public Month()
    public Month(int monthValue)//有参构造方法
        value = monthValue;
    
    public int getValue()//返回月份
        return value;
    
    public void setValue(int value)//创建月份
        this.value = value;
    
    public void resetMin()//月份复位为1
        value = 1;
    
    public void resetMax()//月份为12
        value = 12;
    
    public boolean validate()//检测月份合法
        return value >= 1 && value <= 12;
    
    public void monthIncrement()//月份+1
        value += 1;
    
    public void monthReduction()//月份-1
        value -= 1;
    

class Year
    private int value;
    public Year()//默认构造方法
    
    public Year(int value)//带参构造方法
        this.value = value;
    
    public int getValue()
        return this.value;
    
    public void setValue(int value)//得到年
        this.value = value;
    
    public boolean isLeapYear()//判断是否为闰年
        return ((value % 4 == 0) && (value % 100 != 0)) || value % 400 == 0;
    
    public boolean validate()//判断日期是否合法
        return value >= 1820 && value <= 2020;
    
    public void yearIncrement()//年+1
        value += 1;
    
    public void yearReduction()//年-1
        value -= 1;
    

class DateUtil
    private Year year;
    private Month month;
    private Day day;
    private int[] mon_maxnum = 0,31,28,31,30,31,30,31,31,30,31,30,31;//平年
    public DateUtil()

    
    public DateUtil(int y,int m,int d)
        year = new Year(y);
        month = new Month(m);
        day = new Day(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())//闰年2月为29天
           mon_maxnum[2] = 29;
       
        day.setValue(mon_maxnum[month.getValue()]);
    
    public boolean checkInputValidity()//判断日期是否合法
        if(year.isLeapYear())//闰年2月为29天
            mon_maxnum[2] = 29;
        
        return year.validate() && month.validate() &&
                day.getValue() >= 1 && day.getValue() <= mon_maxnum[month.getValue()];
    
    public DateUtil getNextNDays(int n)//求下n天
        while(n > 0)//一天天往里加
            day.dayIncrement();//天数加一
            if(year.isLeapYear())//闰年2月为29天
                mon_maxnum[2] = 29;
            
            else
                mon_maxnum[2] = 28;//改完要调回去
            
            if(day.getValue() > mon_maxnum[month.getValue()])//如果超过本月天数,则月份加一,天数变为1
                day.setValue(1);
                month.monthIncrement();
            
            if(month.getValue() > 12)//如果超过12个月,则进入下一年,月份天数均重置
                year.yearIncrement();
                month.resetMin();
                day.setValue(1);
            
            n--;
        
        return this;
    
    public DateUtil getPreviousNDays(int n)//求前n天
        while(n > 0)//一天天往里减
            day.dayReduction();//天数减一
            if(day.getValue() <= 0)//减完本月天数则进入前一个月减
                month.monthReduction();
                if(year.isLeapYear())//闰年2月为29天
                    mon_maxnum[2] = 29;
                
                else
                    mon_maxnum[2] = 28;//改完要调回去
                
                day.setValue(mon_maxnum[month.getValue()]);
            
            if(month.getValue() <= 0)//减完全部的月则进入前一年,月份重置为12,日期为31
                year.yearReduction();
                month.resetMax();
                day.setValue(31);
            
            n--;
        
        return this;
    
    public boolean compareDates(DateUtil date)//比较两日期先后,若返回为真则date为后
        if(date.getYear().getValue() > year.getValue())//比较年
            return true;
        
        else
            if(date.getMonth().getValue() > month.getValue())//比较月
                return true;
            
            else
                //比较日
                return date.getDay().getValue() > day.getValue();
            
        
    
    public boolean equalTwoDates(DateUtil date)//判断两日期是否相等
        return day.getValue() == date.getDay().getValue() &&
                month.getValue() == date.getMonth().getValue() &&
                year.getValue() == date.getYear().getValue();
    
    public int getDaysofDates(DateUtil date)//求两个日期相差天数
        int n = 0;//求两个日期相差天数,就是其中一个小日期加n天后与大日期相等
        if(equalTwoDates(date))
            return n;
        
        if(compareDates(date))//如果date在后,则this加n天后为date
            while(!equalTwoDates(date))
                day.dayIncrement();//天数加一
                if(year.isLeapYear())//闰年2月为29天
                    mon_maxnum[2] = 29;
                else
                    mon_maxnum[2] = 28;//改完要调回去
                
                if(day.getValue() > mon_maxnum[month.getValue()])//如果超过本月天数,则月份加一,天数变为1
                    day.setValue(1);
                    month.monthIncrement();
                
                if(month.getValue() > 12)//如果超过12个月,则进入下一年,月份天数均重置
                    year.yearIncrement();
                    month.resetMin();
                    day.setValue(1);
                
                n++;
            
        
        else//this在前,date在后,则this前n天为date
            while(!equalTwoDates(date))//一天天往里减
                day.dayReduction();//天数减一
                if(day.getValue() <= 0)//减完本月天数则进入前一个月减
                    month.monthReduction();
                    if(year.isLeapYear())//闰年2月为29天
                        mon_maxnum[2] = 29;
                    
                    else
                        mon_maxnum[2] = 28;//改完要调回去
                    
                    day.setValue(mon_maxnum[month.getValue()]);
                
                if(month.getValue() <= 0)//减完全部的月则进入前一年,月份重置为12,日期为31
                    year.yearReduction();
                    month.resetMax();
                    day.setValue(31);
                
                n++;
            
        
        return n;
    
    public String showDate()
        return (year.getValue()+"-"+month.getValue()+"-"+day.getValue());
    

代码思路:

这个题目思路和前面的差不太多,都是依据类图来写,只是我在计算前后n天的方法里做了改善,直接重新写了另外一个方法,这个方法代码量少,思路清晰,比我之前写的要好很多。之前是将n天分给日期后,判断日期是不是改变了月份,而这个方法是直接一天天往上加,要是天数超过限制,就更新月份,同理更新年份,简洁高效。

类图:

 

OOP06-7-3

7-3 水文数据校验及处理
分数 25
全屏浏览题目
切换布局

《Java技术》第二次作业

(一)学习总结

1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?

public class Test {
    public static void main(String args[]) { 
       Foo obj = new Foo();       
    }     
}
class Foo{
    int value;
    public Foo(int intValue){
        value = intValue;
    }
}
    构造方法是一个与类名相同且没有返回值类型的方法,对象的创建都是通过构造方法完成的,主要功能是完成对象的初始化。构造方法的重载就是方法名相同,而参数个数和类型不同,调用时,会自动相应的构造方法。不能通过编译,因为程序中是有一个参数的构造方法,主方法中调用的是无参的构造方法,所以不能实现。一个类中必定存在构造方法,如果没有明确的声明时,系统会自动生成一个无参的构造方法,如果已经明确的声明了一个构造方法,那么程序在编译时就不会再生成默认的构造方法。

2.运行下列程序,结果是什么?分析原因,应如何修改。

public class Test {
    public static void main(String[] args) {
        MyClass[] arr=new MyClass[3];
        arr[1].value=100;
    }
}
class MyClass{
    public int value=1;
}

没有给定义的数组分配空间。改为:

public class Test {
    public static void main(String[] args) {
        MyClass[] arr= {new MyClass(),
        			new MyClass(),
        			new MyClass()};
        arr[1].value=100;
    }
}
class MyClass{
    public int value=1;
}

3.运行下列程序,结果是什么?说明原因。

public class Test {
    public static void main(String[] args) {
        Foo obj1 = new Foo();
        Foo obj2 = new Foo();
        System.out.println(obj1 == obj2);
    }
}
class Foo{
    int value = 100;
}
    结果是:false。因为创建的两个对象所指的空间不同,所以并不相等。

4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
将属性用private私有化,通过setter和getter方法设置和取得,用this引用,调用公有方法实现对私有属性的访问。
5.阅读下面程序,分析是否能编译通过?如果不能,说明原因。
(1)

class A{
    private int secret = 5;
}
public class Test{
    public static void main(String args[]){
        A a = new A();
        System.out.println(a.secret++);
    }
}
    不能编译,因为secret是私有属性,所以不能直接调用,需要通过使用set,get方法。

(2)

public class Test{
    int x = 50;
    static int y = 200;
    public static void method(){
        System.out.println(x+y);
    }
    public static void main(String args[]){
        Test.method();
    }
}
    不能编译,因为变量x不是静态变量,静态方法无法使用。

6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。

class Book{
    int bookId;
    String bookName;
    double price;
    static int Id,totalBook;// 声明静态变量
    
    static{
    	totalBook=0;
    	Id=1000;
    }//定义静态代码块对静态变量初始化
    
    public Book(String bookName,double price) {
    	Id++;
    	this.bookName=bookName;
    	this.price=price;
    	bookId=Id;
    	totalBook++;
    }//构造方法
    
     public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }  
    public static int totalBook() {
    	return totalBook;
    }//定义方法求图书总册数
    
    public String toString() {
    	return "编号:"+bookId+"书名:"+this.bookName+"价格:"+this.price;
    }//重写toString方法
    
}
public class Test{
    public static void main(String args[]){ 
        Book[] books = {new Book("c语言程序设计",29.3),
                        new Book("数据库原理",30),
                        new Book("Java学习笔记",68)};
        System.out.println("图书总数为:"+ Book.totalBook()); 
        for(Book book:books){
            System.out.println(book.toString());
        }
    }   
}

7.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。
单例设计模式是一种常见的软件设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例。
特点:1、某个类只能有一个实例;
2、必须自行创建这个实例;
3、必须自行向整个系统提供这个实例。

class Sun{
	private Sun() {}
	private static Sun s=new Sun();
	public static Sun getS() {
		return s;
	}
}

8.理解Java参数传递机制,阅读下面的程序,运行结果是什么?说明理由。

public class Test {
    String str = new String("你好  ");
    char[] ch = { \'w\',\'o\',\'l\',\'l\',\'d\' };
    public static void main(String args[]) {
        Test test = new Test();
        test.change(test.str, test.ch);
        System.out.print(test.str);
        System.out.print(test.ch);
    }
    public void change(String str, char ch[]) {
        str = "hello";
        ch[0] = \'W\';
    }
}
    结果:你好  Wolld

调用方法传递的参数只在被调用方法中进行使用,并不改变原参数的内容。

(二)实验总结

本次实验包括实验二和实验三两次的内容:
1.用面向对象思想完成评分系统
程序设计思路:按照老师的模板一步步完成的。
问题1:第一次写出现了很多问题。
原因:不明白怎么调用。
解决方案:老师帮助修改。
2.Email验证
程序设计思路:用了三层嵌套,觉得程序比较麻烦,但没想到还有什么更好的方法。
3.查找子串
程序设计思路:查找出现的字符串的下标,下一次从该下标处继续查找,直到查完整个字符串,没查找到一次,计数加一。
4.统计文件
程序设计思路:先将字符串按“,”拆分,再将每个字符串先转换成字符串数组,根据ASCII码值将首字母转换成大写;统计文件个数时,先定义了一个空的字符串,依次把每一个文件名按“.”拆分后和其他文件名比较,如果相等计数加一,每比较完一个都将其放在空字符串中,每当开始下一个比较之前都先判断是否比较过,如果是则不再比较。
问题1:之前会出现如果有两个相同文件,就会输出两次文件有两个。
原因:没有判断是否统计过。
解决方案:添加了一个空字符串,用于存放统计过的文件名。
5.类的设计
程序设计思路:
问题1:测试类调用
解决方案:多次更改,仍无法编译

(三)代码托管(务必链接到你的项目)

码云提交历史截图

https://gitee.com/hebau_java_cs16/Java_CS02GX

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

面向对象设计与构造第二次总结作业

Java第二次作业总结

OOP课程题目集第二次总结

OO第二次总结

第二次作业——微信案例分析

《开拓者开发团队》第二次作业:基于弹幕评论的大数据分析平台项目开题报告