作者:没有水的鱼0713 | 来源:互联网 | 2023-08-16 10:05
嗨嗨嗨到了每月一次的总结时间了主要是总结前三次具体代码在另外几篇博客里本博客更多的对一些重要的题目做一个讲解和总结目录目录目录代码链接前言题量知识点难度设计与分析7-2串口字符解析
嗨嗨嗨
到了每月一次的总结时间了
主要是总结前三次
具体代码在另外几篇博客里
本博客更多的对一些重要的题目做一个讲解和总结
目录
目录
- 目录
- 代码链接
- 前言
- 设计与分析
- 7-2 串口字符解析
- 7-1 点线形系列1-计算两点之间的距离
- 7-2 点线形系列2-线的计算
- case1
- case2
- case3
- case4
- case5
- 7-3 点线形系列3-三角形的计算
- 踩坑心得
- 改进建议
- 总结
代码链接
第一次作业
第二次作业
第三次作业
前言
三次题目都完(也)美(许)写完了,java作业治好了我的精神内耗?
对于森林小精灵laster、大佬jc等等等等人秒杀三期作业的行为我只能orz.but,他们的强大并不影响我老老实实敲代码,我绝对不当压力小子,坚持稳扎稳打,也希望大家也能耐住性子打代码,不要网上随便找到一串别人的代码就狠狠偷。接下来我会以题量、知识点和难度三个方面对三次作业的总体水平进行一个简单评价。
题量
题量方面,作业一为7题,作业二三为3题,虽然作业一题量更大但实际上是三的题量更大一些hhhh,在第三次作业的题目里,有很多的case,而那些case要比题目一中的题目要复杂的多,题量最少的是第二次作业。
知识点
知识点方面,第一二次作业主要是语法的学习,第二次还有于正则表达式的学习,但是用面向过程的方法也能很好解决,第三次作业主要是对面向对象方法的学习,如果方法和类封装的不好会做的很吃力。
难度
难度方面,最难的肯定是第三次,然后是第一次,最后是第二次。第三次的难度在于早已忘了的的数学知识、复杂的判断,还有精度控制(还有正则表达式hhhh)。第一次的难度更多在于语法的不熟悉,很多人都是第一次用java,而且java的语法扩展上有很多与c不一样的地方,所以难点更多在于对新鲜事物的学习与使用,并且第一次整整有七题,一题一题敲还是要花很长时间的,另外还有一些精度的坑hhhh,真的很浪费时间。
第二次和另外两次比起来就好很多,相对来说难度就没那么大,题量或者是题目难度来说,都不是很高,唯一可以体现含金量的正则表达式过程,都被我用if else的分支结构给解决了。
设计与分析
个人认为,代码的设计构造要比过题思路要重要的多,要是一些方法没封装起来,会让人绕晕,而且代码可读性巨差(有幸看过一些学弟学妹的代码,乍一眼巨晕hhh。他们在一坨if else中还能把代码思路理清楚真的挺厉害的)。而我也勉勉强强做到了封装。后面我会对几个比较重要的题目进行剖析,按类按方法进行讲解和作用。
7-2 串口字符解析
很惭愧,这题我用的是面向过程的写法,只有一个类一个方法,圈复杂度有点抽象。
不急,先看题。
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5 ~ 8 位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
题目的大概意思就是处理一个字符串,并从中读出一段段数据,数据是有包头包尾的,且题目设置一个数据包长度为11个字符串,看懂这些其实就很简单了。即使仅仅使用面对过程的方法也很轻松
Main
很遗憾的,只有一个main类和一个main方法,想来想去还是不想改,大概是记录自己一个学习的过程,让很多年后的我还能看看当年写的屎山hhh。
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String ch;
int flag=1;
ch = input.next();
if(ch.length()<11){
System.out.printf("null data");
return;
}
A:for(int i=0;i if(ch.charAt(i)=='0'&&ch.length()-i>10){
System.out.printf("%d:",flag++);
if(ch.charAt(i+10)!='1'){
System.out.printf("validate error\n");
i+=10;
continue ;
}
int f=0;
for(int j=i+1;j if(ch.charAt(j)=='1')
f++;
if(((f&1)==0&&ch.charAt(i+9)!='1')||((f&1)==1&&ch.charAt(i+9)!='0')){
System.out.printf("parity check error\n");
i+=10;
continue ;
}
for(int j=i+1;j System.out.printf("%c",ch.charAt(j));
i+=10;
System.out.printf("\n");
}
}
if(flag==1){
System.out.printf("null data");
return;
}
}
}
7-1 点线形系列1-计算两点之间的距离
题目简洁明了,就是要给你一串字符,问你其中包含的两个点的距离。
难点在于正则表达式hhhh,搞了我巨久,好在最后彻底学会了,但是后面的正则表达式还是改了点,光用这个正则表达式后面题目的case过不去。其他没啥难度,算是一个顺承的过程,这个题目写的代码后面还能用。
1.Point
属于点的类,包含有两点距离计算。
class Point {//点的类
double x = 0 , y = 0 ;
double DistanceCalculation(Point b) {
return Math.sqrt((this.x-b.x)*(this.x-b.x)+(this.y-b.y)*(this.y-b.y));
}//返回两点距离
}
2.PointTaking
本来是作为字符输入和坐标剥离的,但是面向过程之魂燃烧,就开始处理起来了,是实际的主函数。
class PointTaking {
String ch;
double Solve() {
Point a = new Point();
int pos = 0;
Point b = new Point();
// String[]
String[] c = this.ch.split(" ");//将字符串以空格分割
for(String i:c) {//对分割的字符串遍历
String[] d = i.split(",");
for(String j:d) {
// System.out.printf(j+"\n");
if(!j.matches("^[+-]?(([0-9][1-9]*\\.\\d+)|(0\\.\\d+)|([0-9][1-9]*))$"))//正则表达式判断是否合法
return -1;//返回输入错误
if(pos==0)//按位读入坐标x1,y1,x2,y2
a.x =Double.parseDouble(j);
else if(pos == 1)
a.y = Double.parseDouble(j);
else if(pos == 2)
b.x=Double.parseDouble(j);
else
b.y =Double.parseDouble(j);
pos++;
}
}
if(c.length!=2)
return -2;//返回错误点数量
return a.DistanceCalculation(b);
}
}
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"。
好家伙,一题更比六题强。
蛋黄猫看完都累趴了
咱们来梳理一下几个要求:1、判断垂直;2、判断点到直线距离;3、判断三点是否在一条直线;4、判断两直线是否平行;5、计算交叉点。
梳理完其实就很明了了,我按case给大家讲解一下我的代码。
case1
首先肯定是判断斜率是否为0,即两点x坐标相等,然后直接输出斜率,斜率这块我是封装在了线的类中的,在后面我会贴上各个类。
if(pointSet[1].x==pointSet[2].x) {
System.out.printf("Slope does not exist");
return 4;
}
line.a=pointSet[1];
line.b=pointSet[2];
System.out.printf(line.slope()+"");
case2
case3
case4
case5
7-3 点线形系列3-三角形的计算
本次博客的最难题来了。简单分析一下这题的五个case,除了第四个很难之外,其他case其实都还好,各种格式错误、输入错误来来回回折磨我几个小时,我的强迫症一发作就必须把前面的case过掉才会安心做其他的case,然后就是疯狂提交:
这也是一个调试小技巧,看懂掌声。
然后我们按类来讲讲我的代码。
Triangle
除了之前用的一些类外,针对第三题我重新设置了一个类Triangle,主要功能是计算三角形的面积。
public class Triangle {
Line a;
Line b;
Line c;
public Triangle() {
}
double area() {
double p = (Math.sqrt((this.a.a.x - this.a.b.x) * (this.a.a.x - this.a.b.x) + (this.a.a.y - this.a.b.y) * (this.a.a.y - this.a.b.y)) + Math.sqrt((this.b.a.x - this.b.b.x) * (this.b.a.x - this.b.b.x) + (this.b.a.y - this.b.b.y) * (this.b.a.y - this.b.b.y)) + Math.sqrt((this.c.a.x - this.c.b.x) * (this.c.a.x - this.c.b.x) + (this.c.a.y - this.c.b.y) * (this.c.a.y - this.c.b.y))) / 2.0;
return Math.sqrt(p * (p - Math.sqrt((this.a.a.x - this.a.b.x) * (this.a.a.x - this.a.b.x) + (this.a.a.y - this.a.b.y) * (this.a.a.y - this.a.b.y))) * (p - Math.sqrt((this.b.a.x - this.b.b.x) * (this.b.a.x - this.b.b.x) + (this.b.a.y - this.b.b.y) * (this.b.a.y - this.b.b.y))) * (p - Math.sqrt((this.c.a.x - this.c.b.x) * (this.c.a.x - this.c.b.x) + (this.c.a.y - this.c.b.y) * (this.c.a.y - this.c.b.y))));
}
}
踩坑心得
改进建议
总结