7-2 串口字符解析 (40 分)

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;
			}
		}
	}

}

我滴总结:

不知道大伙再看题的时候有没有仔细阅读。

没错,蔡!轲!你的测试用例有误啊!

不是输入和输出的答案有错误,是错误原因解析有误啊!!!

咳咳,

这道题就是题目超级长,难看,而且有些额外的知识。其实没什么难度嗷

关于奇偶校验位的知识,我推荐这一博客

http://t.csdn.cn/b0lmA

说一下我的代码思路:

1.判断是否是长度大于最小结构:

        1个起始位‘0’+八个有效数据+一个奇校验位+一个结束位 = 11位

2.判断是否有0:

        我是通过正则表达式来判断的

        通过普通的遍历也行,但时间会更长

3.开始找0(怎么感觉怪怪的):

        找到0后开始对他后面10位做处理;

4.先判断最后一位是不是结束1

5.再判断是否奇校验正确;

6.通过两次判断结果来输出。

这个题只要是结尾错了,那就是“validate error”,所以可以先判断结尾,结尾正确再去判断是否奇校验正确,这样偷个小懒,可以加快一丢丢的代码速度。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值