题目集1~3作业总结
题目集1~3的总结性Blog
在本次pta题目集1-3的作业中,我们通过类的创建,对象的创建,类的引用以及基础的for循环,if与else语句,创建函数等方法成功实现了代码。前两次作业的题目量会比较的大,但都没有使用类的创建以及封装等操作。到第三次作业便有了提升,需要使用类的创建以及类的引用。虽然可能不是很熟练,但在这里我想把我自己的做法写出来,供大家参考。
本次作业分为以下部分,三次作业实现介绍(包括调度方法), 总结作业。请读者各取所需。
(注:本次作业算法仅针对作业题目,对实际情况并不完全相符)
三次作业实现
1.判断三角形类型 (第一次作业)
其实这一次作业是完全面相过程的,在解答本题的时候,并未使用到创建对象和创建类。
求三角形类型的时候,可以很明确自己的思路:第一步肯定为判断非法输入。为了能准确判断执行非法输入的输入与输出,我选用了if与else语句方便对各种情况进行判断。以引用java.util.Scanner来创建Scanner的新对象,以便于输入。由于此题比较简单,就不多做分析了给大家看看代码结构:
Main主类:
通过查看这些图片可知在各方面此题都是比较简单的。
2.求下一天(第二次左右)
在编写本题的时候栽了大跟头,由于对情况考虑的不够周全,导致许许多多的测试点始终无法通过。在写本题时,为判断闰年与平年的二月份的特殊性,创建了判断润平年的方法(isLeapYear),当然做题的第一步还是去判断非法输入的情况,此次非法输入仍然使用ifelse语句。后在主类中调用方法得以实现。
由于对boolean用法的不理解,在创建isLeapYear方法时返回值用的为‘0/1’,导致程序始终报错,后来经过学习将其返回值改为true/flase。虽然简单的测试点能够通过,但仍有报错,后认真研读了一些大佬的方法,发现自己忽略了跨年的情况,原来做JAVA还是很考罗辑思维的。
Main类结构:
从开始的困难,到不断的调试,使平均复杂度降低了不少。
3.求前N天(第二次作业)
这一题作业吸取了上一题的教训,在创建判断平闰年方法时返回值正确使用了Boolean的返回值true/flase。由于为前N天,使程序复杂了不少,在上一题的基础上,不仅仅要判断跨年时的情况,也要注意不同月不同天数的情况。在求前N天的同时必定会出现跨月的情况,便需要调用if else语句来对不同的情况进行判断。由于上一题,对判断日期已有了明确的思路,做起本题时也是十分的轻松。
Main主类:
第二次作业到此便结束了,编写程序的过程虽然十分的繁琐,但做完之后还是成就感满满的。
4.定义日期类(第三次作业)
本次作业出现了全新的方法:创建类。由于之前没有接触过创建类的方法,也不知道如何对类进行封装,编写代码时出现的很大的困难。刚开始只是按照题目的要求简单的创建了一个类:Data类。后通过向老师的学习,成功掌握了private的方法,也明白了对类中创建对象的原理。便十分轻松的在Data类中创建了getmonth(),getyear(),getday()等方法。当然这次作业与第二次作业中的求下一天的思路类似便不多做讲解。本题最重要的还是创建类中的对象data,方便对类的调用。以对象data加上‘.’来调用类中的方法。从main开始写起,到下面的创建新类,并在类中创建方法,再回到上面的main主类中就行调用。再解答本题时还是出现了一些问题,在非法输入时,输出结果除了Wrong Format还有后面的其他输出结果,经过研磨网上大佬的代码,了解到了终止语句System.exit(0),便成功运行了。
Main主类:
由于上次作业的原因,过程也是十分轻松,不过在创建类的层面上进行了提升,对于我这样的新人还是比较困难的。
5.一元多项式求导(第三次作业)
本次作业在创建类和封装的基础上,又多出了对正则表达式的运用。对我初次接触到的我来说,简直是噩梦。只能不断的去网上学习网课和查阅资料,后来也成功掌握了部分。
其实这次作业完全是面向过程的。多项式可以表示为二元组的列表,这种形式关于求导这种运算是封闭的,也就是说求导依然产生二元组的表。由于涉及到合并同类项,所以使用映射表比较好,指数作为键,系数作为值。这样,在查找、添加、合并的时间复杂度都很低,编码也方便。
性能分唯一得分方式就是合并同类项,系数1不输出,指数为1不输出,0项忽略。另外一个小点就是正项先输出。
这次只有一个主类,一Main到底。因为HashMap
已经可以存储所有多项式,就没考虑另定义类。
Main主类:
此题并未写完整,但部分功能已经实现,还需要后期的学习才能够将其全部实现。
部分代码分析与改进意见
由于前两次作业较简单,对于代码便不多做展示,我们来看看第三次作业的部分代码:public static class Date { private static int year; private static int month; private static int day; }
应题目需要创建了Date类,并封装其中所包含的数据year(年),month(月),day(日),方便后面输入数据对类进行调用。
public static boolean isLeapYear(int year) { if((year % 4 == 0 && year % 100 !=0 )||(year % 400 == 0)) { return true; } else return false; }
这里是很简单的平润年判断的代码,依据其原理即可判断。
public static void main(String[] args) { Scanner in=new Scanner(System.in); Date.year=in.nextInt(); Date.month=in.nextInt(); Date.day=in.nextInt(); if(Date.checkInputValidity(Date.year,Date.month,Date.day)==false) { System.out.print("Date Format is Wrong"); } else { Date.getNextDay(Date.year,Date.month,Date.day); } }
最后在主函数中对类以及类中所包含的方法进行调用。
改进意见:
(1).在书写代码时“{}”始终无法标齐上面所对应的开投,导致自己经常写到一半便忘记了自己写到哪。
(2).在写此题时经常用到if else语句,但在书写if else时经常忘记书写花括号,然后后面的输出便写的十分的混乱,经常让自己迷失在代码中,最后不得不使用debug去寻找错误。在以后写类似程序时,一定会注意花括号的用法与书写格式。
2.一元多项式求导:
public static void getString(String hanshu) { String strs = new String(); boolean a=Pattern.matches("([-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?)+", hanshu); if(a==true) { Pattern p = Pattern.compile("([-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?)+"); Matcher m = p.matcher(hanshu); while(m.find()) { strs=m.group(); System.out.println(strs); } } else System.out.println("Wrong Format"); }
此段代码为判断系数是否为0,然后为0则进行报错。
public static void changshu(String hanshu) { boolean a=Pattern.matches("[+-]?[1-9]+", hanshu); String strs = new String(); if(a==true) { Pattern p = Pattern.compile("[+-]?[1-9]+"); Matcher m = p.matcher(hanshu); while(m.find()) { strs="0"; System.out.println(strs); System.exit(0); } }
此段代码为判断多项式是否为常数时的情形,若为常数,则其的输出值为0,并终止输入。
public static void main(String[] args) { Scanner in=new Scanner(System.in); String hanshu=in.nextLine(); qiudao.changshu(hanshu); qiudao.getString(hanshu); }
此段为主函数,在主函数中对类中的方法进行调用。
改进意见:
(1).写代码时始终无法正确调用类以及类中的方法,如此题中的qiudao.changshu(hanshu),无法调用动态方法是个硬伤。在今后的学习中也会认真的学习对类以及类中方法的调用。
(2).没有正确的书写习惯,就比如分号(;)会经常忘记打上去,导致报错。以后也会十分注意这一点的。
总结
本次作业,我个人进步最大的地方是学习了几种方法来创建类以及对象,这让我代码整体结构比较好,思路清晰,逻辑严谨。这次作业我也学到了许多正则表达式的基本方法。
但是,我还有许多地方有待进步,比如正则表达式的广泛运用。各种方法也需要抓紧时间学习。
最后,感谢罗老师对我们的指导、建议,感谢wxw,zs等大佬的帮助和鼓励。
大家一起加油吧!