作业分析
作业分析
一.前言:
刚开始学习java认为好多与c语言一摸一样,应该学起来会轻松,但是事实却与想象完全不一样。刚开始写代码时,真的是写什么错什么,而且很多东西都不知道,里面的东西真的比c语言多了很多,并且这些也是之前学习c语言没有接触到的。
就拿刚学习的类定义来说,他好像c语言里的结构体但是功能上却相差的不只是一点点,c语言的结构体很像java中所说的对象,但是c语言的结构体只继承了java中的对象的属性这一点,java中的对象可以调用属于它自己的专属方法,同时java的对象的属性具有封装性,这一点可以说对每一个对象的属性都进行了一次保护与加固,主方法一般不能直接改变对象的属性,还需要通过调用set,get方法来进行改变,我个人认为java的类的灵魂就在这个封装性。这点特性在功能上已经可以说是完全碾压c语言的结构体,当然两种语言各有各自的特点,不能片面的比较优劣。我只是发表一下对于java对象的设计的理解,它就好像把c语言的结构体与c语言的指针相结合了一样,甚至可以说功能更加强大。凡事都有两面性,它也不例外,它有这些好处的同时也有一些缺点。就比如类的书写十分繁琐,在加上方法的涉足,是的它的书写要花费很多时间,如果再加上对象的属性恰巧为私有属性,就更加复杂了,set,get的书写与应用都是难题。
这些缺点一方面降低了代码的可读性,另一方面也加大了程序员的工作量。毕竟每一步都是比较容易出错的,程序员必须保证它功能实现的完整性。
再说起java的安装过程,它真的花费了我大量的时间,在寒假里我都打算安装java编译器来练练手,谁知道它的安装不是像c语言那样软件一安装就可以在里面进行练习编译,再安装java环境之前还需要先进行java环境的配置。我看了很多网课,真的就是照葫芦画飘都弄不好,配置几次都没有成功。最后还导致配置的残留对再次配置有影响。最后到学校才找到靠谱的安装教程。
Java编译器老师发过几种,在对其的选择上我选择了idea,因为它里面含有丰富的快捷键与强大的代码生成功能。会根据你书写的代码进行选择。但是这款软件需要激活。费用不少,
二.设计与分析
1.第一次作业
第一次作业的题目偏简单,可以说都是一些基本的简单题目,这次作业的一大特点就是数量多。这对刚开始学习java的我们我认为起到了很好的缓冲作用,里面的题目在学习c语言
时都做过原题。只是使用一些特定的语句,当然也可以说是做了一次转换,例如第一题的计算两数之和,第三题的成绩等级管理等等。后面的几个题目有一点难度,其复杂性也是比较大,写起来很慢,而且对于细致性的要求也较高。这里就展开说最后一题的判断三角形类型。
事例的输入带有小数,所以我定义的三条边为f loat型变量。题目要求的变量有取值范围,所以我采用if语句,即:
if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200),然后下面在进行各种操作,如果下面再有判断条件,我就会使用嵌套if语句。下面果然有对是否构成三角形的判断。这条语句
自然写在上一个if语句的内部。
下一步就开始了正式的写三角形环节。首先我想最简单的就是对等边三角形的判断了吧,其次我开始了对等腰三角的判断,等腰三角形的情况是真的比较麻烦,有等腰直角三角形,i一般的等腰三角形。而且它含有一个隐性的判断先后性,那就是要先对特殊的等腰三角形先进行判断。若不是这样的话会只输出Isosceles triangle,下面再写特殊情况的话不会再进行判断。最后一个直角三角形的判断不难,很中规中矩。但是当我代码全部写完后我发现一直有个测试点过不去,这是为什么呢?寻找了很久未果后我决定不再浪费时间,上网查看了这道题,发现有跟我一样的情况!原来这涉及到出题者的设计问题,它对根号二的设计不准确,所以他采用根号二倍的直角边减去斜边小于某个小值。
这对我们的启发是有时面对解决不了的问题要多角度思考,从不同的角度来看待事物才会更加了解问题所在,也更有益于提高自己的处理问题的能力。
2.第二次作业
第二次作业相对于第一次作业难度上提升了不只是一点点,但都是按照顺序出题的,就跟学习c语言时一样,数组,函数又来了。第二题和第一题都是数组的应用,我个人觉得第一题是比第二题难度要大的。因为第一题涉及到二进制与十进制的相互转化,如果在不知道Integer.parseInt()这个方法的情况下,纯手工写工程量真的蛮大的。对于字符串的处理的方法我感觉真的好多。Integer.parseInt(s.substring(an , an+8) , 2)后面的参数为二进制。
下面我将对7-4,7-5两道题目进行详细分析,两道题目都是有对方法的熟练掌握,且每道题目都是含有不只一个方法,两道题有相似之处,都含有对年份的判断,对年份的处理,有一点复杂!7-4是求输入年份的下一天,输出日期。public static boolean isLeapYear(int year);
判断year是否为闰年,返回boolean类型,public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值,这两个函数为boolean型函数,主要功能为是合法性检测。之后的一系列操作都是在此条件下产生进行的。自然这两个判断要写在最前面。
之后的void nextDate(int year,int month,int month,int day)则是主要函数,功能基本就在这。先是采用switch对月份进行分类,平年,闰年判断后又要在分类一下。
这是平年的情况:
当输入的日期不为月份的最后一天时,就十分简单啦,后面的分类着重考虑几种特殊情况,这些都是日子为每个月的最后一天的情况。月份为12月时,年份就要加1,其他也是都变成。后面有的测试点则专门针对某个月份的最后一天,此时不能简单地对月份,日子做常规的合法性检测,还需要展开来讨论,这当时也是找了很久才发现。
7-5这道题目是求前n天,与前一题有些许相似,都是要先进行判断,这里我直接写在主方法里了,不再另外构造方法了,
如果日期减去输入天数不会出现越界情况,则是普通情况,所以
接下来就是特殊情况了,如果日期向前越界,并且月份越界,则年份减去一,月份为12,
还有一种情况就是向后越界啦,如果月份又越界,则年份加1,
3.第三次作业
第三次作业就很重要了,涉及到对象和类,这三道题目都有点难度,对面向对象的概念的要求掌握度挺高,下面我将对7-2,7-3两道题做详细分析。
7-2是定义日期类,讲到底这道题不难,与上一次的作业有相似性,只需要定义属性后再把函数写到第对象中即可,只要要求就是体现类的封装性。我先创建一个类,里面方法挺多
这里就截取一部分。
这道题目的要求还是求下一天,在这里我就不做太多解释了,详细参考上次作业。
7-3这道题挺难的,是一元多项式的求导,我没有得到满分啊,只得到了一部分分,是输入错误和常数的情况,这道题需要用到正则表达式,他的书写是一大难度,题目中的逻辑分析又是一大难点。
这是判断输入是否合法的正则表达,我是没怎么看懂,我只判断了常数情况
我这里并不做过多分析,真的不会写。
三.踩坑心得
1.if else语句使用时又是需要注意大小情况问题,小的情况要放在普遍情况的前面进行单独展开,要不然会有遗漏。
2.对各种方法的掌握要熟练,要知晓,知道的话一旦到了需要运用的时候会避免很多弯路。
3.对于给定的题目要求要看清,对题目的逻辑要求要分析到位,之前的一道题目就是因为题目没有认真看,导致浪费了很多时间来找语法错误,结果就是简单的判断问题。
4.对接接触过多的简单排序,素数,闰年等题目要熟练掌握。
5.代码的书写要提高可读性,模板性,不要用空格,否则找错误的时候真的是会浪费很多时间。
6.对于未接触到过的题目不会的话可以直接上网搜索,不必太纠结,浪费太多时间也是没有必要。
7.使用类的私有属性时要运用set,get函数,虽说这个作用是改变属性的值,但是写一下是很有必要的。
四.改进建议
1.我个人写代码时也是很喜欢用空格键,这个是不好的习惯,用tab键即可。
2.对于题目的要求可以先画出逻辑图,便于书写代码时一一对照。
3.对于类的属性声明要是私有属性的话,每一个属性都要写出对应的set,get函数。
4.多多练习,增加知识储备。
五.总结:
通过这三次作业我对java有了初步认识,对其的态度也应该保持绝对端正,他的难度较大,有点难学。这几次作业我学会了数组,方法,类的定义与引用,以及字符串的地位与用途。没一个知识点都时极其重要的,这是一个基础的建立过程,如果基础没有打好,以后的代码书写我可能会走很多弯路,犯很多基础问题。学习时无止境的,有很多东西都是需要你去学习认识的。以后的学习中 我将会以更加热情的态度来学习这门课程,以更加稳重的心态来面对挑战。

浙公网安备 33010602011771号