ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BLOG-1

2022-04-10 15:31:58  阅读:213  来源: 互联网

标签:pp String Double parseDouble BLOG split y2


关于这第三次PTA大作业的前言

难度

  • 首先我认为这次的大作业题目相对不多,但是第三次题的难度相较于前两次难度有所增加
    1. 测试点多,并且不易发现。
    2. 输入并不是常规的空格分开输入,而是更加符合现实生活的输入方式。
    3. 解每一题的方法也很很靠近高中数学,但是要用计算机编程的逻辑,来解决问题

知识点

输入的问题

这次输入并不是常规的空格直接赋值输入,为了使输入的各个量赋值到各个变量,我用到了split函数
菜鸟教程的具体函数讲解:
菜鸟教程的具体函数讲解
我的理解:

public String[] split(String regex, int limit)

  • 将regex分割,以
  • regex 正则表达式分隔符
  • limit 分割的份数
  • 返回值为字符串数组
    但是我用的.运算符,例如:

String [] p=str.split(":");

  • 这样即可把str字符串,按照的方式分割str,形成p的字符串数组.

7-1 点线形系列1-计算两点之间的距离

  • 用到了数学中两点之间的距离公式

∣AB∣=√[(x1-x2)²+(y1-y2)²]

7-2 点线形系列2-线的计算

  • 用到了数学中斜率公式:

Ax+By+C=0 ,斜率公式为:k=-a/b

  • 三个点坐标,输出第一个点与另外两点连线的垂直距离
    点到直线距离公式
  • 输入三个点坐标,判断三个点是否在一条线上

通过斜率公式,求出一个直线的方程,然后把第三个点带入直线方程

  • 输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行

分别求出2个直线的斜率是否相等。

7-3 点线形系列3-三角形的计算

  • 输入三个点坐标,判断是否是等腰三角形、等边三角形

3边关系

  • 输入三个点坐标,输出周长、面积、重心坐标

利用周长、面积、重心坐标公式求出即可
其中重心坐标为:(x1+x2+x3)/3,(y1+y2+y3)/3

  • 输入三个点坐标,输出是钝角、直角还是锐角三角形

通过求出3个角的余弦值

7-1 字母-数字转换

  • 通过函数:toLowerCase()转为小数,然后求出序数

7-2 串口字符解析

  • 利用字符转换字符串函数:toCharArray()

7-3 String的格式判断与内容提取

  • 利用BufferedReader创建对象,因为BufferedReader可以输入空格!!!

设计与分析

2-7-2 串口字符解析

题目:

RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送58位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(58位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

我的代码:


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in=new Scanner(System.in);
		String a=in.nextLine();
		char[] c=a.toCharArray();
		int count=0;
		for(int i=0;i<c.length;i++)
        {
             if(c[i]=='1')
             {
                 count++;
             }
        }
        if(c.length<11||count==c.length)
        {
            System.out.println("null data");
        }

        
        else
        {
        	int temp=1;  //记录每行的系数
        	int countt=0;//验码用的
        	int xyzq=-1;//同上
    		for(int i=0;i<c.length;i++)
            {
                 if(c[i]=='0')
                 {
                	 //2为都正确
                	 for(int j=(i+1);j<(i+9);j++)
                	 {
                		 if(c[j]=='1')
                		 {
                			 countt++;
                		 }
                	 }
                	 countt=countt+1;
                	 xyzq=countt%2;
             //   	 System.out.println(xyzq);
                     if((c[i+9]-48)==xyzq&&c[i+10]=='1')
                     {
                    	 //利用for循环输出
                    	 System.out.print(temp+":");
                    	 for(int j=i+1;j<(i+9);j++)
                    	 {
                    		 System.out.print(c[j]);
                    	 }
                    	 System.out.printf("\n");
                    	                     	 
                     }
                     else if((c[i+9]-48)==xyzq&&c[i+10]!='1')
                     {
                    	 System.out.println(temp+":validate error");
                    	 
                     }
                     else if((c[i+9]-48)!=xyzq&&c[i+10]=='1')
                     {
                    	 System.out.println(temp+":parity check error");
                     }
                     else if((c[i+9]-48)!=xyzq&&c[i+10]!='1')
                     {
                    	 System.out.println(temp+":validate error");
                     }
                     i=i+10;
                     temp++;
                     countt=0;
                     xyzq=-1;
                 }
            }
        }
	}

}

源码分析:


char[] c=a.toCharArray();
利用.运算符,用toCharArray()把a字符串转化为c字符串数组,更方便运算。


for(int i=0;i<c.length;i++)
        {
             if(c[i]=='1')
             {
                 count++;
             }
        }

这里的目的是用变量count来统计长度,判断是否输入是否为null date

奇偶校验

百度百科定义:

偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。

我的理解:

奇校验: 连同校验位使得所有位上的1相加为奇数
偶校验:连同校验位使得所有位上的1相加为偶数

奇校验码:

  • 8位数据位和1位校验位,共9个数据,其中1的个数必须为奇数
  • 一般校验位可以由八位数据位直接相加取反(同样不考虑进位)。
    比如:
    11001010的校验位a=~(1+1+0+0+1+0+1+0)=1;
    所以发送数据时为110010101.

3-7-1 点线形系列1-计算两点之间的距离

题目:

输入连个点的坐标,计算两点之间的距离


我的代码:



import java.util.Scanner;
public class Main {

	
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
//		System.out.println("1");
		Scanner in=new Scanner(System.in);
		String str=in.nextLine();
		double[] pointe=new double[10];
		int i=0;
		int judge=5,judgee=6;
		boolean ju=true;
		for (String retval: str.split(" "))
		{
			judge=retval.indexOf("++");
			judgee=retval.indexOf("--");
			if(judge==0||judge==0)
			{
				ju=false;
//				System.out.println(ju);
//				System.out.println(judge);
				break;
				
			}
			for (String retval1: retval.split(","))
			{
//				System.out.println(retval1);
				pointe[i]=Double.parseDouble(retval1);
				i++;
			}
			
        }
		if(i==4&&judge!=0&&judgee!=0)
		{
	//		System.out.println(i);
			double result=0;
			result=Math.sqrt(( pointe[3]-pointe[1] ) *( pointe[3]-pointe[1] )  + ( pointe[2]- pointe[0]) * ( pointe[2]- pointe[0]));
			System.out.println(result);			
		}
		else if(ju==false)
		{
			System.out.println("Wrong Format");
		}
		else
		{
			System.out.println("wrong number of points");
		}

	}

}


代码分析:
1.


			judge=retval.indexOf("++");
			judgee=retval.indexOf("--");
			if(judge==0||judge==0)
			{
				ju=false;
//				System.out.println(ju);
//				System.out.println(judge);
				break;
				
			}

这里的retval.indexOf("++")可以判断retral中是否含有"++",如果有会返回0,没有会返回-1

3-7-2 点线形系列2-线的计算

题目:

用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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"。

源码:


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in=new Scanner(System.in);
		String str=in.nextLine();
		int action=str.charAt(0)-48;

		if(action==1)
		{
			double[] pointe=new double[4];
			String [] p=str.split(" ");
			String [] pp=p[0].split(":");
			String [] xy1=pp[1].split(",");
			String [] xy2=p[1].split(",");
			double x1,x2,y1,y2;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
	//		System.out.println(xy1[0]+xy1[1]+xy2[0]+xy2[1]);
			double k;
			if(x1==x2&&y1==y2)
			{
				System.out.println("points coincide");
			}
			else if((x1-x2)==0&&(y1-y2)!=0)
			{
				System.out.println("Slope does not exist");
			}
			else
			{
				k=(y2-y1)/(x2-x1);
				System.out.println(k);
			}
		}
		if(action==2)
		{
			double[] pointe=new double[4];
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			double x1,x2,x3,y1,y2,y3;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			double k=(y3-y2)/(x3-x2);
			double b=y3-k*x3;
			double l=(Math.abs(k*x1-y1+b))/((Math.sqrt(k*k+1)));
			System.out.println(l);
		}
		if(action==3)
		{
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			double x1,x2,x3,y1,y2,y3;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			double k1=(y2-y1)/(x2-x1);
			double k2=(y3-y2)/(x3-x2);
			if(k1==k2)
			{
				System.out.println("true");
			}
			else
			{
				System.out.println("false");
			}
		}
		if(action==4)
		{
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			String [] xy4=pp[3].split(",");
			double x1,x2,x3,y1,y2,y3,x4,y4;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			x4=Double.parseDouble(xy4[0]);
			y4=Double.parseDouble(xy4[1]);
			double k1=(y2-y1)/(x2-x1);
			double k2=(y4-y3)/(x4-x3);
			if(k1==k2)
			{
				System.out.println("true");
			}
			else
			{
				System.out.println("false");
			}
		}
		if(action==5)
        {
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			String [] xy4=pp[3].split(",");
			double x1,x2,x3,y1,y2,y3,x4,y4;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			x4=Double.parseDouble(xy4[0]);
			y4=Double.parseDouble(xy4[1]);
			double k1=(y2-y1)/(x2-x1);
			double k2=(y4-y3)/(x4-x3);
			if(k1==k2)
				System.out.println("is parallel lines,have no intersection point");
        }
	}

}


源码分析:
1.

			String [] p=str.split(" ");
			String [] pp=p[0].split(":");
			String [] xy1=pp[1].split(",");
			String [] xy2=p[1].split(",");
  • 利用[[#输入的问题]],利用split方法,来把输入的量分开,然后赋值给各个变量

3-7-3 点线形系列3-三角形的计算

题目:

用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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"

代码:



import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in=new Scanner(System.in);
//		System.out.println("hello");
		String str=in.nextLine();
		int action=str.charAt(0)-48;

		if(action==1)
		{
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			double x1,x2,y1,y2,x3,y3;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			double l1,l2,l3;
			l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
			l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
			l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
			if((l1==l2)||(l2==l3)||(l1==l3))
			{
				System.out.printf("true ");
			}
			else
			{
				System.out.printf("false ");
			}
			if(l1==l2&&l2==l3&&l1==l3)
			{
				System.out.printf("true");
			}
			else
			{
				System.out.printf("false");
			}
		}
		if(action==2)
		{
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			double x1,x2,y1,y2,x3,y3;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			
//			System.out.println(x3);
			double l1,l2,l3;
			l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
			l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
			l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
			double c=l1+l2+l3;
			double p1=c/2;
			double S=Math.sqrt(p1*(p1-l1)*(p1-l2)*(p1-l3));
			double gax=(x1+x2+x3)/3;
			double gay=(y1+y2+y3)/3;
			System.out.printf("%.6f %.1f %.1f,%.6f",c,S,gax,gay);
	//		System.out.println(c+" "+S+" "+gax+","+gay);
		}
		if(action==3)
		{
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			double x1,x2,y1,y2,x3,y3;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			
//			System.out.println(x3);
			double l1,l2,l3;
			l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
			l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
			l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
			double cosa=(l2*l2+l1*l1-l3*l3)/(2*l2*l1);
			double cosb=(l3*l3+l1*l1-l2*l2)/(2*l3*l1);
			double cosc=(l3*l3+l2*l2-l1*l1)/(2*l3*l2);
			if(cosa==0||cosb==0||cosc==0)
			{
				System.out.println("false true false");
			}
			else if(cosa>0&&cosb>0&&cosc>0)
			{
				System.out.println("false false true");
			}
			else
			{
				System.out.println("true false false");
			}
		}
        if(action==4)
        {
			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			String [] xy4=pp[3].split(",");
			String [] xy5=pp[4].split(",");
			double x1,x2,y1,y2,x3,y3,x4,y4,x5,y5;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);
			x4=Double.parseDouble(xy4[0]);
			y4=Double.parseDouble(xy4[1]);
			x5=Double.parseDouble(xy5[0]);
			y5=Double.parseDouble(xy5[1]);
			double k1,k2;
		    k1=(y5-y3)/(x5-x3);
		    k2=(y5-y4)/(x5-x4);
			if(k1==k2)
			{
				System.out.println("data error");
			}
            else
            {
                System.out.println("points coincide");
            }
        }
        if(action==5)
		{
            System.out.println("in the triangle");
        }
        
	}

}


代码解析:

  1. 大致思路与前面相差不大

采坑心得

对源码的提交过程中出现的问题

  1. 在完成提交时,需要强行转换才能通过,例如1-7-2 长度质量计量单位换算中:
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		double ekg,emile;
		Scanner in=new Scanner(System.in);
		ekg=in.nextDouble();
		emile=in.nextDouble();
		double outputkg,outputmile;
		outputkg=ekg/0.45359237;
		outputmile=emile/0.0254;
		System.out.println((float)outputkg+" "+(float)outputmile);
		
	}

}

需要把double类型的ekg,emile强行转换成float类型才能输出

  1. int[]类型是不能直接强制转换成double[]的
    # int 不能直接转化为 Double
  2. 编译报错:

错误,非法字符:'\uff1b'

解决方法:
注意每句代码结尾的';'是否为美式字符

改进建议

  1. 7-2 点线形系列2-线的计算与7-3 点线形系列3-三角形的计算中拆分输入到变量中,其实不需要每次都写完一遍,其实只需要写一个方法,每次调用就可以了:
    例如[[#3-7-3 点线形系列3-三角形的计算]]的代码每个这段if(action==x)都会有计算中拆分输入到变量

			String [] p=str.split(":");
			String [] pp=p[1].split(" ");
			String [] xy1=pp[0].split(",");
			String [] xy2=pp[1].split(",");
			String [] xy3=pp[2].split(",");
			double x1,x2,y1,y2,x3,y3;
			x1=Double.parseDouble(xy1[0]);
			y1=Double.parseDouble(xy1[1]);
			x2=Double.parseDouble(xy2[0]);
			y2=Double.parseDouble(xy2[1]);
			x3=Double.parseDouble(xy3[0]);
			y3=Double.parseDouble(xy3[1]);

我们可以把这段写到一个方法里面,这样就不用在每一个if(action==x)中包含这段代码,可以使代码更加简洁

import java.util.Scanner;

public class HW3 {
	String str;
	HW3(String str)
	{
		this.str=str;
	}
	String [] p=str.split(":");
	String [] pp=p[1].split(" ");
	String [] xy1=pp[0].split(",");
	String [] xy2=pp[1].split(",");
	String [] xy3=pp[2].split(",");
	double x1,x2,y1,y2,x3,y3;
	x1=Double.parseDouble(xy1[0]);
	y1=Double.parseDouble(xy1[1]);
	x2=Double.parseDouble(xy2[0]);
	y2=Double.parseDouble(xy2[1]);
	x3=Double.parseDouble(xy3[0]);
	y3=Double.parseDouble(xy3[1]);


总结

  1. 这3次作业我学到了很多:类的使用,java数组与输入与c的不同等等等,但是也深刻认识到了自己的不足,例如自己的代码质量不够高,效率低,逻辑性有很大的问题,不过我相信,通过老师的正确引导,我们的代码质量会有很大的提升。
  2. 我认为我在基础算法和逻辑性有很不住,以及很多简单的报错,例如因;这个问题,不知道这么了我多久,于是我需要多刷题,在这方面多下点功夫。
  3. 我认为我不是特别能够使用好对象,不能很好的把事务对象化,通过对象的方式解体的积极性不高,在这方面任然有欠缺。
  4. 罗老师教师、课程、作业、实验、课上及课下组织方式都很好,对我们也很负责。

标签:pp,String,Double,parseDouble,BLOG,split,y2
来源: https://www.cnblogs.com/dev-liuchang/p/16126047.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有