前三次题目集总结性blog
作业总结
前言:
在前三次作业的代码训练当中,整体难度逐渐偏难,第一次还好可以全部写出来,后面两次的作业难度直线上升(还是自己太菜了没能掌握完全),接下来也是应老师要求对前三次作业做一个小小的总结,虽然有些作业现在还没有完全搞明白,在这分析问题的过程当中,也希望自己可以找到新的突破吧。
接下来就直接对三次作业分开来进行分析好了,最后再做一个大总结。
1、第一次作业(综合应用训练)
本次作业偏简单,也比较偏综合性,在这里也不逐个分析了,但是在题目中还是有一些小细节值得去注意的
比如第二题在精确度的判断中有着些许问题
长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。
输入格式:
两个浮点数,以空格分隔,第一个是质量(以千克为单位)、第二个是长度(以米为单位)。例如:0.45359237 0.0254。
输出格式:
两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。
代码以下,在这道题当中注意的是double和float的选取使用

import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); float str1 = input.nextFloat(); float str2 = input.nextFloat(); str1=(float)(str1/0.45359237); str2=(float)(str2/0.0254); System.out.println(str1+" "+str2); } }
只要采取float单精度就可以通过测试点
然后就是第六题,对字符串读入的处理也是一个需要注意的点
学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号
输入格式:
8位数字组成的学号。例如:18011103
注意:输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入
输出格式:
学号每一项的完整说明。例如:
入学年份:2018年
学院:材料学院
班级:11
学号:03
注意:如非法输入,输出“Wrong Format"
在本题当中,主要是对学号的读入,以及在不是非法读入的情况下对八位数字的学号进行两两数字的判断

import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int[] numbers = new int[8]; int x=input.nextInt(); int sum=0; int y=x; while(y>0) { y/=10; sum++; } if(sum==8) { for(int i=7;i>=0;i--) { numbers[i]=x%10; x=x/10; } if(numbers[2]==0 && numbers[3]>=1 &&numbers[3]<=3 || numbers[2]==2&&numbers[3]==0) { System.out.println("入学年份:20"+numbers[0]+numbers[1]+"年"); System.out.print("学院:"); if(numbers[2]==0) { if(numbers[3]==1) System.out.println("材料学院"); if(numbers[3]==2) System.out.println("机械学院"); if(numbers[3]==3) System.out.println("外语学院"); } else System.out.println("软件学院"); System.out.println("班级:"+numbers[4]+numbers[5]); System.out.println("学号:"+numbers[6]+numbers[7]); } else { sum=0; } } if(sum!=8) System.out.println("Wrong Format"); } }
本题先将字符串读入,然后再对字符串进行初步判断,用标记sum来判断,若符合8位数字的标准,则进入下一步的判断。
再将字符串存储到数组里面,对数组进行分析判断合法性,若不合法则改变标记sum,最后再输出题目所要求的。
本题可以简化改进,不用多一个循环来判断数字长度,直接采用x.length来判断即可
2、第二次作业(对字符串的分析应用)
本次作业更多的是偏向对字符串进行读入并进行分析输出,根据题目的要求对读入的字符串进行分析
第一题是对字符串进行字母数字进行转换
第二题是对读入的串口字符进行分析
第三题是对字符串进行格式判断及提取
所以可以看出来,这三道题目的解题思路都要从字符串入手,也按照要求重点对第二道题目进行分析
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
从题目可以看出来输入的是由0和1组成的串口字符,然后再对串口字符进行具体的分析,具体思路就是用string读入串口字符,但是在后面的分析中当时遇到了瓶颈以及时间有限,于是只做了最简单的错误判断,并没有把所有的都完成
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub int a=1; Scanner input = new Scanner(System.in); String x=input.nextLine(); char[] sum=x.toCharArray(); int num=sum.length; if(x.length()<11) System.out.print("null data"); if(x.matches("^[1]*$")) { System.out.print("null data"); } } }
首先先是对串口符进行读入,先判断数据不足11位或者输入数据全1没有起始位,然后先输出null data,这边可以直接对读入的字符串进行判断,分别利用长度以及正则表达式进行判断串口符的合法性
当时到这里就没有往后面写下去了,现在再顺着当时的思路继续往下分析
由题目可知,结束符不为1并且奇偶校验不合格输出validate error,所以可以将这两个点进行单独判断输出结果
然后接下来就是采用数组的遍历对串口符进行具体分析
具体还要判断有几组数据,对正常值,空闲位等都要进行判断,由于代码也没有全部写完那就直接跳下一次作业好了。
2、第三次作业(点线形系列)
本次作业的三道题目都是循序渐进
第一题从两点之间的距离出发进行长度计算
第二题从线段之间进行运算
第三题则是对由线段组成的三角形进行判断
具体分析放到代码最后面去了
输入连个点的坐标,计算两点之间的距离
输入格式:
4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。
输出格式:
计算所得的两点之间的距离。例如:1.4142135623730951



import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); String a = scanner.nextLine(); char str[] = a.toCharArray(); int len=a.length(); int i,j; int sum=0; int flag=1; int point=0; int e=0,b=0,c=0,d=0; int num1=0,num2=0,num3=0,num4=0; double x1=0,y1=0,x2=0,y2=0; double result; for(i=0;i<len;i++) { if(str[i]==',') sum++; } if(sum>2) System.out.print("wrong number of points"); else { for(i=0;i<len;i++) { if(str[i]=='+' || str[i]=='-') { if(a.matches("(\\+|-)?(0|[1-9]\\d*)(\\.\\d*[1-9])?(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d*[1-9])?(\\ )(\\+|-)?(0|[1-9]\\d*)(\\.\\d*[1-9])?(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d*[1-9])?")) flag=flag; else flag++; if(str[i]=='.') point++; if(str[i]>='a' && str[i]<='z') flag++; if(str[i]>='A' && str[i]<='Z') flag++; } } if(flag!=1) { System.out.print("Wrong Format"); } else if(point==0) { for(i=0;i<len;i++) { //System.out.println(str[i]); if(point==0) { if(str[i]=='-') e++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num1++; else break; } } if(str[i]>='0' && str[i]<='9') { x1=x1*10+(str[i]-'0'); //System.out.println(x1); } } if(point==1) { if(str[i]=='-') b++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num2++; else break; } } if(str[i]>='0' && str[i]<='9') { y1=y1*10+(str[i]-'0'); //System.out.println(y1); } } if(point==2) { if(str[i]=='-') c++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num3++; else break; } } if(str[i]>='0' && str[i]<='9') { x2=x2*10+(str[i]-'0'); //System.out.println(x2); } } if(point==3) { if(str[i]=='-') d=1; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num4++; else break; } } if(str[i]>='0' && str[i]<='9') { y2=y2*10+(str[i]-'0'); //System.out.println(y2); } } if(str[i]==' '||str[i]==',') point++; } if(e==1) { x1=-x1; } if(b==1) { y1=-y1; } if(c==1) { x2=-x2; //System.out.println(x2); } if(d==1) { y2=-y2; //System.out.println(y2); } if(num1!=0) x1=x1/Math.pow(10,num1); if(num2!=0) y1=y1/Math.pow(10,num2); if(num3!=0) x2=x2/Math.pow(10,num3); if(num4!=0) y2=y2/Math.pow(10,num4); result=Math.sqrt(Math.abs(x1*x1+x2*x2-2*x1*x2)+Math.abs(y1*y1+y2*y2-2*y1*y2)); System.out.print(result); } } } }
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
例如:1:0,0 1,1
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",
输出格式:



import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); String a = scanner.nextLine(); char str[] = a.toCharArray(); int len=a.length(); int i,j; int sum=0; int flag=1; int point=0; int num1=0,num2=0,num3=0,num4=0,num5=0,num6=0; int e=0,b=0,c=0,d=0,f=0,g=0,h=0,k=0; double x1=0,y1=0,x2=0,y2=0,x3=0,y3=0,x4=0,y4=0; double result,result1,result2; for(i=0;i<len;i++) { if(str[i]==',') sum++; } if(sum>4||sum==1) System.out.print("wrong number of points"); if(str[0]=='1') { for(i=2;i<len;i++) { if(str[i]=='+' || str[i]=='-') { if(str[i+1]>='0' && str[i+1]<='9') flag=flag; else flag++; if(str[i]=='.') point++; } } if(flag!=1) { System.out.print("Wrong Format"); } else if(point==0) { for(i=2;i<len;i++) { //System.out.println(str[i]); if(point==0) { if(str[i]=='-') e++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num1++; else break; } } if(str[i]>='0' && str[i]<='9') { x1=x1*10+(str[i]-'0'); } } if(point==1) { if(str[i]=='-') b++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num2++; else break; } } if(str[i]>='0' && str[i]<='9') { y1=y1*10+(str[i]-'0'); } } if(point==2) { if(str[i]=='-') c++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num3++; else break; } } if(str[i]>='0' && str[i]<='9') { x2=x2*10+(str[i]-'0'); } } if(point==3) { if(str[i]=='-') d=1; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num4++; else break; } } if(str[i]>='0' && str[i]<='9') { y2=y2*10+(str[i]-'0'); } } if(str[i]==' '||str[i]==',') point++; } if(e==1) x1=-x1; if(b==1) y1=-y1; if(c==1) x2=-x2; if(d==1) y2=-y2; if(num1!=0) x1=x1/Math.pow(10,num1); if(num2!=0) y1=y1/Math.pow(10,num2); if(num3!=0) x2=x2/Math.pow(10,num3); if(num4!=0) y2=y2/Math.pow(10,num4); result=(y1-y2)/(x1-x2); if(x1==x2&&y1==y2) System.out.print("points coincide"); else if(x1==x2&&y1!=y2) System.out.print("Slope does not exist"); else System.out.print(result); } } if(str[0]=='2') { } if(str[0]=='3') { for(i=2;i<len;i++) { if(str[i]=='+' || str[i]=='-') { if(str[i+1]>='0' && str[i+1]<='9') flag=flag; else flag++; if(str[i]=='.') point++; } } if(flag!=1) { System.out.print("Wrong Format"); } else if(point==0) { for(i=2;i<len;i++) { if(point==0) { if(str[i]=='-') e++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num1++; else break; } } if(str[i]>='0' && str[i]<='9') { x1=x1*10+(str[i]-'0'); } } if(point==1) { if(str[i]=='-') b++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num2++; else break; } } if(str[i]>='0' && str[i]<='9') { y1=y1*10+(str[i]-'0'); } } if(point==2) { if(str[i]=='-') c++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num3++; else break; } } if(str[i]>='0' && str[i]<='9') { x2=x2*10+(str[i]-'0'); } } if(point==3) { if(str[i]=='-') d=1; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num4++; else break; } } if(str[i]>='0' && str[i]<='9') { y2=y2*10+(str[i]-'0'); //System.out.println(y2); } } if(point==4) { if(str[i]=='-') f=1; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num5++; else break; } } if(str[i]>='0' && str[i]<='9') { x3=x3*10+(str[i]-'0'); } } if(point==5) { if(str[i]=='-') g=1; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num6++; else break; } } if(str[i]>='0' && str[i]<='9') { y3=y3*10+(str[i]-'0'); } } if(str[i]==' '||str[i]==',') point++; } if(e==1) x1=-x1; if(b==1) y1=-y1; if(c==1) x2=-x2; if(d==1) y2=-y2; if(f==1) x3=-x3; if(g==1) y3=-y3; if(num1!=0) x1=x1/Math.pow(10,num1); if(num2!=0) y1=y1/Math.pow(10,num2); if(num3!=0) x2=x2/Math.pow(10,num3); if(num4!=0) y2=y2/Math.pow(10,num4); if(num5!=0) x3=x3/Math.pow(10,num1); if(num6!=0) y3=y3/Math.pow(10,num2); if(x1==x2&&y1==y2 || x1==x3&&y1==y3 || x3==x2&&y3==y2) System.out.println("points coincide"); else if(x1*y2==x2*y1 && x2*y3==x3*y2 && x1*y3==x3*y1) System.out.println("true"); else System.out.println("flase"); } } if(str[0]=='4') { for(i=2;i<len;i++) { if(str[i]=='+' || str[i]=='-') { if(str[i+1]>='0' && str[i+1]<='9') flag=flag; else flag++; if(str[i]=='.') point++; } } if(flag!=1) { System.out.print("Wrong Format"); } else if(point==0) { for(i=2;i<len;i++) { //System.out.println(str[i]); if(point==0) { if(str[i]=='-') e++; if(str[i]>='0' && str[i]<='9') { x1=x1*10+(str[i]-'0'); //System.out.println(x1); } } if(point==1) { if(str[i]=='-') b++; if(str[i]>='0' && str[i]<='9') { y1=y1*10+(str[i]-'0'); //System.out.println(y1); } } if(point==2) { if(str[i]=='-') c++; if(str[i]>='0' && str[i]<='9') { x2=x2*10+(str[i]-'0'); //System.out.println(x2); } } if(point==3) { if(str[i]=='-') d=1; if(str[i]>='0' && str[i]<='9') { y2=y2*10+(str[i]-'0'); //System.out.println(y2); } } if(point==4) { if(str[i]=='-') f=1; if(str[i]>='0' && str[i]<='9') { x3=x3*10+(str[i]-'0'); //System.out.println(y2); } } if(point==5) { if(str[i]=='-') g=1; if(str[i]>='0' && str[i]<='9') { y3=y3*10+(str[i]-'0'); //System.out.println(y2); } } if(point==6) { if(str[i]=='-') h=1; if(str[i]>='0' && str[i]<='9') { x4=x4*10+(str[i]-'0'); //System.out.println(y2); } } if(point==7) { if(str[i]=='-') k=1; if(str[i]>='0' && str[i]<='9') { y4=y4*10+(str[i]-'0'); //System.out.println(y2); } } if(str[i]==' '||str[i]==',') point++; } if(e==1) { x1=-x1; } if(b==1) y1=-y1; if(c==1) x2=-x2; if(d==1) y2=-y2; if(f==1) x3=-x3; if(g==1) y3=-y3; if(h==1) x4=-x4; if(k==1) y4=-y4; result1=(y1-y2)/(x1-x2); result2=(y3-y4)/(x3-x4); if(Math.abs(result1-result2)<0.0001) System.out.println("true"); else System.out.println("flase"); } } } }
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
如果输入的三个点无法构成三角形,输出"data error"。
注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333333,1.0按格式输出为1.0
选项4中所输入线的两个点坐标重合,输出"points coincide",

import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); String a = scanner.nextLine(); char str[] = a.toCharArray(); int len=a.length(); int i,j; int sum=0; int flag=1; int point=0; int e=0,b=0,c=0,d=0; int num1=0,num2=0,num3=0,num4=0; double x1=0,y1=0,x2=0,y2=0; double result; for(i=0;i<len;i++) { if(str[i]==',') sum++; } if(sum>2) System.out.print("wrong number of points"); else { for(i=0;i<len;i++) { if(str[i]=='+' || str[i]=='-') { if(str[i]>=0&&str[i]<=9) flag=flag; else flag++; if(str[i]=='.') point++; } } if(flag!=1) { System.out.print("Wrong Format"); } else if(point==0) { for(i=0;i<len;i++) { //System.out.println(str[i]); if(point==0) { if(str[i]=='-') e++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num1++; else break; } } if(str[i]>='0' && str[i]<='9') { x1=x1*10+(str[i]-'0'); //System.out.println(x1); } } if(point==1) { if(str[i]=='-') b++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num2++; else break; } } if(str[i]>='0' && str[i]<='9') { y1=y1*10+(str[i]-'0'); //System.out.println(y1); } } if(point==2) { if(str[i]=='-') c++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num3++; else break; } } if(str[i]>='0' && str[i]<='9') { x2=x2*10+(str[i]-'0'); //System.out.println(x2); } } if(point==3) { if(str[i]=='-') d=1; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num4++; else break; } } if(str[i]>='0' && str[i]<='9') { y2=y2*10+(str[i]-'0'); //System.out.println(y2); } } if(str[i]==' '||str[i]==',') point++; } if(e==1) { x1=-x1; } if(b==1) { y1=-y1; } if(c==1) { x2=-x2; //System.out.println(x2); } if(d==1) { y2=-y2; //System.out.println(y2); } if(num1!=0) x1=x1/Math.pow(10,num1); if(num2!=0) y1=y1/Math.pow(10,num2); if(num3!=0) x2=x2/Math.pow(10,num3); if(num4!=0) y2=y2/Math.pow(10,num4); result=Math.sqrt(Math.abs(x1*x1+x2*x2-2*x1*x2)+Math.abs(y1*y1+y2*y2-2*y1*y2)); System.out.print(result); } } } }
第三次作业的三个代码都有相关性,所以放一起来分析
第一题:
首先先是第一个点与点之间的距离计算。string读入字符串,再转换成char类型的数组,先是对是否超过两个点进行判断,是的话直接输出wrong number of points,判断标准则利用点的','来进行判断点的个数。
然后再是对输入的合法性进行判断,这里可以设一个标记点flag,然后利用正则表达式来判断表达式合法性,若不合法则改变flag的值,后面再对flag的值进行判断,
若合法则进入判断,将数组中的每一个点利用计算提取出来,最后再对得出来的两个点直接进行计算距离即可解决。
提取坐标这部分可能比较麻烦,还要考虑小数点和正负号
else if(point==0) { for(i=0;i<len;i++) { //System.out.println(str[i]); if(point==0) { if(str[i]=='-') e++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num1++; else break; } } if(str[i]>='0' && str[i]<='9') { x1=x1*10+(str[i]-'0'); //System.out.println(x1); } } if(point==1) { if(str[i]=='-') b++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num2++; else break; } } if(str[i]>='0' && str[i]<='9') { y1=y1*10+(str[i]-'0'); //System.out.println(y1); } } if(point==2) { if(str[i]=='-') c++; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num3++; else break; } } if(str[i]>='0' && str[i]<='9') { x2=x2*10+(str[i]-'0'); //System.out.println(x2); } } if(point==3) { if(str[i]=='-') d=1; if(str[i]=='.') { for(j=i+1;j<len;j++) { if(str[j]>='0' && str[j]<='9') num4++; else break; } } if(str[i]>='0' && str[i]<='9') { y2=y2*10+(str[i]-'0'); //System.out.println(y2); } } if(str[i]==' '||str[i]==',') point++; } if(e==1) { x1=-x1; } if(b==1) { y1=-y1; } if(c==1) { x2=-x2; //System.out.println(x2); } if(d==1) { y2=-y2; //System.out.println(y2); }
解决完这些问题到了最后就会比较好做了
这边还有一个个人问题,就是在判断表达式合法的时候,一开始没有打算用正则表达式,然后在判断表达式合法性的时候是读入'+'或者'-'的时候直接判断下一位是否为数字
所以应该是写成str[i+1]>='0' && str[i+1]<='9',但是数字带上单引号反而比不带要低两分,还过了更多的测试点,但是这样明显是错误的,因为后面不能继续进行判断了
剩下的问题都比较好解决
第二题:
第二题相比第一题就要复杂许多了,首先先多了几个选项的选择,所以在读取判断的时候利用char类型的数组要先将数组中str[0]以及str[1]进行一个优先的判断,且在之后的判断中应该从str[2]项开始判断
还是依据第一题的思路来做,先对读入的字符串进行判断,分别从数组的前两位以及后面数组点的数量以及合法性进行判断和定性,这些都不存在问题就进入选项分支的判断
第一个选项是对两个点的情况进行斜率计算,这个的思路直接照搬第一题就好了,直接对两点进行计算,只是要考虑斜率无穷大的情况
第二第三个选项是对三个点的情况进行计算,难点主要是在第二个选项当中,当时没有写出来这个选项,后面思考了一下,对于三个点,求第一个点到第二个和第三个点构成的直线的距离,直接求出y=kx+b中的k和b,再待人第一个点直接算出来就好了
第四第五个选项是对四个点的情况进行计算,难点同样是在第五个点的计算交点当中,当时写题目的时候觉得很复杂也没有写出来,实际上这个也是简单粗暴的用数学公式求解就好了,毕竟电脑计算能力非常强大(笑)
然后就是对个人的代码问题了,在进行数字提取当中其实是可以使用函数的,这里可以进行改进,也让代码更加简洁,如果不这样写到后面500行都可能不够把代码写完
第三题:
第三题也是在第二题的基础上将难度拔高,对线组成的三角形进行判断,由于当时也没有写完,这里也只能做一个比较简单的分析
由于是对三角形的分析,也只能使用数学方法将点与点之间的距离求出来再做具体分析,基本思路还是按照第二题来走,这边也没有做出来所以也不好具体分析
总结思考与反思:
这三次题目集对我来说收获颇多,虽然从第二次作业开始就遇到了比较大的瓶颈。第一次作业更加偏向于综合性,第二次偏向对字符串的分析,第三次偏向对点线的分析,在写代码的过程中也不断学习方法,对我个人的代码能力提升有着莫大的帮助
然而还有很多方面值得我个人去学习去深究,也要求今后对java语言的学习要更加认真,在老师的带领下不断提升自我的能力,从而不断完善自己的专业知识,提高自我。

浙公网安备 33010602011771号