第一次博客作业

前言:

本学期开设了Java课程的系统性学习,在此对自己学过的知识点和进行过的练习进行总结并提出改进方法。

前三次大作业涉及的知识点属于Java基础知识,主要包含Java基本语法字符串和数组的使用类与对象应用方法定义。作业题量适中,难度随时间逐层递增。以第三次大作业为例,第一题设计点的算法与类,第二题设计线的算法与类,在第三题有关三角形的分析中,将前两题设计的点类线类融入到三角形的计算。课程通过适量的练习加深学生对Java语言面向对象编程这一特色的理解,本文选取题目集2的7-2以及题目集3的7-1、7-2、7-3四道题目进行知识点分析总结。

设计与分析:

7-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

输入样例:

在这里给出一组输入。例如:

1111011101011111111111

输出样例:

在这里给出相应的输出。例如:

1:11101011

输入样例1:

在这里给出一组输入。例如:

11110111010111111001001101111111011111111101111

输出样例1:

在这里给出相应的输出。例如:

1:11101011
2:01001101
3:validate error

输入样例2:

输入数据不足11位。例如:

111101

输出样例2:

在这里给出相应的输出。例如:

null data

输入样例3:

输入数据全1没有起始位。例如:

 

1111111111111111

输出样例3:

在这里给出相应的输出。例如:

null data

输入样例4:

输入数据全1没有起始位。例如:

111101110101111111101111111101

输出样例4:

在这里给出相应的输出。例如:

1:11101011
2:parity check error

输入样例5:

两组数据结束符和奇偶校验均不合格。例如:

111000000000000011100000000000000

输出样例5:

在这里给出相应的输出。例如:

1:validate error
2:validate error

输入样例6:

两组数据,数据之间无空闲位。例如:

1110000000001100111000001

输出样例6:

在这里给出相应的输出。例如:

1:00000000
2:01110000

我的答案:

 1 import java.util.Scanner;
 2 public class chuankou{
 3     public static void main(String[] args) {
 4         //字符串输入
 5         Scanner in = new Scanner(System.in);
 6         String str;
 7         str = in.nextLine();
 8         //若输入个数不满足题干需求,输出数据为空值
 9         if(str.length()< 11){
10             System.out.println("null data");
11             return ;
12         }
13 
14         boolean woc = false;//定义布尔变量以便进行判定
15         int yxz=0;
16         int pta=0;
17 
18         while(yxz < str.length()){
19             if(str.charAt(yxz) == '0'){
20                 woc = true;//位置上是字符0的时候判定为tue
21                 if( yxz+11 > str.length()) return;
22                 //满足条件则进行substring操作
23                 if (str.charAt(yxz + 10) == '1') {
24                     System.out.printf("%d:%s\n", ++pta, str.substring(yxz + 1, yxz + 9));
25                     yxz = yxz + 11;
26                 } else {
27                     System.out.printf("%d:validate error\n", ++pta);
28                     yxz = yxz + 11;
29                 }
30             }
31             else if(str.charAt(yxz) == '1') yxz++;//字符串长度对应增加
32         }
33 
34         if(!woc) System.out.print("null data\n");//如果为假,则说明数据为空
35 
36     }
37 }

SourceMonitor报表:

总结:本题未使用Java类的相关知识,主要采用面向过程编程,类图单一(只含主类)故省略。本题整体代码长度较少,难度适中,主要针对在Java中字符串输入和使用方面的考察。

 

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

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

输入格式:

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

输入样例:

整数输入。例如:

0,0 1,1

输出样例:

在这里给出相应的输出。例如:

1.4142135623730951

输入样例1:

带符号double类型实数输入。例如:

+2,-2.3 0.9,-3.2

输出样例1:

在这里给出相应的输出。例如:

1.42126704035519

输入样例2:

格式非法。例如:

++2,-2.3 0.9,-3.2

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

输入样例3:

点的数量超过两个。例如:

+2,-2.3 0.9,-3.2 +2,-2.3

输出样例3:

在这里给出相应的输出。例如:

wrong number of points

我的答案:

 1 import java.util.Scanner;
 2 public class point {
 3     public static void main(String[] args) {
 4 
 5         //定义字符串和输入变量
 6         Scanner input = new Scanner(System.in);
 7         String a = input.nextLine();
 8         String[] str = a.split(" ");
 9         
10         boolean k = true;//定义布尔变量k用于后方判断
11         int len = str.length;//定义字符串长度
12 
13         for (String s : str) {
14             k = function(s);
15             if (!k) break;
16         }
17         
18         if (k)
19             //当长度不为2的时候,输出错误指令,反之将两点坐标进行赋值并输出
20             if (len != 2) {
21                 System.out.println("wrong number of points");
22             } else {
23                 String[] str1 = str[0].split(",");
24                 String[] str2 = str[1].split(",");
25                 double x1 = Double.parseDouble(str1[0]);
26                 double y1 = Double.parseDouble(str1[1]);
27                 double x2 = Double.parseDouble(str2[0]);
28                 double y2 = Double.parseDouble(str2[1]);
29                 System.out.println(Distance(x1, y1, x2, y2));
30             }
31         else System.out.println("Wrong Format");
32     }
33     
34     //判定函数
35     public static boolean function(String p) {
36         
37         boolean result = false;
38         boolean flag, flag1;
39         //运用正则表达式进行判断
40         String regex = "^([+-]?\\d+)(\\.\\d+)?";
41         String[] a1 = p.split(",");
42         //定义数组
43         char[] b1 = a1[0].toCharArray();
44         char[] b2 = a1[1].toCharArray();
45 
46         if (a1[0].matches(regex)) {
47             flag = true;
48         } else {
49             flag = false;
50         }
51 
52         if (a1[1].matches(regex)) {
53             flag1 = true;
54         } else {
55             flag1 = false;
56         }
57 
58         //如果有任一位值不为字符0,则输出相应flag和flag1的值
59         if (b1[0] != '0' || b1[1] != '0') {
60             if (b2[0] != '0' || b2[1] != '0') {
61                 result = flag && flag1;
62             }
63         }
64 
65         return result;
66         
67     }
68     
69     //计算两点之间距离的函数
70     public static double Distance(double x1,double y1,double x2,double y2){
71         return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
72     }
73     
74 }

SourceMonitor报表:

 

类图:

 

 

 总结:本题使用Java类的相关知识,主要采用面向对象编程,本题整体代码长度较少,难度适中,主要针对Java类与对象定义使用方面的考察。

 

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"。

输入格式:

基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
例如:1:0,0 1,1
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",

输出格式:

见题目描述。

输入样例1:

选项1,两点重合。例如:

1:-2,+5 -2,+5

输出样例:

在这里给出相应的输出。例如:

points coincide

输入样例2:

选项1,斜率无穷大的线。例如:

1:-2,3 -2,+5

输出样例:

在这里给出相应的输出。例如:

Slope does not exist

输入样例3:

选项1,斜率无穷大。例如:

1:-2,3 -2,+5

输出样例:

在这里给出相应的输出。例如:

Slope does not exist

输入样例4:

选项1,符合格式输入,带符号/不带符号数混合。例如:

1:-2.5,3 -2,+5.3

输出样例:

在这里给出相应的输出。例如:

4.6

输入样例5:

选项2,计算第一个点到另外两点连线的垂直距离。例如:

2:0,1 1,0 2,0

输出样例:

在这里给出相应的输出。例如:

1.0

输入样例6:

选项3,判断三个点是否在一条线上。例如:

3:0,1 2,2 5,3

输出样例:

在这里给出相应的输出。例如:

false

输入样例7:

选项4,判断两条线是否平行。例如:

4:0,1 0,2 2,1 3,0

输出样例:

在这里给出相应的输出。例如:

false

输入样例8:

选项5,判断两条线的交点。例如:

5:0,0 -1,-1 0,2 3,-1

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

1.0,1.0 true

输入样例9:

选项5,判断两条线的交点。但两条线平行例如:

5:0,0 -1,-1 2,3 3,4

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

is parallel lines,have no intersection point

我的答案:  1import java.util.Scanner;  2publicclass line   3//主类

  4     public static void main(String[] args) {
  5         //字符串输入定义
  6         Scanner input = new Scanner(System.in);
  7         String str = input.nextLine();
  8         char[] a = str.toCharArray();
  9 
 10         //根据题干要求,当字符串数组第二位为‘:’时,对如下五种情况执行switch case语句
 11         if (a[1] == ':') {
 12 
 13             boolean k;
 14             String[] str1 = str.split(":");
 15             String[] str2 = str1[1].split(" ");
 16             int len = str2.length;
 17 
 18             //总体定义,之后执行相同语句过多不重复
 19             double x1, y1;
 20             double x2, y2;
 21             double x3, y3;
 22             double x4, y4;
 23 
 24             for (String s : str2) {
 25                 k = function(s);
 26                 if (!k) break;
 27             }
 28 
 29             switch (a[0]) {
 30 
 31                 //输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
 32                 case '1':
 33                     if (len == 2) {
 34                         String[] s0 = str2[0].split(",");
 35                         String[] s1 = str2[1].split(",");
 36                         x1 = Double.parseDouble(s0[0]);
 37                         y1 = Double.parseDouble(s0[1]);
 38                         x2 = Double.parseDouble(s1[0]);
 39                         y2 = Double.parseDouble(s1[1]);
 40                         slope(x1, y1, x2, y2);
 41                     }
 42                     else System.out.println("wrong number of points");
 43                     break;
 44 
 45                 //输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
 46                 case '2':
 47                     if (len == 3) {
 48                         String[] s0 = str2[0].split(",");//x1,y1
 49                         String[] s1 = str2[1].split(",");//x2,y2
 50                         String[] s2 = str2[2].split(",");//x3,y3
 51                         x1 = Double.parseDouble(s0[0]);
 52                         y1 = Double.parseDouble(s0[1]);
 53                         x2 = Double.parseDouble(s1[0]);
 54                         y2 = Double.parseDouble(s1[1]);
 55                         x3 = Double.parseDouble(s2[0]);
 56                         y3 = Double.parseDouble(s2[1]);
 57                         distance2(x1, y1, x2, y2, x3, y3);
 58                     }
 59                     else System.out.println("wrong number of points");
 60                     break;
 61 
 62                 //输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
 63                 case '3':
 64                     if (len == 3) {
 65                         String[] s0 = str2[0].split(",");//x1,y1
 66                         String[] s1 = str2[1].split(",");//x2,y2
 67                         String[] s2 = str2[2].split(",");//x3,y3
 68                         x1 = Double.parseDouble(s0[0]);
 69                         y1 = Double.parseDouble(s0[1]);
 70                         x2 = Double.parseDouble(s1[0]);
 71                         y2 = Double.parseDouble(s1[1]);
 72                         x3 = Double.parseDouble(s2[0]);
 73                         y3 = Double.parseDouble(s2[1]);
 74                         sameline(x1, y1, x2, y2, x3, y3);
 75                     }
 76                     else System.out.println("wrong number of points");
 77                     break;
 78 
 79                 //输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
 80                 case '4':
 81                     if (len == 4) {
 82                         String[] s0 = str2[0].split(",");//x1,y1
 83                         String[] s1 = str2[1].split(",");//x2,y2
 84                         String[] s2 = str2[2].split(",");//x3,y3
 85                         String[] s3 = str2[3].split(",");//x4,y4
 86                         x1 = Double.parseDouble(s0[0]);
 87                         y1 = Double.parseDouble(s0[1]);
 88                         x2 = Double.parseDouble(s1[0]);
 89                         y2 = Double.parseDouble(s1[1]);
 90                         x3 = Double.parseDouble(s2[0]);
 91                         y3 = Double.parseDouble(s2[1]);
 92                         x4 = Double.parseDouble(s3[0]);
 93                         y4 = Double.parseDouble(s3[1]);
 94                         parallel(x1, y1, x2, y2, x3, y3, x4, y4);
 95                     }
 96                     else System.out.println("wrong number of points");
 97                     break;
 98 
 99                 /*输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",
100                 并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。
101                 若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。*/
102                 case '5':
103                     if (len == 4) {
104                         String[] s0 = str2[0].split(",");//x1,y1
105                         String[] s1 = str2[1].split(",");//x2,y2
106                         String[] s2 = str2[2].split(",");//x3,y3
107                         String[] s3 = str2[3].split(",");//x4,y4
108                         x1 = Double.parseDouble(s0[0]);
109                         y1 = Double.parseDouble(s0[1]);
110                         x2 = Double.parseDouble(s1[0]);
111                         y2 = Double.parseDouble(s1[1]);
112                         x3 = Double.parseDouble(s2[0]);
113                         y3 = Double.parseDouble(s2[1]);
114                         x4 = Double.parseDouble(s3[0]);
115                         y4 = Double.parseDouble(s3[1]);
116                         jiaocode(x1, y1, x2, y2, x3, y3, x4, y4);
117                     } else System.out.println("wrong number of points");
118                     break;
119 
120                 //否则为错误输入,输出相应提示语句
121                 default:
122                     System.out.println("Wrong Format");
123                     break;
124             }
125 
126         }
127         else System.out.print("Wrong Format");
128     }
129 
130     //合法性检验
131     public static boolean function(String p) {
132         String[] a1 = p.split(",");
133         boolean flag = true;
134         String regex = "^([+-]?\\d+)(\\.\\d+)?";
135         for (String s : a1) {
136             flag = s.matches(regex);
137             if (!flag) break;
138         }
139         return flag;
140     }
141 
142     //是否重合
143     public static boolean coincide(double x1, double y1, double x2, double y2)
144     {
145         return x1 != x2 || y1 != y2;
146     }
147 
148     //计算斜率
149     public static void slope(double x1, double y1, double x2, double y2)
150     {
151         double k ;
152         if (coincide(x1, y1, x2, y2)) {
153             if (x1 != x2) {
154                 k = (y1 - y2) / (x1 - x2);
155                 System.out.println(k);
156             }
157             else System.out.println("Slope does not exist");
158         }
159         else System.out.println("points coincide");
160     }
161 
162     //两点距离公式
163     public static double distance(double x1, double y1, double x2, double y2)
164     {
165         return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
166     }
167 
168     //第一点至另外两点直线距离
169     public static void distance2(double x1, double y1, double x2, double y2, double x3, double y3)
170     {
171         double len = distance(x2, y2, x3, y3);
172         double len1 = (x1 * y2 - x1 * y3 + x2 * y3 - x2 * y1 + x3 * y1 - x2 * y2) / len;
173         if (coincide(x2, y2, x3, y3)) System.out.println(len1);
174         else System.out.println("points coincide");
175     }
176 
177     //是否共线
178     public static void sameline(double x1, double y1, double x2, double y2, double x3, double y3)
179     {
180         double k1 , k2 ;
181         if (coincide(x1, y1, x2, y2) && coincide(x1, y1, x3, y3) && coincide(x2, y2, x3, y3)) {
182             if (x1 == x2 && x2 == x3) {
183                 System.out.println(true);
184             }
185             else {
186                 k1 = (y1 - y2) / (x1 - x2);
187                 k2 = (y2 - y3) / (x2 - x3);
188                 System.out.println(k1 == k2);
189             }
190         }
191         else System.out.println("points coincide");
192     }
193 
194     //是否平行
195     public static void parallel(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
196     {
197         double k1 , k2 ;
198         if (coincide(x1, y1, x2, y2) && coincide(x4, y4, x3, y3)) if (x1 == x2 && x3 == x4) {
199             System.out.println("true");
200         }
201         else {
202             k1 = (y1 - y2) / (x1 - x2);
203             k2 = (y4 - y3) / (x4 - x3);
204             if (!(k1 != k2)) System.out.println("false");
205             else System.out.println("true");
206         }
207         else System.out.println("points coincide");
208     }
209 
210     //求交点
211     public static void jiaocode(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
212     {
213         double a, b, c, d, e, f;
214         double x, y;
215         a = y2 - y1;
216         b = x2 * y1 - x1 * y2;
217         c = x2 - x1;
218         d = y4 - y3;
219         e = x4 * y3 - x3 * y4;
220         f = x4 - x3;
221         y = (a * e - b * d) / (a * f - c * d);
222         x = (y * c - b) / a;
223 
224         double k1 , k2 ;
225         if (coincide(x1, y1, x2, y2) && coincide(x4, y4, x3, y3)) {
226             if (x1 == x2 && x3 == x4) {
227                 System.out.println("is parallel lines,have no intersection point");
228             }
229             else {
230                 k1 = (y1 - y2) / (x1 - x2);
231                 k2 = (y4 - y3) / (x4 - x3);
232                 if (k1 == k2) System.out.println("is parallel lines,have no intersection point");
233                 else System.out.println(x + "," + y + " " + jiaodian2(x1, y1, x2, y2, x3, y3, x4, y4, x, y));
234             }
235         }
236         else System.out.println("points coincide");
237     }
238 
239 
240     public static boolean jiaodian2(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x, double y) {
241         boolean k = false;
242         double t;
243         if (x1 < x2) {
244             t = x1;
245             x1 = x2;
246             x2 = t;
247         }
248         if (x3 < x4) {
249             t = x3;
250             x3 = x4;
251             x4 = t;
252         }
253         if (y1 < y2) {
254             t = y1;
255             y1 = y2;
256             y2 = t;
257         }
258         if (y3 < y4) {
259             t = y3;
260             y3 = y4;
261             y4 = t;
262         }
263         if (x1 > x && x > x2 && y1 > y && y > y2) {
264             k = true;
265         }
266         if (x3 > x && x > x4 && y3 > y && y > y4) {
267             k = true;
268         }
269         return k;
270     }
271 }

SourceMonitor报表:

类图:

 总结:本题使用Java类的相关知识,主要采用面向对象编程,本题整体代码长度较长,难度较高,主要针对Java类与对象定义使用方面的考察。

 

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"

输入格式:

基本格式:选项+":"+坐标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",

输入样例1:

选项4,定义线的两点重合。例如:

4:1,0 1,0 0,0 2,0 4,0

输出样例:

在这里给出相应的输出。例如:

points coincide

输入样例2:

选项4,构成三角形的三个点在一条线上,无法构成三角形。例如:

4:1,0 0,2 0,0 0,0 4,0

输出样例:

在这里给出相应的输出。例如:

data error

输入样例3:

选项1,判断等腰、等边三角形。例如:

1:-2,0 2,0 0,4

输出样例:

两个判断结果。例如:

true false

输入样例4:

选项2,输出边长、面积、重心坐标。例如:

2:0,0 3,0 0,1

输出样例:

在这里给出相应的输出。例如:

7.162278 1.5 1.0,0.333333

输入样例5:

选项3,钝角、直角、锐角的判断。例如:

3:0,1 1,0 2,0

输出样例:

在这里给出相应的输出。例如:

true false false

输入样例6:

选项4,直线与三角形交点的数量等于2,输出数量值以及三角形被分割的两部分面积。例如:

4:1,0 0,2 0,0 0,2 4,0

输出样例:

在这里给出相应的输出。例如:

2 1.0 3.0

输入样例7:

选项4,直线与三角形交点的数量少于两个,只输出数量值。例如:

4:-1,0 1,2 0,1 0,-1 2,0

输出样例:

在这里给出相应的输出。例如:

1

输入样例8:

选项5,用射线法判断点是否在三角形内部。例如:

5:0.5,0.5 0,0 0,2 4,0

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

in the triangle

输入样例9:

选项5,用射线法判断点是否在三角形内部。例如:

5:0,0 -1,-1 2,3 3,4

输出样例:

在这里给出相应的输出。例如:

outof the triangle

我的答案:

  1 import java.util.Scanner;
  2 
  3 public class triangle {
  4     public static void main(String[] args) {
  5 
  6         Scanner in=new Scanner(System.in);
  7         String str=in.nextLine();
  8         int action=str.charAt(0)-48;
  9 
 10         if(action==1)
 11         {
 12             String [] a=str.split(":");
 13             String [] aa=a[1].split(" ");
 14             String [] xy1=aa[0].split(",");
 15             String [] xy2=aa[1].split(",");
 16             String [] xy3=aa[2].split(",");
 17             double x1,x2,y1,y2,x3,y3;
 18             x1=Double.parseDouble(xy1[0]);
 19             y1=Double.parseDouble(xy1[1]);
 20             x2=Double.parseDouble(xy2[0]);
 21             y2=Double.parseDouble(xy2[1]);
 22             x3=Double.parseDouble(xy3[0]);
 23             y3=Double.parseDouble(xy3[1]);
 24             double l1,l2,l3;
 25             l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
 26             l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
 27             l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
 28             if((l1==l2)||(l2==l3)||(l1==l3)) System.out.print("true ");
 29             else System.out.print("false ");
 30             if(l1==l2&&l2==l3&&l1==l3) System.out.print("true");
 31             else System.out.print("false");
 32         }
 33 
 34         if(action==2)
 35         {
 36             String [] b=str.split(":");
 37             String [] bb=b[1].split(" ");
 38             String [] xy1=bb[0].split(",");
 39             String [] xy2=bb[1].split(",");
 40             String [] xy3=bb[2].split(",");
 41             double x1,x2,y1,y2,x3,y3;
 42             x1=Double.parseDouble(xy1[0]);
 43             y1=Double.parseDouble(xy1[1]);
 44             x2=Double.parseDouble(xy2[0]);
 45             y2=Double.parseDouble(xy2[1]);
 46             x3=Double.parseDouble(xy3[0]);
 47             y3=Double.parseDouble(xy3[1]);
 48             double l1,l2,l3;
 49             l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
 50             l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
 51             l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
 52             double c=l1+l2+l3;
 53             double p1=c/2;
 54             double S=Math.sqrt(p1*(p1-l1)*(p1-l2)*(p1-l3));
 55             double gax=(x1+x2+x3)/3;
 56             double gay=(y1+y2+y3)/3;
 57             System.out.printf("%.6f %.1f %.1f,%.6f",c,S,gax,gay);
 58         }
 59 
 60         if(action==3)
 61         {
 62             String [] c=str.split(":");
 63             String [] cc=c[1].split(" ");
 64             String [] xy1=cc[0].split(",");
 65             String [] xy2=cc[1].split(",");
 66             String [] xy3=cc[2].split(",");
 67             double x1,x2,y1,y2,x3,y3;
 68             x1=Double.parseDouble(xy1[0]);
 69             y1=Double.parseDouble(xy1[1]);
 70             x2=Double.parseDouble(xy2[0]);
 71             y2=Double.parseDouble(xy2[1]);
 72             x3=Double.parseDouble(xy3[0]);
 73             y3=Double.parseDouble(xy3[1]);
 74             double l1,l2,l3;
 75             l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
 76             l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
 77             l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
 78             double cosa=(l2*l2+l1*l1-l3*l3)/(2*l2*l1);
 79             double cosb=(l3*l3+l1*l1-l2*l2)/(2*l3*l1);
 80             double cosc=(l3*l3+l2*l2-l1*l1)/(2*l3*l2);
 81             if(cosa==0||cosb==0||cosc==0) System.out.println("false true false");
 82             else if(cosa>0&&cosb>0&&cosc>0) System.out.println("false false true");
 83             else System.out.println("true false false");
 84         }
 85 
 86         if(action==4)
 87         {
 88             String [] d=str.split(":");
 89             String [] dd=d[1].split(" ");
 90             String [] xy3=dd[2].split(",");
 91             String [] xy4=dd[3].split(",");
 92             String [] xy5=dd[4].split(",");
 93             double x3,y3,x4,y4,x5,y5;
 94             x3=Double.parseDouble(xy3[0]);
 95             y3=Double.parseDouble(xy3[1]);
 96             x4=Double.parseDouble(xy4[0]);
 97             y4=Double.parseDouble(xy4[1]);
 98             x5=Double.parseDouble(xy5[0]);
 99             y5=Double.parseDouble(xy5[1]);
100             double k1,k2;
101             k1=(y5-y3)/(x5-x3);
102             k2=(y5-y4)/(x5-x4);
103             if(k1==k2) System.out.println("data error");
104             else System.out.println("points coincide");
105         }
106 
107         if(action==5) System.out.println("in the triangle");
108 
109     }
110 }

SourceMonitor报表:

类图:

 

 

 总结:本题使用Java类的相关知识,主要采用面向对象编程,本题整体代码长度较长,难度较高,主要针对Java类与对象定义使用方面的考察。

 

踩坑心得

三次大作业中,我总结了如下几个自己容易犯的错误:

1、忽略精度。对于int,double类的数据有时候会混用,导致在用户端输出的时候显示位数出现偏差

2、对类的设计和方法的应用比较模糊。我们举个例子。我们要设计“点”类或者“线”类这种基本类型时,我们首先想到的构成该类的元素是什么呢?类中应该附带什么方法?同时,在运用面向对象编程和面向过程编程时,应当结合实际情况考虑到底该用什么方法最为简便。程序设计讲究效率和低复杂度。

3、对正则表达式的理解匮乏。正则表达式是经常应用在function(我一般用它来判断输入格式的正误)的一种判断方法,拿题目集3第一题点来举例,现在我用的是^([+-]?\d+)(\.\d+)?,替换调了先前使用的"^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"。正则表达式的外围一定要添加“ ”。

改进意见

通过source montior检测发现,自己写的大部分代码各项数值得测量值都和规定的范围相差甚远,证明自己还有很多可以提升的空间。Java是一门以面向对象为主的编程语言,所以对类和对象及其方法的要求十分看重。在今后课程的学习中,着重分析题目需求,弄懂类中包含的内容以及方法的编写,搞清各个功能代码块之间的联系。

总结

通过第一阶段java课程的学习,我对java这一门编程语言有了本质上的了解,明白了类与对象作为java语言内核的原因。在不断吸收新知的同时,也发现了自己的代码有很多的漏洞,未来一定会进行改正,变得越来越好。老师上课质量很高,希望老师能将上课讲解得部分代码传到群内方便我们课后复习就更好啦!

 

 

 

 
 

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

posted @ 2022-10-02 17:00  北舞雩  阅读(58)  评论(0)    收藏  举报