《零基础学Java语言·翁恺》第6周编程题 GPS数据处理

题目概述:

找出$GPRMC语句,计算校验和,找出其中校验正确,并且字段2表示已定位的语句,从中计算出时间,换算成北京时间。一次数据中会包含多条$GPRMC语句,以最后一条语句得到的北京时间作为结果输出。

题目链接:

https://www.icourse163.org/learn/ZJU-1001541001?tid=1206090266#/learn/ojhw?id=1219327391

解题思路:

题目很长,信息量大,较为繁琐,注意点有:

1:表征定位状态的字段2不能直接用下标确定,因为表征时间的字段1的长度可能不确定,所以字段2需要通过逗号(',')的位置确定;

2:异或计算的循环条件,将$和*之间所有的字符做^运算(不包括这两个字符);

int checkNum = s.charAt(1);
for (int i = 2; s.charAt(i) != '*'; i++) {
    checkNum ^= s.charAt(i);
}

3:利用 Integer.parseInt(s.substring(s.length() - 2, s.length()), 16) 将输入字符串s的最后两位字符转化为十六进制数字。

 

完整代码:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int hh = 0, mm = 0, ss = 0;
		String s = in.nextLine();
		while (!s.equals("END")) {
			// 字段1 UTC时间的长度可能不固定,字段2的位置需要通过第2个','确定
			// 直接用 s.charAt(18) == 'A' 是不对的
			int idx = s.indexOf(',');
			idx = s.indexOf(',', idx + 1);

			// $GPRMC语句,并且字段2表示已定位
			if (s.substring(0, 6).compareTo("$GPRMC") == 0 && s.charAt(idx + 1) == 'A') {
				// 进行异或计算
				int checkNum = s.charAt(1);
				for (int i = 2; s.charAt(i) != '*'; i++) {
					checkNum ^= s.charAt(i);
				}
				checkNum %= 65536;

				// 判断校验符是否正确
				int givenNum = Integer.parseInt(s.substring(s.length() - 2, s.length()), 16);
				if (checkNum == givenNum) {
					hh = (s.charAt(7) - '0') * 10 + (s.charAt(8) - '0');
					mm = (s.charAt(9) - '0') * 10 + (s.charAt(10) - '0');
					ss = (s.charAt(11) - '0') * 10 + (s.charAt(12) - '0');
					hh = (hh + 8) % 24;
				}
			}
			s = in.nextLine();
		}
		if (hh < 10)
			System.out.print(0);
		System.out.print(hh + ":");
		if (mm < 10)
			System.out.print(0);
		System.out.print(mm + ":");
		if (ss < 10)
			System.out.print(0);
		System.out.print(ss);
	}
}

 

 

你可能感兴趣的:(Java入门)