1) 前言:
(1) 难度分析:第一次的作业还是挺简单的,基本请教一下同学都能解决,但是后面几次的作业着实加大了难度,特别是第二次作业的第二题和第三次作业的二三题,是又难分数又重,像我两次都没有及格,确实应该好好学。
(2) 题量分析:虽然后两次各只有三题,但是比起第一次作业花费的时间肯定要更多。
(3) 知识点总结:一维数组、循环结构、字符函数的应用。
(2)设计与分析:
题目集二 --(7-2)
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
在这里给出一组输入。例如:
1111011101011111111111
在这里给出相应的输出。例如:
1:11101011
在这里给出一组输入。例如:
11110111010111111001001101111111011111111101111
在这里给出相应的输出。例如:
1:11101011 2:01001101 3:validate error
输入数据不足11位。例如:
111101
在这里给出相应的输出。例如:
null data
输入数据全1没有起始位。例如:
1111111111111111
在这里给出相应的输出。例如:
null data
输入数据全1没有起始位。例如:
111101110101111111101111111101
在这里给出相应的输出。例如:
1:11101011 2:parity check error
两组数据结束符和奇偶校验均不合格。例如:
111000000000000011100000000000000
在这里给出相应的输出。例如:
1:validate error 2:validate error
两组数据,数据之间无空闲位。例如:
1110000000001100111000001
在这里给出相应的输出。例如:
1:00000000 2:01110000 我的代码、
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int flag1 = 0;
int flag2 = 0;
int m = 0;
int p = 0;
int i, j, n;
String number;
Scanner in = new Scanner(System.in);
number = in.next();
char[] chars1 = number.toCharArray();
for (i = 0; i < chars1.length; i++) {
if (chars1[i] == '0') {
flag1 = 1;
}
}
if (flag1 == 1) {
for (j = 0; j < chars1.length; j++) {
if (chars1[j] == '0') {
p++;
number = number.substring(j);
char[] chars2 = number.toCharArray();
if (chars2.length >= 10) {
flag2 = 1;
for (n = 1; n < 9; n++) {
if (chars2[n] == '1') {
m++;
}
}
if (m % 2 == 0 && chars2[9] != '1') {
System.out.println(p + ":" + "validate error");
j = 0;
m = 0;
n = 1;
} else if (m % 2 != 0 && chars2[9] == '1') {
System.out.println(p + ":" + "parity check error");
j = 0;
m = 0;
n = 1;
} else if (m % 2 != 0 && chars2[9] != '1') {
System.out.println(p + ":" + "validate error");
j = 0;
m = 0;
n = 1;
} else {
System.out.println(p + ":" + number.substring(1, 9));
j = 0;
m = 0;
n = 1;
}
}
}
}
} else {
System.out.println("null data");
}
}
}
分析:
题目分析:刚看这道题是一头雾水,根本不知道讲的是啥,请教了同学很久,才听懂,但是,理解错了意思,导致·只得了十分,但是我想,只要努力写还是能写出来的,
首先,要用到toCharArray把字符串转化为字符数组,然后用substring把字符串提取出来,这样方便提取各个串口,然后分类就行了。
题目集三 --(7-3)
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
整数输入。例如:
0,0 1,1
在这里给出相应的输出。例如:
1.4142135623730951
带符号double类型实数输入。例如:
+2,-2.3 0.9,-3.2
在这里给出相应的输出。例如:
1.42126704035519
格式非法。例如:
++2,-2.3 0.9,-3.2
在这里给出相应的输出。例如:
Wrong Format
点的数量超过两个。例如:
+2,-2.3 0.9,-3.2 +2,-2.3
在这里给出相应的输出。例如:
wrong number of points 我的代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String a;
Scanner in = new Scanner(System.in);
a = in.nextLine();
String[] number = a.split(" ");
if (number.length <= 1 || number.length >= 3) {
System.out.print("wrong number of points");
} else {
String[] b1 = number[0].split(",");
String[] b2 = number[1].split(",");
if (number[0].contains("++") == true
|| number[1].contains("++") == true
|| b1.length != 2
|| b2.length != 2) {
System.out.print("Wrong Format");
} else {
double x1 = Double.parseDouble(b1[0]);
double y1 = Double.parseDouble(b1[1]);
double x2 = Double.parseDouble(b2[0]);
double y2 = Double.parseDouble(b2[1]);
double p1 = Math.abs(x1 - x2);
double p2 = Math.abs(y1 - y2);
System.out.print(Math.sqrt(p1 * p1 + p2 * p2));
}
}
}
}
代码分析:
首先用String[] b1 = number[0].split(",");String[] b2 = number[1].split(",");把其分割成两个坐标,再用同样的方法分割一次就行,在进行相应的分析,解析就行。
题目集三 --(7-2)
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,两点重合。例如:
1:-2,+5 -2,+5
在这里给出相应的输出。例如:
points coincide
选项1,斜率无穷大的线。例如:
1:-2,3 -2,+5
在这里给出相应的输出。例如:
Slope does not exist
选项1,斜率无穷大。例如:
1:-2,3 -2,+5
在这里给出相应的输出。例如:
Slope does not exist
选项1,符合格式输入,带符号/不带符号数混合。例如:
1:-2.5,3 -2,+5.3
在这里给出相应的输出。例如:
4.6
选项2,计算第一个点到另外两点连线的垂直距离。例如:
2:0,1 1,0 2,0
在这里给出相应的输出。例如:
1.0
选项3,判断三个点是否在一条线上。例如:
3:0,1 2,2 5,3
在这里给出相应的输出。例如:
false
选项4,判断两条线是否平行。例如:
4:0,1 0,2 2,1 3,0
在这里给出相应的输出。例如:
false
选项5,判断两条线的交点。例如:
5:0,0 -1,-1 0,2 3,-1
在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:
1.0,1.0 true
选项5,判断两条线的交点。但两条线平行例如:
5:0,0 -1,-1 2,3 3,4
在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:
is parallel lines,have no intersection point 我的代码是
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String a;
double p;
Scanner in = new Scanner(System.in);
a = in.nextLine();
String[] b = a.split(":");
switch (b[0]) {
case "1":
String[] c = b[1].split(" ");
if (c.length != 2) {
System.out.println("wrong number of points");
} else {
String[] d1 = c[0].split(",");
String[] d2 = c[1].split(",");
double x1 = Double.parseDouble(d1[0]);
double y1 = Double.parseDouble(d1[1]);
double x2 = Double.parseDouble(d2[0]);
double y2 = Double.parseDouble(d2[1]);
p = (y1 - y2) / (x1 - x2);
if (x1 == x2 && y1 == y2) {
System.out.println("points coincide");
} else {
if (p == Double.MAX_VALUE) {
System.out.println("Slope does not exist");
} else {
System.out.println(p);
}
}
}
break;
case "2":
String[] e = b[1].split(" ");
if (e.length != 3) {
System.out.println("wrong number of points");
} else {
String[] d1 = e[0].split(",");
String[] d2 = e[1].split(",");
String[] d3 = e[2].split(",");
double x1 = Double.parseDouble(d1[0]);
double y1 = Double.parseDouble(d1[1]);
double x2 = Double.parseDouble(d2[0]);
double y2 = Double.parseDouble(d2[1]);
double x3 = Double.parseDouble(d3[0]);
double y3 = Double.parseDouble(d3[1]);
p = (y1 - y2) / (x1 - x2);
if ((x1 == x2 && y1 == y2) || (x1 == x3 && y1 == y3) || (y2 == y3 && x2 == 3)) {
System.out.println("points coincide");
} else {
System.out.println(p);
}
}
break;
}
}
}
题目分析
我觉得本提用对象交互更好,但是我没想到,所以很多测试点不会,但是我想,今后长个记性,用更好的方法解决,其实题目跟题目一挺相似的,基本用到高中的就行了。
题目集三 --(7-3)
true false false
选项4,直线与三角形交点的数量等于2,输出数量值以及三角形被分割的两部分面积。例如:
4:1,0 0,2 0,0 0,2 4,0
在这里给出相应的输出。例如:
2 1.0 3.0
选项4,直线与三角形交点的数量少于两个,只输出数量值。例如:
4:-1,0 1,2 0,1 0,-1 2,0
在这里给出相应的输出。例如:
1
选项5,用射线法判断点是否在三角形内部。例如:
5:0.5,0.5 0,0 0,2 4,0
在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:
in the triangle
选项5,用射线法判断点是否在三角形内部。例如:
5:0,0 -1,-1 2,3 3,4
在这里给出相应的输出。例如:
outof the triangle题目分析
用split把字符分割开,然后用Double.parseDouble把字符变为double类型,这样通过一些事方法实现其要达到的功能。 (3)采坑心得:字符串之间不能直接比较,需要用到equals,但是放在case里的能相比较比如第一次的作业的第六题if (a.equals("01") || a.equals("02") || a.equals("03") || a.equals("20")) ,其次可以用parse来将字符转换为想要的类型。 (4)改进建议:需要跟多的时间来完成这项作业,要完成每个知识点,这样,作业才跟好完成。 (5)总结:解决Java作业是非常非常重要的,需要自己多花时间,不能懒惰。