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



3.改进建议
自己刚开始接触java,编程能力肯定比较低,写出来的代码错误多,代码质量差,在遇到难一点的题目时,思绪不够清晰,考虑不够完整严密,这些虽然是正常现象,但在今后学习中要注意这些问题,仅仅会编程是远远不够的,也要学会慢慢去提高代码质量。经过三次题目集练习,明显发觉自己对与字符数据类型和操作的知识掌握不太好,运用吃力,导致只要碰到与此类相关的题就不会写,写出来的代码也是存在很多问题。除此之外,三次题目集的练习中,发现自己的学习方式存在问题,零散学习,知识片面化,效率低下,后面自己应抓紧时间调整学习方式,端正学习态度,找到适合自己的高效学习方法。
(第一次题目集统计子串在整串中出现的次数问题提交情况)
4.总结:
通过三次练习学到了什么:对Java语法知识基本了解,当然,这其中肯定还有些知识掌握不太牢固,后面学习过程中要注意对这些知识进一步巩固。目前能进行简单编程,开始对面向对象设计有了一些认识,知道其与面向过程设计的一些区别,比如:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。了解了面向对象设计的一些优缺点,易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护;但与面向过程设计相比,性能比其要低。
关于Java语法的一些细节还需要不断学习,特别是对String类要进一步学习研究,自己一遇到和字符串有关的题目就犯难,像是字符串比较,查找字符串中的字符或者子串这些知识相对生疏,得花时间去加强巩固。对与类相关的知识需要进一步学习,类与类之间的关系,类的封装,对象数组,与this相关的知识等等新东西还需要自己多花些时间查找资料,看书,看慕课来进一步学习,力争对知识吃透吃牢,不要让这这基础的东西在后面拖后腿。方法使用虽然现在已经了解的差不多了,但任然存在对细节知识的欠缺,以及在方法抽象和逐步求精上掌握极少,还需要学习研究。另外在这三次作业中,我还学到了要多思考,多学习,要看得见头和尾的学习,而不是碎片化学习,哪里不会才去学哪里,这样是错误的学习方式,效率极低,知识掌握不连贯,知识运用时链接不起来,导致多种、多重错误。编程语言学习也是一个训练思维的学习过程,仅是掌握了知识是远远不够的,优质量的代码是需要不断思考,改良而来的,而且思考不到位,遇到复杂的编程就会出现很多bug,因此学习加不断思考才能学好这门课。
最后希望老师上课时偶尔能提一下一些基础知识的细节问题,说不定哪一点我们就疏漏了;也可以提一下我们做的题目集中的一些严重的问题所在,让我们好进一步改进。课程的话,按老师的节奏走就行。作业和试验希望老师可以抽一点时间给我们分析一下难一点的题目。
接下来,请自己继续努力!
浙公网安备 33010602011771号