前三次oop作业总结

前言

  这三次题目集总的来说有简单的题目,也有相对来说不太容易做出来的题目,毕竟是初学,肯定有很多需要我们研究的知识点。相比来说第一次题目集知识比较基础,我认为老师的目的是让我们上手试试感觉,主要是一些Java基础语法,比如选择语句(ifif-else、嵌套if语句等),循环语句,嵌套循环,字符数据类型和操作,数值输出时的转换,一维数组;第二次的输出数据基本都强调用强制转换数值类型,第二次最后一题相对训练思维,比较难;另外在第二次题目集中首次使用了switch选择语句;第三题题目集相对较难,因为开始接触类和方法了,虽然只有四道题,但确实是做了很久;此次题目涉及类,类的构造方法和方法以及方法调用,类的封装(第一次接触private私有属性),开始训练面向对象思想了。

1.设计与分析

第二次题目集最后两题:判断三角形的类型和求下一天比较考思维,大家都说老是有测试点一直过不了,比如判断等腰三角形的测试点,我开始的部分代码如下:

      else if((a==b) && ((a*a)+(b*b)==(c*c))) {

                        System.out.println("Isosceles right-angled triangle");

                    }

                    else if((b==c) && ((b*b)+(c*c)==(a*a))) {

                        System.out.println("Isosceles right-angled triangle");

                    }

                    else if((a==c) && ((a*a)+(c*c)==(b*b))) {

                        System.out.println("Isosceles right-angled triangle");

                    }

这个代码去判断两个浮点数值相等是不可靠的,浮点数具有有限的计算精度,涉及浮点数的计算可能引入舍入错误,应该通过测试两个数值的差距小于某个阈值,来比较它们是否已经足够接近。更改后的代码:

      else if((a==b) && ((a*a)+(b*b)-(c*c))<0.000001) {

                        System.out.println("Isosceles right-angled triangle");

                    }

                    else if((b==c) && ((b*b)+(c*c)-(a*a))<0.000001) {

                        System.out.println("Isosceles right-angled triangle");

                    }

                    else if((a==c) && ((a*a)+(c*c)-(b*b))<0.000001) {

                        System.out.println("Isosceles right-angled triangle");

                    }

最终通过测试点。

在求下一天中,首次声明的月份天数数组int[] arry=new int[]{31,29,31,30,31,30,31,31,30,31,30,31};未考虑到数组下标是从0开始的,若要月份和下标相对应,应修改为

int[] arry=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};更改后测试答案正确。

 第三次题目集后两题难度比较大,相对来说题目复杂些,要考虑的东西也有多点,很训练思维,第一次接触难免使人有点慌乱。

7-3定义日期类(功能也是求下一天)难点就在于闰年与平年(2月天数不同),每月最后一天,每年最后一月的情况,这些难点想通了做起来就会轻松些。

部分代码如下:

  if(!isLeapYear(year)) {

              mon_maxnum[2] = 28;

          }

          if(checkInputValidity(year,month,day)) {

              if(month==12) {

                  if(day==mon_maxnum[month]) {

                     year = year+1;

                      m = 1;

                      d = 1;

                  }

                  else {

                      m = month;

                      d = day +1;

                  }

              }

              else {

                 if(day==mon_maxnum[month]) {

                      m = month + 1;

                      d = 1;

                  }

                  else{

                      m=month;

                      d = day+1;

                  }

              }

              System.out.println("Next day is:"+year+"-"+m+"-"+d);

          }

          else {

              System.out.println("Date Format is Wrong");

          }

  }

这些正确代码自己做题的时候弄了很久才弄明白,最后才写出来,虽然过程痛苦,不过写出来的一刻还是有点兴奋的。

7-4日期类设计,更复杂,当时这题花了我一天时间,最后还是没有完全做出来,求当前日期入date之间相差天数没有思路。刚开始求下n天的时候,思路混乱,考虑情况未到位,代码也有错误,测试点就过了几个,后面更改后,下n天测试点通过,前n天和下n天差不多,只是是逆向思维。相差天数目前还没做出来,后面需要花点时间和精力去把它做出来。

                         

 

 

第一次提交代码部分:

public DateUtil getNextNDays(int n) {

        for(int i=0;i<=n;i++) {

            if(!isLeapYear(year)) {

                day = day+i;

                if(day==M[month]) {

                    month++;

                    day=1;    

                    if(month>12) {

                        year++;

                        month = 1;       

                    }

                }

            }

            else if(isLeapYear(year)) {

                day = day+i;

                if(day==M[month]) {

                    month++;

                    day = 1;

                    if(month==2 ) {         

                        month = 3;

                    }

                    if(month>12) {

                        year++;

                        month = 1;               

                    }

                }

            }

        }

    return new DateUtil(year,month,day);

}

  //求当前日期与date之间相差的天数

    public int getDaysofDates(DateUtil date) {

        int days = 0;

        if(!this.compareDates(date)) {

            for (int j=0;;j++) {

                if(!this.equalTwoDates(date)) {

                    days = j;

                }

            }

        }

        return days;

    }

可以看出思维很乱,甚至可以说是有点在乱写的那味儿了,还写了个死循环,事实证明自己确实需要更多地去学习,练习,还有研究Java了。

更改后代码(部分):后面经同学提点,慢慢地理清楚了思路,开始重新编写,一个一个测试点的过,最后到截止时间了算天数差还是未能做出来,后面希望自己尽快找空余时间研究一下。

//取得year-month-day的下n天日期

    public DateUtil getNextNDays(int n) {

        for(int i=0;i<n;i++) {

            if(!isLeapYear(year)) {

                M[2]=28;

            }

               if(month==12) {

                if(day==M[month]) {

                    this.year = year+1;

                    this.month = 1;

                    this.day = 1;

                }

                else {

                    this.month = month;

                    this.day = day +1;

                }

            }

            else {

                if(day==M[month]) {

                    this.month = month + 1;

                    this.day = 1;

                }

                else{

                    this.month=month;

                    this.day = day+1;

                }

            }

            M[2]=29;

        }

        return new DateUtil(year,month,day);

    }

    //取得year-month-day的前n天日期

    public DateUtil getPreviousNDays(int n) {

        for(int i=0;i<n;i++) {

            if(!isLeapYear(year)) {

                M[2]=28;

            }

               if(month==1) {

                if(day==1) {

                    this.year = year-1;

                    this.month = 12;

                    this.day = 31;

                }

                else {

                    this.month = month;

                    this.day = day - 1;

                }

            }

            else {

                if(day==1) {

                    this.month = month - 1;

                    this.day = M[month];

                }

                else{

                    this.month=month;

                    this.day = day-1;

                }

            }

            M[2]=29;

        }

        return new DateUtil(year,month,day);

    }

 

2.踩坑心得:

第一次写题目集,亦是初次接触Java,有些生疏,第一题提交过程出现多次编译错误,并且是很低级的语法错误,现在回头看原因是自己没有沉下心来学习基础java语法,认为有的和C语言差不多就跳过,殊不知自己漏了很多细节。到目前为止,写过了三次作业后,我认为java有许多小的细节需要注意,例如:最简单的输出语句用的printfprintlnprint的不同之处,java语法中还有很多是我们初学者要注意的细节,俗话说细节决定成败嘛,更何况编写代码不注重细节,最后会报错一串。三次题目集中很多次提交结果显示非零返回错误,刚开始不理解为什么,后面发现一些是没有运用return语句返回,还有个别题目前不是很清楚原因,自己得抓紧时间研究一下。另外一点是因为自己未及时学习使用编译软件,作业直接在PTA平台上编写,以为题目简单,自己盲目觉得没问题,就直接提交了;像IDEA,eclipse这些软件都非常友好,出现错误就报红,对初学者而言算是一个捷径,能提高一定效率,不会把时间浪费在找低级错误上。错误的心态和学习方式导致我的学习低效率;自学进度慢,所以题目集后面知识跟不上进度,就不是很会写了,便开始在网上找代码看,思维就跟着别人跑了,自己没有思考,没有进步;特别是第三次题目集比较难,脑子就转不动了,因此多思考才会有收获,软件这个专业不是靠背东西就可以的。总而言之,自己在以后学习过程中还需要投入更多精力,亦需要找到正确学习方式,适合自己的学习方法,提高学习效率。

                           

 

 

                           

 

 

                           

 

 

 

 3.改进建议

自己刚开始接触java,编程能力肯定比较低,写出来的代码错误多,代码质量差,在遇到难一点的题目时,思绪不够清晰,考虑不够完整严密,这些虽然是正常现象,但在今后学习中要注意这些问题,仅仅会编程是远远不够的,也要学会慢慢去提高代码质量。经过三次题目集练习,明显发觉自己对与字符数据类型和操作的知识掌握不太好,运用吃力,导致只要碰到与此类相关的题就不会写,写出来的代码也是存在很多问题。除此之外,三次题目集的练习中,发现自己的学习方式存在问题,零散学习,知识片面化,效率低下,后面自己应抓紧时间调整学习方式,端正学习态度,找到适合自己的高效学习方法。

                                                                              (第一次题目集统计子串在整串中出现的次数问题提交情况)

 

 

 

 

4.总结

  通过三次练习学到了什么:对Java语法知识基本了解,当然,这其中肯定还有些知识掌握不太牢固,后面学习过程中要注意对这些知识进一步巩固。目前能进行简单编程,开始对面向对象设计有了一些认识,知道其与面向过程设计的一些区别,比如:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。了解了面向对象设计的一些优缺点,易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护;但与面向过程设计相比,性能比其要低。

  关于Java语法的一些细节还需要不断学习,特别是对String类要进一步学习研究,自己一遇到和字符串有关的题目就犯难,像是字符串比较,查找字符串中的字符或者子串这些知识相对生疏,得花时间去加强巩固。对与类相关的知识需要进一步学习,类与类之间的关系,类的封装,对象数组,与this相关的知识等等新东西还需要自己多花些时间查找资料,看书,看慕课来进一步学习,力争对知识吃透吃牢,不要让这这基础的东西在后面拖后腿。方法使用虽然现在已经了解的差不多了,但任然存在对细节知识的欠缺,以及在方法抽象和逐步求精上掌握极少,还需要学习研究。另外在这三次作业中,我还学到了要多思考,多学习,要看得见头和尾的学习,而不是碎片化学习,哪里不会才去学哪里,这样是错误的学习方式,效率极低,知识掌握不连贯,知识运用时链接不起来,导致多种、多重错误。编程语言学习也是一个训练思维的学习过程,仅是掌握了知识是远远不够的,优质量的代码是需要不断思考,改良而来的,而且思考不到位,遇到复杂的编程就会出现很多bug,因此学习加不断思考才能学好这门课。

  最后希望老师上课时偶尔能提一下一些基础知识的细节问题,说不定哪一点我们就疏漏了;也可以提一下我们做的题目集中的一些严重的问题所在,让我们好进一步改进。课程的话,按老师的节奏走就行。作业和试验希望老师可以抽一点时间给我们分析一下难一点的题目。

  接下来,请自己继续努力!

 

posted @ 2023-03-26 19:37  筱筱诶  阅读(26)  评论(0)    收藏  举报