前三次OO作业总结

前言

  这个学期接触了一种全新的编程语言——java,对于它很陌生,不知道怎么写。不过基于上学期c语言的基础,在翻阅教科书中认识了java的基础语法知识,在eclipse运行了第一个程序helloworld,然后就是三次作业的训练了。
  第一次题目集题目量很多,时间紧任务重,刚布置的前几天还在熟悉语法导致没有完成题目集,这次题目集主要考察了java基础的语法,考察对循环和字符串的掌握情况,循环比如7-3的九九乘法表和7-12列出最简分数序列,字符串比如7-5到7-8,字符串没有掌握好,很多没写出来,总的来说有些难题也有些比较简单的题。
  第二次题目集题量较上次减少了一点,考察的知识点很多很杂,基本涵盖了java的基础语法,各种类型的题目都有,总体偏易一点,最后两题偏难,训练逻辑思维。
  第三次题目集题量就更少了,不在多在于精,代码行数也变得很多,甚至有一道题将近三百行,第一次考察了类的用法,并且迭代了上一次题目集中求日期的问题,总体偏难,重点面向对象进行编程。

二、设计与分析

  第一次题目集中考察循环的7-3,题目要求打印如下类似的九九乘法表

 

 源码如下:

import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    int n = input.nextInt();
    int i = 0;
    int j = 0;
    if(n<1||n>9){
      System.out.println("INPUT ERROR.");
    }
    else{
      for(i=1;i<=n;i++){
        for(j=1;j<=i;j++){
          if(i==j){
            System.out.print(i+"X"+j+"="+(i*j)+"\n");
          }
          else{
            System.out.print(i+"X"+j+"="+(i*j)+"\t");
          }
        }
      }
    }
  }
}

解释与分析:当用户的输入大于九时,输出INPUT ERROR.表示输入错误。设置i和j两个循环控制变量控制乘法表的行与列,对其的范围进行合理约束,以实现题目要求情况,这题要小心注意最后输出的i和j的顺序。

心得:注意小心观察题目中的隐藏信息输出与题目要求一致。

   第一次题目集中的7-11,题目要求求定积分

 

 

 源码如下:

import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    double a = input.nextDouble();
    double b = input.nextDouble();
    int n = input.nextInt();
    double s=0.0;
    double w=(b-a)/n;
    for(int i=1;i<=n;i++){
      s=s+(a+(i-0.5)*w)*(a+(i-0.5)*w)*w;
    }
    System.out.printf("%.4f",s);
  }
}

解释与分析:求定积分输入两个边界值a,b,采用极限的思想分割近似为一个一个长方形求其面积再使用循环累加,使用中间值(a+(i-0.5)*w)的函数值作为高。

心得:要充分分析题目,发挥计算机善于进行重复计算的特点。

  第二次题目集7-1,长度质量计量单位换算题目要求:长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。

源码如下:

import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    double kg = 0.45359237;
    double m = 0.0254;
    double a = input.nextDouble();
    double b = input.nextDouble();
    double a1;
    double b1;
    a1=a/kg;
    b1=b/m;
    System.out.println((float)a1+" "+(float)b1);
  }
}

解释与分析:这题相对比较容易,首先定义两个转换常量,用户输入两个数据,进行简单的除法运算,唯一的问题就是最后输出需要强制转换数据类型,比较坑。

心得:注意题目给的输出类型包括保留的小数位数。

  第二次题目集的7-9,求下一天题目要求

 

 源码如下:

import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    int year = input.nextInt();
    int month = input.nextInt();
    int day = input.nextInt();
    nextDate(year,month,day);
  }

  public static boolean isLeapYear(int year){
    boolean isleapYear;
    isleapYear=(year%4==0&&year%100!=0)||year%400==0;
    return isleapYear;
  }

  public static boolean checkInputValidity(int year,int month,int day){
    boolean checkInputValidity;
    checkInputValidity=year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31;
    return checkInputValidity;
  }

  public static void nextDate(int year,int month,int day){
    if(checkInputValidity(year,month,day)){
      if(day==31){
        if(month==12){
          year=year+1;
          month=1;
          day=1;
        }
        else{
          year=year;
          month=month+1;
          day=1;
        }
      }
      else{
        year=year;
        month=month;
        day=day+1;
      }
      System.out.printf("Next date is:"+year+"-"+month+"-"+day);
    }
    else{
      System.out.println("Wrong Format");
    }
  }
}

解释与分析:使用了多个方法进行不同的数据处理,例如有判断是否是闰年,判断是否输入的数据合理,还有最重要的求下一天的日期的函数,前两个判断使用的c语言中没接触的布尔类型, 布尔型的值只有两个:false(假)和true(真)。 且false的序号为0,true的序号是1(或者是非0)。学到了。求下一天的过程中要重点考虑12月31号,xx月最后一天,使用多个判断进行处理,不过这次的题目中没有想到用数组表示每个月的最后一天,导致此代码还有有些问题。

心得:多思考,使用多个方法独立进行处理。

  第三次题目集7-3,仍然是求下一天,需要用类题目要求:

 

 日期类图:

 

 源码如下:

import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    int year = input.nextInt();
    int month = input.nextInt();
    int day = input.nextInt();
    int[] mon_maxnum = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    boolean isLeapYear;
    nextDate(year,month,day,mon_maxnum);
   }

  public static boolean isLeapYear(int year){
    boolean isleapYear;

    isleapYear=(year%4==0&&year%100!=0)||year%400==0;

    return isleapYear;
  }

  public static boolean checkInputValidity(int year,int month,int day,int mon_maxnum[]){
    boolean checkInputValidity;
    if(isLeapYear(year)==true){
      mon_maxnum[2]=29;
    }
    checkInputValidity=year>=1900&&year<=2000&&month>=1&&month<=12&&day>=1&&day<=mon_maxnum[month];
    return checkInputValidity;
  }

  public static void nextDate(int year,int month,int day,int mon_maxnum[]){
    if(checkInputValidity(year,month,day,mon_maxnum)){
      if(day==mon_maxnum[month]){
        if(month==12){
          year=year+1;
          month=1;
          day=1;
          }
          else{
            year=year;
            month=month+1;
            day=1;
          }
        }
        else{
          year=year;
          month=month;
          day=day+1;
        }
    System.out.printf("Next day is:"+year+"-"+month+"-"+day);
    }
    else{
     System.out.println("Date Format is Wrong");
    }
  }
}

解释与分析:这题需要设计Date类,笔者没做到这点,直接偷懒复制了上次题目集中的代码提交,很后悔。不过用到了int[] mon_maxnum = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}处理每个月不同的最后一天至少在逻辑上没有错误。  

心得:不能偷懒,要认真做到题目中的每点要求。

  第三次题目集7-4,日期类设计,要求:

 

源码:

class DateUtil{
private int year;
private int month;
private int day;
int[] mon_maxnum = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};

public DateUtil(int y,int m,int d){
year=y;
month=m;
day=d;
}
public int getYear(){
return year;
}
public void setYear(){
this.year=year;
}
public int getMonth(){
return month;
}
public void setMonth(){
this.month=month;
}
public int getDay(){
return day;
}
public void setDay(){
this.day=day;
}

public boolean isLeapYear(int year){
boolean isleapYear;

isleapYear=(year%4==0&&year%100!=0)||year%400==0;

return isleapYear;
}

public boolean checkInputValidity(){
boolean checkInputValidity;
if(isLeapYear(year)==true){
mon_maxnum[2]=29;
}
checkInputValidity=(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=mon_maxnum[month]);
return checkInputValidity;
}

public DateUtil getNextNDays(int n){
for(int i=0;i<n;i++){
if(isLeapYear(year)==true){
mon_maxnum[2]=29;
}
else{
mon_maxnum[2]=28;
}
if(day==mon_maxnum[month]){
if(month==12){
year=year+1;
month=1;
day=1;
}
else{
year=year;
month=month+1;
day=1;
}
}
else{
year=year;
month=month;
day=day+1;
}
}
return this;
}

public DateUtil getPreviousNDays(int n){
for(int i=0;i<n;i++){
if(isLeapYear(year)==true){
mon_maxnum[2]=29;
}
else{
mon_maxnum[2]=28;
}
if(day==1){
if(month==1){
year=year-1;
month=12;
day=mon_maxnum[month];
}
else{
year=year;
month=month-1;
day=mon_maxnum[month];
}
}
else{
year=year;
month=month;
day=day-1;
}
}
return this;
}

public boolean compareDates(DateUtil date){
if(this.year>date.getYear()){
return true;
}
else if(this.year==date.getYear()&&this.month>date.getMonth()){
return true;
}
else if(this.year==date.getYear()&&this.month==date.getMonth()&&this.day>date.getDay()){
return true;
}
else{
return false;
}
}

public boolean equalTwoDates(DateUtil date){
if(this.year==date.getYear()&&this.month==date.getMonth()&&this.day==date.getDay()){
return true;
}
else{
return false;
}
}

public int getDaysofDates(DateUtil date){
int n1 = 0;
int n2 = 0;
int n3 = 0;
int n = 0;
int m1 = 0;
int m2 = 0;
int m3 = 0;
int m = 0;
for(int i=0;i<this.year;i++){
if(isLeapYear(i)==true){
n1=n1+366;
}
else{
n1=n1+365;
}
}
for(int j=0;j<this.month;j++){
if(isLeapYear(this.year)==true){
mon_maxnum[2]=29;
}
n2=n2+mon_maxnum[j];
}
for(int k=0;k<this.day;k++){
n3=n3+1;
}
n=n1+n2+n3;

for(int i=0;i<date.getYear();i++){
if(isLeapYear(i)==true){
m1=m1+366;
}
else{
m1=m1+365;
}
}
for(int j=0;j<date.getMonth();j++){
if(isLeapYear(date.getMonth())==true){
mon_maxnum[2]=29;
}
m2=m2+mon_maxnum[j];
}
for(int k=0;k<date.getDay();k++){
m3=m3+1;
}
m=m1+m2+m3;

return Math.abs(n-m);
}

public String showDate(){
return this.year + "-" + this.month + "-" + this.day;
}
}

 解释与分析:这题是前两道求日期的重大升级版,不仅是要求下n天,还要求前n天,还要求两个日期相差的天数。程序的主方法题目中已经给出,,需要编写DateUtil类还有很多方法。首先由用户输入一个数choice选择实现不同的方法(当输入错误的数据是输出“Wrong Format”并退出程序),输入1进入求下n天,输入n(同理有错误输入),类似于求下一天,一天一天累加,仍需重点考虑12月的最后一天和每个月的最后一天,使用了int[] mon_maxnum = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}轻松解决每个月的最后一天。当choice=2时即求前n天,同理类似与求下一天,只不过将最后一天改成第一天。当choice=3时即求两个日期相差的天数,笔者的做法是假设某个特定的日子,从这个一直算到所求日期的天数,然后两个相减使用Math.abs取绝对值。

Datetil类:

class DateUtil{
  private int year;
  private int month;
  private int day;
  int[] mon_maxnum = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};

}

三、采坑心得

  这几次题目集中有蛮多坑的。

  第一次题目集7-3九九乘法表

 

 

 

 两个格式不同即i和j的顺序不同,值得注意

修改了多遍。

  第一次题目集7-4快递运费需要四舍五入

根据题目的意思需要在x的基础上加上0.5,然后还有(int)强制转换类型,一开始没看懂试了很久。

 

第二次题目集很多都需要强制转换类型加上(float)什么的。

7-8判断三角形类型有一个很大的坑,就是判断直角三角形的时候不能直接a*a+b*b=c*c

而是如此

 

让差值小于某个很小的数才行。

  第三次题目集7-4求日期

 

 

 

 一开始使用了很复杂的算法,弄的自己都头晕了,一直非零返回,测试用例的时候一直输出不出来,之后干脆直接换了一个算法

 

 

 一天一天加上去,只需重点考虑每年的最后一天和每个月的最后一天即可,很清晰。

四、改进建议

  要多写注释,方便日后能读懂自己写的代码,变量命名使用英文单词,避免单个的字母和拼音

例如第二次题目集7-3中变量很多,命名很困难,随机用了写拼音缩写和单个字母,再看是很难理解。

 

 、总结

   经过三周的java题目训练,基本掌握了java的基本语法,还有许多要学的,有些部分还是一知半解,多看看书和菜鸟教程。

posted @ 2023-03-25 19:50  鲨鲨鲨  阅读(33)  评论(0)    收藏  举报