一、前言
- 对于我来说,自己学习一门新的语言难度是十分大的,在一边学习一边完成作业的过程中,我学习到了很多关于java语言的使用技巧,但也由于不够熟练而导致作业的完成度不高,对此我只能通过以后的继续学习来增强自己的能力,更好地完成作业。
- PTA的第一次作业总体来说难度系数不是很大,但题量很大。前四题都是考查if else选择结构,拥有C语言的基础,完成起来比较轻松,唯一困难的就是自己学习java的语法。但是从5,6题难度上升,当时也卡了我很久,现在看来其实也没有特别难,只是当时刚接触java,很难想到思路。后面几题除了第十题没太看明白之外,都有一定的思路,但是难以达到想象中的效果。
- 第二次作业题量大,时间紧,总体难度系数有所上涨,主要还是考查if else语句的使用与嵌套,但个别题目我使用了switch结构。更多考查了我们对条件的判断,如第五题和第九题。其中第九题考查了方法的使用。
- 第三次作业题量小,但难度大幅度上升,主要考查了对类的定义设计与使用。
二、设计与分析
挑选个别题目进行分析
-
第一次作业
7-1 计算年利率
输入格式: 输入一个整数。
输出格式: 实际利率=x.xx%
- 思路:使用if else嵌套来完成
源码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args)
{
Scanner a = new Scanner (System.in);
int y=a.nextInt();
double level;
double n=7.7;
if(y>0)
{
if (y<=1)
level=n/2;
else if (y<=3)
level=n*0.7;
else if(y<=5)
level=n;
else level=1.1*n;
System.out.printf("实际利率=");
System.out.printf("%.2f",level);
System.out.print("%");
}
else
System.out.println("error");
}
}
7-2 身体质量指数(BMI)测算
- 思路:同样还是使用if else嵌套来完成
源码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args)
{
Scanner a =new Scanner(System.in);
double w=a.nextDouble();
double h=a.nextDouble();
if(w<0||h<0||w>727||h>2.72)
System.out.println("input out of range");
else{
double BMI=w/(h*h);
if(BMI<18.5)
System.out.println("thin");
else if(BMI<24)
System.out.println("fit");
else if(BMI<28)
System.out.println("overweight");
else System.out.println("fat");
}
}
}
7-3 九九乘法表(双重循环)
打印九九乘法表。
输入格式:一个整数n。
输出格式:乘法表的前n行。
- 思路:使用for循环的嵌套
源码如下:
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner a =new Scanner(System.in); int n=a.nextInt(); if(n>9||n<1) System.out.println("INPUT ERROR."); else { int i,j; for(i=1;i<=n;i++){ for (j=1;j<=i;j++){ if(j!=i) System.out.printf(i+"X"+j+"="+i*j+"\t"); else System.out.printf(i+"X"+j+"="+i*j); } System.out.println(); } } } }
7-5 去掉重复的字符
输入一个字符串,输出将其中重复出现的字符去掉后的字符串
输入格式:一行字符串
输出格式:去掉重复字符后的字符串
- 思路:一开始想了很久也没想出来,后面通过翻书和查阅资料学习了charAt方法及StringBuffer类的attend方法写了出来
源码如下:
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner a=new Scanner(System.in); String b=a.nextLine(); StringBuffer x=new StringBuffer(); int i; for(i=0;i<b.length();i++) { char c=b.charAt(i); if(b.indexOf(c)==i) { x.append(c); } } System.out.println(x); } }
7-7 有重复的数据
输入格式:你的程序首先会读到一个正整数n,n∈[1,100000],然后是n个整数。
输出格式:如果这些整数中存在重复的,就输出:YES
否则,就输出:NO
-
思路:使用了两个for循环进行嵌套,在eclipse上运行没有问题,但在pta上报错,说内存超限或运行超时,不知道如何改进
源码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner a=new Scanner(System.in); int n=a.nextInt(); int[] aa=new int[n]; for(int j=0;j<aa.length;j++) aa[j]=a.nextInt(); int flag=0; for(int i=0;i<aa.length;i++){ for(int j=i+1;j<aa.length;j++) { if(aa[i]==aa[j]) {flag=1;} } } if(flag==1) System.out.printf("YES"); else System.out.printf("NO"); } }
-
第二次作业
7-1 长度质量计量单位换算
长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。
输入格式:两个浮点数,以空格分隔,第一个是质量(以千克为单位)、第二个是长度(以米为单位)。例如:0.45359237 0.0254。
输出格式:两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。
- 思路:乍一看题目好像很简单,但是实则有一个大坑,输出时要强制转换成float类型,否则全错
源码如下:
import java.util.*; public class Main{ public static void main(String[] args) { Scanner input=new Scanner(System.in); double a=input.nextDouble(); double b=input.nextDouble(); double h=a/0.45359237; double l=b/0.0254; System.out.printf((float)h+" "+(float)l); } }
7-2 奇数求和
计算一个数列中所有奇数的和。
输入格式:十个整数,以空格分隔。例如:1 2 3 4 5 6 7 8 9 0。
输出格式:输入数列中所有奇数之和。例如:25。
- 思路:使用for循环输入一个有十个元素的数组,再使用for循环和if语句判断元素的奇偶,如果是奇数就相加
源码如下:
import java.util.*; public class Main{ public static void main(String[] args) { Scanner input=new Scanner(System.in); int[] a=new int[10]; for(int i=0;i<10;i++) a[i]=input.nextInt(); int sum=0; for(int j=0;j<10;j++) { if(a[j]%2!=0) sum+=a[j]; } System.out.println(sum); } }
7-4 游戏角色选择
- 思路:可以使用if else嵌套,也可以使用switch结构,这里我为了简洁选择了switch结构
源码如下:
import java.util.*; public class Main{ public static void main(String[] args) { Scanner input=new Scanner(System.in); int a=input.nextInt(); int b=input.nextInt(); if(a<1||a>4||b<1||b>3) System.out.print("Wrong Format"); else{ switch(a){ case 1: System.out.print("人类 "); break; case 2: System.out.print("精灵 "); break; case 3: System.out.print("兽人 "); break; case 4: System.out.print("暗精灵 "); break; } switch(b){ case 1: System.out.println("战士"); break; case 2: System.out.println("法师"); break; case 3: System.out.println("射手"); break; } } } }
7-5 学号识别
学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号
输入格式:
8位数字组成的学号。例如:18011103
注意:输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入
输出格式:学号每一项的完整说明。例如:
入学年份:2018年
学院:材料学院
班级:11
学号:03
注意:如非法输入,输出“Wrong Format"
- 思路:题目不长,难度不小。一开始我想把学号用数组存储,但我就困在了如何判断数组的两位数上,最后还是换成了字符串来存储,用substring方法来截取字符串的不同位数,同时还使用了equals方法来判断两个字符串是否相等,再进入if else选择。不过判断条件上好像出了一点问题,导致我只能使用最繁琐的方法进行输出,但所幸结果没有太大问题。然而第二个测试点一直过不去,百思不得其解
源码如下:
import java.util.*; public class Main{ public static void main(String[] args) { Scanner input=new Scanner(System.in); String a=input.nextLine(); if (a.length() != 8) System.out.print("Wrong Format"); else{ String yuan=a.substring(2,4); String year = a.substring(0,2); String cls = a.substring(4,6); String number = a.substring(6,8); if(yuan.equals("01")||yuan.equals("02")||yuan.equals("03")||yuan.equals("20")) { if(yuan.equals("01")) { System.out.println("入学年份:20"+year+"年"); System.out.println("学院:材料学院"); System.out.println("班级:"+cls); System.out.println("学号:"+number); } else if(yuan.equals("02")) { System.out.println("入学年份:20"+year+"年"); System.out.println("学院:机械学院"); System.out.println("班级:"+cls); System.out.println("学号:"+number); } else if(yuan.equals("03")) { System.out.println("入学年份:20"+year+"年"); System.out.println("学院:外语学院"); System.out.println("班级:"+cls); System.out.println("学号:"+number); } else if(yuan.equals("04")) { System.out.println("入学年份:20"+year+"年"); System.out.println("学院:软件学院"); System.out.println("班级:"+cls); System.out.println("学号:"+number);} } else System.out.println("Wrong Format"); } } }
7-7 二进制数值提取
在一个字符串中提取出其中的二进制数值序列。
输入格式:
一个由0、1构成的序列,以-1为结束符,非0、1字符视为正常输入,但忽略不计,未包含结束符的序列视为非法输入。例如:abc00aj014421-1
- 思路:一开始以为只是单纯地将0、1提取出来,但仔细一看题目发现了非法输入的要求,才觉得事情不太简单,最后也是使用了charAt方法
源码如下:
import java.util.*; public class Main{ public static void main(String[] args) { Scanner input=new Scanner(System.in); String a=input.nextLine(); int x=a.length(); for(int i=0;i<x;i++) { if(a.charAt(i)=='0'||a.charAt(i)=='1') System.out.print(a.charAt(i)); else if(a.charAt(i)=='-'&&a.charAt(i+1)=='1') break; if(a.charAt(i)=='-'&&a.charAt(i+1)!='1') System.out.println("Wrong Format"); } } }
7-8 判断三角形类型
输入三角形三条边,判断该三角形为什么类型的三角形。
- 思路:使用了if else嵌套选择
源码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner x=new Scanner(System.in); double a,b,c,temp; a=x.nextFloat();b=x.nextFloat();c=x.nextFloat(); if(a>b){ temp=a;a=b;b=temp; } if(a>c){ temp=a;a=c;c=temp; } if(b>c){ temp=b;b=c;c=temp; } if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200){ if(a+b>c){ if(a==b&&b==c) System.out.println("Equilateral triangle"); else if(a*a+b*b-c*c<0.000001&&a==b) System.out.println("Isosceles right-angled triangle"); else if((a==b&&a!=c)||(a==c&&a!=b)||(b==c&&b!=a)) System.out.println("Isosceles triangle"); else if(a*a+b*b-c*c<0.000001) System.out.println("Right-angled triangle"); else System.out.println("General triangle"); } else System.out.println("Not a triangle"); } else System.out.println("Wrong Format"); } }
7-9 求下一天
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
要求:Main类中必须含有如下方法,签名如下:
public static void main(String[] args);//主方法
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输入日期的下一天
- 思路:这道题还真是不简单,也是第一次接触到java中的方法,其实和C语言的函数是类似的,但是还是学习了一段时间。闰年的判断很简单,做过很多次了,难就难在对于下一天的判断上,要考虑多种特殊情况。思考了很久,还是决定随大流,使用数组来存放每月的天数。PTA上的答案是阉割版,这里我放出修改过后的正确代码
源码如下:
import java.util.*; public class Main{ public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner input=new Scanner(System.in); int year=input.nextInt(); int month=input.nextInt(); int day=input.nextInt(); if(checkInputValidity(year,month,day)) nextDate(year,month,day); else System.out.println("Wrong Format"); } public static boolean isLeapYear(int year) { boolean y; y = ((year % 4 == 0 && year % 100 !=0 )||year % 400 == 0); return y; } public static boolean checkInputValidity(int year, int month, int day) { boolean x; int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; if(!isLeapYear(year)) a[2] = 28; x=(year>=1820&&year<=2020&&month>0&&month<=12&&day<=a[month]&&day>0); return x; } public static void nextDate(int year,int month,int day) { int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; if(!isLeapYear(year)) a[2] = 28; if(checkInputValidity(year,month,day)) { if(month==12) { if(day==a[month]) { year = year+1; month=1; day=1; } else{ day++; } } else { if(day==a[month]) { month++; day=1; } else{ day++; } } System.out.println("Next date is:"+year+"-"+month+"-"+day); } else System.out.println("Date Format is Wrong"); } }
-
第三次作业
终于到了激动人心的类环节,这玩意可不简单啊
7-1 创建圆形类
编写一个圆形类Circle,一个私有实型属性半径,要求写出带参数构造方法、无参构造方法、属性的getter、setter方法以及求面积、输出数据等方法,具体格式见输入、输出样例。
- 思路:根据类的定义写出
源码如下:
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner input=new Scanner(System.in); Main a=new Main(); a.setRadius(input.nextDouble()); if(a.getRadius()<0) System.out.print("Wrong Format"); else { System.out.printf("The circle's radius is:%.2f",(float)a.getRadius()); System.out.println(""); System.out.printf("The circle's area is:%.2f",(float)a.getArea()); } } private double radius; public double getRadius() { return this.radius; } public void setRadius(double r) { this.radius=r; } public double getArea() { double r=this.radius; return r*r*Math.PI; } public Main(double r) { this.radius=r; } public Main() { } }
7-2 创建账户类Account
- 思路:这道题还是考到了float类型强制转换,以及条件的判断,难度不是很大,但是比较繁琐
源码如下:
import java.time.LocalDate; import java.util.*; public class Main { static Scanner input=new Scanner(System.in); private int id=0; private double balance=0; private double annuallnterestRate=0; private LocalDate dateCreated ; public Main(){} public Main(int id,double balance){ this.id = id; this.balance = balance; } public int getId() { return this.id; } public void setId(int id){ this.id=id; } public void setBalance(double balance) { this.balance=balance; } public double getBalance() { return this.balance; } public void setannuallnterestRate(double annuallnterestRate) { this.annuallnterestRate=annuallnterestRate; } public double getannuallnterestRate() { return this.annuallnterestRate; } public LocalDate getDateCreated() { return this.dateCreated; } public double getMonthlyInterestRate(){ return this.balance*(this.annuallnterestRate/1200); } public double withDraw(double count){ this.balance=balance-count; return this.balance; } public double deposit(double count){ this.balance=balance+count; return this.balance; } public static void main(String[] args) { Main a = new Main(); a.setId(input.nextInt()); a.setBalance(input.nextDouble()); a.setannuallnterestRate(input.nextDouble()); double x=input.nextDouble(); if(x<0||x>a.getBalance()) { System.out.println("WithDraw Amount Wrong");} else { a.withDraw(x);} double y=input.nextDouble(); if(y>20000||y<0) { System.out.println("Deposit Amount Wrong");} else {a.deposit(y);} System.out.printf("The Account'balance:%.2f",(float)a.getBalance()); System.out.println(); System.out.printf("The Monthly interest:%.2f",(float)a.getMonthlyInterestRate()); System.out.println(); System.out.println("The Account'dateCreated:2020-07-31"); } }
7-3 定义日期类
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
- 思路:其实这道题很眼熟啊,就是第二次作业的第九题,只不过上次只要求写方法,这次要求写类,事实上还是大差不差,直接上源码
源码如下:
import java.util.Scanner; class Date{ private int year; private int month; private int day; public Date(int year,int month,int day){ this.year=year; this.month=month; this.day=day; } public Date() { int year,month,day; } public int getYear(){ return year; } public int getMonth() { return month; } public int getDay() { return day; } public void setYear(int year) { this.year = year; } public void setMonth(int month) { this.month = month; } public void setDay(int day) { this.day = day; } public static boolean isLeapYear(int year) { boolean y; y = ((year % 4 == 0 && year % 100 !=0 )||year % 400 == 0); return y; } public static boolean checkInputValidity(int year, int month, int day) { boolean x; int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; if(!isLeapYear(year)) a[2] = 28; x=(year>=1900&&year<=2000&&month>0&&month<=12&&day<=a[month]&&day>0); return x; } public static void getnextDate(int year,int month,int day) { int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; if(!isLeapYear(year)) a[2] = 28; if(checkInputValidity(year,month,day)) { if(month==12) { if(day==a[month]) { year = year+1; month=1; day=1; } else{ day++; } } else { if(day==a[month]) { month++; day=1; } else{ day++; } } System.out.println("Next day is:"+year+"-"+month+"-"+day); } else System.out.println("Date Format is Wrong"); } } public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); Date a=new Date(); a.setYear(input.nextInt()); a.setMonth(input.nextInt()); a.setDay(input.nextInt()); a.getnextDate(a.getYear(), a.getMonth(),a.getDay()); } }
7-4 日期类设计
参考题目3和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31]
- 思路:毫不夸张,最难的一题,当时根本做不出来,最开始看到这个感觉特别复杂,实际上也确实复杂,需要判断很多东西,首先要设置一个数字对每一个月份的天数进行一个定义,其次要判断年份是否为闰年,因为闰年的二月有29天,再对输入的日期根据题目所给范围进行一个合法性的一个判断,每次年份进行加减时都需要重新判断并且对月份的数组进行更改,对于当前日期的后几天和前几天的一个日期输出,先要根据所给的n天进行年,月的越界的一个判断,如果超过当前日期到下一年或上一年的天数,则需要对下一年或上一年进行判断闰年与否,再对n减去该天数所剩下的日子进行年,月的判断,若小于一年,则从1月(前几天的话就是12月)开始逐个月份的去删减直至n为0,最后得到最终的答案。而两个日期相差的天数跟上面几乎是一样的,首先判断是否是同一年,若是,则从小的日期计算到下一年的日子,再判断是否年大于1,是则判断闰年与否进行增加天数(365或355)直至加至同一年,再判断月份之间的差距和天数的差距。下面放上更改过后的正确代码
源码如下:(太长了所以折叠一下)
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() + "-" + date.getMonth() + "-" + date.getDay() + " 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() + "-" + date.getMonth() + "-" + date.getDay() + " 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 DateUtil{ private int day; private int month; private int year; public DateUtil(int year,int month,int day) { this.day = day; this.month = month; this.year = year; } public int getYear() { return year; } public int getDay() { return day; } public int getMonth() { return month; } public boolean checkInputValidity() { boolean a; int[] n = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)) { n[2] = 29; } if(year>=1820&&year<=2020&&month>0&&month<=12&&day<=n[month]&&day>0) { a = true; } else { a = false; } return a; } public static boolean isLeapYear(int year) //判断year是否为闰年,返回boolean类型; { if((year%4 == 0&&year%100 != 0)||(year%400 == 0)) return true; else return false; } public DateUtil getPreviousNDays(int n) { int[] m = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int day1 = day; int month1 = month; int year1 = year; int k; if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { k = 365; } int a = 0; for(int i=1;i<month;i++) { a = a + m[i]; } a = a + day; if(n>a) { n = n-a; year1 = year1-1; month1 = 12; day1 = 31; if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { k = 365; } while(n-k>0) { n = n-k; year1 = year1-1; if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { k = 365; } } while(n>m[month1]) { n -=m[month1]; month1 = month1-1; } day1 =m[month1]-n; } else { if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { k = 365; } if(n>day1) { n = n-day1; month1 = month1-1; while(n>m[month1]) { n = n-m[month1]; month1 = month1-1; } day1 =m[month1]-n; } else { day1 = day1 - n; } } DateUtil beforedate = new DateUtil(year1, month1, day1); return beforedate; } public DateUtil getNextNDays(int n) { int[] m = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int day1 = day; int month1 = month; int year1 = year; int k; int a = 0; if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { k = 365; } for(int i=1;i<month;i++) { a = a + m[i]; } a = a + day; if(n>k-a) { n = n-(k-a); year1++; month1 = 1; day1 = 1; if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { k = 365; m[2] = 28; } while(n-k>0) { n = n-k; year1 ++; if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { k = 365; m[2] = 28; } } while(n>m[month1]) { n -= m[month1]; month1++; } day1 = n; } else { if(isLeapYear(year1)) { k = 366; m[2] = 29; } else { m[2] = 28; k = 365; } if(n>m[month1]-day1) { n = n-(m[month1]-day1); month1 ++; while(n>m[month1]) { n = n-m[month1]; month1++; } day1 = n; } else { day1 = day1 + n; } } DateUtil nextdate = new DateUtil(year1, month1, day1); return nextdate; } public int getDaysofDates(DateUtil toDate) { boolean b = equalTwoDates(toDate); boolean a = compareDates(toDate); int[] m = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int duringday = 0; int k1; if(b) { duringday = 0; } else { if(a) { if(year<toDate.year) { if(isLeapYear(year)) { k1 = 366; m[2] = 29; } else { k1 = 365; } for(int i=1;i<month;i++) { duringday +=m[i]; } duringday += day; duringday = k1-duringday; while(toDate.year-year>1) { year++; if(isLeapYear(year)) { k1 = 366; } else { k1 = 365; } duringday +=k1; } if(isLeapYear(toDate.year)) { m[2] = 29; } else { m[2] = 28; } for(int i=1;i<toDate.month;i++) { duringday = duringday + m[i]; } duringday +=toDate.day ; } else { if(isLeapYear(year)) { m[2] = 29; } else { m[2] = 28; } if(month<toDate.month) { duringday = m[month]-day; while(toDate.month-month>1) { month++; duringday +=m[month]; } duringday +=toDate.day; } else { duringday = toDate.day-day; } } } else { if(year>toDate.year) { if(isLeapYear(toDate.year)) { k1 = 366; m[2] = 29; } else { k1 = 365; } for(int i=1;i<toDate.month;i++) { duringday = duringday + m[i]; } duringday = duringday + toDate.day; duringday = k1-duringday; while(year-toDate.year>1) { toDate.year++; if(isLeapYear(toDate.year)) { k1 = 366; } else { k1 = 365; } duringday +=k1; } if(isLeapYear(year)) { m[2] = 29; } else { m[2] = 28; } for(int i=1;i<month;i++) { duringday = duringday + m[i]; } duringday +=day ; } else { if(isLeapYear(year)) { m[2] = 29; } else { m[2] = 28; } if(month>toDate.month) { duringday = m[toDate.month]-toDate.day; while(month-toDate.month>1) { toDate.month++; duringday +=m[toDate.month]; } duringday +=day; } else { duringday =day-toDate.day; } } } } return duringday; } public String showDate() { String str1 = ""+year+"-"+month+"-"+day; return str1; } public boolean equalTwoDates(DateUtil date) { if(date.year==year&&date.day==day&&date.month==month) { return true; } else { return false; } } public boolean compareDates(DateUtil date) { if(year>date.year) { return false; } else if(year<date.year){ return true; } else { if(month>date.month) { return false; } else if(month<date.month) { return true; } else { if(day>date.day) { return false; } else { return true; } } } } }
三、踩坑心得
虽然题量总的来说并不大,但是我踩过的坑还真不少。从一开始的格式错误,再到题目故意埋的陷阱,比如输出时的强制转换(float转换),具体条件的判断(点名批评日期类的题目),这些坑我都一个个踩了个遍。总结出来的心得就是做题时一定要细心,仔细看好题目的要求,是要几位小数,或者有什么固定格式,有时候就是因为急急忙忙做题没看清楚,才导致做了七八遍都是错误。而且遇到不会的题目一定要自己主动翻阅书籍,学习不同的方法来更简洁地完成题目,比如求绝对值的方法,比较字符串的方法,添加字符的方法,掌握更多的方法对于我们完成题目是非常有利的。并且一定要注意方法名中的大小写格式,避免报错。、
四、改进建议
1. 规范命名。一开始总是为了方便,用abc命名变量和方法,但是后面变量和方法多了之后很容易弄混,这就体现了规范命名的重要性。
2. 更多地使用方法,防止语句冗长。
3. 熟练掌握类的书写,方便后续阅读代码。
五、总结
通过这几次作业,让我从一窍不通到对java有了更深的理解,并且对面向对象有了一定的认识,更精进了自学的技巧,对以后的学习有很大的帮助作用。
第一次作业让我对java有了初步认识,通过自主学习,了解了java的语法,并且发现了与C语言的共通之处,方便上手。第二次作业主要考查了对方法的定义和使用,还有对于代码的严谨性,让我认识到了细心的重要。第三次作业让我们学会了类的使用,对面向对象程序设计也有了属于自己的理解。但是,我的缺点很明显集中在思维能力不足,还有不懂得如何具体用代码实现需求上。很多时候有一个想法雏形,但是不知道如何让想法变成现实。这就说明了我的知识储备还是不够,仍旧需要自发学习,填补这方面的空缺。同时,我也希望老师能够讲解一下某些难题,教授一些正确方法。