题目集1~3的总结性Blog
一.前言
首先,对前三次题目的知识点、题量、难度进行总结。第一次题目集主要考察对java语言的基本运用,对自学内容的检测。题量和难度都没有很大都是比较基础的内容。第二次题目集主要考察的是对与基础的代码的更深层次的的使用,虽然题目量不对,但是题目难度的话,除了7-2剩下的题目难度都还可以没有很难,7-2就有难度了。第三次题目集考察的是对于类的使用,三道题都有一定的难度,并且难度也是一步一步递进的,题目量没有很大。
二.设计与分析
这里就对第二次题目集的7-2以及第三次的题目集进行分析。因为这四道题目我都没有拿到满分,对我来说都是有难度的题目。
(1)首先是题目集的7-2

对串口字符进行解析。要求:

在看到这道题目的时候,第一想法就是,这是啥啊,根本看不懂。
但是经过仔细分析之后,要实现这道题目的基本要求没有很难。
首先是通过
Scanner input = new Scanner (System.in); String num =input.nextLine(); char []arr= num.toCharArray();
将输入的数字进行保存到arr数组当中,
因为需要 数据不足11位或者输入数据全1没有起始位,输出"null data"
for(int i=0;i<arr.length;i++) { b++; if(arr[i] == '1') { m++; } }
所以,通过一个for循环将输入的所有数据用b统计出来,同时用m统计出数据中‘1’的个数。
if(b < 11 || m ==b) { System.out.print("null data"); }
如果数据总数少于11或者全部都是1,就输出'null date'
否则,进行剩下的程序操作。
for(int k = 0 ; k < b ; k++) { if(arr[k] == '0') { n++; System.out.print(n + ":" + arr[k+1] + arr[k+2]+ arr[k+3]+ arr[k+4]+ arr[k+5]+ arr[k+6]+ arr[k+7]+ arr[k+8]+"\n"); k=k+8; } }
通过一个循环arr数组,当识别到了'0',就将'0'之后的八位数字按照规定的格式进行打印,同时将k加8,即跳过已经输出的数据。

由于,对于奇偶校验没有理解,导致题目中,
1.某个数据奇偶校验错误,则输出“parity check error”。
2.数据结束符和奇偶校验均不合格,输出“validate error”。
两个要求没有满足,写出的程序也无法实现这两点要求。
下面是题目提交的源码,还有不足的地方,还需要进行修改,以及要求的实现
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner (System.in); int b=0; int m=0; int n=0; String num =input.nextLine(); char []arr= num.toCharArray(); for(int i=0;i<arr.length;i++) { b++; if(arr[i] == '1') { m++; } } if(b < 11 || m ==b) { System.out.print("null data"); } else { for(int k = 0 ; k < b ; k++) { if(arr[k] == '0') { n++; System.out.print(n + ":" + arr[k+1] + arr[k+2]+ arr[k+3]+ arr[k+4]+ arr[k+5]+ arr[k+6]+ arr[k+7]+ arr[k+8]+"\n"); k=k+8; } } } } }
(2)题目集三.7-1

这道题需要实现,输入两个点的坐标,然后求出两个点之间的距离。
计算两点距离,我们就通过一个cal函数来实现
public static void cal(double x1,double y1,double x2,double y2) { double sum = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); System.out.println(sum); }
接着,需要运用正则表达式将输入的数据中的符号剔除(提出其中的数字)
Scanner input = new Scanner(System.in); String arr = input.nextLine(); String[] str1Array = arr.split("\\,|\\ ");
这里第三行的split
String[] str1Array = arr.split("\\,|\\ ");
实现的就是通过正则表达式,将输入的数据中','以及' '除去,再将数字信息存入str1Array数组中。
if( (arr.charAt(k) == ','&&arr.charAt(k+1) == '-')|| (arr.charAt(k) == arr.charAt(k+1) )|| (arr.charAt(k) == '-'&&arr.charAt(k+1) == ',') ) { System.out.print("Wrong Format"); break; }
接着运用if-else语句来实现对于错误情况的判断,但是这里只找到了几种错误的格式,没有全部找出来(一开始是想通过与正确的情况进行对比。这样,除去正确格式的就都是错误的格式,但是因为不会没有实现)
然后,
else { double[] num = new double[str1Array.length]; for (int i = 0; i < str1Array.length; i++) { num[i] = Double.parseDouble(str1Array[i]); //System.out.print(num[i]+" "); } if(str1Array.length != 4) { System.out.print("wrong number of points"); break; } else { cal(num[0],num[1],num[2],num[3]); break;} }
这里首先是通过
for (int i = 0; i < str1Array.length; i++) { num[i] = Double.parseDouble(str1Array[i]); //System.out.print(num[i]+" "); }
把字符串数组中的数字以浮点数形式存入num数组中,
if(str1Array.length != 4) { System.out.print("wrong number of points"); break; }
然后,判断数组中的数据数量,如果不是四个那么就打印“wrong number of points”。
最后,再去调用cal函数将正确的没有问题的数据输入函数进行计算,得出最后的结果。
else { cal(num[0],num[1],num[2],num[3]); break;}
但是,最后提交的结果还是有两个错误情况的输入没有满足,如果是对正确情况排除来找出错误的情况应该是能够实现满足需求。
最后附上提交的源码,还有待改进(毕竟没有实现所有的需求)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String arr = input.nextLine(); String[] str1Array = arr.split("\\,|\\ "); for(int k = 0;;k++) { if( (arr.charAt(k) == ','&&arr.charAt(k+1) == '-')|| (arr.charAt(k) == arr.charAt(k+1) )|| (arr.charAt(k) == '-'&&arr.charAt(k+1) == ',') ) { System.out.print("Wrong Format"); break; } else { double[] num = new double[str1Array.length]; for (int i = 0; i < str1Array.length; i++) { num[i] = Double.parseDouble(str1Array[i]); //System.out.print(num[i]+" "); } if(str1Array.length != 4) { System.out.print("wrong number of points"); break; } else { jisuan(num[0],num[1],num[2],num[3]); break;} } } } public static void jisuan(double x1,double y1,double x2,double y2) { double sum = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); System.out.println(sum); } }
(3)题目集三.7-2

这道题有点复杂,需要一组选项以及点的坐标,实现对应的要求。输入格式如下:

首先
Scanner input = new Scanner(System.in); String arr = input.nextLine(); String[] str1Array = arr.split("\\:|\\,|\\ ");
这里和7-1一样,都是通过正则表达式来实现内容的提取。
for(int u = 0;u<arr.length();u++) { if(arr.charAt(u) == ',') r++; else if(arr.charAt(u)==':') d++; else if(arr.charAt(u)>=0&&arr.charAt(u)<=9) s++; } //System.out.print(s); //System.out.print(e); if(d!=1||s%2!=0||arr.charAt(0)>'5') { System.out.print("Wrong Format"); } else { for (int i = 0; i < str1Array.length; i++) { num[i] = Double.parseDouble(str1Array[i]); e=i; //System.out.print(num[i]+" "); }
然后,通过循环来计算出',' ':'以及数字的个数,当冒号个数不是一个、第一个选项数组大于5或者输入的坐标的的数字个数为奇数不满足坐标有两个数的要求是输出'Wrong Format'。
double k = num[0]; if(num[0]==1&& r!=2) { System.out.print("wrong number of points"); } else if(num[0]==2&& r!=3) { System.out.print("wrong number of points"); } else if(num[0]==3&& r!=3) { System.out.print("wrong number of points"); } else if(num[0]==4&& r!=4) { System.out.print("wrong number of points"); } else if(num[0]==5&& r!=4) { System.out.print("wrong number of points"); }
接着,通过统计输入的数据中','的个数,来判断输入的格式符合要求但是点的数量与选项所需要的点数不符合,如果不符合则输出"wrong number of points".符合就继续进行下面的操作。
for(int l = 1; l < (str1Array.length-1)/2;l++) { for(int j = 1; j < (str1Array.length-1)/2;j++) { if(num[l]==num[2*l+1]&&num[j+1]==num[2*j+2]) { System.out.print("points coincide"); return; } else { panduan(k,num); return; } } }
通过两次循环来判断 构成任一条线的两个点坐标是否重合,如果是则输出"points coincide",否就按照要求来执行主要的程序。
(这里的判断是否重合感觉有点问题,但是就是找不出来有什么问题)
public static void panduan(double k,double num[])
这里通过k来保存第一个选项的数字,然后将保存数据的数组传入函数中
if(k==1) { if(num[1] == num[3]) { System.out.print("Slope does not exist"); } else { double m ; m = (num[2]-num[4])/(num[1]-num[3]); System.out.print(m); } }
当选项为1时
先判断两个坐标所构成的直线是否垂直x轴,如果垂直就不能计算出斜率输出"Slope does not exist",如果不是垂直的那么就通过正常的方法进行计算。
if(k==2) { double t; t=Math.abs((num[6]-num[4])*(num[1]-num[3])-(num[5]-num[3])*(num[2]-num[4]))/Math.sqrt(Math.pow((num[6]-num[4]),2)+Math.pow((num[5]-num[3]),2)); System.out.print(t); }
当选项为2时
只需要通过学过的数学公式,将数据输入进去进行计算就行了。
if(k==3) { double x1=num[1]; double y1=num[2]; double x2=num[3]; double y2=num[4]; double x3=num[5]; double y3=num[6]; if((x1==x2)||(x1==x3)||(x2==x3)) { if(x1==x2&&x2==x3&&x1==x3) { System.out.print("true"); } else System.out.print("flase"); } else { if((y1-y2)/(x1-x2) == (y2-y3)/(x2-x3)) { System.out.print("true"); } else System.out.print("flase"); } }
当选项为3时
先判断三个点是不是共线并垂直于x轴(因为垂直x轴不能进行斜率计算)。如果不是,就通过不同的点来计算出两个斜率的值,接着进行对比。如果相等就是共线,不相等就是不共线。
if(k==4) { double m1; double m2; if((num[1]==num[3])&&(num[5]==num[7])) { System.out.print("true"); } else { m1=Math.abs((num[2]-num[4])/(num[1]-num[3])); m2=Math.abs((num[6]-num[8])/(num[5]-num[7])); if(m1 == m2) System.out.print("true"); else System.out.print("flase");} }
当选项为4时
同样,先对两条线是否是垂直x轴进行判断。如果不是,则计算两条线的斜率,如果相等那么两条线就是平行的反之。
if(k==5) { double x1=num[1]; double y1=num[2]; double x2=num[3]; double y2=num[4]; double x3=num[5]; double y3=num[6]; double x4=num[7]; double y4=num[8]; if(((y1-y2)/(x1-x2))==((y3-y4)/(x3-x4))) System.out.print("is parallel lines,have no intersection point"); else { double a1=y2-y1; double b1=(x2-x1); double c1=x1*y2-x2*y1; double a2=y4-y3; double b2=(x4-x3); double c2=x3*y4-x4*y3; double d=a1*b2-a2*b1; System.out.print((b2*c1-b1*c2)/d + "," + (a2*c1-a1*c2)/d); if(((b2*c1-b1*c2)/d) >= x1 &&((b2*c1-b1*c2)/d) <= x2&&((b2*c1-b1*c2)/d) >= x3&&(((b2*c1-b1*c2)/d) <= x4&&((b2*c1-b1*c2)/d) >= y1 && ((b2*c1-b1*c2)/d) <= y2 &&((b2*c1-b1*c2)/d) >= y3&&(((b2*c1-b1*c2)/d) <= y4))) { System.out.print(" true"); } else System.out.print(" false"); } }
当选项为5时
通过数学方法计算出交点坐标,然后通过点的坐标是不是小于线的端点坐标来判断是不是在范围之内。最后在提交源码的时候还是格式错误的测试点以及计算交点的测试点还是没有通过。下面是源码,有待改进:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String arr = input.nextLine(); String[] str1Array = arr.split("\\:|\\,|\\ "); double[] num = new double[str1Array.length]; int r=0; int d=0; int s=0; int e=0; for(int u = 0;u<arr.length();u++) { if(arr.charAt(u) == ',') r++; else if(arr.charAt(u)==':') d++; else if(arr.charAt(u)>=0&&arr.charAt(u)<=9) s++; } //System.out.print(s); //System.out.print(e); if(d!=1||s%2!=0||arr.charAt(0)>'5') { System.out.print("Wrong Format"); } else { for (int i = 0; i < str1Array.length; i++) { num[i] = Double.parseDouble(str1Array[i]); e=i; //System.out.print(num[i]+" "); } //System.out.print(r); double k = num[0]; if(num[0]==1&& r!=2) { System.out.print("wrong number of points"); } else if(num[0]==2&& r!=3) { System.out.print("wrong number of points"); } else if(num[0]==3&& r!=3) { System.out.print("wrong number of points"); } else if(num[0]==4&& r!=4) { System.out.print("wrong number of points"); } else if(num[0]==5&& r!=4) { System.out.print("wrong number of points"); } else { for(int l = 1; l < (str1Array.length-1)/2;l++) { for(int j = 1; j < (str1Array.length-1)/2;j++) { if(num[l]==num[2*l+1]&&num[j+1]==num[2*j+2]) { System.out.print("points coincide"); return; } else { panduan(k,num); return; } } } } } } public static void panduan(double k,double num[]) { if(k==1) { if(num[1] == num[3]) { System.out.print("Slope does not exist"); } else { double m ; m = (num[2]-num[4])/(num[1]-num[3]); System.out.print(m); } } if(k==2) { double t; t=Math.abs((num[6]-num[4])*(num[1]-num[3])-(num[5]-num[3])*(num[2]-num[4]))/Math.sqrt(Math.pow((num[6]-num[4]),2)+Math.pow((num[5]-num[3]),2)); System.out.print(t); } if(k==3) { double x1=num[1]; double y1=num[2]; double x2=num[3]; double y2=num[4]; double x3=num[5]; double y3=num[6]; if((x1==x2)||(x1==x3)||(x2==x3)) { if(x1==x2&&x2==x3&&x1==x3) { System.out.print("true"); } else System.out.print("flase"); } else { if((y1-y2)/(x1-x2) == (y2-y3)/(x2-x3)) { System.out.print("true"); } else System.out.print("flase"); } } if(k==4) { double m1; double m2; if((num[1]==num[3])&&(num[5]==num[7])) { System.out.print("true"); } else { m1=Math.abs((num[2]-num[4])/(num[1]-num[3])); m2=Math.abs((num[6]-num[8])/(num[5]-num[7])); if(m1 == m2) System.out.print("true"); else System.out.print("flase");} } if(k==5) { double x1=num[1]; double y1=num[2]; double x2=num[3]; double y2=num[4]; double x3=num[5]; double y3=num[6]; double x4=num[7]; double y4=num[8]; if(((y1-y2)/(x1-x2))==((y3-y4)/(x3-x4))) System.out.print("is parallel lines,have no intersection point"); else { double a1=y2-y1; double b1=(x2-x1); double c1=x1*y2-x2*y1; double a2=y4-y3; double b2=(x4-x3); double c2=x3*y4-x4*y3; double d=a1*b2-a2*b1; System.out.print((b2*c1-b1*c2)/d + "," + (a2*c1-a1*c2)/d); if(((b2*c1-b1*c2)/d) >= x1 &&((b2*c1-b1*c2)/d) <= x2&&((b2*c1-b1*c2)/d) >= x3&&(((b2*c1-b1*c2)/d) <= x4&&((b2*c1-b1*c2)/d) >= y1 && ((b2*c1-b1*c2)/d) <= y2 &&((b2*c1-b1*c2)/d) >= y3&&(((b2*c1-b1*c2)/d) <= y4))) { System.out.print(" true"); } else System.out.print(" false"); } } } }
(四)题目集三.7-3

第三题三角形计算,要求输入选项和点的坐标来实现要求,这道题和上面的题目相比较难度又是加大了的,我也是没有写完这道题后面两个选项的要求也没有去写。这里就只对我写了的进行分析。
{ Scanner input = new Scanner(System.in); String arr = input.nextLine(); String[] str1Array = arr.split("\\:|\\,|\\ "); double[] num = new double[str1Array.length]; for (int i = 0; i < str1Array.length; i++) { num[i] = Double.parseDouble(str1Array[i]); //System.out.print(num[i]+" "); } //System.out.print(num[0]); panduan(num); }
前面还是和7-2一样,通过正则表达式把数字提取出来然后存入数组中。接着将数组传入一个函数中进行运行。
public static void panduan(double num[]) { double x1=num[1]; double y1=num[2]; double x2=num[3]; double y2=num[4]; double x3=num[5]; double y3=num[6]; if(num[0]==1) { op1(x1,y1,x2,y2,x3,y3); } else if(num[0]==2) { op2(x1,y1,x2,y2,x3,y3); } else if(num[0]==3) { op3(x1,y1,x2,y2,x3,y3); } else if(num[0]==4) { op4(num); } else if (num[0]==5) { op5(num); } }
这里是第一次传入的函数,来判断选项,然后再去执行要求。
public static void op1(double x1,double y1,double x2,double y2,double x3,double y3){ double a = Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2)); double b = Math.sqrt(Math.pow((x1-x3),2)+Math.pow((y1-y3),2)); double c = Math.sqrt(Math.pow((x3-x2),2)+Math.pow((y3-y2),2)); if(a+b>c&&a+c>b) { if(a == b||b == c||a == c) { System.out.print("true"+" "); if(a == b && b == c) System.out.print("true"); else System.out.print("false"); } else System.out.print("false false"); } else { System.out.print("data error"); } }
第一个选项,先计算出三条边的长度,然后通过数学知识来进行判断三角形的类型。
public static void op2(double x1,double y1,double x2,double y2,double x3,double y3) { double C; double S; double a = Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2)); double b = Math.sqrt(Math.pow((x1-x3),2)+Math.pow((y1-y3),2)); double c = Math.sqrt(Math.pow((x3-x2),2)+Math.pow((y3-y2),2)); if(a+b>c&&a+c>b) { C=a+b+c; if((C*1000000)%10!=0) { System.out.printf("%.6f ",C); } else { System.out.printf("%f",C); } double p; p=(a+b+c)/2; double q=(p*(p-a)*(p-b)*(p-c)); S=Math.sqrt(q); if((S*1000000)%10!=0) { System.out.printf("%.1f ",S); } else { System.out.printf(S+" "); } double x=(x1+x2+x3)/3; double y=(y1+y2+y3)/3; if((x*1000000)%10!=0) { System.out.printf("%.6f",x); System.out.print(","); } else { System.out.print(x+","); } if((y*1000000)%10!=0) { System.out.printf("%.6f",y); } else { System.out.print(y); } } else { System.out.print("data error"); } }
第二个选项,也是通过数学知识来将三个数据计算出来
public static void op3(double x1,double y1,double x2,double y2,double x3,double y3) { double a = Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2)); double b = Math.sqrt(Math.pow((x1-x3),2)+Math.pow((y1-y3),2)); double c = Math.sqrt(Math.pow((x3-x2),2)+Math.pow((y3-y2),2)); if(a*a+b*b>c*c&&a*a+c*c>a*a&&b*b+c*c>a*a) { System.out.print("false false true"); } else if(a*a+b*b==c*c||a*a+c*c==a*a||b*b+c*c==a*a) { System.out.print("false true false"); } else System.out.print("true false false"); }
第三个也是一样的数学方法。然后这道题就写了这么多其他的选项没写出来。
三.踩坑心得
(1)题目集二.7-2
if(arr[k] == '0') { n++; System.out.print(n + ":" + arr[k+1] + arr[k+2]+ arr[k+3]+ arr[k+4]+ arr[k+5]+ arr[k+6]+ arr[k+7]+ arr[k+8]+"\n"); k=k+8; }
这里k=k+8一开始写的是k=k+1,导致循环了很多遍。
(2)题目集三.7-1
if( (arr.charAt(k) == ','&&arr.charAt(k+1) == '-')|| (arr.charAt(k) == arr.charAt(k+1) )|| (arr.charAt(k) == '-'&&arr.charAt(k+1) == ',') )
错误格式的判断一直会有两个点过不去,可能是判断方式出了问题,应该是通过先判断出正确的再去反面判断出错误的。
(3)题目集三.7-2
if(k==3) { double x1=num[1]; double y1=num[2]; double x2=num[3]; double y2=num[4]; double x3=num[5]; double y3=num[6]; if((x1==x2)||(x1==x3)||(x2==x3)) { if(x1==x2&&x2==x3&&x1==x3) { System.out.print("true"); } else System.out.print("flase"); } else { if((y1-y2)/(x1-x2) == (y2-y3)/(x2-x3)) { System.out.print("true"); } else System.out.print("flase"); } }

判断三点一线,暂时没有找到问题出现在哪了
(4)题目集三.7-2
if(k==4) { double m1; double m2; if((num[1]==num[3])&&(num[5]==num[7])) { System.out.print("true"); } else { m1=Math.abs((num[2]-num[4])/(num[1]-num[3])); m2=Math.abs((num[6]-num[8])/(num[5]-num[7])); if(m1 == m2) System.out.print("true"); else System.out.print("flase");} }

判断两条线是否平行,暂时没有发现问题。
四.改进建议
题目集三中的格式错误判断应该改进成从侧面判断的方式,这样会更好。不然去一个一个列举出错误的情况太复杂了。
多运用类以及函数,不是只写一个main函数写完整个程序
五.总结
通过这三次实验初步掌握了java语言的一些用法,以及类和函数的用法。但是,还是不能够熟练的使用,同时对于题目的理解还是有所欠缺的。对于类的使用还需要加强练习。

浙公网安备 33010602011771号