20201710赖成慧前三次作业总结

一,前言

  面向对象程序设计开展学习已经过去一个月,共有三次PTA大作业,前两次难度相对较小,第三次作业的第三题难度很大。

 个人体会:

  1.第一次大作业考察内容偏向编程基础,让我意识到在语句上,例如for、while、if,不同的编程语言是共通的,所以第一次作业用的知识大部分还是C语言学到的知识。

  2.第二次大作业考察内容为数组,字符串和类方法,在第二次大作业中,需要掌握JAVA中字符串类的一些方法,需要学会JAVA的数组如何使用,后面的题目更是需要自己添加自定义方法,个人感觉与C语言的自定义函数有一点相似。

  3.第三次大作业考察内容为类,第一题是账户类第二题为日期类,学到类第一次让我感觉到了什么是面向对象的程序设计,同时知道了通过对象访问类的属性、方法需要怎么做。掌握了public/private的用法,掌握了static的使用方法。

二,设计与分析

    第一次作业:7-8 判断三角形类型:

  题目:输入三角形三条边,判断该三角形为什么类型的三角形。

  输入:在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

  输出:(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

  我的思路:创建三个double型变量和一个boolean型变量flag,对应三条边,通过三角形两边之和大于第三边验证输入是否正确,正确情况赋值boolean型变量flag为true,否则为false。然后按照判断等边三角形→等腰直角三角形→等腰三角形→直角三角形→一般三角形的顺序,进行判断并且输出。

  我的问题:在判断直角三角形时,使用了勾股定理,但是并不能进行正确判断,后查询资料得知,double型存在误差,不能保证数值精确。

  改良方法:(one*one+two*two-thr*thr<0.00001)|| (one*one+thr*thr-two*two<0.00001)|| (two*two+thr*thr-one*one<0.00001)通过判断误差来实现功能。

   第二次作业:7-4 求下一天

  题目:输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。

  输入:在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

  输出:

  1. 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
  2. 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日;

  我的思路:用三个字符串接受输入。创建三个方法,第一个boolean方法StringTrueOrFalse判断输入字符串中是否有非法字符(例如字母、特殊字符),若无,则将字符串转为三个int型变量;第二个boolean方法checkInputValidity判断这三个int型变量大小是否合法,若合法返回true否则false;第三个void方法nextDate,用于进行最后步骤,判断年月日并且求出下一天并输出。

  我的问题:

       1.最初使用一个字符串,用nextLine()接受全部输入时,会在boolean方法StringTrueOrFalse中出现错误,因为不能保证用户输入一定是两位数,例如2020-7-8与2020-07-08,这时用一个字符串就会因为要加更多判断而更加复杂。

       2.Character.isDigit()方法判断是否是数字,lenth()得到字符串长度。

  改良方法:

       1.使用三个字符串,改用next()接收三次输入。

   第二次作业:7-5 求前N天

  题目:输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

  输入:在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

  输出:

  1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
  2. 当输入数据合法时,输出“n days ago is:年-月-日”

  我的思路:沿用上一题的两个方法boolean方法StringTrueOrFalse(判断字符串是否合法)和boolean方法checkInputValidity(判断数字是否合法),也将使用三个字符串输入,然后转变为合法数字。同时添加一个新方法void方法changeDate()用于输出前N天的日期。

  我的问题:由于建立在第四题的基础上,所以这题相对来说比较简单,没有什么大问题。

  改良方法:将前一题的nextDate方法一些条件反着用就可以很快实现功能。

   第三次作业:7-2 定义日期类

  题目:定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

  输入:在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

  输出:

  • 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
  • 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日

  我的思路:

  

 

   首先,题目给出了类图,我在类图上可以知道这个类名为Date,同时有int型属性year,month,day三个和int型的数组mon_maxnum并且进行了初始化。在第三个框中首先有一个不含参的构造方法和一个含参的构造方法,在下面是year,month,day的gatter/setter方法,boolean型方法isLeapYear(用于判断是否是闰年)checkInputValidity(判断输入是否合法),最后一个void方法getNextDate()用于输出下一天。

  我的问题:最初写getNextDate()方法时,没有正确排列判断顺序,导致判断结果会出错

  改良方法:按照28日→29日→30日→31日→其他日子的顺序判断,在每次进入时判断闰年,然后进行相应输出。

   第三次作业:7-3 一元多项式求导(类设计)

  题目:编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。

  输入:在一行内输入一个待计算导函数的表达式,以回车符结束。

  输出:

  1. 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
  2. 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
  •  当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
  • 当输出结果第一项系数符号为“+”时,不输出“+”;
  • 当指数符号为“+”时,不输出“+”;
  • 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。

  我的思路:创建一个Boolean方法inputJudgment判断输入合法与否,方法内使用正则String judgone = "([-+]?[\\d]+)(?=\\s*\\*\\s*x\\^?)"(用于判断系数合法)和正则String judgtwo = "(?:\\s*\\*\\s*x\\^)([-+]?[\\d]+)"(用于判断指数是否合法),使用一个void方法outputresult输出结果。

  我的问题:由于有的输入有的没有系数有的没有指数,所以需要很多判断,然后在进行输出。但是我的正则方法是分开的,没能实现提取功能。

  改良方法:未能改良,因为此题到最后我都没能完成全部目标。

三,采坑心得

  1.PTA提交JAVA题目时要删除package这一行

  2.在写JAVA题目时尽量减少Main的复杂度,将功能拆分到其他类或者其他方法中,有益于检查调试。

四,总结

  转眼间JAVA已经做过了三次大作业,每次大作业开始的时候,我都是匆匆忙忙的开始学习新内容,每次的大作业进度都很快。所以在这三次作业的总结中,我想说我们在面向对象的程序设计课程中,需要加强自己的自觉性,在课余投入更多的时间去学期书本上的基础知识,这样老师在课堂上才能更好的结合实例讲解。在过去的三个星期里,最让我为难的题目就是第三次大作业的第三题,因为这题使用到了我从来没有接触过的正则表达式,在查找正则网课后,发现正则并不是那么简单的东西,它需要一定的熟练度。JAVA的学习还算有趣,这一种语言与我们上学期学的C语言有区别,但是最初感觉不到,在进入类的学习之后我才发觉面向对象的一点点感觉。不知道我的感觉是不是来的太晚了,以至于我到现在还是好奇什么才是面向对象的程序设计。在今后的学习中,我会努力补上自己不足的一些地方,努力克服PTA上的难题,提高能力。这次对三次大作业的总结到此结束。

posted @ 2021-04-04 13:31  木野kino  阅读(84)  评论(0)    收藏  举报