第三周的学习总结

第三周的学习总结


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

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函数,可以将一个字符串拼接到另一个字符串的尾部并将‘\0’字符串结尾符覆盖,这样我们每获取一个字符并转换后,就可以拼接到我们之前转换过的字符串,最后再一起输出。









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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值