第一次博客作业

1|0前言:

第一次作业:因刚刚接触JAVA,知识点主要涉及JAVA基础语法,题量比较多,有9道,难度一般。

第二次作业:有了第一次作业的基础,可以开始使用JAVA的特性:面对对象了,比起面对过程来说更加模块化。题量不是很多,有3道,因为刚刚接触,所以难度也并没有出的很高。

第三次作业:因为经过了前两次作业的历练,对面向对象编程有了一定的理解,题量还是3道不变的情况下,难度骤然提高。

2|0设计与分析:

2|1题目集2(7-2)

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

1|0输入格式:

由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111

1|0输出格式:

过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error

1|0输入样例:

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

1111011101011111111111
 

1|0输出样例:

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

1:11101011
 

1|0输入样例1:

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

11110111010111111001001101111111011111111101111
 

1|0输出样例1:

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

1:11101011 2:01001101 3:validate error
 

1|0输入样例2:

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

111101
 

1|0输出样例2:

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

null data
 

1|0输入样例3:

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

1111111111111111
 

1|0输出样例3:

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

null data
 

1|0输入样例4:

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

111101110101111111101111111101
 

1|0输出样例4:

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

1:11101011 2:parity check error
 

1|0输入样例5:

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

111000000000000011100000000000000
 

1|0输出样例5:

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

1:validate error 2:validate error
 

1|0输入样例6:

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

1110000000001100111000001
 

1|0输出样例6:

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

1:00000000 2:01110000

SourceMonito报表

类图

由于此次没有用到面对对象编程,还是面向过程编程的老样子,类图只有一个。

完整代码
 import java.util.Scanner; public class test2_2 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.next(); input.close(); int tmp = 0; int j, num = 0, model1, model2;// model1 奇偶 model2 结束位 char[] chs = s.toCharArray(); if (s.length() < 11) { System.out.println("null data"); return; } for (int i = 0; i < s.length(); i++) if (chs[i] == '1') tmp++; if (tmp == s.length()) { System.out.println("null data"); return; } for (int i = 0; i < s.length(); i++) { if (chs[i] == '0' && i + 10 < s.length()) { tmp = 0; model1 = 1; model2 = 1; for (j = i + 1; j < i + 9; j++) { // System.out.print(chs[j]); if (chs[j] == '1') tmp++; } // System.out.print("\n"); if (tmp % 2 == 0 && chs[j] != '1')// 奇偶判断 model1--; if (tmp % 2 == 1 && chs[j] != '0')// 奇偶判断 model1--; // System.out.print(chs[j]); if (chs[j + 1] == '0')// 结束位判断 model2--; // System.out.print(chs[j + 1] + "\n"); // System.out.println(j + 2); if (model1 == 1 && model2 == 1) { System.out.print(++num + ":"); for (j = i + 1; j < i + 9; j++) System.out.print(chs[j]); System.out.print("\n"); } if (model2 != 1) { System.out.println(++num + ":validate error"); } else if (model1 != 1) System.out.println(++num + ":parity check error"); i += 10; } } } }

虽然本次难度不是很大,由于Java好久没有写过了,远离了Python方便的包有点不习惯,改了12版才满分。有一说一,Java运行效率虽然没有C高,但是比Python高多了。

2|2题目集3(7-1)

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

1|0输入格式:

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|0输出格式:

计算所得的两点之间的距离。例如:1.4142135623730951

1|0输入样例:

整数输入。例如:

0,0 1,1
 

1|0输出样例:

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

1.4142135623730951
 

1|0输入样例1:

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

+2,-2.3 0.9,-3.2
 

1|0输出样例1:

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

1.42126704035519
 

1|0输入样例2:

格式非法。例如:

++2,-2.3 0.9,-3.2
 

1|0输出样例2:

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

Wrong Format
 

1|0输入样例3:

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

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

1|0输出样例3:

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

wrong number of points

SourceMonito报表

类图

本次较难的是对于格式错误的处理,故只贴出输入类匹配部分:

输入类匹配部分
 // 匹配 public boolean IsRight(String str) { boolean IsRight = Pattern.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)", str); return IsRight; }

正则表达式注意Java的转义符是两个\\。

2|3题目集3(7-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"。

1|0输入格式:

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

1|0输出格式:

见题目描述。

1|0输入样例1:

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

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

1|0输出样例:

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

points coincide
 

1|0输入样例2:

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

1:-2,3 -2,+5
 

1|0输出样例:

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

Slope does not exist
 

1|0输入样例3:

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

1:-2,3 -2,+5
 

1|0输出样例:

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

Slope does not exist
 

1|0输入样例4:

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

1:-2.5,3 -2,+5.3
 

1|0输出样例:

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

4.6
 

1|0输入样例5:

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

2:0,1 1,0 2,0
 

1|0输出样例:

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

1.0
 

1|0输入样例6:

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

3:0,1 2,2 5,3
 

1|0输出样例:

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

false
 

1|0输入样例7:

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

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

1|0输出样例:

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

false
 

1|0输入样例8:

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

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

1|0输出样例:

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

1.0,1.0 true
 

1|0输入样例9:

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

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

1|0输出样例:

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

is parallel lines,have no intersection point

SourceMonito报表

类图

本题为第一题的扩展,主要难点在算法部分。

2|4题目集3(7-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"

1|0输入格式:

基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。

1|0输出格式:

基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
如果输入的三个点无法构成三角形,输出"data error"。
注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333333,1.0按格式输出为1.0

选项4中所输入线的两个点坐标重合,输出"points coincide",

1|0输入样例1:

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

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

1|0输出样例:

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

points coincide
 

1|0输入样例2:

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

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

1|0输出样例:

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

data error
 

1|0输入样例3:

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

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

1|0输出样例:

两个判断结果。例如:

true false
 

1|0输入样例4:

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

2:0,0 3,0 0,1
 

1|0输出样例:

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

7.162278 1.5 1.0,0.333333
 

1|0输入样例5:

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

3:0,1 1,0 2,0
 

1|0输出样例:

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

true false false
 

1|0输入样例6:

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

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

1|0输出样例:

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

2 1.0 3.0
 

1|0输入样例7:

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

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

1|0输出样例:

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

1
 

1|0输入样例8:

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

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

1|0输出样例:

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

in the triangle
 

1|0输入样例9:

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

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

1|0输出样例:

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

outof the triangle

SourceMonito报表

类图

本题为第二题的扩展。主要难度也在算法,在下认为分割求三角形面积较难,在下的思路是判断交点在分割线的哪一侧,然后取一侧只有一个的求三角形面积,再比对与剩余面积的大小,打印输出。抛砖引玉,要是各位有更简单的方法,欢迎在评论区留言。

3|0采坑心得

3|1题目集1(7-1)

这道题可能面对过程编程比起面对对象编程简单。

3|2题目集3(7-1)

本题要注意格式问题。

刚开始写的正则:

[+|-][0-9]+.[0-9]+|[0-9]+.[0-9]+|[0-9]+|[+|-][0-9]+

改正后的正则:

^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)

相信聪明的你已经看出来区别了。

 刚开始没有按开始进行强制匹配,导致了“a2.3”这种也可以过。大大的失误。

3|3题目集3(7-2)

本题目是在下花费时间最多的一个题目。

总共提交了85次。(作为对比,第一题4次,第三题16次)

就是一个错误:格式错误。

中间更换过全匹配也未通过

\d:([+-]?\d+(.\d+)?,[+-]?\d+(.\d+)?[ ])+

最后是把整个输入函数重新写过一遍,完善了预匹配才解决问题。(当然本题匹配代码没改前直接挪去第三题没有报格式错误。。。。)

预匹配
 // 预判断 public boolean IKnow(String str) { if (str == "")// 不为空 return true; if (Pattern.matches("[^+-:\\d., ]", str)) return true; if (Pattern.matches("[^\\d]", str.substring(0, 1)) || !str.substring(1, 2).equals(":")) { return true; } Pattern pattern1 = Pattern.compile(","); Pattern pattern2 = Pattern.compile(" "); Matcher matcher1 = pattern1.matcher(str); Matcher matcher2 = pattern2.matcher(str); if (matcher1.results().count() != matcher2.results().count() + 1) return true; return false; }

3|4 题目集3(7-3)

本题是第二题的延伸,主要难在算法部分。

切割部分算法
 // 线分割三角形及其面积输出 void Knife(line line) { int[] num = new int[3];// 1上 2线上 3下 num[0] = line.Direction(a); num[1] = line.Direction(b); num[2] = line.Direction(c); int i = 0, j = 0, k = 0, w = 0; int[] num1 = new int[3], num2 = new int[3], num3 = new int[3];// 三侧的数量 for (; i < num.length; i++) { if (num[i] == 1) num1[j++] = i; if (num[i] == 2) num2[k++] = i; if (num[i] == 3) num3[w++] = i; } if (j < k && j < w) { Create(line, j, num1); } else if (k < j && k < w) { Create(line, k, num2); } else if ((w < j && w < k)) { Create(line, w, num3); } else { double h = MaxD(line.Perpendicular(a), line.Perpendicular(b), line.Perpendicular(c)); double maxs = h * line.Length() / 2; double mins = this.Area() - maxs; System.out.println("2 " + work.Print(mins) + " " + work.Print(maxs)); } }

刚开始没有想到这种方法,用的是向量,虽然也可以解决问题,但过于复杂,遂更改为此种方法。

4|0改进建议

4|1题目集1(7-1)

本题改为面向对象写法可能更简单,但是没必要。

4|2题目集3(7-1)

本题其实可以用完全匹配来写,效率更高。

4|3题目集3(7-2)

本题可以缩减一些测试方法,让提交的代码更短。

4|4题目集3(7-2)

以后写本题类似的题目,应该对每个方法的实现有一个大概的印象再动笔,才不至于中途改实现方法。

5|0总结:

本三次作业重新熟悉了Java的面向对象编程。也会利用代码分析工具优化自己的代码了。但对Java类的界限还有不同类之间的组合使用并不是非常理解,稍微复杂一点的题目,无法快速从全局给出实现架构,仍需努力。


__EOF__

本文作者愿原力与你同在!
本文链接https://www.cnblogs.com/Saul-Goodman/p/16746844.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浮云战争  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示