21201118-java第一次博客作业
21201118-Java第一次博客作业
1.前言
题目集一
题目集一的总体难度并不是很大,主要考察了对控制台的熟悉程度,考察了强制转换,浮点数的计算,及输入输出,第六题是较难的一道题,考察了对字符串的处理,及怎样划分字符串等等。同时第九题考察了在面对同类型数据时通过对数据的判断输出不同的数据。
题目集二
题目集二的难度随着学习的深入,难度也提高了,题目集二的主要考察点在对于字符串的处理与运用,在第二题中,需要查找字符串中的特定字符,然后再提取出正确的字符串,并对该字符串的内容进行判断,在一系列条件都符合的情况下,才能输出。
题目集三
题目集三的三道题都十分具有挑战性,难度高了许多,需要从字符串中筛选出没用的信息并提取自己需要的信息,并通过判断达成多种功能,还需判断所给输入是否是非法输入,最后再将字符串转换成浮点数,其中转化浮点数由于输入中自带正负号,导致难度提高许多。
2.设计与分析
题目集一:7-9 二进制数值提取
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner input = new Scanner(System.in); 5 String xulie = input.nextLine(); 6 int[] a=new int[xulie.length()]; 7 int j=0; 8 for(int i=0;i<xulie.length();i++) 9 { 10 if (xulie.charAt(i)=='0') 11 { 12 System.out.print("0"); 13 } 14 if (xulie.charAt(i)=='1') 15 { 16 System.out.print("1"); 17 18 } 19 if (xulie.charAt(i)=='-') 20 { 21 break; 22 } 23 24 } 25 26 } 27 }
要求:在一个字符串中提取出其中的二进制数值序列;
先接收输入字符串,存入xulie中,然后通过对xulie中每一项的字符进行判断,筛选其中的’0‘,’1‘字符并输出,在碰到字符’-‘时break终止,在这里我的思路是从字符串的每个字符从第一个开始检查,等于“1”“0”时,直接输出,等于“-”时,若下一位等于1,则break结束。

题目集三:7-1 点线形系列1-计算两点之间的距离
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); int i,a=0,b=0,a1=0,a2=0,b1=0,b2=0,t=0; double x1,x2,y1,y2; String point1 = new String(); String point2 = new String(); String line=input.nextLine(); for(i=0;i<line.length();i++) { if(line.charAt(i)==' ') { point1 = line.substring(0, i); point2 = line.substring(i+1, line.length()); break; } } for(i=0;i<point2.length();i++) { if(point2.charAt(i)==' ') { t=1; break; } } point1=point1.replace(","," "); point2=point2.replace(","," "); String[] poi1=point1.split(" "); String[] poi2=point2.split(" "); x1=Double.parseDouble(poi1[0]); y1=Double.parseDouble(poi1[1]); x2=Double.parseDouble(poi2[0]); y2=Double.parseDouble(poi2[1]); if(t==1) { System.out.print("wrong number of points"); } else { System.out.print(Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))); } } }
这个的难点是:由于给出的符号有正有负当输入格式错误时,容易将判断格式的代码与判断正负的代码搞混甚至弄反,在这里我通过询问同学的方式,学了一些同学的方法,先将接收的字符串储存,在通过找空格将其分成两个字符串,再将其中的“,”“:”替换为“ ”,再运用Double.parseDouble()函数将字符串转化为数字,再将点坐标命名为x1,x2,y1,y2,计算两点距离。

题目集三:7-2 点线形系列2-线的计算
1 import java.util.Scanner; 2 public class Main { 3 public static void main(String[] args) { 4 Scanner input=new Scanner(System.in); 5 String line=input.nextLine(); 6 double x1=0,x2=0,x3=0,y1=0,y2=0,y3=0,x4=0,y4=0,k1,k2,b1,b2; 7 if(line.charAt(0)=='1') 8 { 9 line=line.replace(","," "); 10 line=line.replace(":"," "); 11 String[] choice1=line.split(" "); 12 x1=Double.parseDouble(choice1[1]); 13 y1=Double.parseDouble(choice1[2]); 14 x2=Double.parseDouble(choice1[3]); 15 y2=Double.parseDouble(choice1[4]); 16 17 if(x1==x2&&y1==y2) 18 { 19 System.out.print("points coincide"); 20 } 21 if(x1==x2&&y1!=y2) 22 { 23 System.out.print("Slope does not exist"); 24 } 25 if(x1!=x2&&y1!=y2) 26 { 27 System.out.print((y1-y2)/(x1-x2)); 28 } 29 } 30 if(line.charAt(0)=='2') 31 { 32 line=line.replace(","," "); 33 line=line.replace(":"," "); 34 String[] choice1=line.split(" "); 35 x1=Double.parseDouble(choice1[1]); 36 y1=Double.parseDouble(choice1[2]); 37 x2=Double.parseDouble(choice1[3]); 38 y2=Double.parseDouble(choice1[4]); 39 x3=Double.parseDouble(choice1[5]); 40 y3=Double.parseDouble(choice1[6]); 41 42 System.out.print(Math.abs(((y2-y3)*x1-(x2-x3)*y1+x2*y3-x3*y2)/(Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))))); 43 } 44 if(line.charAt(0)=='3') 45 { 46 line=line.replace(","," "); 47 line=line.replace(":"," "); 48 String[] choice1=line.split(" "); 49 x1=Double.parseDouble(choice1[1]); 50 y1=Double.parseDouble(choice1[2]); 51 x2=Double.parseDouble(choice1[3]); 52 y2=Double.parseDouble(choice1[4]); 53 x3=Double.parseDouble(choice1[5]); 54 y3=Double.parseDouble(choice1[6]); 55 if((y2-y3)*x1-(x2-x3)*y1+x2*y3-x3*y2==0) 56 { 57 System.out.print("true"); 58 } 59 else 60 { 61 System.out.print("false"); 62 } 63 } 64 if(line.charAt(0)=='4') 65 { 66 line=line.replace(","," "); 67 line=line.replace(":"," "); 68 String[] choice1=line.split(" "); 69 x1=Double.parseDouble(choice1[1]); 70 y1=Double.parseDouble(choice1[2]); 71 x2=Double.parseDouble(choice1[3]); 72 y2=Double.parseDouble(choice1[4]); 73 x3=Double.parseDouble(choice1[5]); 74 y3=Double.parseDouble(choice1[6]); 75 x4=Double.parseDouble(choice1[7]); 76 y4=Double.parseDouble(choice1[8]); 77 if((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)) 78 { 79 System.out.print("true"); 80 } 81 else 82 { 83 System.out.print("false"); 84 } 85 } 86 if(line.charAt(0)=='5') 87 { 88 line=line.replace(","," "); 89 line=line.replace(":"," "); 90 String[] choice1=line.split(" "); 91 x1=Double.parseDouble(choice1[1]); 92 y1=Double.parseDouble(choice1[2]); 93 x2=Double.parseDouble(choice1[3]); 94 y2=Double.parseDouble(choice1[4]); 95 x3=Double.parseDouble(choice1[5]); 96 y3=Double.parseDouble(choice1[6]); 97 x4=Double.parseDouble(choice1[7]); 98 y4=Double.parseDouble(choice1[8]); 99 if((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)) 100 { 101 System.out.print("is parallel lines,have no intersection point"); 102 } 103 else 104 { 105 k1=(y1-y2)/(x1-x2); 106 k2=(y3-y4)/(x3-x4); 107 b1=(x1*y2-x2*y1)/(x1-x2); 108 b2=(x3*y4-x4*y3)/(x3-x4); 109 System.out.print((b2-b1)/(k1-k2)+","+(k1*((b2-b1)/(k1-k2))+b1)+" true"); 110 } 111 } 112 } 113 }
此题难点在考查的方面比较复杂,一共考查了五种情况,并且这五种情况里需要提取的数据都不尽相同,需要先判断是哪一种情况,再进行字符串的拆分,这里所用到的拆分方法与第一题相同,也是把不相关的标点符号先化为i“ ”,然后再将其中转换成数字,就能提取到坐标,然后则是各种情况的输出,这个在知道了坐标后就容易得多了,只需要按固定公式计算与判断即可
题目集三 7-3 点线形系列3-三角形的计算
1 import java.util.Scanner; 2 public class Main { 3 public static void main(String[] args) { 4 Scanner input=new Scanner(System.in); 5 String line=input.nextLine(); 6 double x1=0,x2=0,x3=0,y1=0,y2=0,y3=0,x4=0,y4=0,k1,k2,b1,b2,AB,BC,AC; 7 if(line.charAt(0)=='1') 8 { 9 line=line.replace(","," "); 10 line=line.replace(":"," "); 11 String[] choice1=line.split(" "); 12 x1=Double.parseDouble(choice1[1]); 13 y1=Double.parseDouble(choice1[2]); 14 x2=Double.parseDouble(choice1[3]); 15 y2=Double.parseDouble(choice1[4]); 16 x3=Double.parseDouble(choice1[5]); 17 y3=Double.parseDouble(choice1[6]); 18 AB=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 19 BC=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); 20 AC=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); 21 if((AC==AB&&AB!=BC)||(AB==BC&&BC!=AC)||(AC==BC&&BC!=AB)) 22 { 23 System.out.print("true"); 24 } 25 else{ 26 System.out.print("false"); 27 } 28 if(AB==BC&&BC==AC) 29 { 30 System.out.print(" true"); 31 } 32 else 33 { 34 System.out.print(" false"); 35 } 36 } 37 else{ 38 System.out.print("outof the triangle"); 39 } 40 41 } 42 }
这道题并没有将其完成,但是具体思路已经有了,首先将需要的数据筛选出来,与前面第一题第二题的方法一致,然后例如第一题,可以设定一个变量m=0,每当有两条边相等时,m+1,然后在最后通过对于m值的判定判断等边或等腰三角形,后面的难点感觉主要还是在于数学知识的运用。
3.采坑心得
1.在题目集一 7-8 巴比伦法求平方根近似值中,在提交时经常出现错误,在多次检测后发现,题目要求nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同,所以需要判断误差,而我的代码是只有当nextGuess=lastGuess时才会输出lastGuess,这就导致了无法正常按照题目要求拿分,所以这题的分一开始并不高,后面则是将if(nextGuess==astGuess)改为if(nextGuess-lastGuess<=0.00001)时输出才得以拿分。
2.在题目集二 7-2 串口字符解析中,一开始由于区分不了“validate error”“parity check error”的先后顺序,导致在判断这方面的代码总是出错,因为我的代码需要在一开始就判断是哪种情况,然而由于我之前
的思维定势,我是在判断完一种情况后就使用else切换到下一种情况的,但并不是每种情况的判断都需要用到if,所以一时间竟不知道该怎么实现代码,后面才用到先保存最后再判断的方式,即设置两个变量m,n,若情况A,则m=1,若情况B,则n=1,由此还避免了重复输出的情况。
3.在题目集二 7-3 String的格式判断与内容提取中,需要将字符串每八个分为一组,这里用到了二维数组的方式,即将其拆分到一个n行8列的二维数组中,每行储存了一个同学的信息,然后判断就可用
for(int i=0;i<b;i++) { for(int j=0;j<8;j++) { } }
的方式在其中判断,例如每列的前两位是否是20等,最后再从数组中选出202017班、202061班的同学即可。
4.在题目集三7-2 点线形系列2-线的计算中,需要通过对字符串的第一个字符进行判断从而达成五种不同的情况,由于五种情况所给的输入也不尽相同,我是先判断第一位字符再对字符串进行处理
if(line.charAt(0)=='1') { line=line.replace(","," "); line=line.replace(":"," "); String[] choice1=line.split(" "); x1=Double.parseDouble(choice1[1]); y1=Double.parseDouble(choice1[2]); x2=Double.parseDouble(choice1[3]); y2=Double.parseDouble(choice1[4]); if(x1==x2&&y1==y2) { System.out.print("points coincide"); } if(x1==x2&&y1!=y2) { System.out.print("Slope does not exist"); } if(x1!=x2&&y1!=y2) { System.out.print((y1-y2)/(x1-x2)); } }
其次则是对于五种情况的不同处理,在设计与分析中已经说明了我如何提取字符串中的数字,这里我主要对五种情况中遇到的问题进行阐述,首先第一种情况需要计算斜率与直线与x轴关系,可先判断x1与x2是否相等已确认是否垂直于x轴,再通过(y1-y2)/(x1-x2)计算斜率。第二种则可以通过((y2-y3)*x1-(x2-x3)*y1+x2*y3-x3*y2)/(Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))))直接输出结果,第三种则是 if((y2-y3)*x1-(x2-x3)*y1+x2*y3-x3*y2==0)判断是否三点一线,后面两种情况也都是同理。
4.改进建议
1.在题目集二 7-1 字母-数字转换中我的代码是
import java.util.Scanner; import java.util.Scanner; Scanner input = new Scanner(System.in); String a=input.nextLine(); int i; for(i=0;i<a.length();i++) { if(a.charAt(i)=='a'||a.charAt(i)=='A') { System.out.print("1"); } if(a.charAt(i)=='b'||a.charAt(i)=='B') { System.out.print("2"); } if(a.charAt(i)=='c'||a.charAt(i)=='C') { System.out.print("3"); } if(a.charAt(i)=='d'||a.charAt(i)=='D') { System.out.print("4"); } if(a.charAt(i)=='e'||a.charAt(i)=='E') { System.out.print("5"); } if(a.charAt(i)=='f'||a.charAt(i)=='F') { System.out.print("6"); } if(a.charAt(i)=='g'||a.charAt(i)=='G') { System.out.print("7"); } if(a.charAt(i)=='h'||a.charAt(i)=='H') { System.out.print("8"); } if(a.charAt(i)=='i'||a.charAt(i)=='I') { System.out.print("9"); } if(a.charAt(i)=='j'||a.charAt(i)=='J') { System.out.print("10"); } if(a.charAt(i)=='k'||a.charAt(i)=='K') { System.out.print("11"); } if(a.charAt(i)=='l'||a.charAt(i)=='L') { System.out.print("12"); } if(a.charAt(i)=='m'||a.charAt(i)=='M') { System.out.print("13"); } if(a.charAt(i)=='n'||a.charAt(i)=='N') { System.out.print("14"); } if(a.charAt(i)=='o'||a.charAt(i)=='O') { System.out.print("15"); } if(a.charAt(i)=='p'||a.charAt(i)=='P') { System.out.print("16"); } if(a.charAt(i)=='q'||a.charAt(i)=='Q') { System.out.print("17"); } if(a.charAt(i)=='r'||a.charAt(i)=='R') { System.out.print("18"); } if(a.charAt(i)=='s'||a.charAt(i)=='S') { System.out.print("19"); } if(a.charAt(i)=='t'||a.charAt(i)=='T') { System.out.print("20"); } if(a.charAt(i)=='u'||a.charAt(i)=='U') { System.out.print("21"); } if(a.charAt(i)=='v'||a.charAt(i)=='V') { System.out.print("22"); } if(a.charAt(i)=='w'||a.charAt(i)=='W') { System.out.print("23"); } if(a.charAt(i)=='x'||a.charAt(i)=='X') { System.out.print("24"); } if(a.charAt(i)=='y'||a.charAt(i)=='Y') { System.out.print("25"); } if(a.charAt(i)=='z'||a.charAt(i)=='Z') { System.out.print("26"); } } } }
直接通过abcd的列举法来完成的,但实际上可以通过
for(int i=0;i<s.length();++i){ char c = s.charAt(i); if(c<='z' && c>='a') { System.out.print((byte)c-96); }else if(c<='Z' && c>='A'){ System.out.print((byte)c-64); } }
来通过字符串的取值直接输出数字。
5.总结
这次题目集,个人感觉难度逐层递增,到了第三次,难度感觉很大,但是经常提交代码时,系统显示出错,但是并没有给出错误点,难以对症下药,需要自己去找,经常会花费特别多的无用时间,还不一定能找出问题所在,通过这三次的题目集,我将学习的知识了真正实践到了作业中,Java语句的运用等,比如说输出,输入等语法,和字符串中字符的替换与转化,还学到了一些新的知识,例如如何从字符串中提取出需要的字符,与将字符转化成浮点数,而且还学到了新的思路,即先储存判断的数据再在最后进行检验输出等,个人问题认为主要还是在不知道如何将自己脑袋中的思路化作代码,可能主要还是对语法的不熟练,仍需要巩固基础知识。
一点建议
可以在pta上加入每个考查点考查的点,这样可以让学生更好的发现自己的问题,以对症下药,提高效率,万分感谢。

浙公网安备 33010602011771号