第一次博客作业
前言:
本学期开设了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语言内核的原因。在不断吸收新知的同时,也发现了自己的代码有很多的漏洞,未来一定会进行改正,变得越来越好。老师上课质量很高,希望老师能将上课讲解得部分代码传到群内方便我们课后复习就更好啦!
输出样例:
在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

浙公网安备 33010602011771号