BLOG-1
一、前言
大一下学期开始学Java这门课程,因为刚开始学Java,所以有很多不懂的地方,代码也写的比较混乱,逻辑性差。个人感觉Java比c语言要更难一些,Java和c语言也有很大的区别。c语言核心为数据结构+算法,c语言是面向过程的语言,执行效率高;而Java是面向对象的语言,执行效率没有c语言高。
但是面向对象有以下优点:
1.可复用性(保证低耦合)
2.可扩展性(功能可扩展)
3.可维护性
语言介绍:Java是一门面向对象的编程语言,被设计用于互联网的分布式环境。Java具有类似于C++语言的“形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种“以对象为导向”的方式。Java具有三大特性,分别是封装性,继承和多态。
Java开发工具:可以使用Windows记事本或写字板创建Java程序,之后从命令窗口编译、运行程序,也可以使用Eclipse编译器进行编译。
二、总结题目集1-3
(1)前言:
1.题目集01共有9道题目,主要考察的是Java语言的基础,包括输入,输出,浮点数的使用,数组求和,分情况讨论,字符串等知识点,难度不算特别难,还可以接受。
2.题目集02共有3道题目,但是难度相对于01有很大的提升,主要考察字母-数字转换,字符串的使用以及不同类型的输出。
3.题目集03共有四道题目,我个人感觉难度直接上升了一大截,主要考察用Java中的“类"来解决问题。
总体来说考察的知识点为Java的基本语法和Java对象间的基本关系。
(2)设计与分析:
1.题目集2:7-2 串口字符解析:RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
设计思路:当程序判断到第一个0时,开始接受数据,从0开始,连续读入10位数字,倒数第二位为奇偶效验位,最后一位为结束位。其次,判断是否符合题目要求,若数据不足11位或者输入数据全1没有起始位,则输出"null data",若某个数据的结束符不为1,则输出“validate error”。若某个数据奇偶校验错误,则输出“parity check error”。若数据结束符和奇偶校验均不合格,输出“validate error”。
import java.util.Scanner; public class Main{ public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner in=new Scanner(System.in); String s=in.nextLine(); int n=0; int count=1; int l=0; int m=0; for(int i=0;i<s.length();i++) { if(l==0) { if(s.charAt(i)=='0') { m=1; int j=i; if(s.length()-i<11) { System.out.print("null data"); System.exit(0); } else { int k=i+8; int sum=0; for(;j<k;j++) { if(s.charAt(j+1)=='0') { sum=sum+1; } } if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)=='1') { System.out.println(count+":"+"parity check error"); i=i+10; } else if(s.charAt(i+10)!='1'&&((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1'))) { System.out.println(count+":"+"validate error"); i=i+10; } else if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)!='1') { System.out.println(count+":"+"validate error"); i=i+10; } else if(((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1'))&&s.charAt(i+10)=='1') { System.out.println(count+":"+s.substring(i+1,i+9)); i=i+10; } count=count+1; l=1; } } } else if(l==1) { if(s.charAt(i)=='0') { int j=i; if(s.length()-i<11) { System.exit(0); } else { int k=i+8; int sum=0; for(;j<k;j++) { if(s.charAt(j+1)=='0') { sum=sum+1; } } if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)=='1') { System.out.println(count+":"+"parity check error"); i=i+10; } else if(s.charAt(i+10)!='1'&&((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1'))) { System.out.println(count+":"+"validate error"); i=i+10; } else if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)!='1') { System.out.println(count+":"+"validate error"); i=i+10; } else if(((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1'))&&s.charAt(i+10)=='1') { System.out.println(count+":"+s.substring(i+1,i+9)); i=i+10; } count=count+1; } } } } if(m==0) System.out.print("null data"); } }
2.题目集3:7-1 用类解一元二次方程式:定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),类中定义的方法参考main方法中的代码。
设计思路:
1.题目已经给出主函数main,需要设计一个类QuadraticEquation,在类中补充Getter、Setter、return等方法的代码。
2.设置三个私有属性a、b、c
Scanner in = new Scanner(System.in); private double a; private double b; private double c; public QuadraticEquation(double a, double b, double c) { this.a=a; this.b=b; this.c=c;
public double getA() { // TODO 自动生成的方法存根 return a; } public double getB() { // TODO 自动生成的方法存根 return b; } public double getC() { // TODO 自动生成的方法存根 return c; }
3.在求根的方法中写出求出跟root1和跟root2的代码,运用求根公式
public Object getRoot1() { double Root1=(-b+Math.sqrt((b*b-4*a*c)))/(2*a); return Root1; } public Object getRoot2() { double Root2=(-b-Math.sqrt((b*b-4*a*c)))/(2*a); return Root2; }
4.注意输出格式,完整代码如下
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner input = new Scanner(System.in); double a = Double.parseDouble(input.next()); double b = Double.parseDouble(input.next()); double c = Double.parseDouble(input.next()); if(a == 0){ System.out.println("Wrong Format"); System.exit(0); } //create a QuadraticEquation object QuadraticEquation equation = new QuadraticEquation(a, b, c); //get value of b * b - 4 * a * c double discriminant = equation.getDiscriminant(); System.out.println("a=" + equation.getA() + ",b=" + equation.getB() + ",c=" + equation.getC()+":"); if (discriminant < 0) { System.out.println("The equation has no roots."); } else if (discriminant == 0) { System.out.println("The root is " + String.format("%.2f", equation.getRoot1())); } else // (discriminant >= 0) { System.out.println("The roots are " + String.format("%.2f", equation.getRoot1()) + " and " + String.format("%.2f", equation.getRoot2())); } } } class QuadraticEquation{ Scanner in = new Scanner(System.in); private double a; private double b; private double c; public QuadraticEquation(double a, double b, double c) { this.a=a; this.b=b; this.c=c; // TODO 自动生成的构造函数存根 } public double getDiscriminant() { double getDiscriminant; getDiscriminant=b*b-4*a*c; return getDiscriminant; } public double getA() { // TODO 自动生成的方法存根 return a; } public double getB() { // TODO 自动生成的方法存根 return b; } public double getC() { // TODO 自动生成的方法存根 return c; } public Object getRoot1() { double Root1=(-b+Math.sqrt((b*b-4*a*c)))/(2*a); return Root1; } public Object getRoot2() { double Root2=(-b-Math.sqrt((b*b-4*a*c)))/(2*a); return Root2; } }
类图:

3.题目集3:7-2 日期类设计
参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:
public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
设计思路:
1.题目已经给出主函数main,需要设计一个类DateUtil,在类中通过不同的方法来实现不同的功能。
2.首先设置三个私有属性year、month、day等
3.其次,在不同的方法中填写符合功能的代码
public boolean checkInputValidity();//检测输入的年、月、日是否合法 public boolean isLeapYear(int year);//判断year是否为闰年 public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期 public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期 public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后) public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等 public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数 public String showDate();//以“year-month-day”格式返回日期值
4.最后注意题目要求输出的格式,控制好格式问题,完整代码如下
private int year; private int month; private int day; int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; int []b=new int[] {0,31,29,31,30,31,30,31,31,30,31,30,31}; public int getYear() { return year; } public int getMonth() { return month; } public int getDay() { return day; } public DateUtil(int year, int month, int day) { this.year=year; this.month=month; this.day=day; }
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 year; private int month; private int day; int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; int []b=new int[] {0,31,29,31,30,31,30,31,31,30,31,30,31}; public int getYear() { return year; } public int getMonth() { return month; } public int getDay() { return day; } public DateUtil(int year, int month, int day) { this.year=year; this.month=month; this.day=day; } public boolean isLeapYear(int year){ if((year%4==0&&year%100!=0)||(year%400==0)) { return true; } else { return false; } } public boolean checkInputValidity() { int year=this.year; int month=this.month; int day=this.day; if((year>=1820&&year<=2020)&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&(day>=1&&day<=31)) { return true; } else if((year>=1820&&year<=2020)&&(month==4||month==6||month==9||month==11)&&(day>=1&&day<=30)) { return true; } else if((year>=1820&&year<=2020)&&month==2&&(day>=1&&day<=29)&&((year%4==0&&year%100!=0)||(year%400==0))) { return true; } else if((year>=1820&&year<=2020)&&month==2&&(day>=1&&day<=28)&&((year%4!=0||year%100==0)||(year%400!=0))) { return true; } else { return false; } } public DateUtil getNextNDays(int m) { int year=this.year; int month=this.month; int day=this.day; int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } for(int i=0;i<m;i++) { day=day+1; if(day>a[month]) { day=1; month++; if(month>12) { month=1; year=year+1; if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } else { a[2]=28; } } } } return new DateUtil(year, month, day); } public DateUtil getPreviousNDays(int n) { int year=this.year; int month=this.month; int day=this.day; int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } int j=0; for(j=0;j<n;j++) { day=day-1; if(day<1) { month=month-1; day=a[month]; if(month<1) { year=year-1; month=12; day=31; if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } else { a[2]=28; } } } } return new DateUtil(year, month, day); } public boolean compareDates(DateUtil date) { if(year>date.year) { return true; } else if((year==date.year)&&(month>date.month)) { return true; } else if(((year==date.year)&&(month==date.month))&&(day>date.day)) { return true; } else { return false; } } public boolean equalTwoDates(DateUtil date)//判断两个日期是否相等 { if(((year==date.year)&&(month==date.month))&&(day==date.day)) { return true; } else { return false; } } public String showDate() { return year+"-"+month+"-"+day; } public int getDaysofDates(DateUtil toDate) { int days=0; for(int i=year;i<toDate.year;i++) { if((i%4==0&&i%100!=0)||(i%400==0)) { days=days+366; } else { days=days+365; } } for(int j=1;j<toDate.month;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10) { days=days+31; } else if(j==4||j==6||j==9||j==11) { days=days+30; } else if(j==2&&((toDate.year%4==0&&toDate.year%100!=0)||(toDate.year%400==0))) { days=days+29; } else { days=days+28; } } days=days+toDate.day; int dayss=0; for(int k=1;k<month;k++) { if(k==1||k==3||k==5||k==7||k==8||k==10) { dayss=dayss+31; } else if(k==4||k==6||k==9||k==11) { dayss=dayss+30; } else if(k==2&&((year%4==0&&year%100!=0)||(year%400==0))) { dayss=dayss+29; } else { dayss=dayss+28; } } dayss=dayss+day; return (days-dayss); } }
类图:

4.7-3 日期问题面向对象设计(聚合一)参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
设计思路:
1.首先,题目给出了设计类图,跟第二题的不同点在于第二题为设计一个类,而第三题设计如下几个类:DateUtil、Year、Month、Day
2.分别设置这四个类,再根据题目要求,在相应的类中完成算法
3.注意年月日的界限
4.注意输出格式,完整代码如下
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 DateUtil{ int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; private Day day; private Year year; private Month month; public DateUtil(int year, int month, int day) { this.year=new Year(year); this.month=new Month(month); this.day=new Day(day); } 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.value=1; } public void setDayMax() { day.value=a[month.value]; } public boolean compareDates(DateUtil date) { if(year.value>date.year.value) { return true; } else if((year.value==date.year.value)&&(month.value>date.month.value)) { return true; } else if(((year.value==date.year.value)&&(month.value==date.month.value))&&(day.value>date.day.value)) { return true; } else { return false; } } public boolean equalTwoDates(DateUtil date)//判断两个日期是否相等 { if(((year.value==date.year.value)&&(month.value==date.month.value))&&(day.value==date.day.value)) { return true; } else { return false; } } public boolean checkInputValidity() { if((year.value>=1900&&year.value<=2050)&&(month.value==1||month.value==3||month.value==5||month.value==7||month.value==8||month.value==10||month.value==12)&&(day.value>=1&&day.value<=31)) { return true; } else if((year.value>=1900&&year.value<=2050)&&(month.value==4||month.value==6||month.value==9||month.value==11)&&(day.value>=1&&day.value<=30)) { return true; } else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=29)&&((year.value%4==0&&year.value%100!=0)||(year.value%400==0))) { return true; } else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=28)&&((year.value%4!=0||year.value%100==0)||(year.value%400!=0))) { return true; } else { return false; } } public String showDate() { return year.value+"-"+month.value+"-"+day.value; } public int getDaysofDates(DateUtil toDate) { if (compareDates(toDate)) { int y,m,d; y=toDate.year.value; m=toDate.month.value; d=toDate.day.value; toDate.year.setValue(year.value); toDate.month.setValue(month.value); toDate.day.setValue(day.value); year.setValue(y); month.setValue(m); day.setValue(d); } int days=0; for(int i=this.getYear().value;i<toDate.getYear().value;i++) { if((i%4==0&&i%100!=0)||(i%400==0)) { days=days+366; } else { days=days+365; } } for(int j=1;j<toDate.getMonth().value;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10) { days=days+31; } else if(j==4||j==6||j==9||j==11) { days=days+30; } else if(j==2&&((toDate.getYear().value%4==0&&toDate.getYear().value%100!=0)||(toDate.getYear().value%400==0))) { days=days+29; } else { days=days+28; } } days=days+toDate.getDay().value; int dayss=0; for(int k=1;k<this.getMonth().value;k++) { if(k==1||k==3||k==5||k==7||k==8||k==10) { dayss=dayss+31; } else if(k==4||k==6||k==9||k==11) { dayss=dayss+30; } else if(k==2&&((this.getYear().value%4==0&&this.getYear().value%100!=0)||(this.getYear().value%400==0))) { dayss=dayss+29; } else { dayss=dayss+28; } } dayss=dayss+this.getDay().value; return (days-dayss); } public DateUtil getNextNDays(int m) { int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; if((year.value%4==0&&year.value%100!=0)||(year.value%400==0)) { a[2]=29; } for(int i=0;i<m;i++) { day.value=day.value+1; if(day.value>a[month.value]) { day.value=1; month.value=month.value+1; if(month.value>12) { month.value=1; year.value=year.value+1; if((year.value%4==0&&year.value%100!=0)||(year.value%400==0)) { a[2]=29; } else { a[2]=28; } } } } return new DateUtil(year.value,month.value,day.value); } public DateUtil getPreviousNDays(int n) { int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; if((year.value%4==0&&year.value%100!=0)||(year.value%400==0)) { a[2]=29; } int j=0; for(j=0;j<n;j++) { day.value=day.value-1; if(day.value<1) { month.value=month.value-1; day.value=a[month.value]; if(month.value<1) { year.value=year.value-1; month.value=12; day.value=31; if((year.value%4==0&&year.value%100!=0)||(year.value%400==0)) { a[2]=29; } else { a[2]=28; } } } } return new DateUtil(year.value, month.value, day.value); } } class Year{ int value; public Year() {} public Year(int value) { super(); 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>=1820&&value<=2020) { return true; } else { return false; } } public void yearIncrement(){ value=value+1; } public void yearReduction(){ value=value-1; } } class Month{ int value; public Month(int value) { super(); this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } 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=value+1; } public void monthReduction(){ value=value-1; } } class Day{ public Day(int value) { super(); this.value = value; } int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } public void dayIncrement(){ value=value+1; } public void dayReduction(){ value=value-1; } }
类图:

三、踩坑心得
(1)7-2 串口字符解析
1.长度不足11位或者输入数据全1没有起始位,通过控制字符串的长度来达到要求,需要注意,当长度不足11位时是不需要输出的,只有数据满了11位时才会判断数据格式是否错误
if(s.length()<11) { System.out.print("null data"); System.exit(0); } for(i=1;i<s.length();i++) { if(s.charAt(i)!=0) { System.out.print("null data"); System.exit(0); } }

(2)7-1 用类解一元二次方程式
1.;两个实数根时,测试点未通过。

原因:没有+根号,公式运用错误,将跟root1和跟root2改正,添加Math.sqrt()
public Object getRoot1() { double Root1=(-b+Math.sqrt((b*b-4*a*c)))/(2*a); return Root1; } public Object getRoot2() { double Root2=(-b-Math.sqrt((b*b-4*a*c)))/(2*a); return Root2; }

(3).7-2 日期类设计
1.下n天的测试值错误

int i=0; for(i=0;i<m;i++) { day=day+1; if(day==a[month]) { day=1; month=month+1; } }
原因:在临界出思路出现了问题,应该在day大于当月最大日期后,day=1,month+1,以下为改正后的代码
for(int i=0;i<m;i++) { day=day+1; if(day>a[month]) { day=1; month++; } }

2.前n天测试错误
.
if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } int j=0; for(j=0;j<n;j++) { day=day-1; if(day<1) { month=month-1; day=a[month]; if(month<1) { year=year-1; month=12; day=31; if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } else { a[2]=28; } } } System.out.println(year+"-"+month+"-"+day); } return new DateUtil(year, month, day);
原因:多输出了一次System.out.println(year+"-"+month+"-"+day);导致结果不正确,所以这句话应该删除,将上面更改为下图的
if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } int j=0; for(j=0;j<n;j++) { day=day-1; if(day<1) { month=month-1; day=a[month]; if(month<1) { year=year-1; month=12; day=31; if((year%4==0&&year%100!=0)||(year%400==0)) { a[2]=29; } else { a[2]=28; } } } } return new DateUtil(year, month, day);

3.天数差计算出错

for(int j=1;j<toDate.month;j++) { if(j==1&&j==3&&j==5&&j==7&&j==8&&j==10) { days=days+31; } else if(j==4&&j==6&&j==9&&j==11) { days=days+30; } else if(j==2&&((toDate.year%4==0&&toDate.year%100!=0)||(toDate.year%400==0))) { days=days+29; } else { days=days+28; } }
for(int k=1;k<month;k++) { if(k==1||k==3||k==5||k==7||k==8||k==10) { dayss=dayss+31; } else if(k==4||k==6||k==9||k==11) { dayss=dayss+30; } else if(k==2&&((year%4==0&&year%100!=0)||(year%400==0))) { dayss=dayss+29; } else { dayss=dayss+28; } dayss=dayss+day; } return (days-dayss);
错误原因1:&&与||符号整混了,if(j==1&&j==3&&j==5&&j==7&&j==8&&j==10)和else if(j==4&&j==6&&j==9&&j==11),在此处应该为||而不是&&,因为这些月份的天数都为31或者30
错误原因2;套错循环,dayss=dayss+day;应在外层循环
同时也需要注意数组超界的问题,可以先判断月份,再判断日期是否合法,减少出错的情况。
更正后的代码如下
if(j==1||j==3||j==5||j==7||j==8||j==10) { days=days+31; } else if(j==4||j==6||j==9||j==11) { days=days+30; } else if(j==2&&((toDate.year%4==0&&toDate.year%100!=0)||(toDate.year%400==0))) { days=days+29; } else { days=days+28; }
for(int k=1;k<month;k++) { if(k==1||k==3||k==5||k==7||k==8||k==10) { dayss=dayss+31; } else if(k==4||k==6||k==9||k==11) { dayss=dayss+30; } else if(k==2&&((year%4==0&&year%100!=0)||(year%400==0))) { dayss=dayss+29; } else { dayss=dayss+28; } } dayss=dayss+day; return (days-dayss);

(4)7-3 日期问题面向对象设计(聚合一)
1.日期间隔测试错误

public int getDaysofDates(DateUtil toDate) { if (compareDates(toDate)) { int y,m,d; y=toDate.year.value; m=toDate.month.value; d=toDate.day.value; toDate.year.setValue(year.value); toDate.month.setValue(month.value); toDate.day.setValue(day.value); } int days=0; for(int i=this.getYear().value;i<toDate.getYear().value;i++) { if((i%4==0&&i%100!=0)||(i%400==0)) { days=days+366; } else { days=days+365; } } for(int j=1;j<toDate.getMonth().value;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10) { days=days+31; } else if(j==4||j==6||j==9||j==11) { days=days+30; } else if(j==2&&((toDate.getYear().value%4==0&&toDate.getYear().value%100!=0)||(toDate.getYear().value%400==0))) { days=days+29; } else { days=days+28; } } days=days+toDate.getDay().value; int dayss=0; for(int k=1;k<this.getMonth().value;k++) { if(k==1||k==3||k==5||k==7||k==8||k==10) { dayss=dayss+31; } else if(k==4||k==6||k==9||k==11) { dayss=dayss+30; } else if(k==2&&((this.getYear().value%4==0&&this.getYear().value%100!=0)||(this.getYear().value%400==0))) { dayss=dayss+29; } else { dayss=dayss+28; } } dayss=dayss+this.getDay().value; return (days-dayss); }
错误原因:考虑情况不周全,当第一个日期大于第二个日期时,输出结果错误,所以应该加一个if (compareDates(toDate))函数,当第一个日期大于第二个日期时,交换两个日期,更正后的代码和结果如下
public int getDaysofDates(DateUtil toDate) { if (compareDates(toDate)) { int y,m,d; y=toDate.year.value; m=toDate.month.value; d=toDate.day.value; toDate.year.setValue(year.value); toDate.month.setValue(month.value); toDate.day.setValue(day.value); year.setValue(y); month.setValue(m); day.setValue(d); } int days=0; for(int i=this.getYear().value;i<toDate.getYear().value;i++) { if((i%4==0&&i%100!=0)||(i%400==0)) { days=days+366; } else { days=days+365; } } for(int j=1;j<toDate.getMonth().value;j++) { if(j==1||j==3||j==5||j==7||j==8||j==10) { days=days+31; } else if(j==4||j==6||j==9||j==11) { days=days+30; } else if(j==2&&((toDate.getYear().value%4==0&&toDate.getYear().value%100!=0)||(toDate.getYear().value%400==0))) { days=days+29; } else { days=days+28; } } days=days+toDate.getDay().value; int dayss=0; for(int k=1;k<this.getMonth().value;k++) { if(k==1||k==3||k==5||k==7||k==8||k==10) { dayss=dayss+31; } else if(k==4||k==6||k==9||k==11) { dayss=dayss+30; } else if(k==2&&((this.getYear().value%4==0&&this.getYear().value%100!=0)||(this.getYear().value%400==0))) { dayss=dayss+29; } else { dayss=dayss+28; } } dayss=dayss+this.getDay().value; return (days-dayss); }

2.日期测试错误
错误代码如下
public boolean checkInputValidity() { if((year.value>=1820&&year.value<=2020)&&(month.value==1||month.value==3||month.value==5||month.value==7||month.value==8||month.value==10||month.value==12)&&(day.value>=1&&day.value<=31)) { return true; } else if((year.value>=1820&&year.value<=2020)&&(month.value==4||month.value==6||month.value==9||month.value==11)&&(day.value>=1&&day.value<=30)) { return true; } else if((year.value>=1820&&year.value<=2020)&&month.value==2&&(day.value>=1&&day.value<=29)&&((year.value%4==0&&year.value%100!=0)||(year.value%400==0))) { return true; } else if((year.value>=1820&&year.value<=2020)&&month.value==2&&(day.value>=1&&day.value<=28)&&((year.value%4!=0||year.value%100==0)||(year.value%400!=0))) { return true; } else { return false; } }
错误原因:没看清题目,以为时间界限和第二题一样,年份应该更改为1900-2050年
更正后的代码如下
public boolean checkInputValidity() { if((year.value>=1900&&year.value<=2050)&&(month.value==1||month.value==3||month.value==5||month.value==7||month.value==8||month.value==10||month.value==12)&&(day.value>=1&&day.value<=31)) { return true; } else if((year.value>=1900&&year.value<=2050)&&(month.value==4||month.value==6||month.value==9||month.value==11)&&(day.value>=1&&day.value<=30)) { return true; } else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=29)&&((year.value%4==0&&year.value%100!=0)||(year.value%400==0))) { return true; } else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=28)&&((year.value%4!=0||year.value%100==0)||(year.value%400!=0))) { return true; } else { return false; } }
四、改进建议
1.自我感觉逻辑非常混乱,没有清晰的思路,有时总是想到一出写一出,总的来说就是代码质量不高。在之后的题目中,需要先理清思路,可以尝试画出流程图,根据思路一步一步的写出来。
2.所用的算法非常麻烦,有些题目是可以用到更简单的方法,有许多简单易懂的算法和思路,而我的代码长,乱,不容易读懂。
五、总结
1.
耦合:类与类之间关系的紧密程度---弱耦合性(有些时候理想情况为无耦合。)
例如:现在有方法A和方法B,我们在A元素去调用B元素,当B元素有问题或者不存在的时候,
A元素就不能正常的工作,那么就说元素A和元素B耦合。
2.
内聚:类内---强内聚性
高内聚是另外一个评判软件设计质量的标准。内聚更为专业的说法叫做功能内聚,是对系统中元素职责的相关性和集中度的量度。
如果元素有高度的相关职责,除了这些职责在没有其他的工作,那么该元素就有高内聚。
3.了解了Java的类间关系
类间关系:
①关联
②依赖
③聚集: 整体--->部分(发送消息)
1.聚合:整体和部分的生存期不一致
2.组合:整体和部分的生存期一致
④泛化
⑤实现
4.学会了类间关系的写法

浙公网安备 33010602011771号