总结blog
只需使用Main类。首先得对该题目进行详细的分析,明白奇偶效验是判断“1”的个数为奇数还是偶数,并是采用的是奇效验,判定的数据段为有效数据和其后一位计算判定,再运用for循环语句,if-else语句,变量标识符,解答该题目
if(b.length<11){
x=1;
}
else{
String c="1";
for(int i=1;i<b.length;i++){
c=c+1;
}
if(c.equals(a)){
x=1;
}
}
if(x==1){
System.out.println("null data");
}
else{
for(int k=0;k<b.length;k++){
if(b[k]=='0'){
for(int j=k+1;j<=k+9;j++){
if(b[j]=='1'){
z=z+1;
}
}
if(b[k+10]!='1'){
System.out.println(y+":"+"validate error");
y++;
k=k+10;
z=0;
continue;
}
else if(z%2==0){
System.out.println(y+":"+"parity check error");
y++;
k=k+10;
z=0;
continue;
}
else if(b[k+10]!='1'&&z%2==0){
System.out.println(y+":"+"validate error");
y++;
k=k+10;
z=0;
continue;
}
else{
System.out.print(y+":");
for(int t=k+1;t<k+9;t++){
System.out.print(b[t]);
}
System.out.println();
y++;
k=k+10;
z=0;
continue;
}
}
}
}
先用if-else语句和for语句以x为标识符,判断输入数据格式是否错误,如果正确再用for语句对输入的字符串进行解析,利用z来计算“1”的个数进行奇偶效验,每次输出一个结果后,y+1来表示下一结果的顺序,k+10来略过解析完的字符串段,使用continue保证进行下一次的循环,最后对每段字符的判断若某个数据的结束符不为1,则输出“validate error”。若某个数据奇偶校验错误,则输出“parity check error”。若数据结束符和奇偶校验均不合格,输出“validate error”。得出相应的结果。
1.for语句循环中,使用了continue,保证了下一次循环的进行。
2.能够较为精准的对字符串解析,并依照题意得出对应结果。
1.if-else语句与前面题目集7-7一样依旧使用过多,造成程序繁杂。
2.标识符多,并且使用嵌套循环,不易于阅读者理解。
该题目整体思路清晰,只需创建一个Point类(点),主要注意的地方是判断输入格式非法的地方要严谨准确(讨论多种情况),创建一个find方法来判断输入格式,使用新学习的split方法进行分割字符串,il-else语句等,判断输入格式合法且没超过2个点后输出距离
public static int find(String a){
char b[]=a.toCharArray();
for(int i=0;i<b.length;i++){
if(i<=b.length-2) {
if((b[i]=='-'||b[i]=='+'||b[i]=='.')&&(b[i+1]=='-'||b[i+1]=='+'||b[i+1]=='.')){
return 1;
}
}
if(b[i]!='.'&&b[i]!='-'&&b[i]!='+'&&(b[i]<'0'||b[i]>'9')){
return 1;
}
if(b[i]=='0'&&b[i+1]!='.'){
return 1;
}
}
if(b[b.length-1]=='.'||b[0]=='.'){
return 1;
}
return 0;
}
此为find方法,返回值为int类型,用以判断输入数据的合法性。将输入的字符串a转换成为字符数组b,判断数组中除了. - + 0-9外是否还有其它非法字符,如果有返回1,并判断. - + 0-9的顺序是否有问题,如果有返回1,这些情况都没有出现,则返回0。
1.if-else语句条件简明,且运用了新学习的tochararray方法和split方法。
:1.使用了许多if-else语句和嵌套循环,代码繁杂过多,,不简洁,不易于理解。
2.测试点测试非法格式有许多种情况未考虑到,仅考虑了部分非法格式,不够完善。
3.未能使用正则表达式,程序过长。
这题出现bug有两个测试点未通过,经过完善find方法得以通过,并且我对输入数据的长度和字符数量进行了判断。该题我创建了Point类(点)和Test类(方法),Point类用于取用其中的方法对应题目的选项。通过Main类,Point类,Test类共同完成该题。
public static int find(String a){
char b[]=a.toCharArray();
if(b[0]=='0'&&b.length>1){
if(b[1]!='.'){
return 1;
}
}
if(b[0]=='+'||b[0]=='-'){
if(b[1]=='0'&&b.length>2){
if(b[2]!='.'){
return 1;
}
}
if(b[1]<'0'||b[1]>'9'){
return 1;
}
}
for(int k6=0;k6<b.length;k6++){
if(b[k6]==' '||b[k6]==':'){
return 1;
}
}
if(b[b.length-1]=='.'||b[0]=='.'||b[b.length-1]=='+'||b[b.length-1]=='-'){
return 1;
}
return 0;
}
public void test1(String a[]){
String a1[]=a[0].split(",");
String a2[]=a[1].split(",");
Point aa=new Point(a1[0],a1[1]);
Point b=new Point(a2[0],a2[1]);
if(aa.x==b.x&&aa.y==b.y){
System.out.println("points coincide");
}
else{
double s=0;
s=(aa.y-b.y)/(aa.x-b.x);
if(aa.x==b.x){
System.out.println("Slope does not exist");
}
else{
System.out.println(s);
}
}
}
public void test2(String a[]){
String a1[]=a[0].split(",");
String a2[]=a[1].split(",");
String a3[]=a[2].split(",");
Point aa=new Point(a1[0],a1[1]);
Point b=new Point(a2[0],a2[1]);
Point c=new Point(a3[0],a3[1]);
if((b.x==c.x&&b.y==c.y)||(aa.x==b.x&&aa.y==b.y)||(aa.x==c.x&&aa.y==c.y)){
System.out.println("points coincide");
}
else{
if(b.x==c.x){
System.out.println(Math.abs(aa.x-b.x));
}
else if(b.y==c.y){
System.out.println(Math.abs(aa.y-b.y));
}
else{
double k=(b.y-c.y)/(b.x-c.x);
double b1=b.y-k*b.x;
double s=Math.abs(k*aa.x-aa.y+b1)/Math.sqrt(k*k+1);
System.out.println(s);
}
}
}
public void test3(String a[]){
String a1[]=a[0].split(",");
String a2[]=a[1].split(",");
String a3[]=a[2].split(",");
Point aa=new Point(a1[0],a1[1]);
Point b=new Point(a2[0],a2[1]);
Point c=new Point(a3[0],a3[1]);
if((aa.x==b.x&&aa.y==b.y)||(aa.x==c.x&&aa.y==c.y)||(b.x==c.x&&b.y==c.y)) {
System.out.println("points coincide");
}
else {
if(aa.x==b.x&&b.x==c.x&&aa.x==c.x) {
System.out.println("true");
}
else if((aa.y-b.y)/(aa.x-b.x)==(aa.y-c.y)/(aa.x-c.x)&&(aa.y-b.y)/(aa.x-b.x)==(b.y-c.y)/(b.x-c.x)&&(b.y-c.y)/(b.x-c.x)==(aa.y-c.y)/(aa.x-c.x)) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
}
public void test4(String a[]){
String a1[]=a[0].split(",");
String a2[]=a[1].split(",");
String a3[]=a[2].split(",");
String a4[]=a[3].split(",");
Point aa=new Point(a1[0],a1[1]);
Point b=new Point(a2[0],a2[1]);
Point c=new Point(a3[0],a3[1]);
Point d=new Point(a4[0],a4[1]);
if((aa.x==b.x&&aa.y==b.y)||(c.x==d.x&&c.y==d.y)) {
System.out.println("points coincide");
}
else {
if((aa.x==b.x&&c.x==d.x)||(aa.x==b.x&&b.x==c.x&&c.x==d.x)) {
System.out.println("true");
}
else if((aa.y-b.y)/(aa.x-b.x)==(c.y-d.y)/(c.x-d.x)) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
}
public void test5(String a[]){
String a1[]=a[0].split(",");
String a2[]=a[1].split(",");
String a3[]=a[2].split(",");
String a4[]=a[3].split(",");
Point aa=new Point(a1[0],a1[1]);
Point b=new Point(a2[0],a2[1]);
Point c=new Point(a3[0],a3[1]);
Point d=new Point(a4[0],a4[1]);
if((aa.x==b.x&&aa.y==b.y)||(c.x==d.x&&c.y==d.y)) {
System.out.println("points coincide");
}
else {
if((aa.x==b.x&&c.x==d.x)||(aa.x==b.x&&b.x==c.x&&c.x==d.x)||(aa.y-b.y)/(aa.x-b.x)==(c.y-d.y)/(c.x-d.x)) {
System.out.println("is parallel lines,have no intersection point");
}
else {
double aa1,aa2,bb1,bb2,c1,c2,m,x,y;
aa1=b.y-aa.y;
aa2=d.y-c.y;
bb1=b.x-aa.x;
bb2=d.x-c.x;
c1=bb1*aa.y-aa1*aa.x;
c2=bb2*c.y-aa2*c.x;
m=aa1*bb2-aa2*bb1;
x=(bb1*c2-bb2*c1)/m;
y=(aa1*c2-aa2*c1)/m;
double max1=Math.max(aa.x,b.x);
double min1=Math.min(aa.x,b.x);
double max2=Math.max(aa.y,b.y);
double min2=Math.min(aa.y,b.y);
double max3=Math.max(c.x,d.x);
double min3=Math.min(c.x,d.x);
double max4=Math.max(c.y,d.y);
double min4=Math.min(c.y,d.y);
if ((x>min1&&x<max1&&y>min2&&y<max2)||(x>min3&&x<max3&&y>min4&&y<max4)) {
System.out.println(x+","+y+" true");
}
else {
System.out.println(x+","+y+" false");
}
}
}
}
第一个是find方法,较7-1进行了完善,对一些我本以为已经排除的字符进行再次判断,并按照输入数据顺序判断字符顺序,最后成功通过遗漏的测试点。
test1方法,void型,用于对应选项一,要特别区分斜率存在和斜率不存在的情况得出相应结果。
test2方法,void型,用于对应选项二,跟test1注意的点一样。
test3方法,void型,用于对应选项三,三个点x坐标相同则true,斜率相同也输出true,其他情况则输出false。
test4方法,void型,用于对应选项四,跟test3的原理类似。
test5方法,void型,用于对应选项五,刚开始使用以前学习的方法来求交点坐标,但是始终有一个测试点无法通过,后面通过学习csdn上求交点的方法通过了测试点。还要注意题目意思是该交点在两条线段中的一条内就行。
1.运用point类让程序结构不会出现太多重复创建点的代码,但还是存在一些。
2.对非法格式和选项的方法进行详细分析,找出多种可能存在的情况。
1.程序过长,每个方法都创建了大量double型数据,过于繁杂。
2.选项五求交点的方法使用平常数学方法不能通过测试点,需使用另外的方法,测试样例能通过,但测试点却无法通过。
3.没有使用正则表达式匹配输入格式,代码太过于长。
判断非法格式判断方面套以7-2的方法改变点的数量和数据格式长度等,能够通过测试点测试样例。我创建了Point类和Triangle类,Triangle类里创建了匹配选项1-5的方法和需要使用的一些方法,并引用Point类创建的点,选项二和四输出的数据需要四舍五入并且保留至小数点后六位,通过在网上查询四舍五入的方法,通过先转换成字符串,再判断是否超过六位小数点,对其进行四舍五入,再输出数据。选项三输出三角形同样因为精度问题需要比较其误差,而选项五耗费很长时间编写的代码通过其测试样例,但始终无法通过测试点,更改了多种方法还是无法完成那两个测试点。
class Triangle{
double a1,b1,c1;
Triangle(){
}
void test1(Point a,Point b,Point c) {
int x=0,y=0;
a1=d(a.x,a.y,b.x,b.y);
b1=d(a.x,a.y,c.x,c.y);
c1=d(b.x,b.y,c.x,c.y);
if((a.x==b.x&&a.y==b.y)||(a.x==c.x&&a.y==c.y)||(c.x==b.x&&c.y==b.y)) {
System.out.println("data error");
}
else {
if(a1==b1&&b1==c1) {
y=1;
}
if(a1==b1||a1==c1||b1==c1) {
x=1;
}
if(x==1&&y==1) {
System.out.println("true true");
}
else if(x==1&&y==0) {
System.out.println("true false");
}
else if(x==0&&y==1) {
System.out.println("false true");
}
else {
System.out.println("false false");
}
}
}
void test2(Point a,Point b,Point c) {
double S,C,x1,y1;
a1=d(a.x,a.y,b.x,b.y);
b1=d(a.x,a.y,c.x,c.y);
c1=d(b.x,b.y,c.x,c.y);
if((a.x==b.x&&a.y==b.y)||(a.x==c.x&&a.y==c.y)||(c.x==b.x&&c.y==b.y)) {
System.out.println("data error");
}
else {
C=a1+b1+c1;
double xx=d(b.x,b.y,c.x,c.y);
S=dd(a,b,c)*xx/2;
x1=(a.x+b.x+c.x)/3;
y1=(a.y+b.y+c.y)/3;
String result1= change(C);
String result2= change(S);
String result3= change(x1);
String result4= change(y1);
System.out.println(result1+" "+result2+" "+result3+","+result4);
}
}
void test3(Point a,Point b,Point c) {
a1=d(a.x,a.y,b.x,b.y);
b1=d(a.x,a.y,c.x,c.y);
c1=d(b.x,b.y,c.x,c.y);
if((a.x==b.x&&a.y==b.y)||(a.x==c.x&&a.y==c.y)||(c.x==b.x&&c.y==b.y)) {
System.out.println("data error");
}
else {
double max=getmax(a1,b1,c1);
if(max==a1) {
sjx(b1,c1,max);
}
else if(max==b1) {
sjx(a1,c1,max);
}
else {
sjx(a1,b1,max);
}
}
}
void test4(Point a,Point b,Point c,Point d,Point e) {
int i=0;
if(a.x==b.x&&b.y==a.y) {
System.out.println("points coincide");
}
else if((c.x==d.x&&c.y==d.y)||(c.x==e.x&&c.y==e.y)||(d.x==e.x&&d.y==e.y)){
System.out.println("data error");
}
else {
int a1=0,a2=0;
Point p1=getpoint(a,b,c,d);
Point p2=getpoint(a,b,c,e);
Point p3=getpoint(a,b,d,e);
i=panduan(p1)+panduan(p2)+panduan(p3);
if((p1!=null&&p2!=null&&p1.x==p2.x&&p1.y==p2.y)||(p1!=null&&p3!=null&&p1.x==p3.x&&p1.y==p3.y)) {
i--;
a1=1;
}
if(p2!=null&&p3!=null&&p2.x==p3.x&&p2.y==p3.y) {
i--;
a2=1;
}
if(i<2) {
System.out.println(i);
}
else if(i==2) {
if(panduan(p1)==0||a1==1) {
double xx=d(d.x,d.y,e.x,e.y);
double s=dd(c,d,e)*xx/2;
double xx1=d(p2.x,p2.y,p3.x,p3.y);
double s1=dd(e,p2,p3)*xx1/2;
double s2=s-s1;
double max=Math.max(s1, s2);
String result1= change(s2);
String result2= change(max);
String result3= change(s1);
if(max==s1) {
System.out.println(i+" "+result1+" "+result2);
}
else {
System.out.println(i+" "+result3+" "+result2);
}
}
else if(panduan(p2)==0||a2==1) {
double xx=d(d.x,d.y,e.x,e.y);
double s=dd(c,d,e)*xx/2;
double xx1=d(p1.x,p1.y,p3.x,p3.y);
double s1=dd(d,p1,p3)*xx1/2;
double s2=s-s1;
double max=Math.max(s1, s2);
String result1= change(s2);
String result2= change(max);
String result3= change(s1);
if(max==s1) {
System.out.println(i+" "+result1+" "+result2);
}
else {
System.out.println(i+" "+result3+" "+result2);
}
}
else if(panduan(p3)==0) {
double xx=d(d.x,d.y,e.x,e.y);
double s=dd(c,d,e)*xx/2;
double xx1=d(p1.x,p1.y,p2.x,p2.y);
double s1=dd(c,p1,p2)*xx1/2;
double s2=s-s1;
double max=Math.max(s1, s2);
String result1= change(s2);
String result2= change(max);
String result3= change(s1);
if(max==s1) {
System.out.println(i+" "+result1+" "+result2);
}
else {
System.out.println(i+" "+result3+" "+result2);
}
}
}
else {
System.out.println("The point is on the edge of the triangle");
}
}
}
void test5(Point a,Point b,Point c,Point d) {
if((b.x==c.x&&b.y==c.y)||(b.x==d.x&&b.y==d.y)||(d.x==c.x&&d.y==c.y)) {
System.out.println("data error");
}
else {
if((pan(a,b,c)==1&&(b.x!=c.x)&&pan1(a,b,c)==1)||(pan(a,b,d)==1&&(b.x!=d.x)&&pan1(a,b,d)==1)||(pan(a,c,d)==1&&(c.x!=d.x)&&pan1(a,c,d)==1)) {
System.out.println("on the triangle");
}
else if((b.x==c.x&&a.x==b.x&&pan(a,b,c)==1)||(b.x==d.x&&a.x==b.x&&pan(a,b,d)==1)||(c.x==d.x&&a.x==c.x&&pan(a,c,d)==1)) {
System.out.println("on the triangle");
}
else {
double s1,s2,s3,S;
double x1=d(b.x,b.y,c.x,c.y);
s1=dd(a,b,c)*x1/2;
double x2=d(b.x,b.y,d.x,d.y);
s2=dd(a,b,d)*x2/2;
double x3=d(c.x,c.y,d.x,d.y);
s3=dd(a,c,d)*x3/2;
double xx=d(c.x,c.y,d.x,d.y);
S=dd(b,c,d)*xx/2;
if(s1+s2+s3-S<0.00001) {
System.out.println("in the triangle");
}
else {
System.out.println("outof the triangle");
}
}
}
}
int pan(Point a,Point b,Point c) {//判断a是否在b,c点范围内
double max1=Math.max(b.x,c.x);
double min1=Math.min(b.x,c.x);
double max2=Math.max(b.y,c.y);
double min2=Math.min(b.y,c.y);
if(a.x>=min1&&a.x<=max1&&a.y>=min2&&a.y<=max2) {
return 1;
}
return 0;
}
int pan1(Point a,Point b,Point c) {//判断a点是否在b,c点连线的直线上
double k1=(b.y-c.y)/(b.x-c.x);
double b1=b.y-k1*b.x;
if((k1*a.x)-a.y+b1==0) {
return 1;
}
return 0;
}
double d(double a,double b,double c,double d) {//计算两点间的距离
return Math.sqrt(Math.pow(a-c, 2)+Math.pow(b-d, 2));
}
String change(double x) {//改变数据位数
String a=String.valueOf(x);
if(a.length()>6) {
return String.format("%.6f",x);
}
return a;
}
void sjx(double a,double b,double max) {//判断该三角形为什么类型
if((a*a+b*b)-max*max<-0.00001) {
System.out.println("true false false");
}
else if(Math.abs((a*a+b*b)-max*max)<0.00001) {
System.out.println("false true false");
}
else {
System.out.println("false false true");
}
}
double getmax(double a,double b,double c){//求三个数的最大值
double max=a;
if(max<b) {
max=b;
}
if(max<c) {
max=c;
}
return max;
}
Point getpoint(Point a,Point b,Point c,Point d) {//计算交点
if((a.x==b.x&&c.x==d.x)||(a.x==b.x&&b.x==c.x&&c.x==d.x)||(a.y-b.y)/(a.x-b.x)==(c.y-d.y)/(c.x-d.x)) {
return null;
}
else {
double aa1,aa2,bb1,bb2,c1,c2,m,x,y;
aa1=b.y-a.y;
aa2=d.y-c.y;
bb1=b.x-a.x;
bb2=d.x-c.x;
c1=bb1*a.y-aa1*a.x;
c2=bb2*c.y-aa2*c.x;
m=aa1*bb2-aa2*bb1;
x=(bb1*c2-bb2*c1)/m;
y=(aa1*c2-aa2*c1)/m;
double max3=Math.max(c.x,d.x);
double min3=Math.min(c.x,d.x);
double max4=Math.max(c.y,d.y);
double min4=Math.min(c.y,d.y);
if ((x>=min3&&x<=max3&&y>=min4&&y<=max4)) {
return new Point(x,y);
}
else {
return null;
}
}
}
int panduan(Point a) {//判断是否存在交点
if(a==null) {
return 0;
}
else
return 1;
}
double dd(Point a,Point b,Point c) {//求点到直线的距离
double d;
if(b.x==c.x) {
d=Math.abs(a.x-b.x);
}
else {
d=Math.abs(((b.y-c.y)/(b.x-c.x))*a.x-a.y+b.y-b.x*((b.y-c.y)/(b.x-c.x)))/Math.sqrt(Math.pow((b.y-c.y)/(b.x-c.x),2)+1);
}
return d;
}
}
,只需进行正常的边长比较。test2输出数据时需要注意格式,算重心坐标直接使用数学公式套用,test3类似与前面题目的三角形类型判断,使用了a平方b平方c平方关系的比较,不过测定数据更加严谨,对三种情况都有误差的检验。test4我使用的求交点方法会计算出重复交点,所以运用了标识符进行排除。test5计算点重合和是否在三角形边上大概都过了测试点,而到了计算在三角形内部还是外部时候,由于对射线法不是很能理解,使用别的方法,但是始终无法通过选项五判断的全部测试点。
.使用了面向过程,创建多个类,进行协同完成。
.没有使用正则表达式,代码过于繁琐。
总结
我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串(这点对理解上面至关重要)。
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。
所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运
行时常量池。
在“ 项目”窗口中,右键单击Java文件或文件夹,然后选择“ 新建” >“ Java类”。
或者,在“ 项目” 窗口中选择Java文件或文件夹,或在代码编辑器中单击Java文件。然后选择 File > New > Java Class。
您选择的项目确定新类或类型的默认包。
在“ 创建新类”对话框中,填写以下字段:
名称 - 新类或类型的名称。它必须符合Java名称要求。不要键入文件扩展名。
种类 - 选择类或类型的类别。
超类 - 新类继承的类。您可以键入包和类名,或只键入类名,然后双击下拉列表中的项以自动完成它。
接口 - 新类或类型实现的一个或多个接口。多个接口应该用逗号分隔,后跟可选空格。您可以键入包和接口名称,或只键入接口名称,然后双击下拉列表中的项目以自动完成它。
自动完成仅适用于第一个接口名称。请注意,虽然逗号和以下接口名称可能会出现工具提示错误,但您可以忽略该错误,因为它不会影响生成的代码。
包 - 类或类型所在的包。默认值自动显示在字段中。如果在字段中键入包名称,则包标识符中不存在的任何部分将以红色突出显示; 在这种情况下,Android Studio会在您单击“ 确定”后创建该程序包。该字段必须包含值; 否则,Java文件将不包含package语句,并且类或类型不会放在项目的包中。
默认值取决于您启动“ 创建新类”对话框的方式。如果您首先在“ 项目”窗口中选择了Java文件或文件夹,则默认为您选择的项目的包。如果首先在代码编辑器中单击Java文件,则默认为包含此文件的包。
浙公网安备 33010602011771号