中国大学MOOC C语言程序设计入门 第8周编程练习第二题 GPS数据处理

题目内容

解题思路

这个题的题目真的是我学习C语言以来见过的最长的题目了,很多人的第一感觉可能是无从下手,所以让我们先来整理一下题目中给出的信息,梳理一下思路。

这段文字告诉了我们要书写的代码需要有的流程,下面我们开始从题目中找寻书写各个流程所需要的信息。

流程①:找出$GPRMC语句

由此联系上文,我们可以知道:我们需要在众多的语句中找出以 $GPRMC 开头的语句,并且当语句为 END 时,表示数据的结束。

题目实际上是要我们判断在一个语句中是否有规定的字符,我们第一反应肯定是用strncmp( String1,String2,n ),函数的作用是比较字符串 String1String2 的前 n 个字符,若前 n 个字符相等,则返回函数值 0

流程②:计算校验和,找出校验正确的语句

题目中给出了一个 ^ 运算符让我们计算 $ 和 * 之间所有字符的校验和,然后与 * 后面的数值比对,若不相等则舍弃掉这条语句。

这一步的重点在于句段最后的文字: “注意这个十六进制值中是会出现A-F的大写字母的” 。由于这个条件,我们需要额外定义函数来把 * 后的可能包含字母的十六进制数的每一位先转换为数字,然后再用十六进制转化为十进制的方法转化。

转化范例:若13A6为十六进制数,则它转化为十进制数为 6x160 + 10x161 + 3x162 + 1x163 = 4950(我们需要设置函数来把A转化为10)*

流程③:(计算校验和,找出校验正确)并且字段2表示已定位的语句

很明显就是判定字段2的字符是否是 ‘A’ ,只需在上一流程判断是否校验正确的语句后加一个逻辑运算的且运算即可

流程④:从中计算出时间,换算成北京时间


查阅资料可知UTC时间即世界标准时间,比北京时间慢8个小时。故我们先从字符串中把代表时间的数字由字符型转换为整型,然后把代表小时的数字然后加上8,将其转化为24小时制即可。

个人倾向于定义一个长度为6的整型数组 time[6] 来储存表示时间的6个整型数,则 time[0] 和 time[1] 就分别是表示小时的十位数和个位数,先定义一个整型变量 newtime = time[0]*10 + time[1] + 8,然后用 newtime%24,得到的数即为24小时制的北京时间。然后用分别用10对北京时间作 /(除以)和 %(取余)运算获得新的 time[0] 和 time[1]。

个人代码分享:

#include <stdio.h>
#include <string.h>int value(char number) //定义value函数,函数作用是使字符转换为对应的十六进制的整型数字
{int value;if (number >= '0' && number <= '9')value = number - '0';else if (number >= 'A' && number <= 'F')value = number - 'A' + 10;else if (number >= 'a' && number <= 'f')value = number - 'a' + 10;return value;
}int main()
{char s[100] = {0}; //定义一个字符串变量来容纳每次输入的字符串char *p = s;int length, time[6] = {0};while (1) //因为输入的GPS语句数量未知,我们用死循环加上scanf("%s",s)来逐行读入字符串,暂时不考虑跳出循环的条件{scanf("%s", s);                      //读入字符串length = strlen(s);                 //用length记录字符串的长度if ((strncmp("$GPRMC", s, 6)) == 0) //题目中需要我们找出$GPRMC语句,当读入的字符串s的前6个字符为"$GPRMC"时,进行后续的判定{int cnt = 0, test_value = s[1], true_value = 0, i, start, timeaddress, statusaddress;for (i = 2; s[i] != '*'; i++) //题目中让我们"找出校验正确,并且字段2表示已定位的语句,从中计算出时间。"于是我们先用一个for循环找到解决这两个问题所需要的字符下标{if (s[i] == ','){cnt++;//用cnt记录字符s[i]对应的逗号是第几个逗号if (cnt == 1) //字符串内第一个逗号后面的字符是表示时间的字符,获取他的下标存于变量 timeaddresstimeaddress = i + 1;else if (cnt == 2) //我们知道字符串第二个','后面的字符表示是否已经定位,获取他的下标存于变量 statusaddressstatusaddress = i + 1;}test_value = test_value ^ s[i]; //将前两个字符的异或值与字符进行异或,来得到我们计算出的理论校验值test_value}start = i + 1; //上面的for循环结束后,它此时的下标i指向的应该是字符'*'我们取start=i+1来得到实际校验值的首下标for (int sixteen = 1, newlength = length - 1; newlength >= start; newlength--)//这里的sixteen初始值为16的0次方,对应的数应该为实际校验值的个位数,即字符串的最后一位,所以这里的变量 newlength 初始值即为实际校验值的个位数。{true_value += value(s[newlength]) * sixteen; //将代表实际校验值的字符转换为对应的整型数后,逐位乘以对应的权值,加和即为10进制数sixteen *= 16;}if (test_value == true_value && s[statusaddress] == 'A') //判定字符串是否符合要求(同时满足实际校验值等于理论校验值以及显示已定位){char *p1 = (p + timeaddress); //定义指针变量 *p1 ,使其对应表示UTC字段的首字符的地址(p为字符串首地址,加上表示时间首字符的下标即为表示时间首字符的地址)for (int i = 0; i < 6; i++)   //因为我们的输出只输出小时、分钟和秒,所以我们用整型数组time[6]来放置代表时间的6个整型数字{time[i] = *(p1 + i) - 48; //一个数字的字符型减去48(即字符'0'的ASCII码值)即为这个数字的整型}int newtime = time[0] * 10 + time[1] + 8; //将UTC时间加8换算为北京时间time[0] = newtime % 24 / 10;              //换算为24小时制的形式后,分别求出表示小时的个位数和十位数time[1] = newtime % 24 % 10;}}else if ((strncmp("END", s, 3)) == 0) //对应上面的if ((strncmp("$GPRMC", s, 6)) == 0),当字符串为END时,输出时间并跳出循环结束程序{printf("%d%d:%d%d:%d%d", time[0], time[1], time[2], time[3], time[4], time[5]);break;}}return 0;
}

中国大学MOOC C语言程序设计入门 第8周编程练习第二题 GPS数据处理相关推荐

  1. 笔记:中国大学MOOC课程《程序设计入门——C语言》编程练习

    笔记:中国大学MOOC课程<程序设计入门--C语言>编程练习 第7周 数组运算 1 多项式加法 第8周 指针与字符串 2 GPS数据处理 第7周 数组运算 1 多项式加法 题目内容: 一个 ...

  2. 中国大学MOOC课程《程序设计入门——C语言》 第8周编程练习

    1 单词长度(4分) 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's& ...

  3. 中国大学MOOC 浙江大学《程序设计入门——C语言》 第8周:指针与字符串 测验与作业

    1 单词长度(4分) 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's& ...

  4. 中国大学程序设计入门c语言答案,中国大学MOOC课程《程序设计入门——C语言》 第8周编程练习...

    1 单词长度(4分) 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's& ...

  5. 中国大学 MOOC C语言程序设计----编程部分答案解析

    C语言程序设计----编程部分答案解析 编程题目1 1.求解矩形的面积.(10分) 题目内容:编写一个程序,从键盘读入一个矩形的两个边的值(整数),输出矩形面积. 输入样例:3,5 输出样例:15 时 ...

  6. 中国大学MOOC 浙江大学《程序设计入门——C语言》第6周:数组与函数 测验与作业(高精度小数)

    1.高精度小数(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商,为了 ...

  7. 中国大学MOOC课程《程序设计入门——C语言》 期末考试编程题

    1 最简分式(10分) 题目内容: 分数可以表示为"分子/分母"的形式.编写一个程序,要求用户输入一个分数,然后将其约分为最简分式.最简分式是指分子和分母不具有可以约分的成分了.如 ...

  8. 中国大学MOOC课程《程序设计入门——C语言》翁恺老师 第六周测试题 高精度小数(习题记录)

    1高精度小数(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商,为了表 ...

  9. 中国大学MOOC 浙江大学《程序设计入门——C语言》 第一次单元测验(第六周)

    各位同学们,点开我的这篇博客,相信大家都抱有提升成绩的目的, 认为对你有帮助的可以收藏+点赞

最新文章

  1. (每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)
  2. 经验分享 怎么新建PDF文件
  3. 回顾我学过的编程语言
  4. 搭建rabbitmq的docker集群
  5. 06- 本地方法接口
  6. java undo_用JAVA实现Undo、Redo,Copy、Paste、Cut_java
  7. 大熊猫卸妆后_您不应错过的6大熊猫行动
  8. tomcat启动(五)Catalina分析-service.init
  9. Linux内核的文档管理工具:Sphinx
  10. 截取台风后的图片_Python数据分析案例 | 台风最喜欢在我国哪个省市登陆
  11. 跨链永续衍生品协议AntiMatter完成150万美元种子轮融资,NGC领投
  12. Golang import 包时可以使用相对路径吗
  13. 2019年7月19日星期五(交叉编译工具)
  14. linux 查看tomcat启动_一次tomcat启动特别慢的排查
  15. 中断(二)—— x86 APIC
  16. 学习记录540@SVN查看日志报错:Item is not readable
  17. 学计算机的参加数学建模有什么用吗,数学建模是什么?对于编程来说有什么意义?...
  18. phpstorm todo的含义
  19. Intellij idea Tips 之 创建文件自动生成文档描述
  20. 张飞硬件课程第六部:开关电源(上)

热门文章

  1. 米尔科技Zynq利用EMIO操作三色灯的linux驱动
  2. Android 检测USB连接状态
  3. 四川省2020年9月计算机二级成绩查询,2020年9月四川计算机二级考试成绩查询入口...
  4. 以AI为灯,照亮医疗放射防护监管盲区
  5. 关于sql语句中的count(*),count(1),count(具体字段)的介绍
  6. IBM Spectrum Scale RAID 管理
  7. gpfdist服务安装
  8. leecode 514. 自由之路
  9. 联想小新pro16 键盘处电流声 解决方法
  10. 全国3000家以上CoCo Café门店的意式咖啡系列将全线升级