一.对Java的看法
这一学期刚接触Java课程,假期时间就听说这学期要学,但是自制力有点差,想着假期去了解一下Java却没有实现。学习了一个月了感觉Java和C语言有很多共同之处,学起来相对不是很吃力(有了C语言的基础)。
Java有类的概念,刚开始学最难理解的就是对类的调用以及public、private和static的用法
还有以前没有用过的Boolean数据类型,输入输出也和C语言有很大差别,
发现if/else、switch、while、for等语句都可以使用时对Java又产生了信心
像输入输出格式要求、一维数组定义都需要重新学习,但我发现书上什么都有,定义类型和函数运用这方面书上介绍的特别详细,这本书对初学者帮助巨大
二.对三次pta作业进行分析
1.三次作业中遇到的BUG
显示没有Main的外层实例,其实是把类放到了主函数里面
经常把printf写在输出上," "格式也经常打错
不能定义静态初始化
函数使用的返回值Boolean只能返回true和false
2.知识点、题量、难易度
知识点:
第一次pta主要是为了让我们熟悉Java的框架和构造,了解输入输出的格式、for和switch在java中的运用,一维数组的定义等...
第二次最明显的就是相对复杂了很多,像日历这种题不但要考虑闰年还要考虑月份天数,下一天要考虑是否为本月的最后一天,考察我们的全面性和对函数的应用以及查找问题和改正的能力
第三次pta就上升到了类的使用,要求创建一个类用来存储数据,这就需要了解类的创建和调用,还学到了一个新的数据类型LocalData
题量和难易度:
题的数量依次减少,但要写的内容都是相对增加,难易度逐渐上升,第三次的最后一题就没有做出来。
3.题目集1.7-8判断三角形类类型
这个题目很简单,就是对三角形的一个分类,a、b、c三个边可以将所有情况都表述出来,用到if/else if/else方法,题目给出的输出格式的顺序是最简便的,如先判断是否为等腰直角三角形在判断是否为等腰三角形和直角三角形。如果是等腰直角三角形直接输出等腰直角三角形,就不会再输出这个三角形是等腰三角形和直角三角形。
首先是要判断输入问题,三角形要求三个边要是实数且属于(1,200),所以输入字母等就是非法输入,我创建了一个数组,存放三个边,然后用一个if语句用来判断三遍是否符合if(a[i] < 1 || a[i] > 200),然后就是具体类型具体分析,分别给出三边条件,符合就输出三角形的类型。
题目集2,7-4、7-5
这两个题目结构几乎一样,7-4是输出输入日期的下一天,而7-5是输出输入日期的前N天,想要确定日期的下一天和前N天,就要分普通情况和特殊情况,先说下一天:正常情况下一天直接day+1输出即可、特殊情况:第一种是月末,月末又分为三种,2月、30天、31天,所以需要一个if或者switch语句来具体分析,如果属于月末就month+1,day=1,这时候第二种问题就来了,如果是年末呢,month+1=13,那就不符合了,所以又要分month=12和month!=12两类。
前N天也很相似,需要反向思考,分为前N天在上一个月和在本月,在本月直接减法就可以,在上一个月就要分析上一个月有多少天了,因为是倒着来的,所以要知道上一个月最后一天是几号,这种时候就要对month-1进行分类了,分四类。30天的、31天的、2月(分两类闰年和非闰年)、1月、一月就要回到上一年了,要仔细考虑。
做题时创建了两个函数,第一个是boolean isLeapYear,判断是否为闰年(用于判断2月的天数),返回值为boolean类型,如果是闰年就返回true,否则返回false。二是一个对输入条件的判断boolean checkInputValidity,例如2019年2月29号为输入错误,主要判断年份是否在符合范围,每一个月的天数是否超过。
题目集3,7-2定义日期类
这个题目新建了一个类Data用来存放year,month,day数据,我在Data类里创了一个一维数组用来存放每月的天数,由于闰年和不是闰年二月天数会发生变化就可以根据isLeapYear传回来的数据来改a[2]的值。其他方法都和上一题基本相同。
7-3 一元多项式求导
一元多项式求导,这道题有点复杂,当时没有做出来,参考了一下网上一些资料,创建一个DvForString()类,将一元多项式分类进行分析,如全是常数项、x只有系数、x只有指数、x指数和系数都有、还有每一项前面的符号。
number:表示全是常数项时的特判
specialnum:带x项,允许系数中间内有空格,有不为0的系数和指数
regex:x只有指数
regex2:x前面系数,指数都没有
concat:数字和带x项或在一起构成多项式中的一项
concatend:多项式表达式 ,首项可以无+,-, 后续项必须有
end:Polynthic 多项式
public DvForString()有参构造,可以直接通过字符串数组名赋值另一个相同大小和类型的数组public DvForString(String polynthic)对私有变量获取和,赋值的方法
public void setPolynthic(String polynthic)合法性检验
private boolean isLegal() 全常数检验
public void printEveryElement()打印合法输入中每一项
public void print() 打印
private void printNotLegal() 打印合法输出
private void printLegal() 拷贝一份给字符串s
对每一种情况进行分析,将它们分别放入函数里,当检测到多项式是,将他们传到相对应的函数里面进行求导,最后再将它们拼接起来实现一元多项式的求导。
三、踩坑心得
当对输出有要求如保留几位小数时输出才会用到printf,由于写C语言写习惯了,经常会下意识地写printf导致出错
定义类时千万别写在Main里面,以前看不懂错误提示常犯
调用定义的类要先new一个新对象,除非有static时可以直接调用类里面的函数
输出时不只是要注意输出格式,还要注意自己是否打错字母和大小写,如wrong打成wring导致我改了半天都没有找到出错原因(本人英语有点low)
输入字符串是next.Line(),自己经常写next.String();会直接报错然后立马改正
创建数组既可以int[] a = new int[n](书上的格式),也可以int a[] = new int[n];
多思考,像我刚学java,本来啥也不会,不能想着去看别人的代码,因为看到了别人的代码,你的思路就受到了限制,你会不自觉地去想别人的代码靠近,自己看看书多了解了解,最后实在写不出来,问一下写出来的人思路,然后再自己写。虽然自己写出来的代码可能更复杂,但是有了自己的思路就可以了,再根据别人的进行改进删减和完善。
四、改进建议
像第二次题目集我的每月天数相加都是写的一连串,再加上分情况讨论,我的代码不复杂但特别长,在网上看了一下别人的思路,发现他们用了一个一维数组,将每个月的天数都存了起来这样加起来特别方便,不用每次都去写一串数字。
Account类刚写时看到了一个新类型LocalData,就在网上特地查了一下,是一个输出此时此刻的日期的一个函数,还特地扩展了一下,比如说怎么输出当天此时此刻的时间等等
对存储结构还是有点模糊,上课老师让画图也不怎么会画,课下应该多了解一下相关知识
好多东西都写在了主函数里面,这个课程是面向对象,我们应该建立起这样的思维构造,能简便易懂和结构明了就多建一些函数,把每个功能都分开写,至少直观上能达至让别人一眼看出你想表达什么。
五、总结
Java课程也开始了一个多月了,对Java也有了一个大致的了解,从什么都不懂,到老师上课出题能快速进入状态思考方法并自己去完成是一个很大的进步,从刚开始的学习输入输出,怎么定义整型,浮点、字符、字符串、一维数组、构建函数、构建类、调用系统函数,也逐渐有了自己的做题思路,虽不完善,但也逐渐改进,多去了解学习,尤其课下一定要将上课没有及时写出来的问题完善,书本极为重要,内容全面,课下有时间就应该看看书上的内容例子,课下不预习的话上课也会有障碍,毕竟自己是初学者,基础本就没有别人好,再不努力拿什么赶超他人。