ICode9

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

PTA题目集1~3总结

2022-04-10 01:31:42  阅读:161  来源: 互联网

标签:总结 题目 String Double parseDouble PTA System x2 y3


前三次作业总结

对于前三次作业考察的点都相似:

(1)考察了输入数据合法的判断

(2)考察了字符串,数字,字符数组之间的转换

(3)考察了字符串的分割,提取等等对于字符的操作

前三章主要考察了学生对于字符串的解析能力,对于字符串方法的操作

读入

第一次作业 

7-1 身体质量指数(BMI)测算 (10 分)
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。

输入格式:

两个数值:体重(以千克为单位),身高(以米为单位),数值间以空格分隔。例如:65.5 1.75。
注意:体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0;

输出格式:

输入数值超出范围 :输出“input out of range”。例如:-2 3或者125 5。
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。

 1 import java.util.Scanner;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner in = new Scanner(System.in);
 6         double weight = in.nextDouble();
 7         double high = in.nextDouble();
 8         double BMI = weight/Math.pow(high,2);
 9         if(high<=0||weight<=0||high>=2.72||weight>=727||BMI>=727/Math.pow(2.72,2))
10         {
11              System.out.print("input out of range");
12         }
13         else if(BMI<18.5)
14                {
15                    System.out.print("thin");
16                }
17                else if(BMI<=24)
18                {
19                    System.out.print("fit");
20                }
21                else if(BMI<=28)
22                {
23                    System.out.print("overweight");
24                }
25                else
26                {
27                    System.out.print("fat");
28                }
29         }
30 }

第一题倒是没什么难度,但是题目的给出的要求与实际的测试点不符合,刚开始做的时候顺着题目要求来吃了点亏

7-6 学号识别 (10 分)
学校的学号由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"

 1 import java.util.Scanner;
 2 public class Main {
 3         public static void main(String[] args){
 4             Scanner in = new Scanner(System.in);
 5             String arr = in.next();
 6             if(arr.length()!=8)
 7             {
 8                 System.out.print("Wrong Format");
 9             }
10             else
11             {
12                 char []arr1 = new char[arr.length()];
13                 for(int i=0 ; i<arr.length() ; i++)
14                 {
15                      arr1[i]=arr.charAt(i);
16                 }
17                 if((arr1[2]=='0')||(arr1[2]=='2'))
18                 {
19                     if((arr1[3]=='1'||arr1[3]=='2'||arr1[3]=='3')&&(arr1[2]=='0'))
20                     {
21                         System.out.println("入学年份:20"+arr1[0]+arr1[1]+"年");
22                         if(arr1[3]=='1')
23                         {
24                             System.out.println("学院:材料学院");
25                         }
26                         else if(arr1[3]=='2')
27                         {
28                             System.out.println("学院:机械学院");
29                         }
30                         else 
31                         {
32                             System.out.println("学院:外语学院");
33                         }
34                         System.out.println("班级:"+arr1[4]+arr1[5]);
35                         System.out.print("学号:"+arr1[6]+arr1[7]);
36                     }
37                     else if((arr1[2]=='2')&&(arr1[3]=='0'))
38                     {
39                         System.out.println("入学年份:20"+arr1[0]+arr1[1]+"年");
40                         System.out.println("学院:软件学院");
41                         System.out.println("班级:"+arr1[4]+arr1[5]);
42                         System.out.print("学号:"+arr1[6]+arr1[7]);
43                     }
44                     else
45                     {
46                         System.out.print("Wrong Format");
47                     }
48                 }
49                 else
50                 {
51                     System.out.print("Wrong Format");
52                 }
53             }
54         }
55 }
刚开始做这题倒是感觉不难,但是当时没有去找对于字符串的处理方法,所以代码实现有点繁琐,后又重新用subString方法编写了一遍,代码如下
 1 import java.util.Scanner;
 2  
 3 public class Main {
 4  
 5     public static void main(String[] args) {
 6         String a;
 7         String year,college,clas,num;
 8         Scanner in = new Scanner(System.in);
 9         a = in.next();
10         if(8!=a.length()) {
11             System.out.print("Wrong Format");
12             return;
13         }
14         year = a.substring(0,2);
15         college = a.substring(2,4);
16         clas = a.substring(4,6);
17         num = a.substring(6,8);
18         if(college.equalsIgnoreCase("01")) {
19             college = "材料学院";
20         }else if(college.equalsIgnoreCase("02")) {
21             college = "机械学院";
22         }else if(college.equalsIgnoreCase("03")) {
23             college = "外语学院";
24         }else if(college.equalsIgnoreCase("20")) {
25             college = "软件学院";
26         }else {
27             System.out.print("Wrong Format");
28             return;
29         }
30         
31         System.out.print("入学年份:20"+year+"年\n"
32                 + "学院:"+college+"\n"
33                 + "班级:"+clas+"\n"
34                 + "学号:"+num);
35     }
36  
37 }

这次判断变得简单了,输出也将前面的整合到了一起,代码变得较为整洁

7-7 判断三角形类型 (20 分)
输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4         public static void main(String[] args){
 5                     Scanner in =new Scanner (System.in);
 6                     double a = in.nextDouble();
 7                     double b = in.nextDouble();
 8                     double c = in.nextDouble();
 9                     double error=0.000001;
10                     if(a<1||a>200||b<1||b>200||c<1||c>200)
11                     {
12                         System.out.print("Wrong Format");
13                     }
14                     else if(a+b<c+error||a+c<b+error||b+c<a+error)
15                     {
16                         System.out.println("Not a triangle");
17                     }
18                     else if(a==b||a==c||b==c)
19                     {
20                         if(a==b&&a==c)
21                         {
22                             System.out.println("Equilateral triangle");
23                         }
24                         else if((a*a+b*b<c*c+error&&a*a+b*b>c*c-error)||(a*a+c*c<b*b+error&&a*a+c*c>b*b-error)||(c*c+b*b<a*a+error&&c*c+b*b>a*a-error))
25                         {
26                             System.out.println("Isosceles right-angled triangle");
27                         }
28                         else
29                         {
30                             System.out.println("Isosceles triangle");
31                         }
32                     }
33                     else if((a*a+b*b<c*c+error&&a*a+b*b>c*c-error)||(a*a+c*c<b*b+error&&a*a+c*c>b*b-error)||(c*c+b*b<a*a+error&&c*c+b*b>a*a-error))
34                     {
35                          System.out.println("Right-angled triangle");
36                     }
37                     else
38                     {
39                         System.out.print("General triangle");
40                     }
41         }
42 }

本题难度不大,但是判断的条件却严丝合缝,确实困扰了一会,对于逻辑判断更加得熟练了。

第一次作业总的来说不难,也算是Java入门的开始吧。

 

都二次作业

7-2 串口字符解析 (40 分)
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

 1 import java.util.Scanner;
 2  
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner in = new Scanner(System.in);
 6         String a=in.next();
 7         if(a.length()<11||a.matches("^+[1]+$"))
 8         {
 9             System.out.println("null data");
10             return;
11         }
12         int sum=1;
13         for(int i=0;i<a.length()-10;i++)
14         {
15             int num=0;
16             if(a.charAt(i)=='0')
17             {
18                 if(a.charAt(i+10)=='0')
19                 {
20                     System.out.println(sum+":"+"validate error");
21                     sum++;
22                     i=i+10;
23                 }
24                 else
25                 {
26                     for(int j=i+1;j<i+9;j++) 
27                     {
28                         if(a.charAt(j)=='1') 
29                         {
30                             num++;
31                         }
32                     }
33                     if((num%2==0&&a.charAt(i+9)=='1')||(num%2==1&&a.charAt(i+9)=='0'))
34                     {
35                         System.out.println(sum+":"+a.substring(i+1,i+9));
36                         sum++;
37                         i=i+10;
38                     }
39                     else
40                     {
41                         System.out.println(sum+":"+"parity check error");
42                         sum++;
43                         i=i+10;
44                     }
45                 }
46             }
47         }
48     }
49 }

具体思路实现:

1.判断是否是长度大于11位:

2.判断的输入的字符串中是否有0;

3.找到0后对其后面10位进行分析;

4.先判断最后一位是不是结束1;

5.再判断是否奇校验正确;

6.通过两次判断结果来输出。

本题开始的话会有点蒙圈但是上网浏览关于奇偶效验的规则后思路就会变得明确起来。

第二次作业比第一次对于字符串处理的要求更高了,更注重方法的作用。

 

第三次作业

7-1 点线形系列1-计算两点之间的距离 (10 分)
输入连个点的坐标,计算两点之间的距离

输入格式:

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

 1 import java.util.Scanner;
 2 public class Main {
 3     public static void main(String[] args) {
 4         Scanner in = new Scanner(System.in);
 5         String arr = in.nextLine();
 6         double dist=0;
 7         String []a0 = arr.split(" ");
 8         panduan zhi = new panduan();
 9         if(a0.length>2)
10         {
11             System.out.print("wrong number of points");
12         }
13         else
14         {
15             String []a1 = a0[0].split(",");
16             String []a2 = a0[1].split(",");
17             if(zhi.fact(a1[0])&&zhi.fact(a1[1])&&zhi.fact(a2[0])&&zhi.fact(a2[1])) 
18             {
19                 double q,w,p,r;
20                 q = Double.parseDouble(a1[0]);
21                 w = Double.parseDouble(a1[1]);
22                 p = Double.parseDouble(a2[0]);
23                 r = Double.parseDouble(a2[1]);
24                 dist = Math.sqrt((q-p)*(q-p)+(w-r)*(w-r));
25                 System.out.print(dist);
26             }
27             else
28                 System.out.print("Wrong Format");
29         }
30     }
31 }
32 class panduan {
33     boolean fact(String a)
34     {
35     boolean b = true;
36         for(int i=0;i<a.length();i++)
37         {
38                 if(a.charAt(i)=='-'||a.charAt(i)=='+')
39                 {
40                     if(a.charAt(i+1)=='-'||a.charAt(i+1)=='+')
41                     {
42                         b=false;
43                     }
44                 }
45         }
46         return b;
47     }
48 }

本题虽然比较题目意思比较简明,但是非法输入的情况种类太多了,定义了一个panduan类用来校验字符串输入的是否正确。

7-2 点线形系列2-线的计算 (42 分)
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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",

输出格式:

见题目描述。

  1 import java.util.Scanner;
  2 public class Main {
  3 
  4     public static void main(String[] args) {
  5         // TODO 自动生成的方法存根
  6         Scanner in = new Scanner(System.in);
  7         String arr = in.nextLine();
  8         panduan zhi = new panduan();
  9             double x1=0,x2=0,y1=0,y2=0,k1=0,x3=0,x4=0,y3=0,y4=0,dist=0,k2=0;
 10             String []a0 = arr.split(":");
 11             if(!zhi.fact(a0[1]))
 12            {
 13                 System.out.print("Wrong Format");
 14            }
 15             else
 16             {
 17                 char [] a = a0[0].toCharArray();
 18                 String []a01 = a0[1].split(" ");
 19                 if(a01.length<2||a01.length>4)
 20                 {
 21                     System.out.print("wrong number of points");
 22                 }
 23                 else
 24                 {
 25                     switch(a[0])
 26                     {
 27                         case '1':
 28                         {
 29                             String []a1 = a0[1].split(" ");
 30                             if(a1.length!=2)
 31                             {
 32                                 System.out.println("wrong number of points");
 33                             }
 34                             else
 35                             {
 36                                 String []a2 = a1[0].split(",");
 37                                 String []a3 = a1[1].split(",");
 38                                 if(!zhi.fact(a2[0])||!zhi.fact(a2[1])||!zhi.fact(a3[0])||!zhi.fact(a3[1]))
 39                                 {
 40                                     System.out.print("Wrong Format");
 41                                 }
 42                                 else
 43                                 {
 44                                     x1 = Double.parseDouble(a2[0]);
 45                                     y1 = Double.parseDouble(a2[1]);
 46                                     x2 = Double.parseDouble(a3[0]);
 47                                     y2 = Double.parseDouble(a3[1]);
 48                                     if(x1==x2&&y1==y2)
 49                                     {
 50                                         System.out.print("points coincide");
 51                                     }
 52                                     else
 53                                     {
 54                                         if(x1==x2)
 55                                         {
 56                                             System.out.print("Slope does not exist");
 57                                         }
 58                                         else
 59                                         {
 60                                             System.out.print((y1-y2)/(x1-x2));
 61                                         }
 62                                     }
 63                                 }
 64                             }
 65                         }
 66                             break;
 67                         case '2':
 68                         {
 69                             String []a1 = a0[1].split(" ");
 70                             if(a1.length!=3)
 71                             {
 72                                 System.out.println("wrong number of points");
 73                             }
 74                             else
 75                             {
 76                                 String []a2 = a1[0].split(",");
 77                                 String []a3 = a1[1].split(",");
 78                                 String []a4 = a1[2].split(",");
 79                                 if(!zhi.fact(a2[0])||!zhi.fact(a2[1])||!zhi.fact(a3[0])||!zhi.fact(a4[0])||!zhi.fact(a4[1]))
 80                                 {
 81                                     System.out.print("Wrong Format");
 82                                 }
 83                                 else
 84                                 {
 85                                         x1 = Double.parseDouble(a2[0]);
 86                                         y1 = Double.parseDouble(a2[1]);
 87                                         x2 = Double.parseDouble(a3[0]);
 88                                         y2 = Double.parseDouble(a3[1]);
 89                                         x3 = Double.parseDouble(a4[0]);
 90                                         y3 = Double.parseDouble(a4[1]);
 91                                     if(x3==x2&&y3==y2)
 92                                     {
 93                                         System.out.print("points coincide");
 94                                     }
 95                                     else 
 96                                     {
 97                                         dist = Math.abs((y2-y3)*x1/(x2-x3)-y1-(y2-y3)*x2/(x2-x3)+y2)/Math.sqrt(1+((y2-y3)*(y2-y3))/((x2-x3)*(x2-x3)));
 98                                         System.out.print(dist);
 99                                     }
100                                 }
101                             }
102                         }
103                             break;
104                         case '3':
105                         {
106                             String []a1 = a0[1].split(" ");
107                             if(a1.length!=3)
108                             {
109                                 System.out.println("wrong number of points");
110                             }
111                             else
112                             {
113                                 String []a2 = a1[0].split(",");
114                                 String []a3 = a1[1].split(",");
115                                 String []a4 = a1[2].split(",");
116                                 x1 = Double.parseDouble(a2[0]);
117                                 y1 = Double.parseDouble(a2[1]);
118                                 x2 = Double.parseDouble(a3[0]);
119                                 y2 = Double.parseDouble(a3[1]);
120                                 x3 = Double.parseDouble(a4[0]);
121                                 y3 = Double.parseDouble(a4[1]);
122                                 if(!zhi.fact(a2[0])||!zhi.fact(a2[1])||!zhi.fact(a3[0])||!zhi.fact(a4[0])||!zhi.fact(a4[1]))
123                                 {
124                                     System.out.print("Wrong Format");
125                                 }
126                                 else
127                                 {
128                                     if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x3==x2&&y3==y2))
129                                     {
130                                         System.out.print("points coincide");
131                                     }
132                                     else
133                                     {
134                                         k1 = (y2-y3)/(x2-x3);
135                                         k2 = x1/y1;
136                                         if(k1==k2)
137                                         {
138                                             System.out.print("true");
139                                         }
140                                         else
141                                         {
142                                             System.out.print("false");
143                                         }
144                                     }
145                                 }
146                             }
147                         }
148                             break;
149                         case '4':
150                         {
151                             String []a1 = a0[1].split(" ");
152                             if(a1.length!=4)
153                             {
154                                 System.out.println("wrong number of points");
155                             }
156                             else
157                             {
158                                 String []a2 = a1[0].split(",");
159                                 String []a3 = a1[1].split(",");
160                                 String []a4 = a1[2].split(",");
161                                 String []a5 = a1[3].split(",");
162                                 x1 = Double.parseDouble(a2[0]);
163                                 y1 = Double.parseDouble(a2[1]);
164                                 x2 = Double.parseDouble(a3[0]);
165                                 y2 = Double.parseDouble(a3[1]);
166                                 x3 = Double.parseDouble(a4[0]);
167                                 y3 = Double.parseDouble(a4[1]);
168                                 x4 = Double.parseDouble(a5[0]);
169                                 y4 = Double.parseDouble(a5[1]);
170                                 if(!zhi.fact(a2[0])||!zhi.fact(a2[1])||!zhi.fact(a3[0])||!zhi.fact(a4[0])||!zhi.fact(a5[0])||!zhi.fact(a5[1]))
171                                 {
172                                     System.out.print("Wrong Format");
173                                 }
174                                 else
175                                 {
176                                     if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x3==x2&&y3==y2)||(x1==x4&&y1==y4)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4))
177                                     {
178                                         System.out.print("points coincide");
179                                     }
180                                     else
181                                     {
182                                         if(Math.abs((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2))<=1e-6) 
183                                         {
184                                             System.out.println("true");
185                                         }
186                                         else 
187                                         {
188                                             System.out.println("false");
189                                         }
190                                     }
191                                 }
192                             }
193                         }
194                             break;
195                         case '5':
196                         {
197                             String []a1 = a0[1].split(" ");
198                             if(a1.length!=4)
199                             {
200                                 System.out.println("wrong number of points");
201                             }
202                             else
203                             {
204                                 String []a2 = a1[0].split(",");
205                                 String []a3 = a1[1].split(",");
206                                 String []a4 = a1[2].split(",");
207                                 String []a5 = a1[3].split(",");
208                                 x1 = Double.parseDouble(a2[0]);
209                                 y1 = Double.parseDouble(a2[1]);
210                                 x2 = Double.parseDouble(a3[0]);
211                                 y2 = Double.parseDouble(a3[1]);
212                                 x3 = Double.parseDouble(a4[0]);
213                                 y3 = Double.parseDouble(a4[1]);
214                                 x4 = Double.parseDouble(a5[0]);
215                                 y4 = Double.parseDouble(a5[1]);
216                                 if(!zhi.fact(a2[0])||!zhi.fact(a2[1])||!zhi.fact(a3[0])||!zhi.fact(a4[0])||!zhi.fact(a5[0])||!zhi.fact(a5[1]))
217                                 {
218                                     System.out.print("Wrong Format");
219                                 }
220                                 else
221                                 {
222                                     if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x3==x2&&y3==y2)||(x1==x4&&y1==y4)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4))
223                                     {
224                                         System.out.print("points coincide");
225                                     }
226                                     else
227                                     {
228                                        if(Math.abs((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2))<=1e-6) 
229                                        {
230                                              System.out.println("is parallel lines,have no intersection point");
231                                         }
232                                         else 
233                                         {
234                                             double x=(x4*(x3-x4)*(y1-y2)-x2*(x1-x2)*(y3-y4)-(y4-y2)*(y3-y4)*(y1-y2))/((x3-x4)*(y1-y2)-(x1-x2)*(y3-y4));
235                                             double y=((x-x2)*(x1-x2)+y2*(y1-y2))/(y1-y2);
236                                             System.out.print(x+","+y);
237                                             if((x>x1&&x<x2)||((x<x1)&&(x<x2))||(x>x3&&x<x4)||((x<x3)&&(x<x3))) 
238                                             {
239                                                 System.out.println(" true");
240                                              }
241                                             else 
242                                             {
243                                                 System.out.println(" false");
244                                             }
245                                     }
246                                 }
247                             }
248                                 break;
249                         }
250                     }
251                     }
252                 }
253             }
254     }
255 }
256 class panduan {
257     boolean fact(String a)
258     {
259     boolean b = true;
260         for(int i=0;i<a.length();i++)
261         {
262                 if(a.charAt(i)=='-'||a.charAt(i)=='+')
263                 {
264                     if(a.charAt(i+1)=='-'||a.charAt(i+1)=='+')
265                     {
266                         b=false;
267                     }
268                 }
269         }
270         return b;
271     }
272 }

本题条件繁多内容复杂,本题引用了第一题中的panduan类用来校验字符串输入的是否合理,用Double.parseDouble()放法将字符类型转化为double类型的数据进行运算,使用split对字符串进行分割,再用

switch函数判断输入哪种情况,再进行相应的实现。

具体思路实现

1.先对输入的字符串用split方法进行分割;

2.再用switch函数对其进行判断,具体要求具体实现;

3.再将分割后的字符串进行进一步分割,再用pandua类进行校验;

4.最后再按照题目的要求进行相应的输出;

7-3 点线形系列3-三角形的计算 (48 分)
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        String arr = in.nextLine();
            double x1=0,x2=0,y1=0,y2=0,k1=0,x3=0,x4=0,y3=0,y4=0,dist=0,k2=0;
            String []a0 = arr.split(":");
            char [] a = a0[0].toCharArray();
            String []a01 = a0[1].split(" ");
            if(a01.length!=3||a01.length!=5)
            {
                System.out.print("wrong number of points");
            }
            else
            {
                switch(a[0])
                {
                    case '1':
                    {
                         String []a1 = a0[1].split(" ");
                             String []a2 = a1[0].split(",");
                             String []a3 = a1[1].split(",");
                             String []a4 = a1[2].split(",");
                                     x1 = Double.parseDouble(a2[0]);
                                     y1 = Double.parseDouble(a2[1]);
                                     x2 = Double.parseDouble(a3[0]);
                                     y2 = Double.parseDouble(a3[1]);
                                     x3 = Double.parseDouble(a4[0]);
                                     y3 = Double.parseDouble(a4[1]);
                                     if(Math.abs(Math.sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))==Math.abs(Math.sqrt(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)))
                                     {
                                         System.out.print("true ");
                                     }
                                     else 
                                     {
                                         System.out.print("false ");
                                     }
                                     if((Math.abs(Math.sqrt(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3))==Math.abs(Math.sqrt(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)))&&(Math.abs(Math.sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))==Math.abs(Math.sqrt(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3))))
                                     {
                                         System.out.print("true");
                                     }
                                     else
                                     {
                                         System.out.print("false ");
                                     }
                    }
                        break;
                    case '2':
                            {
                                String []a11 = a0[1].split(" ");
                                    String []a21 = a11[0].split(",");
                                    String []a31 = a11[1].split(",");
                                    String []a41 = a11[2].split(",");
                                            x1 = Double.parseDouble(a21[0]);
                                            y1 = Double.parseDouble(a21[1]);
                                            x2 = Double.parseDouble(a31[0]);
                                            y2 = Double.parseDouble(a31[1]);
                                            x3 = Double.parseDouble(a41[0]);
                                            y3 = Double.parseDouble(a41[1]);
                                            double zhou = Math.abs(Math.sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))+Math.abs(Math.sqrt(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3))+Math.abs(Math.sqrt(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
                                            System.out.print(zhou+" ");
                                            double S = Math.abs((x1*y2-x1*y3+x2*y3-x2*y1+x3*y1-x2*y2));
                                            System.out.print(S+" ");
                                            double heng = (x1+x2+x3)/3;
                                            double zong = (y1+y2+y3)/3;
                                            System.out.print(heng+","+zong);
                                    }
                        break;
                    case '3':
                            {
                                String []a11 = a0[1].split(" ");
                                    String []a21 = a11[0].split(",");
                                    String []a31 = a11[1].split(",");
                                    String []a41 = a11[2].split(",");
                                            x1 = Double.parseDouble(a21[0]);
                                            y1 = Double.parseDouble(a21[1]);
                                            x2 = Double.parseDouble(a31[0]);
                                            y2 = Double.parseDouble(a31[1]);
                                            x3 = Double.parseDouble(a41[0]);
                                            y3 = Double.parseDouble(a41[1]);
                                                double d3 = Math.abs(Math.sqrt(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
                                                double d2 = Math.abs(Math.sqrt(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
                                                double d1 = Math.abs(Math.sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
                                                if(d1+d2<=d3&&d3+d2<=d1&&d1+d3<=d2)
                                                {
                                                System.out.print("false false false");
                                                }
                                                else
                                                {
                                                    if(d1*d1+d2*d2>d3*d3)
                                                    {
                                                        System.out.print("true ");
                                                    }
                                                    else
                                                    {
                                                        System.out.print("false ");
                                                    }
                                                    if(d1*d1+d2*d2==d3*d3)
                                                    {
                                                        System.out.print("true ");
                                                    }
                                                    else
                                                    {
                                                        System.out.print("false ");
                                                    }
                                                    if(d1*d1+d2*d2<d3*d3)
                                                 {
                                                     System.out.print("true");
                                                 }
                                                 else
                                                 {
                                                     System.out.print("false");
                                                 }
                                                }
                                    }
                        break;
                    case '4':
                            {
                                String m[]=b[0].split(",");
String n[]=b[1].split(",");
String k[]=b[2].split(",");
String l[]=b[3].split(",");
String p[]=b[4].split(",");
double x1=Double.parseDouble(m[0]);
double y1=Double.parseDouble(m[1]);
double x2=Double.parseDouble(n[0]);
double y2=Double.parseDouble(n[1]);
double x3=Double.parseDouble(k[0]);
double y3=Double.parseDouble(k[1]);
double x4=Double.parseDouble(l[0]);
double y4=Double.parseDouble(l[1]);
double x5=Double.parseDouble(p[0]);
double y5=Double.parseDouble(p[1]);
double a4=(x3-x4)*(x3-x4)+(y3-y4)*(y3-y4);
double b4=(x5-x3)*(x5-x3)+(y5-y3)*(y5-y3);
double c4=(x4-x5)*(x4-x5)+(y4-y5)*(y4-y5);
if(b.length!=5) {
System.out.println("wrong number of points");
}
                else if(x1==x2&&y1==y2){
System.out.println("points coincide");
}
else if(a4+b4<c4||a4+c4<b4||b4+c4<a4||Math.abs((y3-y4)*(x4-x5)-(y4-y5)*(x3-x4))<=1e-6) {
System.out.println("data error");
}
else if((Math.abs((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2))<=1e-6&&Math.abs((y3-y2)*(x1-x2)-(y1-y2)*(x3-x2))<=1e-6)||
(Math.abs((y1-y2)*(x3-x5)-(y3-y5)*(x1-x2))<=1e-6&&Math.abs((y3-y2)*(x1-x2)-(y1-y2)*(x3-x2))<=1e-6)||
(Math.abs((y1-y2)*(x5-x4)-(y5-y4)*(x1-x2))<=1e-6&&Math.abs((y4-y2)*(x1-x2)-(y1-y2)*(x4-x2))<=1e-6)) {
System.out.println("The point is on the edge of the triangle");
}
} } break; case '5': { String m[]=b[0].split(",");
String n[]=b[1].split(",");
String k[]=b[2].split(",");
String l[]=b[3].split(",");
double x1=Double.parseDouble(m[0]);
double y1=Double.parseDouble(m[1]);
double x2=Double.parseDouble(n[0]);
double y2=Double.parseDouble(n[1]);
double x3=Double.parseDouble(k[0]);
double y3=Double.parseDouble(k[1]);
double x4=Double.parseDouble(l[0]);
double y4=Double.parseDouble(l[1]);
if(b.length!=4) {
System.out.println("wrong number of points");
}
else if((x1==x2&&y1==y2)||(x3==x4&&y3==y4)){
System.out.println("points coincide");
}
else {
if((Math.abs((y1-y3)*(x2-x3)-(y2-y3)*(x1-x3))<=1e-6&&((x1>x2&&x1<x3)||(x1>x3&&x1<x2)))||
(Math.abs((y1-y4)*(x2-x4)-(y2-y4)*(x1-x4))<=1e-6&&((x1>x2&&x1<x4)||(x1>x3&&x1<x4)))||
(Math.abs((y1-y3)*(x4-x3)-(y4-y3)*(x1-x3))<=1e-6&&((x1>x4&&x1<x3)||(x1>x3&&x1<x4)))) {
System.out.println("on the triangle");
}
else {
double max=x2;
double min=x2;
double max1=x2;
double min1=x2;
if(x3>=x2&&x3>=x4) {
max=x3;
}
else if(x4>=x2&&x4>=x3) {
max=x4;
}
if(x3<=x2&&x3<=x4) {
min=x3;
}
else if(x4<=x2&&x4<=x3) {
min=x4;
}
if(y3>=y2&&y3>=y4) {
max1=y3;
}
else if(y4>=y2&&y4>=y3) {
max1=y4;
}
if(y3<=y2&&y3<=y4) {
min1=y3;
}
else if(y4<=y2&&y4<=y3) {
min1=y4;
}
if(x1>min&&x1<max&&y1>min1&&y1<max1) {
System.out.println("in the triangle");
}
else {
System.out.println("outof the triangle");
}
}
}
}
} } break; } } } }
class panduan {
     boolean fact(String a)
   {    boolean b = true; for(int i=0;i<a.length();i++) { if(a.charAt(i)=='-'||a.charAt(i)=='+') { if(a.charAt(i+1)=='-'||a.charAt(i+1)=='+') { b=false; } }
     } return b; }
}
 

本题可以说是第二题的进阶版,条件比第二题更加复杂,需要使用的知识涉及几何学,偏难具体思路与第二题相差不多就不再赘述.



 

设计与分析:见源代码末尾。

 

踩坑心得:第三次题目集的题目非法输入的种类太多,用if else太过繁琐,输入样例不太全不好对代码进行修改,只能根据多次提交来猜测测试点。

 

改进建议:建议多提供输入样例,方便进行判断,修善代码。

 

总结:三次题目集让我对于循环语句和条件语句的使用更加熟练,更加熟练的运用字符串的方法,对字符串的解析,建议老师能够抽空讲一讲某些题目,也希望老师不要将题目设置的过于繁琐,应该更贴近于教学内容。

标签:总结,题目,String,Double,parseDouble,PTA,System,x2,y3
来源: https://www.cnblogs.com/xsxyyds/p/16124369.html

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

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

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

ICode9版权所有