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

应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
代码实现:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Year {
private int year;
public Year() {
}
public Year(int value) {
this.year=value;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public boolean isLeapYear() {
if(year%400==0||(year%4==0&&year%100!=0))
return true;
else
return false;
}
public void yearIncrement() {
year++;
}
public void yearReduction() {
year--;
}
}
class Month extends Year{
private int month;
public Month() {
}
public Month(int yearvalue,int monthvalue) {
this.setYear(yearvalue);
this.month=monthvalue;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public void reseMin1() {
this.month=1;
}
public void reseMax1() {
this.month=12;
}
public boolean validate() {
if(getYear()>=1900&&getYear()<=2050&&month<=12&&month>=1)
return true;
else
return false;
}
public void monthIncrement() {
month++;
}
public void monthReduction() {
month--;
}
}
class Day extends Month{
private int day;
int mon_maxnum[]= {31,28,31,30,31,30,31,31,30,31,30,31};
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public Day() {
}
public Day(int yearValue,int monthValue,int dayvalue) {
this.setYear(yearValue);
this.setMonth(monthValue);
this.day=dayvalue;
}
public boolean vaildate() {
boolean a=super.validate();
boolean b=super.isLeapYear();
if(b)
mon_maxnum[1]=29;
if(this.getMonth()<1||this.getMonth()>12) {
return false;
}
if(mon_maxnum[this.getMonth()-1]<day|!a)
return false;
else
return true;
}
public void reseMin() {
day=1;
}
public void reseMax() {
day=mon_maxnum[this.getMonth()-1];
}
public void dayIncrement() {
day++;
}
public void dayReduction() {
day--;
}
}
class DateUtil{
int [] arry= {0,31,28,31,30,31,30,31,31,30,31,30,31};
public DateUtil(Day one,Day two) { //两日期之差 3// 2014 2 14 2020 1 5
int num=one.getYear()-two.getYear();
int i=0;
int totalday=0;
if(num<0) {
Day three;three=one;one=two;two=three;
}
if(num==0) {
int sum=0;
int a=one.getMonth()-two.getMonth();
if(a<0) {
for(i=one.getMonth();i<two.getMonth();i++)
sum+=arry[i];
sum+=one.getDay()-two.getDay();
System.out.println(sum);
return;
}
else {
for(i=two.getMonth();i<one.getMonth();i++)
sum+=arry[i];
sum+=one.getDay()-two.getDay();
System.out.println(sum);
return;
}
}
int num1=one.getMonth()-two.getMonth();
//System.out.println(one.getYear());
//System.out.println(two.getYear());
if(num1>0) {
for(i=two.getYear();i<one.getYear();i++) {
if(isLeapYear(i)) {
totalday+=366;
}
else
totalday+=365;
}
//System.out.println(totalday);
for(i=two.getMonth();i<one.getMonth();i++) {
if(one.isLeapYear())
arry[2]=29;
totalday+=arry[i];
}
//System.out.println(totalday);
int num3=one.getDay()-two.getDay();
totalday+=num3;
System.out.println(totalday);
return ;
}
else {
for(i=two.getYear();i<one.getYear()-1;i++) {
if(isLeapYear(i+1)) {
//System.out.print(i+" ");
totalday+=366;
}
else
totalday+=365;
}
//System.out.println(totalday);//0
for(i=0;i<one.getMonth();i++) {
if(one.isLeapYear())
arry[2]=29;
totalday+=arry[i];
//System.out.println(arry[i]);
}
//System.out.println(totalday);//31
for(i=two.getMonth();i<=12;i++) {
if(isLeapYear(one.getYear()-1))
arry[2]=29;
totalday+=arry[i];
//System.out.println(arry[i]);
}
//System.out.println(totalday); //366
int num3=one.getDay()-two.getDay();
totalday+=num3;
System.out.println(totalday);
return;
}
}
public DateUtil(int n,Day one) { //往后n天 1 1999 3 28 6543
if(one.getMonth()<1||one.getMonth()>12){
System.out.println("Wrong Format");
return ;
}
int num=n%1461;
int num1=(n/1461)*4;
one.setYear(one.getYear()+num1);
while(num>=365) {
if(one.isLeapYear()) {
one.yearIncrement();
num-=366;
}
else {
one.yearIncrement();
num-=365;
}
}
for(int i=1;i<one.getMonth();i++) {
if(one.isLeapYear())
arry[2]=29;
num+=arry[i];
}
num+=one.getDay();
while(num>356) {
if(one.isLeapYear())
num-=366;
else
num-=365;
one.yearIncrement();
}
one.reseMin1();
for(int i=1;arry[i]<num;i++) {
one.monthIncrement();
num-=arry[i];
}
one.setDay(num);
System.out.println(one.getYear()+"-"+one.getMonth()+"-"+one.getDay());
return ;
}
public DateUtil(Day one,int n) { //往前n天 2 1935 2 17 125340
if(one.getMonth()<1||one.getMonth()>12){
System.out.println("Wrong Format");
return ;
}
int num=n%1461;
int num1=(n/1461)*4;
one.setYear(one.getYear()-num1);
while(num>=365) {
if(one.isLeapYear()) {
one.yearReduction();
num-=366;
}
else {
one.yearReduction();
num-=365;
}
}
//System.out.println(num);
// System.out.println(one.getYear()+" "+one.getMonth()+" "+one.getDay());
int num2=0;
for(int i=1;i<one.getMonth();i++) {
if(one.isLeapYear())
arry[2]=29;
num2+=arry[i];
}
num2+=one.getDay();
if(num2>num) {
if(one.isLeapYear())
arry[2]=29;
num2-=num;
int i;
for( i=1;arry[i]<=num2;i++) {
num2-=arry[i];
}
System.out.println(one.getYear()+"-"+i+"-"+num2);
}
else {
//System.out.println(num);
num-=num2;
//System.out.println(num);
if(isLeapYear(one.getYear()-1))
num=366-num;
else
num=365-num;
if(isLeapYear(one.getYear()-1))
arry[2]=29;
//System.out.println(num);
int i;
for( i=1;num>=arry[i];i++) {
num-=arry[i];
}
System.out.println(one.getYear()-1+"-"+i+"-"+(num-1));
}
}
public boolean isLeapYear(int year) {
if(year%400==0||(year%4==0&&year%100!=0))
return true;
else
return false;
}
}
public class Main{
public static void main(String[] args) {
Scanner inpute=new Scanner(System.in);
String str=inpute.nextLine();
String [] arry=str.split(" ");
int x=Integer.parseInt(arry[0]);
switch(x){
case 3:{//3 2014 2 14 2020 6 14
String str1="^[0-9]{1}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}";
Pattern p1=Pattern.compile(str1);
Matcher m1=p1.matcher(str);
if(!m1.find()) {
System.out.println("Wrong Format");
return ;
}
else {
Day one=new Day(Integer.parseInt(arry[1]),Integer.parseInt(arry[2]),Integer.parseInt(arry[3]));
Day two=new Day(Integer.parseInt(arry[4]),Integer.parseInt(arry[5]),Integer.parseInt(arry[6]));
boolean c1=one.vaildate();
boolean c2=two.vaildate();
if(c1==true&&c2==true) {
DateUtil a=new DateUtil(one,two);
}
else {
System.out.println("Wrong Format");
return ;
}
}
}break;
case 2:{//2 1935 2 17 125340前n天
String str1="^[0-9]{1}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}\\s\\d+";
Pattern p1=Pattern.compile(str1);
Matcher m1=p1.matcher(str);
if(!m1.find()) {
System.out.println("Wrong Format");
return ;
}
else {
Day one=new Day(Integer.parseInt(arry[1]),Integer.parseInt(arry[2]),Integer.parseInt(arry[3]));
boolean c1=one.vaildate();
if(c1) {
DateUtil a=new DateUtil(one,Integer.parseInt(arry[4]));
}
else {
System.out.println("Wrong Format");
return ;
}
}
}break;
case 1:{//1 1999 3 28 6543后n天
String str1="^[0-9]{1}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}\\s\\d+";
Pattern p1=Pattern.compile(str1);
Matcher m1=p1.matcher(str);
if(!m1.find()) {
System.out.println("Wrong Format");
return ;
}
else {
Day one=new Day(Integer.parseInt(arry[1]),Integer.parseInt(arry[2]),Integer.parseInt(arry[3]));
boolean c1=one.vaildate();
if(c1) {
DateUtil a=new DateUtil(Integer.parseInt(arry[4]),one);
return;
}
else {
System.out.println("Wrong Format");
return ;
}
}
}
default:System.out.println("Wrong Format");
}
}
}
题目:
使用Java中的字符串处理类以及正则表达式对输入字符串数据进行合法性校验及计算。(具体需求参见附件 2021-OO第04次作业-1指导书V1.0.pdf )
输入格式:
假定分水口门的数据上报时是采用人工输入的方式,每一行代表一个整点时刻的分水数据,各数据之间采用“|”符号进行分隔,每次可以输入多条数据,直到遇到用户输入“exit”为止,每一行输入数据共包含五部分:测量时间、目标水位、实际水位、开度(包含目标开度和实际开度,以“/”分隔)、流量。 各数据格式要求如下:
- 测量时间:格式为“年/月/日 时:分”,其中年份取值范围为[1,9999],“月”与“日”为一位数时之前不加“0”,日期与时间之间有一个空格,“时”与“分”之间采用冒号分隔(英文半角),“时”为一位数时之前不加“0”,“分”始终保持两位,且始终为“00”。注意:“时”数必须是24小时进制中的偶数值。
- 目标水位、实际水位、流量:均为实型数,取值范围为[1,1000), 小数点后保留1-3位小数或无小数(也无小数点)
- 目标开度、实际开度:实型数,取值范围为[1,10),必须保留2位小数,两个开度之间用“/”分隔
输出格式:
- 对输入的数据进行有效性校验,其规则如前所述,如遇到不符合规则的数据,系统应能够给出错误提示,提示规则如下:
- 如果每一行输入数据不是由“|”分隔的五部分,则输出:
Wrong Format Data:输入的数据 - 如果某一部分数据有误,则按如下方式显示:
Row:行号,Column:列号Wrong Format Data:输入的数据其中,行号为输入数的行数(从1开始),列号为6个数据的序号(从1开始,最大为6,顺序参见输入数据结构说明)
- 由于人工输入数据可能存在疏忽,在每一个输入数据两端均可能存在多余的空格,程序应该能够自动过滤这些空格(不报错)。
- 如果用户未输入数据,则直接输出Max Actual Water Level和Total Water Flow的值即可(均为0)
- 若输入无误,则对数据进行如下处理:
- 当实际开度的值大于目标开度时,程序给出如下警告:
Row:1 GateOpening Warning - 求出所输入数据中的最大实际水位值(保留2位小数),输出格式如下: Max Actual Water Level:实际水位值
- 根据每个整点时刻的瞬时流量求出所输入的所有时段的总流量(保留2位小数),其计算公式为(参见作业指导书):
$$p = \sum_{n=1}^N2*60*60*Flow$$
输出格式如下:
Total Water Flow:总流量值
代码实现:
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.*;
class HydrologicalInfo {
private String measureDateTime;
private double objectWaterLevel;//目测水位
private double actualWaterLevel;
private double objectGateOpening;//闸门开度
private double actralGateOpening;
double waterFlow;
public String getMeasureDateTime() {
return measureDateTime;
}
public void setMeasureDateTime(String measureDateTime) {
this.measureDateTime = measureDateTime;
}
public double getObjectWaterLevel() {
return objectWaterLevel;
}
public void setObjectWaterLevel(double objectWaterLevel) {
this.objectWaterLevel = objectWaterLevel;
}
public double getActualWaterLevel() {
return actualWaterLevel;
}
public void setActualWaterLevel(double actualWaterLevel) {
this.actualWaterLevel = actualWaterLevel;
}
public double getObjectGateOpening() {
return objectGateOpening;
}
public void setObjectGateOpening(double objectGateOpening) {
this.objectGateOpening = objectGateOpening;
}
public double getActralGateOpening() {
return actralGateOpening;
}
public void setActralGateOpening(double actralGateOpening) {
this.actralGateOpening = actralGateOpening;
}
public double getWaterFlow() {
return waterFlow;
}
public void setWaterFlow(double waterFlow) {
this.waterFlow = waterFlow;
}
}
class DelaDate {
public DelaDate() {
boolean c=true;;
ArrayList<String>list =new ArrayList<>();
Scanner inpute=new Scanner(System.in);
String data=inpute.nextLine();
if(data==null){
System.out.println("Wrong Format");
return;
}
while(!data.equals("exit")) {
list.add(data);
data=inpute.nextLine();
}
HydrologicalInfo arry1[] =new HydrologicalInfo[list.size()];
for(int i=0;i<list.size();i++) {
c=CheckData(list.get(i),i);
String [] arry=list.get(i).split("\\|");
String [] arry2=arry[3].split("\\/");
HydrologicalInfo T=new HydrologicalInfo();
T.setMeasureDateTime(arry[0]);
T.setObjectWaterLevel(Double.parseDouble(arry[1]));
T.setActualWaterLevel(Double.parseDouble(arry[2]));
T.setObjectGateOpening(Double.parseDouble(arry2[0]));
T.setActralGateOpening(Double.parseDouble(arry2[1]));
T.setWaterFlow(Double.parseDouble(arry[4]));
arry1[i]=T;
}
if(c) {
Checkopen(arry1);
System.out.printf("Max Actual Water Level:%.2f",finMax(arry1));
System.out.println();
System.out.printf("Total Water Flow:%.2f",calculate(arry1));
}
}
public static boolean CheckData(String data,int row){
String [] arry=data.split("\\|");
String str="(^[1-9]{1}[0-9]{0,3})(\\/)((1[0-2])|[1-9])(\\/)((3[0-1])|([12][0-9])|([0-9])) (([02468])|(1[02468])|(2[024]))(:)([0]{2})";
Pattern p1=Pattern.compile(str);
Matcher m1=p1.matcher(arry[0]);
String [] arry3=arry[0].split("\\/");
int n1=Integer.parseInt(arry3[0]);
int n2=Integer.parseInt(arry3[1]);
String [] arry4=arry3[2].split(" ");
int n3=Integer.parseInt(arry4[0]);
boolean c4=judge(n1,n2,n3);
int a=0;
row=row+1;
if(arry.length<5)
{
System.out.println("Wrong Format");
return false;
}
if(!m1.find()||!c4) {
System.out.println("Row:"+row+",Column:1Wrong Format");
a=1;
}
String str5="(((1000)$|(^[0-9]{0,3}))((\\.)([0-9]{0,3}$))|(1000))";
Pattern p2=Pattern.compile(str5);
Matcher m2=p2.matcher(arry[1].replaceAll(" ",""));
Matcher m3=p2.matcher(arry[2].replaceAll(" ",""));
if(!m2.find()) {
System.out.println("Row:"+row+",Column:2Wrong Format");
a=1;
}
if(!m3.find()) {
System.out.println("Row:"+row+",Column:3Wrong Format");
a=1;
}
String[] arry1=arry[3].split("/");
String str3="^([1-9])(\\.)\\d{2}";
Pattern p3= Pattern.compile(str3);
Matcher m4=p3.matcher(arry1[0].replaceAll(" ",""));
Matcher m5=p3.matcher(arry1[1].replaceAll(" ",""));
if(!m4.find()) {
System.out.println("Row:"+row+",Column:4Wrong Format");
a=1;
}
if(!m5.find()) {
System.out.println("Row:"+row+",Column:5Wrong Format");
a=1;
}
Pattern p6=Pattern.compile(str5);
Matcher m6=p6.matcher(arry[4].replaceAll(" ",""));
if(!m6.find()) {
System.out.println("Row:"+row+",Column:6Wrong Format");
a=1;
}
if(a==1) {
System.out.print("Data:"+data);
return false;
}
else
return true;
}
public static double finMax(HydrologicalInfo arry[]) {
double max=0;
for(int i=0;i<arry.length;i++) {
if(arry[i].getActualWaterLevel()>max)
max=arry[i].getActualWaterLevel();
}
return max;
}
public static double calculate(HydrologicalInfo arry[]) {
double sum=0;
for(int i=0;i<arry.length;i++)
sum+=arry[i].getWaterFlow()*2*60*60;
return sum;
}
public static void Checkopen(HydrologicalInfo arry[]) {
for(int i=0;i<arry.length;i++) {
double num=arry[i].getActralGateOpening();
double num1=arry[i].getObjectGateOpening();
if(num>num1) {
System.out.println("Row:"+(i+1)+" GateOpening Warning");
}
}
}
public static boolean judge(int year,int month,int day) {
int arry[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
arry[2]=29;
if(arry[month]<day)
return false;
else
return true;
}
public static boolean isLeapYear(int year) {
if(year%400==0||(year%4==0&&year%100!=0))
return true;
else
return false;
}
}
public class Main{
public static void main(String [] args){
DelaDate a=new DelaDate();
}
}
题目:
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
- Java中共有53个关键字(自行百度)
- 从键盘输入一段源码,统计这段源码中出现的关键字的数量
- 注释中出现的关键字不用统计
- 字符串中出现的关键字不用统计
- 统计出的关键字及数量按照关键字升序进行排序输出
- 未输入源码则认为输入非法
输入格式:
输入Java源码字符串,可以一行或多行,以exit行作为结束标志
输出格式:
- 当未输入源码时,程序输出
Wrong Format - 当没有统计数据时,输出为空
- 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为
数量\t关键字 - 代码实现:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.Map.Entry;public class Main {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
Map<String,Integer> map=new HashMap<>();
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
String word=in.nextLine();
if(word.equals("exit")) break;
else {
word =word.replace(",", " ").replace(".", " ").replace("\"", " ").replace("“", " ").replace("”", " ").replace(";", " ").replace("{"," ").replace("}", " ").replace("("," ").replace(")"," ").replace("+", " ").replace(":", " ").replace("=", " ").replace("<"," ").replace("“", " ").replace("”", " ").replace(";", " ").replace("{"," ").replace("}", " ").replace("("," ").replace(")"," ").replace("+", " ").replace(":", " ").replace("=", " ").replace("<"," ").replace("["," ").replace("]"," ").replace(","," ");
String str1=word+" ";
int num=str1.indexOf("//");
if(num!=-1)
str1=str1.substring(0,num);
String arry[]=str1.split(" ");
for(String a:arry)
list.add(a);
}
}
ArrayList<String> list1=new ArrayList<>();
map.put("abstract", 0);map.put("assert", 0);map.put("boolean", 0);
map.put("break", 0);map.put("byte", 0);map.put("case", 0);
map.put("char", 0);map.put("class", 0);map.put("const", 0);
map.put("double", 0);map.put("enum", 0);map.put("do", 0);
map.put("extends", 0);map.put("false", 0);map.put("final", 0);
map.put("finally", 0);map.put("float", 0);map.put("for", 0);
map.put("goto", 0);map.put("if", 0);map.put("implements", 0);
map.put("import", 0);map.put("instanceof", 0);map.put("int", 0);
map.put("interface", 0);map.put("long", 0);map.put("native", 0);
map.put("new", 0);map.put("null", 0);map.put("package", 0);
map.put("private", 0);map.put("protected", 0);map.put("public", 0);
map.put("return", 0);map.put("short", 0);map.put("static", 0);
map.put("strictfp", 0);map.put("super", 0);map.put("switch", 0);
map.put("synchronized", 0);map.put("this", 0);map.put("throw", 0);
map.put("throws", 0);map.put("try", 0);map.put("void", 0);
map.put("volatile", 0);map.put("transient", 0);map.put("true", 0);
map.put("while", 0);map.put("catch", 0);map.put("else", 0);
map.put("default", 0);map.put("continue", 0);
for(int i=0;i<list.size();i++) {
for(Entry<String, Integer> entry:map.entrySet()) {
int num=(list.get(i).indexOf(entry.getKey()));
if(num!=-1) {
//System.out.println(entry.getKey());
map.put(entry.getKey(),entry.getValue()+1);
int num1=list1.indexOf(entry.getKey());
if(num1==-1)
list1.add(entry.getKey());
}
}
/*if(map.containsKey(list.get(i))) {
map.put(list.get(i),map.get(list.get(i))+1);
int num=list1.indexOf(list.get(i));
if(num==-1)
list1.add(list.get(i));
}*/
}
String [] arry2=list1.toArray(new String[0]);
if(arry2.length==0) {
System.out.println("Wrong Format");
System.exit(0);
}
if(arry2.length==0){
System.out.println();
return;
}
Arrays.sort(arry2);
for(String v: arry2) {
System.out.print(map.get(v)+" ");
System.out.println(v);
}
}
} - 题目:
-
7-5 日期问题面向对象设计(聚合二) (40 分)
参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
![类图.jpg]()
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
- 代码实现:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Year {
private int year;
public Year() {
}
public Year(int value) {
this.year=value;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public boolean isLeapYear() {
if(year%400==0||(year%4==0&&year%100!=0))
return true;
else
return false;
}
public void yearIncrement() {
year++;
}
public void yearReduction() {
year--;
}
}
class Month extends Year{
private int month;
public Month() {
}
public Month(int yearvalue,int monthvalue) {
this.setYear(yearvalue);
this.month=monthvalue;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public void reseMin1() {
this.month=1;
}
public void reseMax1() {
this.month=12;
}
public boolean validate() {
if(getYear()>=1820&&getYear()<=2020&&month<=12&&month>=1)
return true;
else
return false;
}
public void monthIncrement() {
month++;
}
public void monthReduction() {
month--;
}}
class Day extends Month{
private int day;
int mon_maxnum[]= {31,28,31,30,31,30,31,31,30,31,30,31};
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public Day() {
}
public Day(int yearValue,int monthValue,int dayvalue) {
this.setYear(yearValue);
this.setMonth(monthValue);
this.day=dayvalue;
}
public boolean vaildate() {
boolean a=super.validate();
boolean b=super.isLeapYear();
if(b)
mon_maxnum[1]=29;
if(mon_maxnum[this.getMonth()-1]<day||!a||day<=0)
return false;
else
return true;
}
public void reseMin() {
day=1;
}
public void reseMax() {
day=mon_maxnum[this.getMonth()-1];
}
public void dayIncrement() {
day++;
}
public void dayReduction() {
day--;
}
}
class DateUtil{
int [] arry= {0,31,28,31,30,31,30,31,31,30,31,30,31};
public DateUtil(Day one,Day two) { //两日期之差 3// 2014 2 14 2020 1 5
int num=0,i;
Day three =new Day();
three.setYear(one.getYear());
while(three.getYear()<two.getYear()) {
if(three.isLeapYear())
num+=366;
else
num+=365;
three.yearIncrement();
}
int num1=0;
if(one.isLeapYear())
arry[2]=29;
for(i=0;i<one.getMonth();i++)
num1+=arry[i];
arry[2]=28;
if(two.isLeapYear())
arry[2]=29;
for(i=0;i<two.getMonth();i++)
num1-=arry[i];
num1+=one.getDay()-two.getDay();
num-=num1;
System.out.print("The days between "+one.getYear()+"-"+one.getMonth()+"-"+one.getDay()+" and "+two.getYear()+"-"+two.getMonth()+"-"+two.getDay()+" are:"+num);
}
public DateUtil(long n,Day one) { //往后n天 1 1999 3 28 6543
if(one.getMonth()<1||one.getMonth()>12||arry[one.getMonth()]<one.getDay()){
System.out.println("Wrong Format");
return ;
}
long num=n;
Day two=new Day();
two.setYear(one.getYear());
two.setMonth(one.getMonth());
two.setDay(one.getDay());
for(int i=0;i<one.getMonth();i++) {
n+=arry[i];
}
n+=one.getDay();
while(n>=365) {
if(one.isLeapYear()) {
one.yearIncrement();
n-=366;
}
else {
one.yearIncrement();
n-=365;
}
}
one.setMonth(1);
while(n>arry[one.getMonth()]) {
n-=arry[one.getMonth()];
one.monthIncrement();
}
System.out.print(two.getYear()+"-"+two.getMonth()+"-"+two.getDay()+" next "+num+" days"+" is:"+one.getYear()+"-"+one.getMonth()+"-"+n);
}
public DateUtil(Day one,long n) { //往前n天 2 1935 2 17 125340
if(one.getMonth()<1||one.getMonth()>12||arry[one.getMonth()]<one.getDay()){
System.out.println("Wrong Format");
return ;
}
long num=n;
Day two=new Day();
two.setYear(one.getYear());
two.setMonth(one.getMonth());
two.setDay(one.getDay());
for(int i=0;i<one.getMonth();i++) {
n-=arry[i];
}
n-=one.getDay();
while(n>=365) {
if(one.isLeapYear()) {
one.yearReduction();
n-=366;
}
else {
one.yearReduction();
n-=365;
}
}
if(n==0) {
one.setMonth(1);
one.setDay(1);
}
else {
one.yearReduction();
one.setMonth(12);
for(int i=12;arry[i]<n;i--) {
one.monthReduction();
n-=arry[i];
}
one.setDay(arry[one.getMonth()]-(int)n);
}
long c=arry[one.getMonth()]-n;
System.out.print(two.getYear()+"-"+two.getMonth()+"-"+two.getDay()+" previous "+num+" days is:"+one.getYear()+"-"+one.getMonth()+"-"+c);
}
public boolean isLeapYear(int year) {
if(year%400==0||(year%4==0&&year%100!=0))
return true;
else
return false;
}
}
public class Main{
public static void main(String[] args) {
Scanner inpute=new Scanner(System.in);
String str=inpute.nextLine();
String [] arry=str.split(" ");
int x=Integer.parseInt(arry[0]);
switch(x){
case 3:{//3 2014 2 14 2020 6 14
String str1="^[0-9]{1}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}";
Pattern p1=Pattern.compile(str1);
Matcher m1=p1.matcher(str);
if(!m1.find()) {
System.out.println("Wrong Format");
return ;
}
else {
Day one=new Day(Integer.parseInt(arry[1]),Integer.parseInt(arry[2]),Integer.parseInt(arry[3]));
Day two=new Day(Integer.parseInt(arry[4]),Integer.parseInt(arry[5]),Integer.parseInt(arry[6]));
boolean c1=one.vaildate();
boolean c2=two.vaildate();
if(c1==true&&c2==true) {
DateUtil a=new DateUtil(one,two);
}
else {
System.out.println("Wrong Format");
return ;
}
}
}break;
case 2:{//2 1935 2 17 125340前n天
String str1="^[0-9]{1}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}\\s\\d+";
Pattern p1=Pattern.compile(str1);
Matcher m1=p1.matcher(str);
if(!m1.find()) {
System.out.println("Wrong Format");
return ;
}
else {
Day one=new Day(Integer.parseInt(arry[1]),Integer.parseInt(arry[2]),Integer.parseInt(arry[3]));
boolean c1=one.vaildate();
if(c1) {
DateUtil a=new DateUtil(one,Integer.parseInt(arry[4]));
}
else {
System.out.println("Wrong Format");
return ;
}
}
}break;
case 1:{//1 1999 3 28 6543后n天
String str1="^[0-9]{1}\\s[0-9]{4}\\s[0-9]{1,2}\\s[0-9]{1,2}\\s\\d+";
Pattern p1=Pattern.compile(str1);
Matcher m1=p1.matcher(str);
if(!m1.find()) {
System.out.println("Wrong Format");
return ;
}
else {
Day one=new Day(Integer.parseInt(arry[1]),Integer.parseInt(arry[2]),Integer.parseInt(arry[3]));
boolean c1=one.vaildate();
if(c1) {
DateUtil a=new DateUtil(Integer.parseInt(arry[4]),one);
return;
}
else {
System.out.println("Wrong Format");
return ;
}
}
}
default:System.out.println("Wrong Format");
}
}
}

浙公网安备 33010602011771号