OOP学习的第一次博客作业
(1)初次学习oop面向程序设计感想:
面向程序设计java和c语言有所相通的地方,比如一些语法和逻辑都大体相同,只是部分的写法不同。c语言的输入和输出与java的用法大体相同,只是写法不同而已。Java中的更灵活,仅仅一种数字进制的约束可以通过string.format或者prinrf等很多方法去实现,比c语言所使用的方法更多。Java也与c不同,java可以分为编译前的与编译后的两种模式,java相较于c有更多的方法,这让我们操作的进行更加的简便,但正是如此,也需要我们更加耗费更多的时间去掌握各种方法的使用,对之熟悉到熟练之后,有助于我们更加快速的解决我们所面临的问题和想要进行的操作。并且现在使用的编译器eclipse相较于之前c语言使用的devc++,我认为更加的智能,他可以在你编写的过程中直接用红色波浪线划出你所错误的详细位置,并且给你提出介意如何解决这个问题。
(2)简要概述java和c语言的区别:
1.Java是一种解释性的编程语言,而C是一种编译型的编程语言。这意味着Java程序在运行时需要解释器来执行,而C程序必须在编译时转化为机器代码。
2.Java在内存管理方面更为高级,具有自动垃圾回收机制,而C需要手动进行内存管理。在Java中,面向对象是一种编程范式,所有的Java代码都是面向对象的。Java相较于c语言是分为很多类,类中含有许多属性,属性又含有其特有的性质(private、public、protected),类之间有含有其特殊的关联关系(依赖,聚集,),Java中的所有类都是基于这基本概念构建的。例如,Java中的String类就是一个封装了字符串数据和操作字符串的方法的类,而ArrayList类继承了List接口,并添加了自己的方法来实现一个可变长度的数组。
(3)对三次作业的总结:
- 第一次作业:本次作业考察了在java函数中的string类,一维数组,各类循环的模式以及各种类型之间的转换,最令我印象深刻的便是保留多少位小数,这与我之前在c语言中学的并不相同,起初遇到System.out.println这类形式输出时并不知道怎么执行,之后经过查阅相关资料之后便有了对System.out.printf的初步了解,并且java中也可用String.format进行有效数字之间的转换。本次作业主体目的是让我们了解java编程的基本构架,基本的输出输入语句,让我们开始逐渐开始学习java。本次作业的题量很多,但是难度并不大,各个题目之间有相关的关联,都为大致一体的框架。
- 第二次作业:本次作业考察了也是输出数字的小数点位次问题,以及学习到了像substring、math.abs这中的新方法,有助于我们以后面对问题时更加容易快捷的去解决。在前两次作业中主要是学会熟悉用java的语言进行编程,以及如何让我们编码的排版 更加整洁,更加让读者易于理解。在本次编程中我对字符串数组的了解更加深刻,也有利于未来java的学习。本次作业的题量适中,难度也适中,但是在编程的过程中太容易出现编码的丢三落四,逻辑错误或者部分条件忽略的现象,需要我从自身找错误,在不断地编程中学习到新的知识。
3.第三次作业:本次作业考察的类的创建,类的创建包括类其中属性与方法的定义。方法的定义往往是让人头疼的,我们得从题目中得知本次编程题的需要的功能是什么,加以思考之后,逐步去编程。引用类的方法其中的学问需要待我们一步步挖掘,从这里我已经意识到了java的难人之处,让我觉得java的学习速度如此之快,让我难以接受,需要花费更多的时间去学习,去完成习题。本次的作业题量不多,但是对于我来说难度巨大,希望以后能够紧跟步伐。
(4)设计与分析:
初次面对7-3这道题时,
这个date类的结构图给了我们很大的引导作用,我们先根据结构导图,编写出date类中的各项方法,首先定义date类中的各项属性以及用数组定义每年十二月的天数之后,再定义各个方法,int、get各项属性,以及功能的方法。isLeapYear()、int checkInputValidity(int year,int month,int day)、nextDate(int year,int month,int day)是类中的重中之重,再构思好方法内具体代码程序之后才可开始去编写详细的程序。
public static void nextDate(int year,int month,int day) { int[] a={0,31,29,31,30,31,30,31,31,30,31,30,31}; // a={0,31,29,31,30,31,30,31,31,30,31,30,31}; int day1=0,month1=0; if(isLeapYear(year)==1&&day<=28) a[2] = 28; if(checkInputValidity(year,month,day)==1){ int flag=0; if(isLeapYear(year)!=1&&day==29) flag=1; if(month==12) { if(day==a[12]) { year=year+1; month1= 1; day1=1; }else{ month1=month; day1=day+1; } }else { if(day==a[month]) { month1= month + 1; day1= 1; }else{ month1=month; day1= day+1; } } if(flag==0) System.out.print("Next day is:"+year+"-"+month1+"-"+day1); else System.out.print("Date Format is Wrong"); } else System.out.print("Date Format is Wrong"); } }
输出下一天是该类最主要的一个方法,最初编写时经常出现下一天的日期实际上是错误日期或不规范的日期。并且在起初,在输入非法日期的时候,由于代码逻辑编写错误,导致
Date Format is Wrong输出了两次,在一次次调试之后才发现了错误所在,更改程序之后才实现了程序的实现。main程序中对data类中发送信息,引用date类中的方法实现功能的实现
Date date1=new Date(year,month,day); date1.nextDate(year,month,day);
在此代码中通过Date类定义date1为Date类型,通过传入参数给date1中的属性赋值后,再给Date类传入信息引用date1中的nextDate来计算下一天,进而实现功能。
而对于7-4这道题,
与7-3有一定的相关性,只是再求下一天的基础上,求下n天,对于isLeapYear()、int checkInputValidity(int year,int month,int day),都与上题一致,可以直接复制过来,差别之处就在于下n天的方法的编写,根据我们所划出的结构导图可以得知,我们先编写出Dateutil的类,再编写Dateutil中的属性及方法。根据提示可知
public boolean checkInputValidity();//检测输入的年、月、日是否合法 public boolean isLeapYear(int year);//判断year是否为闰年 public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期 public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期 public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后) public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等 public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数 public String showDate();//以“year-month-day”格式返回日期值
对于第n天的计算,其实与下一天等同,我们需要注意的就是每个月的末尾以及每年的末尾即可,在这些地方做处理之后便可以编写出来该方法
public DateUtil getNextNDays(int n){ for (int i=0;i<n;i++) { if(isLeapYear(this.year)) a[2]=29; else a[2]=28; if(this.day==a[this.month]) { if(this.month==12) { this.year++; this.month=1; this.day=1; } else { this.month++; this.day=1; } } else this.day++; } return new DateUtil(this.year,this.month,this.day); }
而对于前n天的计算与后n天同理。只是时间加变成时间减而已。
对于判断两个日期的大小,我们便层层比较,由年到月再从月到日,逐一进行比较便可得到答案。
public boolean compareDates(DateUtil date){ if(this.year>date.getYear()) return false; else if(this.year==date.getYear()&&this.month>date.getMonth()) return false; else if(this.year==date.getYear()&&this.month==date.getMonth()&&this.day>date.getDay()) return false; else return true; }
对于判断两天是否相等,易得就是判断两个日期的年月日是否相等。
面对求两个日期的天数差,起初去简单的年数比较相减×365,然后进行月份想减×对应月份的天数再加天数相减,最后发现程序及其的复杂以及忽略了闰年。这让我进入了沉思,经过查阅资料之后才找到了解决办法。我们可以以第0年第1月第1日作为基点,两个日期距离该天的天数进行一个相减,便更容易得到两个日期相差的天数。此刻我编写了一个方法求距离基点天数的方法,这样每次向类发送信息时,更加的方便获得答案。
public int datesum(int year,int month,int day){
int sum=0;
for(int i= 1;i<year;i++) {
if(isLeapYear(i)==true)
sum=sum+366;
else
sum=sum+365;
}
for(int j=1;j<month;j++){
sum=sum+a[j];
if(isLeapYear(year)==true&&j==2)
sum=sum+1;
}
sum=sum+day;
return sum;
}
然后再在datesum(int year,int month,int day)中定义方法获取两个日期之间的差值
public int getDaysofDates(DateUtil date){
int result=datesum(this.year,this.month,this.day)-datesum(date.getYear(),date.getMonth(),date.getDay());
return Math.abs(result);
}
根据这两道题,在不断的编写完善之后,让我掌握了日期之间的规律以及基本的一些编程技巧
(5)踩坑心得:
起初刚开始在pta上编写java程序的时候,很容易出现变成错误,与之前学习的c语言相比,java有许多地方强制需求大小写,System.out.println、nextInt等等,时常会因为大小写没有区分导致编程错误。并且 Scanner input = new Scanner(System.in);的写入在起初编写代码的时候会忘记。以及我认为在pta上jva的测试点过多,每次都很艰难的对代码进行一次次修改之后才可以通过全部测试点,在这个过程中也让我意识到我的代码其实是具有非常多的漏洞的,并不是完美无缺的。并且在保留二位小数方面,我花费了巨大功夫,类似
System.out.printf("The Account'balance:%.2f\n",dwd.getBalance());
在编程上是正确的,但是我使用
System.out.println("The Monthly interest:"+String.format("%.2lf",dwd.getMonthlyInterestRate()));
进行输出就是错误的,这让我沉思了很久。并且在起初写类中的方法时,类的属性更改,我运用
public int setBalance(double balance) { this.balance = balance; }
时的报错让我摸不着头脑,是在我观察很久之后才发现没有熟悉,应该编写为
public void setBalance(double balance) { this.balance = balance; }
我把我平时编程出现错误总结为以下几点:一是自己对题目的误解,自己的想法并不是按照题目所安排的进行。二是自己对知识点的不掌握,一些方法的调用以及逻辑编程的问题,导致自己在编程中经常容易犯错且找不到编写的方向。三是自己编写时的粗心大意,这里漏一点那里写错一点,导致自己的整个程序千疮百孔。我希望在接下的学习以及编程的过程中不断完善自己,学习到更多的知识。
(6)改进建议:
以后编写代码的时候,可以先写出大致的框架之后再进行编写,这样可以让我们编写出来的代码更加具有条理性,也不容易出现差错。并且编写程序时更好的是再编译器上进行编写,这样可以让我们再编写的过程中出现编译的错误更加容易的更改。在我们完成整个程序的编写之后我们可以观察自己编写的代码,看看有没有更加简练的语句让我们的程序变得更加简练。
(7)总结:
在三次的作业中我学习到了java的基本编程语言的不同之处,掌握了基本的java程序设计(输入、输出、部分基本方法等等),学习到了类的定义以及类中方法的定义与引用 ,让我对java编程的框架有了大致的掌握。但是类的编写已经引用一些不熟悉的方法让我们感觉到java编程非常有难度。我觉得java课上讲的东西都非常的深奥,感觉对我目前的编程相关性不大。平时的pta作业也非常有难度,经常要写很久都写不出来。非常的具有难度,感觉都是新知识,都没有学习,都得自己看网上的,这非常考验自己的自学能力,得查阅非常多的资料才能了解编程该程序到底需要什么,目前的作业和实验对于我们个人的能力的考验非常大,难度以及挑战性也是较大的,希望老师在课堂上多引导我们,给我们圈重点,告诉我们本次作业所涉及到的知识点有哪些,让我们有提前准备的机会,不然每次的作业完成的时间过长,痛苦都过大。不过我们相信在不远的未来,在我们历经一次次作业、实验的洗礼的过程中,会不断的进步,掌握更多的技术,成为更好的以及。

浙公网安备 33010602011771号