RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
作者 蔡轲
单位 南昌航空大学
代码长度限制 20 KB
时间限制 400 ms
内存限制 64 MB
输入格式:
由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
我滴答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = in.next();
if(a.length()<11) {
System.out.print("null data");
return;
}
//正则表达式判断输入合法性
if(a.matches("^[1]*$")) {
System.out.print("null data");
return;
}
int start = 0,i=0,num = 1,sum = 0;
boolean parity = false,validate = false;
for(start = 0;start<a.length()-10;start++) {
if(a.charAt(start)=='0') {//开始位置
System.out.print(num+":");
num++;
if(a.charAt(start+10)=='0') {
validate = false;
}else {
validate = true;
sum = 0;
for(i=start+1;i<start+9;i++) {//奇偶位判断(奇判断)
if(a.charAt(i)=='1') {
sum++;
}
}
if(sum%2==0) {
if(a.charAt(start+9)=='1') {
parity = true;
}else {
parity = false;
}
}else {
if(a.charAt(start+9)=='0') {
parity = true;
}else {
parity = false;
}
}
}
if(validate == true) {
if(parity == true) {
for(i=start+1;i<start+9;i++) {
System.out.print(a.charAt(i));
}
System.out.print("\n");
}else {
System.out.println("parity check error");
}
}else {
System.out.println("validate error");
}
start = start + 10;
}
}
}
}
我滴总结:
不知道大伙再看题的时候有没有仔细阅读。
没错,蔡!轲!你的测试用例有误啊!
不是输入和输出的答案有错误,是错误原因解析有误啊!!!
咳咳,
这道题就是题目超级长,难看,而且有些额外的知识。其实没什么难度嗷
关于奇偶校验位的知识,我推荐这一博客
说一下我的代码思路:
1.判断是否是长度大于最小结构:
1个起始位‘0’+八个有效数据+一个奇校验位+一个结束位 = 11位
2.判断是否有0:
我是通过正则表达式来判断的
通过普通的遍历也行,但时间会更长
3.开始找0(怎么感觉怪怪的):
找到0后开始对他后面10位做处理;
4.先判断最后一位是不是结束1
5.再判断是否奇校验正确;
6.通过两次判断结果来输出。
这个题只要是结尾错了,那就是“validate error”,所以可以先判断结尾,结尾正确再去判断是否奇校验正确,这样偷个小懒,可以加快一丢丢的代码速度。