我是靠谱客的博主 犹豫书包,最近开发中收集的这篇文章主要介绍第三周的学习总结GPS摩尔斯电码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第三周的学习总结

  • GPS
  • 摩尔斯电码

这周的学习时做到的两道比较有意思的题目,和大家分享分享。

GPS

某共享单车项目,现要给小蓝车装定位模块,以便获取到该车的定位。经过团队其他人员调研、分析,确定了GPS模块型号,该型号的模块通过串口输出的信息为字符串,格式如下:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>hh
<1> UTC时间,hhmmss(时分秒)格式
<2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<3> 纬度半球N(北半球)或S(南半球)
<4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<5> 经度半球E(东经)或W(西经)

请利用已学的知识,编写一段代码,按照格式解析出经纬度信息,并打印。
举例:若输入的数据为
$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-
5.7,M,0000
77
则经过解析函数,打印出来的结果是S:4250.56,E:14718.50

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int arg, const char *argv[]){
int save = 0;
//记录存储的数量
int need = 4;
//由于规定了输出的格式需要用到4个字符串
char *direction[4]={"N","S","W","E"};
//用于判断方向
char str[100] = "$GPGGA,4250.5589,S,14718.5084,E,092204.999,A*2D";
char transfer[100] = {0};
//对输入的字符串进行备份
char *GPSstr[7] = {0};
//将拆分后的字符串进行存储
char *printf_GPS[need] = {0};
//用于需要输出的字符串的存储
const char sign[2] = ",";
//拆分的识别符号
char *res = 0;
//每次拆分后识别符号前的字符串的指针
strcpy(transfer,str);
//对字符串进行备份,因为strtok函数执行后只能返回拆分后的第一个字符串
res = strtok(transfer,sign);
//指针指向需要拆分的字符串
while( res != NULL ) {
//每拆分一次就进行存储,直到字符串末尾
GPSstr[save] = res;
res = strtok(NULL, sign);
save ++;
}
int record;
for (record = 0; record < need; record++)
//对所需字符串进行提取
{
printf_GPS[record] = GPSstr[record + 1];
}
if (*printf_GPS[1] == *direction[1])
//判断南北
{
printf_GPS[1] = "south";
}
else if (*printf_GPS[1] == *direction[0])
{
printf_GPS[1] = "north";
}
if (*printf_GPS[3] == *direction[3])
//判断东西
{
printf_GPS[3] = "east";
}
else if (*printf_GPS[3] == *direction[2])
{
printf_GPS[3] = "west";
}
printf("%s:%s°,%s:%s°n",printf_GPS[1],printf_GPS[0],printf_GPS[3],printf_GPS[2]);
return 0;
}




自我分析:没有做到对一个实际项目的完成,以我现在的水平只能做到对特定的字符串(经纬度)进行分析。学习到了strtok函数,这个函数是每次遇到指定的分隔符就会替换为节点,后续读取字符串时会返回分隔符前的字符串。首次调用需要指向字符串,后续调用则需要NULL(表示函数继续从上一次调用隐式保存的位置,继续分解字符串;对于上述的第二次调用来说,第一次调用结束前用一个this指针指向了分界符的下一位),具体请看这篇文章:链接: 《关于函数strtok和strtok_r的使用要点和实现原理》。这个函数还有一个很重要的问题:strtok会将源字符串分解而不留备份,分解完后再调用只能返回第一个被分解的字符串。而且,不能在多线程的情况下使用。比这个更加安全的函数有strtok_r和strtok_s。后续在补全其他功能进行更换和调试。


摩尔斯电码

设计一段程序,实现莫尔斯电码的转换。
如输入:123,打印出转换后的结果为.----…—…–

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 5
#define MAXNUMBER 9
int main(int arg , const char argv[]){
char morse[LENGTH + 1] = {0};//初始化摩尔斯电码
char printf_morse[100] = {0};//初始化需要输出的摩尔斯电码
char num[100] = {0};
//输入需要转换莫尔斯电码的数字
int strlong = 0;
//输入数字的长度
int times = 0;
//计算字符串的长度
scanf("%s",num);
strlong = strlen(num) / sizeof(char);//获得输入数字的长度
for (times = 0; times < strlong; times++)
{
strcpy(morse,"-----");
//摩尔斯电码初始化
int change = num[times]- 48;//通过ASCII码转换int型进行判断(0-9的ASCII码排序是:48-57)
switch (change)
{
case 0://防止出现bug
break;
case 1:
case 2:
case 3:
case 4:
case 5:{//1-5都是从左往右依次将“-”改为“.”,利用case的特性进行简化
int count;
for (count = 0; count < change ;count++)
{
morse[count] = '.';
}
strcat(printf_morse,morse);
break;
}
case 6:
case 7:
case 8:
case 9:{//6-9都是从右往左依次将“-”改为“.”,利用case的特性进行简化
int count;
for (count = LENGTH; count < change ;count++)
{
morse[MAXNUMBER - count] = '.';//ASCII码所能代表最大的数字是9,摩尔斯电码的字符串长度是5,所以用count初始化为最大长度即可用最大值减递增的count获得需要改变的字符的位置
}
strcat(printf_morse,morse);
break;
}
default:
break;
}
}
puts(printf_morse);
return 0;
}

自我分析:对于数组的概念掌握得不够熟练。又学到了string.h的strcat函数,可以将一个字符串拼接到另一个字符串的尾部并将‘’字符串结尾符覆盖,这样我们每获取一个字符并转换后,就可以拼接到我们之前转换过的字符串,最后再一起输出。









以上只代表个人浅显的见解,如有错误请在评论里指出,非常感谢。

最后

以上就是犹豫书包为你收集整理的第三周的学习总结GPS摩尔斯电码的全部内容,希望文章能够帮你解决第三周的学习总结GPS摩尔斯电码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部