blog作业1
通过这三次作业来说,我正式开始了java这门课程的学习以及练习,通过这三次的作业,我已经开始通过面向对象的思维来解决问题,而不是重复着上个学期c语言的面向过程的思维去解决问题。
这三次的题目难度是从难到易的,第一次作业就是Java的入门,基本的语句和语法的练习,难度较为简单,而且所划定的时间也是较少的,比较容易完成;然后到了第二次的作业,题目开始有了变化,已经开始了一些算法,在Java中应该说是方法的涉及和设计,以及if else语句的运用还有for’循环的练习运用,一开始做的时候还是觉得有点难度无法下手的,经过几次的失败和语法错误后,我已经开始逐渐掌握了语句的用法。第三次的作业就是开始面向对象进行设计了,需要自己设计方法和设计出类,并且对类进行封装,第三次的作业就明显比前两次难得多了,需要运用到的方法以及数据结构就更加复杂了。
先分析一下作业中的题目吧,首先是作业一中的7-8,这道题是需要通过自己从键盘中输入的三条边来判断所组成的三角形是一个什么的样的三角形,并且在输入错误的数据的时候要给出对应的提示例如:wrong Formet;
double a=0,b=0,c=0;
Scanner scanner = new Scanner(System.in);
a = scanner.nextDouble();
b =scanner.nextDouble();
c=scanner.nextDouble();
我首先定义数据结构,分别是三条边,再分别从键盘中入入这三条边,这些都市基本的语句。if(a>0 && a<=200 && b>0 && b<=200 && c>0 && c<=200) {
if(a>b) {
double temp = a;
a=b;
b= temp;
}
if(a>c) {
double temp = a;
a=c;
c= temp;
}
if(b>c) {
double temp = b;
b=c;
c= temp;
}
if(a+b>c&&a-b<c) {
if(a*a+b*b<c*c) {
if(a==b) {
System.out.println("Isosceles triangle");
}else {
System.out.println("General triangle");
}
}else if(a*a+b*b==c*c) {
if(a==b) {
System.out.println("Isosceles right-angled triangle");
}else {
System.out.println("Right-angled triangle");
}
}else {
if(a==b) {
if(b==c) {
System.out.println("Equilateral triangle");
}else {
System.out.println("Isosceles triangle");
}
}else {
System.out.println("General triangle");
}
}
}else {
System.out.println("Not a triangle");
}
}else {
System.out.println("Wrong Format");
}
后面就开始语句的if else输入,但在这里之前是需要判定是否能够构成三角形,既是a+b>c并且a-b<c才能够构成三角形,而且电脑不能判定那条边才是长边,第二长的边和最短的边,所以我只能通过比较,然后再加入一个参数最后赋值的方法来分出他们的大小,然后在判断边边的关系。等边三角形即使三条边都需要相等才能够成立,等腰三角形需要两个腰相等才能成立,直角三角形是需要用到math方法的运算既是勾股定理的方法,然后直角等腰三角形是在直角的基础上在判断两条腰的。总的来说这道题反复的运用了if else语句,是解决这道题的基本方法和语句,其次就是一些方法的运用的问题。
然后来分析一下作业二的7-4,这道题所需要求的是下一天,即是从键盘中输入一定的年份月份和日,写出来的代码计算出从键盘中输入的数的下一天。这道题首先需要搞清楚的问题是年份的问题,因为在不同的年,存在闰年和平年,即二月有多少天的问题。这是一个陷阱,我之前就忘记了这个问题的所在,导致我的程序一直有几个点过不了,后来咨询了同学才明白这个道理。首先分析年,及用到了计算闰年平年的方法
boolean isLeapYear=(year%4==0&&year%100!=0)||year%400==0;
return isLeapYear;
即使用了布尔类型的语句和基础的方法,然后返回是否是闰年或者平年;然后我用了比较普通的方法来写,也就是最愚蠢的方法,即分开了写,第一个写的是当闰年的时候,二月有二十九号这个特殊的日子,所以就是前一天二十八号的时候备注出来,用if else语句,其他的都是正常写,就是运用到了for循环的语句,设置一个数字然后一直求,然后不是一个月有三十一天,然后一个月三十天的吗,就这样从一月份到十二月份,分开来写,有三十天的写一种情况,而三十一天的又是另一种情况。然后在平年的时候就是没有二十九号的,即到了二十八号就没有了,然后剩下来的思路就是和之前的一样了。当然这个也是存在错误输入的,当输入了所限制的时间点和日子的话,系统会给出wrong Forment,和之前一样这也是用if else 语句来完成的,只不过这是所有的前提,是一个大前提。
然后来分析一下作业二的7-8,这道题应该可以说是结合第二次作业前面几道题,拼出来的一道题,也是一道有一点难度的题目,对于我这种初学者来说吧。它这道题所需要求的是前N天。即从键盘中输入一个日期,然后通过程序计算出你输入的多少天前的日期或者说是若少天后的日期。
boolean c=true;
int y=0,q=0,d=0,n=0,l=0,t=0;
首先我在定义数据类型的时候还是用到了布尔类型,这是因为在后面需要做出一些判断来计算,然后即定义一些普通的常量。然后这道题也是需要像之前的题目一样判断闰年和平年的在这里就不多讲了,
public static void nextDate(int year,int m,int day,int n) {
int[] mm={0,31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year))mm[2]=29;
day-=n;
if (n>0){
while (day<=0){
m--;
if (m==0){
m+=12;
year--;
}
day=day+mm[m];
}
}else if (n<0){
while (day>mm[m]) {
day=day-mm[m];
m++;
if (m==13){
m-=12;
year=year+1;
}
}
}
System.out.printf("%d days ago is:%d-%d-%d\n",n,year,m,day);
这里就用到了方法,通过if else语句算出给出的日期的所在的时间点,然后做出对应的判断和之前的题目一样,只不过是要加上时间要往回减去几天或者加上几天,但要注意的是比如1-8那就是要回到上个月去了而不是单纯的输出一个负数。而且也要判断上个月是几月份,所以这就需要if else的多次判断了,同时写出特殊的情况的if语句,所以这道题既是在前一道题的基础上再加上了一个要转化月份的方法和日子的加减的输出的方法。
然后再来看看第三次作业的第二题,第三次作业就是要开始设计类了,这次所需要设计的类是一个Data类这个data需要包含年月日三个部分。
class Data {
private int year; // 年
private int month; // 月
private int date;
首先是定义这一个类即data,然后定义出这个类中的三个数据。
Day(int year, int month, int date) {
this.year = year; // 年
this.month = month; // 月
this.date = date; // 日
然后是获取这三个数据
void setYear(int year) { this.year = year; } // 设置年
void setMonth(int month) { this.month = month; } // 设置月
void setDate(int date) { this.date = date; } // 设置日
void set(int year, int month, int date) { // 设置年月日
this.year = year; // 年
this.month = month; // 月
this.date = date; // 日
}
然后是设置年月日。
public int dayOfWeek() {
int y = year; // 0 … 星期日
int m = month; // 1 … 星期一
if (m == 1 || m == 2) { // :
y--; // 5 … 星期五
m += 12; // 6 … 星期六
}
return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + date) % 7;
}
然后就是主函数计算日期了。这道题主要就是设计类的时候比较麻烦,总是忘记返回值,导致程序的语法编程错误。
在提交源码的时候出现过各种各样的问题,最多还是是编译错误,因为总是在写题目的时候会出现很多的语法的错误,就像是普通的定义时候忘记了自己定义的是int类型还是double类型导致后来输入输出的时候出现问题,导致出现编译错误的问题,还有出现问题的是自己总是在返回值的时候忘记去写返回,
public void setAnnualInterestRate(double annualInterestRate){
this.annualInterestRate=annualInterestRate;
}
public double getAnnualInterestRate(){
return this.annualInterestRate;
}就拿这个例子来说,之前总是忘记写下面这个return。并且在最后输出的时候总是忘记自己写的是java还是习惯用c语言的方式去写题目,导致我在写Java的过程中经常参些c语言的方法和算法,还有经常忘记输入是需要从键盘中输入,还有在定义数组的时候,容易忘记需要new一下新定义的数组,并且数组是需要在最前面的时候就定义好多少的内存,而不是在写的过程中想到多少就写多少就行的。还有在定义一个类的时候总是会将括号的顺序搞乱来,需要加括号的时候忘记,不需要加括号的时候又经常把别的括号给删掉来,这个问题出现过好几次,现在也是改过来了。还有最后在输出的时候固定的语句是需要加上双引号引用的,这点我也是经常忘记,导致系统有几次进行了报错。还有对静态方法和动态方法的混淆,经常忘记在静态的方法前面加上static,在动态方法也经常写成静态的方法,导致写着写着就写不下去的状况经常发生。这是我暂时总结出来的一些我经常犯的一些错误。
针对这三次的实验,我懂得了Java这个语言的初步的设计,这是一门面向对象的设计课程,总的来说是应该忘记之前的面向过程的设计方法,转而导向对象的思维,在第一次练习中我学到了Java初步语句和基本方法使用的思想.在作业二中,我已经基本掌握了if else语句的使用方法和for循环的使用方法,并且也充分了解计算问题时应该考虑的很多的因素和很多问题答案中存在的不确定性和不唯一性,并且需要将这些特殊的情况一一写出来,并且在所有的问题之前都要说名=明大前提,并且将输入错误时的信息反馈给使用者,让使用者重新输入。并且学习到了一个random取随机数的方法,这个方法很好用。第三次作业我学习到了类的运用,在定义一个类时需要严格的去定义类中的数据,并且,需要时刻记得需要有返回值的存在。并且在对类定义完之后需要对其进行相应的封装,并且将这个写出来的类加入到写的主函数中,并且能让主函数能够很好的去调用这个类和其中的一些方法。
当然还是有很多需要进行改进的地方,首先就是对Java语言的熟悉程度还是有点生疏,有的时候突然就忘记了一些基本的语句怎么写了,还有对Java中的面向对象的理念理解还是不是很深,这一点需要多做题来提升,其次就是对类的理解还是比较浅,如果是遇到了比较难的题目还是不能够下手,还是的去咨询同学,而且在定义的时候经常不严谨,导致后来自己看程序的时候经常看不懂自己写的是什么,而且注释给的也少,不能让别人一眼就知道我这个步骤写的是什么东西。还有很多方法我还不知道,现在知道的方法还是很肤浅很少的,这一方需要很大的加强。
对课上的老师还是说多讲点对写作业有用的东西吧,现在学真就是靠自学了,发布的作业的内容一开始看还真是看天书,不去自学根本写都写不来,而且上课的时候老师讲的也快,经常一下就讲完了一个章节,而且作业与老师讲的真的完全不一样,我在这里也不是说埋怨什么的,老师没做学生做的,根本就不知道学生写的有多痛苦,要写这个要写那个,还要刷网课,没写要挂科,写不出来也要挂科,就是天天把挂科掉的嘴巴上也会有人挂科的好吧,还不如好好多交交学生基础的东西,多关心一下学生是否能够理解,而不是讲完了就直接发题目,你写不出来我就扣你的分这样,这样真的久了就让学生有一种挫败的感觉,更何况还发没讲的题目,还要学生自己去自学,真要是全部都是学生自学还用来上大学干嘛?这就感觉自己学不好这门课程,我只要有一点没做好,老师就要挂我的课。

浙公网安备 33010602011771号