一、作业总结
三次作业,总体来讲做得非常糟糕。
对于这学期才学的Java语言,我感到十分的吃力,对于写Java作业感到很痛苦的时候就是在第二次作业开始的时候,我拼尽全力都没有把pta写及格,尤其是菜单系统,我觉得菜单系统对于刚学的我等如登天,是不可能完成的了的。这其中有我自己的问题(问题很大,缺乏主动),也有一点作业难度的影响,深感无力啊啊啊。
第一次作业没有面向对象的身影,直到第二第三次作业(第二次作业心态大爆炸,导致第三次作业都不怎么想做)。还好本周没有pta的作业,我能够在这周稍微喘口气,去学一下自己薄弱的地方,争取下次作业多拿分,少被测试点卡住。
对于这三次作业我有一些小小的体会:
关于类与对象
1、非常像c语言的结构体(但我c语言结构体就没有学好),对于重载不太明白。
2、要把我们要写的程序进行合理的拆分,这样才能写的快、写的好!
关于java语法
1、java语法有很多与c语言相通相似的地方,但是在具体细节上还是有些许的不同,也许这就是Java老师上课不讲前面的基础语法的原因。在这三次pta作业当中有很多错误都是因为自己对Java语法不太熟悉而导致的,这非常影响做题的熟读。不过这不算很大的问题,在以后多敲多写之后会对java语法有更多、更深的理解,在编写程序的时候会少浪费很多在语法上的时间。
2、小心使用运算符,第一次作业用==去比较两个BigInteger调了很久。
关于题量
每次pta大作业的时间都是一个星期。题目数量不算多,但每次难度都在指数级上升,所以每次写作业的时间都在指数级上升。
·关于难度
第一次pta作业总结
1、第一次作业没用类,也没有方法。没有面向对象,全是面向过程。
第一次作业7-7
·此次作业是判断三角形的系统,需要实现三角形的判断以及对一些非法情况的处理。
代码实现
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); double x,y,z,number; x=input.nextFloat(); y=input.nextFloat(); z=input.nextFloat();// if(x>y){ number=x;x=y;y=number; } if(x>z){ number=x;x=z;z=number; } if(y>z){ number=y;y=z;z=number; } if(x>=1&&x<=200&&y>=1&&y<=200&&z>=1&&z<=200){ if(x+y>z){ if(x==y&&y==z) System.out.println("Equilateral triangle"); else if(x*x+y*y-z*z<0.000001&&x==y) System.out.println("Isosceles right-angled triangle"); else if((x==y&&x!=z)||(x==z&&x!=y)||(y==z&&y!=x)) System.out.println("Isosceles triangle"); else if(x*x+y*y-z*z<0.000001) System.out.println("Right-angled triangle"); else System.out.println("General triangle"); } else System.out.println("Not x triangle"); } else System.out.println("Wrong Format"); } }
SourceMonitor上代码质量分析
运行结果
不知为何这题老是有个测试点过不去,从分析代码上看,此程序复杂度不高,大部分数值在正常范围内,函数深度不高,所以代码的质量还有待提升。该题全程使用面向过程的办法没有使用面向对象实属不行。这道题需要实现的代码功能比较简单,进行的运算也不复杂,但是在格式上还有很多提升的空间,比如没有按照老师的要求写注释,不写注释是非常不好的习惯(以后一定会加以改正)!代码运行的时间也不长。
第二次pta作业总结
在第二次作业中有菜单计价程序(噩梦恶魔!)也有和第三次作业的日期类的问题,但是要求的功能有所不同。下面分析一下这次作业
代码实现
import java.io.*; import java.util.*; public class Main { public static boolean judge(int y,int m,int d) { boolean p=false; if(m<1||m>12) { p=false;} else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) { if(d<=31) { p=true;} else { p=false; } } else if(m==2) { if(y%400==0||(y%4==0&&y%100!=0)) { if(d<=29) { p=true; } else { p=false; } } else { if(d<=28){ p=true; } else { p=false; } } } else { if(d<=30){ p=true; } else { p=false; } } return p; } public static int tianshu(int y,int m,int d){ int a[]={31,28,31,30,31,30,31,31,30,31,30,31}; int f=1;int j=0;int i; if(y%4==0&&y%100!=0||y%400==0) { a[1] = 29; } for(i=0;i<m-1;i++) { j+=a[i]; } return j+d; } public static boolean runnian(int y){ boolean flag=false; if(y%400==0||(y%4==0&&y%100!=0)){ flag=true; } else flag=false; return flag; } public static int week(int y,int m,int d){ if(m==1){ m=13; y--; } if(m==2){ m=14; y--; } int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; return week+1; // while (w< 0){ // w += 7; // w %= 7; } public static int sum_day(int month, int day) { //定义十二月的天数 int month_day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //因为这个月的天数已经明确 所以只需要加到上个月份就行 for (int i = 0; i < month-1; i++) { day += month_day[i]; //对天数进行累加 } return day; } /*计算年份之间的天数*/ public static int interval_year_day(int year,int year2) { int day; day = (year2 - year) * 365; for (int i = year; i < year2; i++) { //把两个日期之间相差年份 中闰年的天数加上 //i的初始是小的年份 循环到大的年份 正好是相差的年份 if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) { day = day + 1; } } return day; } /*判断是否位闰年*/ public static int is_whether_leap(int year) { int day = 0; //判断输入的年份是否为闰年 是 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { day = 1; } return day; } public static boolean jiancha(int yy1,int mm1,int dd1,int yy2,int mm2,int dd2){ boolean p=false; if(yy1>yy2) p=true; else if(yy1==yy2&&mm1>mm2) p=true; else if(yy1==yy2&&mm1==mm2&&dd1>dd2) p=true; return p; } public static void main(String[] args){ Scanner sc=new Scanner(System.in); String str1=sc.next(); int flag_1=1; int flag_2=1; String[] array=str1.split("-");//以-为分隔符,提取年月日 int yy=Integer.parseInt(array[0]); int mm=Integer.parseInt(array[1]); int dd=Integer.parseInt(array[2]); String str2=sc.next(); String[] array1=str2.split("-");//以-为分隔符,提取年月日 int yy1=Integer.parseInt(array1[0]); int mm1=Integer.parseInt(array1[1]); int dd1=Integer.parseInt(array1[2]); String str3=sc.next(); String[] array2=str3.split("-");//以-为分隔符,提取年月日 int yy2=Integer.parseInt(array2[0]); int mm2=Integer.parseInt(array2[1]); int dd2=Integer.parseInt(array2[2]); int year_intveral;//相差年份之间的天数 int day_intveral; //相差天数之间的间隔 int sum_intveral; //总的相差天数 int sum_days,or_year_flag; //定义年 月 日 总天数 是否为闰年标记 int sum_days2, or_year_flag2; int x=mm2-mm1; int a=yy2-yy1; int length1 = array[1].length(); int length2 = array1[1].length(); int length3 = array2[1].length(); int length1_1 = array[2].length(); int length2_2 = array1[2].length(); int length3_3 = array2[2].length(); if((length1!=2)||(length2!=2)||(length3!=2)||(length1_1!=2)||(length2_2!=2)||(length3_3!=2)){ if((length1!=2)||(length1_1!=2)){ flag_1=0; } if((length2!=2)||(length3!=2)||(length2_2!=2)||(length3_3!=2)){ flag_2=0; } } if(flag_1==1&&runnian(yy)&&judge(yy,mm,dd)==true){ System.out.println(str1+"是闰年."); } else if(flag_1==0||judge(yy, mm, dd)==false){ System.out.println(str1+"无效!"); } if(flag_1==1&&judge(yy,mm,dd)==true){ System.out.println(str1+"是当年第"+tianshu(yy, mm, dd)+"天,当月第"+dd+"天,当周第"+week(yy,mm,dd)+"天."); } if((flag_2==0)||(judge(yy1, mm1, dd1)==false)||(judge(yy2,mm2,dd2)==false)){ System.out.print(str2+"或"+str3+"中有不合法的日期."); } if((flag_2==1)&&(judge(yy1, mm1, dd1)==true&&judge(yy2, mm2, dd2)==true)){ if(jiancha(yy2,mm2,dd2,yy1,mm1,dd1)==false){ System.out.print(str3+"早于"+str2+",不合法!"); } else{ or_year_flag = is_whether_leap(yy1); //计算第一个输入的日期是当前的第几天 sum_days = sum_day(mm1, dd1); //判断第二个输入日期的是否为闰年 or_year_flag2 = is_whether_leap(yy2); //计算第二个输入的日期是当前的第几天 sum_days2 = sum_day(mm2, dd2); //计算两个不同年份之间相差的天数 year_intveral = interval_year_day(yy1, yy2); //判断两个日期当年是否为闰年 //如果是闰年 or_year_flag=1是闰年 不是为0 而且月份大于3才能1 不然 没输入到2月的日期就把2月多一天加上了 if (or_year_flag == 1 && mm1 >= 3) { sum_days += 1; //天数加1 } if (or_year_flag2 == 1 && mm2>=3) { sum_days2 += 1; //天数加1 } day_intveral = (sum_days - sum_days2) * -1; //总的相差的天数 sum_intveral = day_intveral + year_intveral; System.out.print(str3+"与"+str2+"之间相差"+sum_intveral+"天,所在月份相差"+x+",所在年份相差"+a+"."); } } } }
SourceMonitor上代码质量分析结果如图:
分析
此次作业由于不清楚Java中有专门的为计算日期的类可以直接调用,所以这些计算这些日期都是手搓的代码,所以根据上面的数据可以看出,在代码中有一个方法的复杂度高,因此十分不适合复用,也十分不利于后期的代码维护,此方法也可能存在一些问题(事实上也确实有一个测试点一直过不去)。代码需要实现的功能是:1、判断用户输入的日期是否正确,不正确把不正确的日期输出,提醒用户重新输入。2、判断输入的日期是当年的第几天,和两个日期相差多少年,相差多少月,相差多少周,这里面有涉及到对闰年的判断。
运行结果
可以看到这段代码对不合法日期不能做出正确的判断,在我后期修改过后最后一个测试点任然过不去,我想应该是if条件判断有问题,和代码复杂度太高有一定的影响。所以才导致测试点一直过不去。
第二次作业7-1
本题与7-2都是菜单计价程序,而7-1比7-2明显简单了许多,因为7-1没有删除功能只是简单的菜单计价程序。此代码需要实现点菜功能以及对菜品的不同的份额进行不同的及结果输出,以及对非法情况的处理。
代码实现:
import java.util.*; public class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); String[] dishes={"西红柿炒蛋 1","西红柿炒蛋 2","西红柿炒蛋 3","清炒土豆丝 1","清炒土豆丝 2","清炒土豆丝 3","麻婆豆腐 1","麻婆豆腐 2","麻婆豆腐 3","油淋生菜 1","油淋生菜 2","油淋生菜 3","end"}; int[] price={15,23,30,12,18,24,12,18,24,9,14,18,0}; int i=1;int num=0; int price_sum=0; for(int i=0;i<=1;){ String[] str_dish=input.nextLine(); if(str_dish[i].equals("end")) i=2; num++; } int flag=0; for(int j=0;j<=num-1;j++){ for(int i=0;i<=11;i++){ if(str_dish[j].equals(dishes[i])){ price_sum=price_sum+price[j]; flag=1; } if(falg==0){ System.out.println(str_dish[j]+" does not exist"); } } } System.out.println(price_sum); } }
在Source Monitor上代码质量分析结果:
结果分析:
由于对刚开始学的类基本没学明白,所以本题都是用面向过程的办法做的,而且代码不长,复杂度也低。从上图数据中也可以看出大部分数值都在正常范围内,没有很复杂的地方。
第二次作业7-2
·此次作业为点菜系统,需要实现对菜单的输出,以及对不同份额的菜品进行计算然后输出,以及对不合法情况的判断以及输出提示。在本题的题干给出了类的设计有部分的提示,但是由于我对类方法的不熟悉,没学明白所以此题还是没有做出来,唉。非常的不应该,原本我以为一个周末应该能做出来,但是我高估了我的水平,一个周末对于我来说压根做不出,只能提交编译都过不了的代码。由于此题目我没有过编译所以给不了在SourceMonitir上代码质量分析结果。
代码实现:
import java.util.Collections; import java.io.*; import java.util.*; public class Mian{ public static void main(String[] args){ Scanner input=new Scanner(System.in); String[] dishes={"西红柿炒蛋 1","西红柿炒蛋 2","西红柿炒蛋 3","清炒土豆丝 1","清炒土豆丝 2","清炒土豆丝 3","麻婆豆腐 1""麻婆豆腐 2","麻婆豆腐 3","油淋生菜 1","油淋生菜 2","油淋生菜 3"}; // int fene[]={1,2,3};//份额 // double price[]={15,12,12,9};//基础价格 int[] price={15,23,30,12,18,24,12,18,24,9,14,18}; int i=1; int price_sum=0; while(i==1){ String str=input.next(); for(int j=0;j<=11;j++){ if(str.equals(dishes[j])){ i=1; price_sum=price_sum+price[i]; } else if(str.equals("end")) i=0; else System.out.println(str+" does not exist"); } } System.out.print(price_sum); } }
第三次pta作业总结
第三次作业7-1 菜单计价程序-3
第三次作业中的此题与前一次作业的7-1,7-2都是菜单计价程序。此次作业时在前一次作业的基础上又增加了代点菜的功能,也增加了饭店营业时间等范围,而且在实现代点菜功能后还要有对代点菜的菜品删除处理。可以说这样一次一次的增加功能是十分符合真正的软件开发的,就像微信的初始,刚开始只有聊天功能,然后再一次又一次的更新中增加需要的功能,一点一点的循序渐进。这个时候面向对象的优点就体现出来了:对代码的复用性非常高,只需要在类上进行增加和修改就可以实现很多想要的功能。可是在我前几次作业没有认真的完成所以这个作业我没有写出来。
三、踩坑心得
在一部分题目中因为代码复杂程度高,修改起来十分麻烦,全删重写时间又不够,只能在原先的代码上进行修修补补,但是这种修修补补的效果不尽如人意
例如在第二次作业的7-3
原先测试点通过情况
在我请教老师和同学后我修改了代码,增加了对不合法的输出的代码
老师给我的意见就是:日期的计算可以不用自己写的,java有处理时间和日期的类,你百度一下。但是在我百度之后对于那些计算日期的类和处理时间的方法后出现了十分尴尬的情况,百度上确实找到了处理时间和计算计日期的类。但是我不会用,我在这题纠结了很久依旧没有做出来。后来询问了同学对代码进行了修改:判断输入的字符串的长度来判断是否是错误输出。这个办法起了一点作用
修改的部分代码:
int a=yy2-yy1; int length1 = array[1].length(); int length2 = array1[1].length(); int length3 = array2[1].length(); int length1_1 = array[2].length(); int length2_2 = array1[2].length(); int length3_3 = array2[2].length(); if((length1!=2)||(length2!=2)||(length3!=2)||(length1_1!=2)||(length2_2!=2)||(length3_3!=2)){ if((length1!=2)||(length1_1!=2)){ flag_1=0; } if((length2!=2)||(length3!=2)||(length2_2!=2)||(length3_3!=2)){ flag_2=0; } } if(flag_1==1&&runnian(yy)&&judge(yy,mm,dd)==true){ System.out.println(str1+"是闰年."); } else if(flag_1==0||judge(yy, mm, dd)==false){ System.out.println(str1+"无效!"); } if(flag_1==1&&judge(yy,mm,dd)==true){ System.out.println(str1+"是当年第"+tianshu(yy, mm, dd)+"天,当月第"+dd+"天,当周第"+week(yy,mm,dd)+"天."); } if((flag_2==0)||(judge(yy1, mm1, dd1)==false)||(judge(yy2,mm2,dd2)==false)){ System.out.print(str2+"或"+str3+"中有不合法的日期."); } if((flag_2==1)&&(judge(yy1, mm1, dd1)==true&&judge(yy2, mm2, dd2)==true)){ if(jiancha(yy2,mm2,dd2,yy1,mm1,dd1)==false){ System.out.print(str3+"早于"+str2+",不合法!"); } else{ or_year_flag = is_whether_leap(yy1);
在修改代码之后通过的测试点情况:
依旧还有一个测试点没有通过,我觉得这个测试点通过不了的直接原因就是因为我的类设计的不好,代码复杂程度太高,不易修改才导致了这一情况的发生。
这题在刚开始的时候因为不懂如何将字符串转化为字符数组也吃了很大的亏。在百度找到这个语句之后解决了我的问题String[] array=str1.split("-");
四、主要困难以及改进建议:
1、在这三次作业中对我来说,最困难的就是类的设计,我在课后有通过网课学习关于什么是类,以及类的用法。可还是感觉有很多懵懵懂懂的地方,在看完网课之后觉得自己会了,可是一到上机实践敲代码的时候就蒙了,一点都写不出来。在网上找到过一些相似的题目,可还是对pta上的题目没有一点办法。唯一一个过了编译那关的第二次pta作业的7-1还是我用面向过程的办法做出来的。建议老师在课堂上讲一些必要的Java语法这样就可以让我们在课后节省一些时间
2、学习更多的关于数据结构的算法和语法,在实际的Java开发当中有许多可以直接利用的数据结构以及先进的算法,这些都可以直接拿过来使用,可以降低程序的复杂程度,节省自己的时间去优化自己的代码。使Java编程更加有效。
3、持续练习是非常有必要的,编程的难度不仅仅在于对语法的熟练掌握,还需要不断联系才能更好的理解更好的融汇贯通与应用它们。所以在Java语言的学习中应该尽可能的多写多敲多看代码,因为这样才能提高自己的编程水平让自己得到提高。
五、总结
在这三次pta作业中我深刻的体会到:学习编程语言是非常需要有一个强的执行能力,不能偷懒不能懈怠。从事程序员这一工作就要做好终身学习的觉悟。自学能力也是一个非常重要的素质。
总结这几次作业,我掌握了Java程序设计的核心该奶奶,包括变量,数据类型,运算符,语句条件,循环条件,数组,字符数组,以及方法的使用。虽然没有掌握对类的使用但我相信在以后的java学习中我一定熟练掌握的。
此外我还学会了如何使用一些常见编译器的进行Java开发如:Eclipse,lightly等。我还注意到编写Java程序时需要遵循一些最佳实践和约定,例如类/方法/变量名要有意义、注释要详尽、避免使用魔法数、异常处理要规范等等。总之,通过Java作业的练习,我获得了更加全面的Java知识体系和实践能力,锻炼了思维方式,也使java的面向对象的编程方式变得更加熟练。
标签:int,代码,作业,System,第一次,flag,博客,&& From: https://www.cnblogs.com/chjdmj/p/17279704.html