一、前言
1.知识点:
(1)第一次题目集:共有九道题,主要为计算题,考察的内容为Java1~8章节的内容和类的设计。比如浮点型计算, java.util.Scanner方法的运用,if else条件语句、System.out.println分类输 出,且和或条件语句,除法和求余运算,一维数组,排序,多个类的设计;
(2)第二次题目集:主要有三道题,主要考察字符串,数组和类等内容,具体为串口字符串解析,数字与字母的转换以及String的格式判断以及内容提取。
(3)第三次题目集:也是三道题,但难度较大,从点类到线类再到形类,不仅考察了我们数学知识,更让我们更深入体会到了类与对象的关系,并且在理解题目含义的同时运用类的创建(包含 若干属性和若干方法)以及多个类的创建来完成整个代码的框架与思路。
2.题量与难度:
总体上讲题量适中,难度从简单到复杂,很符合我们Java现阶段学习的应用和实践,从第一次作业到第三次,引导我们用不同的方法实现同一项功能,通过具体的题目要求,逐步引导我们从面向过程的思维过渡到面向对象的思维。并且题目类型也比较的基础,所涉及到的知识点和基础语法也是以前C语言中的,只不过像Sccaner和print,即输入输出,Java有它自己的与C不同的代码书写方式,而且像这种经常会用到的函数Java中都整合起来成了一个个方法,需要用的时候只需要一句语句调用即可,更方便快捷。相对于第一次作业,第二次题目集题目难度则更多体现在复杂上。算法的设计都大同小异,但是第三次作业的题目要求数据量则大了许多,涉及到的条件判断也更多。稍不留神少考虑了一种判断情况就造成结果错误。条件判断多,分类情况多。从第三次题目集开始,我们能感觉到正式要踏入面向对象程序设计的大门,前两题的题目要求很明确,严格要求了我们创建类的格式,即包含若干属性和若干方法,而题目的具体要求则是在主类中通过调用具体类的具体方法来实现,最后一题则是涉及多个类的涉及,一个类仅完成一项功能。题量不算多,对于Java课程学习来讲题目难度也应该不算大,但毕竟作为入门选手,从面向过程程序设计跨越到面向对象程序设计,多多少少都会感觉到陌生和有难度。
二、设计与分析
1.题目集二的7-2题:串口字符解析
import java.util.Scanner; public class Main2{ public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); String num=in.nextLine(); int temp=1; int c=1; for(int i=0;i<num.length();i++) { if(num.charAt(i)=='0') { temp=0; } if(num.length()<11) { temp=1; } } if(temp==1) { System.out.println("null data"); } else { int j=0; while(j<=num.length()-10) { int sum=0; if(num.charAt(j)=='0') { if(num.charAt(j+10)!='1') { System.out.println(c+":"+"validate error"); } else { for(int m=j;m<j+9;m++) { if(num.charAt(m)=='1') { sum++; } } if(sum%2==0&&num.charAt(j+9)=='0'&&num.charAt(j+10)=='1') { System.out.println(c+":"+"parity check error"); } else if(sum%2!=0&&num.charAt(j+9)=='1'&&num.charAt(j+10)=='1') { System.out.println(c+":"+"parity check error"); } else { System.out.print(c+":"); for(int n=j+1;n<j+9;n++) { System.out.print(num.charAt(n)); if(n == j+8) { System.out.println(""); } } } } c++; j=j+11; } else { j++; } } } } }
解释与心得:
这题只用了一个main函数,并没有创建类,而且考察的知识是奇偶校验,判断是否是长度大于最小结构,判断是否有0,开始找0,先判断最后一位是不是结束1,再判断是否奇校验正确;通过两次判断结果来输出。
2.题目集三的7-1:点线性系列1-计算两点之间的距离
import java.text.DecimalFormat; import java.util.Scanner; public class Main { public static void main(String[] args) { try (Scanner in = new Scanner(System.in)) { String s = in.nextLine(); String[] nums = s.split(" ") ; String[] s1 = nums[0].split(",") ; String[] s2 = nums[1].split(",") ; int count2=0; for(int j=0;j<s1.length;j++) { if(s1[0].charAt(j)=='+'||s1[0].charAt(j)=='-') { count2++; } } if(count2>1) { System.out.print("Wrong Format"); System.exit(0); } int count3=0; for(int m=0;m<s1.length;m++) { if(s1[1].charAt(m)=='+'||s1[1].charAt(m)=='-') { count3++; } } if(count3>1) { System.out.print("Wrong Format"); System.exit(0); } int count4=0; for(int n=0;n<s1.length;n++) { if(s2[0].charAt(n)=='+'||s2[0].charAt(n)=='-') { count2++; } } if(count4>1) { System.out.print("Wrong Format"); System.exit(0); } int count5=0; for(int k=0;k<s1.length;k++) { if(s1[1].charAt(k)=='+'||s1[1].charAt(k)=='-') { count5++; } } if(count5>1) { System.out.print("Wrong Format"); System.exit(0); } double x1 = Double.parseDouble(s1[0]); double y1 = Double.parseDouble(s1[1]); double x2 = Double.parseDouble(s2[0]); double y2 = Double.parseDouble(s2[1]); Point p1=new Point(x1,y1); Point p2=new Point(x2,y2); int count=0; for(int i=0;i<s.length();i++) { if(s.charAt(i)==' ') { count++; } } if(count>1) { System.out.print("wrong number of points"); } else{ System.out.print((Point.distance(p1,p2))); } } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class Point { private double x; private double y; public Point(){x=0;y=0;} public Point(double x,double y){ this.x=x; this.y=y; } public double getX(){ return x; } public double getY(){ return y; } public static double distance(Point p1, Point p2) { return Math.sqrt((p1.getX() - p2.getX()) * (p1.getX() - p2.getX()) + (p1.getY() - p2.getY()) * (p1.getY() - p2.getY())); } public double distance(Point p) { return distance(this,p); } }
解释与心得:
创建一个point类,设计传参数,返回计算所得到的值。感觉主要的难点还是判断格式和字符判断的问题,首先将两组坐标进行分割,用split函数用空格分割一次后再用split函数将每组坐标中的x,y坐标用逗号分割开。
3.题目集三的7-2:点线性系列2-计算两点之间的距离
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); String s=in.nextLine(); double n=Double.parseDouble(s.substring(0, 1)); int m=(int) n; double x1=0; double y1=0; double x2=0; double y2=0; double x3=0; double y3=0; double x4=0; double y4=0; int[] nums = new int[4]; int j=0; switch(m) { case 1: int count=0; for(int i=0;i<s.length();i++) { if(s.charAt(i)==' ') { count=i; } } int num=0; for(int i=0;i<count;i++) { if(s.charAt(i)==',') { x1=Double.parseDouble(s.substring(2, i)); y1=Double.parseDouble(s.substring(i+1, count)); } } for(int i=count;i<s.length();i++) { if(s.charAt(i)==',') { x2=Double.parseDouble(s.substring(count, i)); y2=Double.parseDouble(s.substring(i+1, s.length())); } } if(x1==x2&&y1!=y2) { System.out.println("Slope does not exist"); } else if(x1==x2&&y1==y2){ System.out.println("points coincide"); } else{ double slope=(y2-y1)/(x2-x1); System.out.println(slope); }break; case 2: for(int i=0;i<s.length();i++) { if(s.charAt(i)==' ') { nums[j]=i; j++; } } for(int i=0;i<nums[0];i++) { if(s.charAt(i)==',') { x1=Double.parseDouble(s.substring(2, i)); y1=Double.parseDouble(s.substring(i+1, nums[0])); } } for(int i=nums[0];i<nums[1];i++) { if(s.charAt(i)==',') { x2=Double.parseDouble(s.substring(nums[0], i)); y2=Double.parseDouble(s.substring(i+1, nums[1])); } } for(int i=nums[1];i<s.length();i++) { if(s.charAt(i)==',') { x3=Double.parseDouble(s.substring(nums[1], i)); y3=Double.parseDouble(s.substring(i+1, s.length())); } } double distance=((x2-x1)*(x3-x2)+(y2-y1)*(y3-y2))/(Math.sqrt(Math.pow(x3-x2,2)+Math.pow(y3-y2,2))); System.out.println(distance); break; case 3: for(int i=0;i<s.length();i++) { if(s.charAt(i)==' ') { nums[j]=i; j++; } } for(int i=0;i<nums[0];i++) { if(s.charAt(i)==',') { x1=Double.parseDouble(s.substring(2, i)); y1=Double.parseDouble(s.substring(i+1, nums[0])); } } for(int i=nums[0];i<nums[1];i++) { if(s.charAt(i)==',') { x2=Double.parseDouble(s.substring(nums[0], i)); y2=Double.parseDouble(s.substring(i+1, nums[1])); } } for(int i=nums[1];i<s.length();i++) { if(s.charAt(i)==',') { x3=Double.parseDouble(s.substring(nums[1], i)); y3=Double.parseDouble(s.substring(i+1, s.length())); } } double slope1=(y2-y1)/(x2-x1); double slope2=(y3-y2)/(x3-x2); if(slope1==slope2) { System.out.println("true"); } else if(slope1!=slope2){ System.out.println("false"); }break; } } }
解释与心得:
并没有很好的掌握怎样去设计多个类,还是只用一个main类,这是最大的错误,这次题目包含了很多知识点,也较难,比如判断数位以及字符的正确规范,大小以及长度和强制类型转化等,以及输入几个点坐标怎么判断它们之间的关系。所以用在一个main类里面代码显得很冗杂,没有在老师课堂上他给我们展示的代码简介明了,功能明确,还是不能从面向过程的思维转为面向对象。这是一大缺憾!!!
4.题目集三的7-3:点线性系列3-三角形的计算
import java.util.Scanner; public class Main { public static void main(String[] args) { // 接收输入(三个点x y坐标) Scanner input = new Scanner(System.in); System.out.println("Enter the coordinates of three points separated by spaces like x1 y1 x2 y2 x3 y3: "); double x1 = input.nextDouble(), y1 = input.nextDouble(); double x2 = input.nextDouble(), y2 = input.nextDouble(); double x3 = input.nextDouble(), y3 = input.nextDouble(); // 求出三条边的长度 double side1 = Math.pow((Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)), 0.5); double side2 = Math.pow((Math.pow(x1 - x3, 2) + Math.pow(y1 - y3, 2)), 0.5); double side3 = Math.pow((Math.pow(x2 - x3, 2) + Math.pow(y2 - y3, 2)), 0.5); if(side1==side2&&side2==side3) System.out.print(true); else { System.out.print(false); } if(side1==side3||side2==side3||side1==side2) System.out.print(true); else { System.out.print(false); } // 求s和area double s = (side1 + side2 + side3) / 2; double area = Math.pow(s * (s - side1) * (s - side2) * (s - side3), 0.5); // 输出 System.out.println("The area of the triangle is " + area); } }
解释与心得:
第三题到最后没啥时间了也没啥思路,反正感觉挺复杂的
这道题的要求是输入几个坐标,判断该三角形是什么类型的三角形。
通过具体的各种条件(比如边是否相等、两边平方的和是否等于第三边平方等等)来判断属于哪种类型的三角形,并输出相应的结果。
主要的难点还是在于判断三角形类型时的各种具体条件,需要认真全面详细考虑。
4.题目集一的7-5:游戏角色选择
import java.util.Scanner; class Nation { public Nation() { // TODO Auto-generated constructor stub } public void nation() { Scanner in =new Scanner(System.in); int number=in.nextInt(); switch(number){ case 1: System.out.print("人类 "); int num=in.nextInt(); if(num<1||num>3) { System.out.println("Wrong Format"); } switch(num) { case 1: System.out.print("战士");break; case 2: System.out.print("法师");break; case 3: System.out.print("射手");break; }break; case 2: System.out.print("精灵 "); int a=in.nextInt(); if(a<1||a>3) { System.out.println("Wrong Format"); } switch(a){ case 1: System.out.print("战士");break; case 2: System.out.print("法师");break; case 3: System.out.print("射手");break; }break; case 3: System.out.print("兽人 "); int b=in.nextInt(); if(b<1||b>3) { System.out.println("Wrong Format"); } switch(b){ case 1: System.out.print("战士");break; case 2: System.out.print("法师");break; case 3: System.out.print("射手");break; } break; case 4: System.out.print("暗精灵 "); int c=in.nextInt(); if(c<1||c>3) { System.out.println("Wrong Format"); } switch(c){ case 1: System.out.print("战士");break; case 2: System.out.print("法师");break; case 3: System.out.print("射手");break; } break; } if (number<1||number>4) System.out.println("Wrong Format"); } } class Main { public static void main(String[] args) { Nation a=new Nation(); a.nation(); } }
三、踩坑心得
其实第一次作业考察的内容相对来说比较简单,但是让我踩坑的是刚开始九道题我只有一道是完全正确的,其他的八道题目都有测试点没过,非常难受,并且绞尽脑汁觉得自己的代码没有任何的问题,但实际上是被一个小细节给害惨了,把我所有题目中定义变量的的double全部改为了float,测试点大部分就过去了,真的是人生无常,大肠包小肠~ 吸取教训,正确地运用并把握审题精度是处理细节非常重要的手段之一。
还有第三次作业真的三道题目一个大连贯,从点到线再到形类,初步推测应该是需要设计的类变多了,分割字符串,并且从最初的两个点的坐标到三个点以及四个点五个点的坐标,一步步地复杂化,但主要地一些基础还是没有变化的。老师上课讲了正则表达式,但没有认真的听,所以踩坑了。
四、改进建议
对第二次作业我认为我函数内的代码行数还是太长,而且不是很清晰明了,希望自己以后条件判断还是多用switch case的条件语句,少用if else语句,让自己的代码变得更可读一些。类似的性质也可以做成类函数,就不会让代码那么长一串,用相应的英文函数名表示就明白多了。
对第三次作业我认为我需要去更多的了解类的设计和有关正则的方式。我在最后一题使用的合法性判断很杂是混合在各个功能中的,这样不仅大程度的提高了代码的复杂度而且可读性很低,大概只有我自己能弄的清楚的程度。老师在课上介绍了正则的方法去限定合法性,我还需要对其更深的了解直到能够熟练运用。具体要做的改进首先是用正则的方法写合法测试,再将多次项的分类作为一个类,此类中含整数项判断函数、一次项判断函数和多次项判断函数,主函数在进行筛选时就可以直接调用类中的函数,这样可以大幅的的减少重复代码,减少查重降低复杂度。
五、总结
目前,我认为自己在Java方法的运用中仍存在不足,对其运用的具体场景和条件以及具体的内部原理了解不够透彻,仍需要进一步学习和实践。除此之外,我对于多个类的程序设计仍比较陌生,需要更进一步的学习。另外,自己在编程过程中需要养成更好的习惯,首先要习惯用面向对象的思维去思考问题、设计算法;其次,代码的书写要规范、美观、简略,这也方便自己查找错误,避免了很多不必要的麻烦。对老师就是希望老师能把上课用于讲课的那个知识点文件发给我让我瞅瞅研究研究,然后课程实验作业什么的能够更多的要求类上面的设计以及可读程度。三次作业逐步引导我从面向对象程序设计的思维过渡到面向对象的程序设计思维我认为Java中的类和C语言中的函数有些联系,Java中的类就好像把好几个函数包在一个大函数里,然后主函数可以去调用这个大函数,但是它们之间的区别又是很明显的Java中的类是有性质和方法的是可以拥有实体的,C语言中的函数并不能。还有Java在多人合作项目中确实更方便,因为每个类都可以拥有它们自身的变量,而且可以分好几个文件运行只要在一个包下就行,而且Java类如果写的好的话就很容易让别人去解读。所以我觉得在Java的学习中要学会对类的合理设计,让自己的代码变得看起来舒服可读性高。而且我觉得老师可以在布置pta作业的时候少量多次,从简到易,逐步深入,时长也可以缩短一些。