oop第一次总结分析作业

一、前言

        第一次接触面向对象设计课程,因为之前有学习c语言的基础,所以起步不算太困难,以下是我对三次题目集的知识点、难度、等情况的总结;

(1)知识点:前三次题目集涉及到的知识点有数值数据类型和操作,选择语句,数学函数、字符和字符串,循环,方法,数组,对象和类的初步学习。

(2)题目:题量和题目难度合理安排,题量少的时候难度较大,基本能在代码提交的截至时间前完成。

二、设计

 1.(1)题目集1的7-8: 输入三角形三条边,判断该三角形为什么类型的三角形。

    (2)解释与心得:本题代码书写的思路清晰,操作简单,除了基本的格式书写之外,其他语句如if语句的书写和c语言十分相似,虽然题目简单,但有一个测试点容易出错,在判断等腰直角三角形时用勾股定理作为判定条件时容易造成精度丢失的错误.

2.(1)题目集2的7-4:输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

    (2)解释与心得:解法思路清晰,通过方法将功能模块化,一种方法实现一种功能,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) ; //求输入日期的下一天

代码如下:

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) {
     return year%400==0||(year%4==0&&year%100!=0);
 }
 public static boolean checkInputValidity(int year,int month,int day)
 {
     int monthday[]=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
     if(isLeapYear(year)) {
         monthday[2]=29;
     }
 return year>=1820&&year<=2020&&month>=1&&month<=12&&day>0&&day<=monthday[month];
 }
 public static void nextDate(int year,int month,int day) 
 {
     int monthday[]=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
     if(isLeapYear(year)) {
         monthday[2]=29;
     }
     int a = 0,b = 0,c = 0;
     if(checkInputValidity(year,month,day))
     {
         if(month==12) {
             a=year+1;
             b=1;
             c=1;
         }
         else if(month<12) {
             if(day==monthday[month]) {
                 a=year;
                 b=month+1;
                 c=1;
             }
             else
             {
                 a=year;
                 b=month;
                 c=day+1;
             }
         }
         System.out.print("Next date is:"+a+"-"+b+"-"+c);
     }
     else System.out.print("Wrong Format");
 }
}

(3)题目集二的7-5:输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。

(4)解释与心得:与上一题思路一致,只需要根据测试点找错误就大致能分析出错误所在,前两次题目集很大程度上是面向过程程序设计的写法和思路,还没怎么要到目前所学知识。

3.(1)题目集3的7-3:求下一天,定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

(2)解释与心得:思路与上一次题目集一致,但这次代码书写正迈入对面向对象的领域,要求是必须保证类的封装性,year、month、day等属性必须是私有成员类中的方法,必须针对类的year、month和day进行操作,而不是简单的题目集2中的写法。

代码如下:

import java.util.Scanner;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
    Scanner input=new Scanner (System.in);
    int a=input.nextInt();
    int b=input.nextInt();
    int c=input.nextInt();
    Date date = new Date(a,b,c);//传入参数
    date.getNextDate();
}
}
class Date{

    private int year=0;
    private int month=0;
    private int day=0;
    int mon_maxnum[]=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
    public Date() {}
    public Date(int year,int month,int day) {
        this.year = year;
        this.month = month;
        this.day=day;
}
    public void setYear(int year) {
        this.year = year;
    }
    public int getYear() {
        
        return year;
    }
    public void setMonth(int month) {
        this.month =month;
    }
    public int getMonth() {
        
        return month;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public int getDay() {
        
        return day;
    }
     public  boolean isLeapYear(int year) {//判断是否为闰年
         return year%400==0||(year%4==0&&year%100!=0);
     }
     public boolean checkInputValidity()
     {
         
         if(isLeapYear(year)) {
             mon_maxnum[2]=29;
         }
 return year>=1900&&year<=2000&&month>=1&&month<=12&&day>0&&day<=mon_maxnum[month];
      }
     public  void getNextDate() 
     {
         
         if(isLeapYear(year)) {
             mon_maxnum[2]=29;
         }
         int a = 0,b = 0,c = 0;
         if(checkInputValidity())
         {
             if(day==mon_maxnum[month])
             {
                 if(month==12)
                 {
                     a=year+1;
                     b=1;
                     c=1;
                 }
                 else {
                     a=year;
                     b=month+1;
                     c=1;
                 }
             }
             else {
                 a=year;
                 b=month;
                 c=day+1;
             }
             System.out.print("Next day is:"+a+"-"+b+"-"+c);
         }
         else System.out.print("Date Format is Wrong");
     }
}

(3)题目集3的7-3:编写程序性,实现对简单多项式的导函数进行求解。

(4)自学了正则表达式,但学习不够深入,只会简单的match和pattern操作,测试点只通过了三个,路还很长,要学的还有很多。

三、踩坑心得

1.数值型数据常见错误和陷阱

(1)未声明、未初始化的变量和未使用的变量

     变量必须在使用之前声明为一个类型并且赋值。

(2)舍入错误

     舍入错误是指计算所得到的数字的近似值和确切的数学值之间的差异因为一个变量保存的的位数是有限的,因此舍入错位无法避免。涉及浮点数的计算都是近似的,因为这些数没有准确的精度来储存。例如判断一个等腰直角三角形的代码为(a[0]==a[1]&&a[0]*a[0]+a[1]*a[1]-a[2]*a[2]<0.0001)||(a[0]==a[2]&&a[0]*a[0]+a[2]*a[2]-a[1]*a[1]<0.0001)||(a[1]==a[2]&&a[2]*a[2]+a[1]*a[1]-a[0]*a[0]<0.0001).

2.选择语句常见的错误

(1)忘记必要的括号。如果块中只有一条语句,就可以忽略花括号,但多条语句则需要加上花括号,所以为避免遗忘,就要做到一个块中一个花括号。

(2)错误的在if行出现分号,这是一个常见的错误,如:if(a>b);等价于if(a>b){}  既不是编译错误也不是运行错误,而是一个逻辑错误。

3.对象和类

(1)一个对象的状态由数据域及其当前数值表示,一个对象的行为是由方法定义的,调用一个对象的方法就是要求对象完成一个动作。

(2)第三次题目集中我初步接触了对象和类的使用,用构造方法构造对象,通过引用变量访问对象。

(3)使用this引用数据域、调用构造方法。

四、改进建议

1.声明的变量名应该合理让人易懂,不然数据太多时调用变量容易使本人都觉得混乱。

2.边写代码边注释是个好习惯。

五、总结

1.初步学习Java有一定的困难,自学是项非常重要的技能,不会的看书或者百度或问同学,总会有人走在我前面,我可以学习他们的经验在融入自己的理解就变成了自己的代码。

2.基础知识学习不能停,以前学的知识在这门课程依然有用。

3.老师管理和教学十分到位,乐意解决同学们的问题。

posted @ 2021-04-04 20:45  菜旦  阅读(73)  评论(0)    收藏  举报