GPS数据处理 翁恺老师C语言程序设计CAP第10章编程题

NMEA-0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。

NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。

NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。

其中$GPRMC语句的格式如下:

$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

这里整条语句是一个文本行,行中以逗号“,”隔开各个字段,每个字段的大小(长度)不一,这里的示例只是一种可能,并不能认为字段的大小就如上述例句一样。

  • 字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
  • 字段1:UTC时间,hhmmss.sss格式
  • 字段2:状态,A=定位,V=未定位
  • 字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
  • 字段4:纬度N(北纬)或S(南纬)
  • 字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
  • 字段6:经度E(东经)或W(西经)
  • 字段7:速度,节,Knots
  • 字段8:方位角,度
  • 字段9:UTC日期,DDMMYY格式
  • 字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
  • 字段11:磁偏角方向,E=东W=西
  • 字段16:校验值

这里,“*”为校验和识别符,其后面的两位数为校验和,代表了“$”和“*”之间所有字符(不包括这两个字符)的异或值的十六进制值。上面这条例句的校验和是十六进制的50,也就是十进制的80。

提示:^运算符的作用是异或。将$和*之间所有的字符做^运算(第一个字符和第二个字符异或,结果再和第三个字符异或,依此类推)之后的值对65536取余后的结果,应该和*后面的两个十六进制数字的值相等,否则的话说明这条语句在传输中发生了错误。注意这个十六进制值中是会出现A-F的大写字母的。

现在,你的程序要读入一系列GPS输出,其中包含$GPRMC,也包含其他语句。在数据的最后,有一行单独的

END

表示数据的结束。

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

你的程序一定会读到一条有效的$GPRMC语句。

输入格式:

多条GPS语句,每条均以回车换行结束。最后一行是END三个大写字母。

输出格式:

6位数时间,表达为:

hh:mm:ss

其中,hh是两位数的小时,不足两位时前面补0;mm是两位数的分钟,不足两位时前面补0;ss是两位数的秒,不足两位时前面补0。

输入样例:

$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

END

输出样例:

10:48:13

时间限制:500ms  内存限制:32000kb

#include <stdio.h>
#include <string.h>

int main()
{
    char s[1000],*p;
    int check,sum,hour,min,sec;
    do
    {
        scanf("%s",s);
        if (s[0]==‘$‘ && s[1]==‘G‘&&s[2]==‘P‘&&s[3]==‘R‘&&s[4]==‘M‘&&s[5]==‘C‘)
        {
            for (p=s+7;*p!=‘,‘;p++);        //找到定位的位置,刚开始直接输的第19位,结果错误,简直是个大坑
            if (*(p+1)==‘A‘)
            {
                p=s;
                check=*(++p);
                for (p=p+1;*p!=‘*‘;p++)         //进行异或计算
                {
                    check = check^(*p);
                }
                p++;
                sum=0;
                for (;*p!=‘\0‘;p++)              //将十六进制转换为10进制
                {
                    if (*p>=‘0‘ && *p<=‘9‘)
                    {
                        sum = sum*16+*p-‘0‘;
                    }else if (*p>=‘A‘ && *p<=‘F‘)
                    {
                        sum = sum*16 +*p-‘A‘+10;
                    }
                }
                if (sum==(check%65536))            //记录时间
                {
                    hour = (s[7]-‘0‘)*10+s[8]-‘0‘+8;
                    if (hour>=24) hour=hour-24;
                    min = (s[9]-‘0‘)*10+s[10]-‘0‘;
                    sec = (s[11]-‘0‘)*10+s[12]-‘0‘;
                }
            }
        }
    }while(strcmp(s,"END")!=0);
    printf("%02d:%02d:%02d\n",hour,min,sec);
    return 0;
}

原文地址:https://www.cnblogs.com/hangzhou2seattle/p/9539360.html

时间: 2024-10-12 07:43:33

GPS数据处理 翁恺老师C语言程序设计CAP第10章编程题的相关文章

素数和 翁恺老师C语言程序设计CAP第5章编程题

题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推. 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数. 注意:是第n个素数到第m个素数,不是n和m之间的素数! 输入格式: 两个正整数,第一个表示n,第二个表示m. 输出格式: 一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数. 输入样例: 2 4 输出样例: 15 时间限制:500ms 内存限制

时间换算 翁恺老师C语言程序设计CAP第3章编程题

题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小时小于10,则没有千位部分:如果小时是0,则没有百位部分:如果小时不是0而分小于10分,需要保留十位上的0:如果小时是0而分小于10分的,则不需要保留十位上的0.如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分. 有效的输入范围是0到2359,即你的程序不可能从测试服务器读到0到23

分解质因数 翁恺老师C语言程序设计CAP第5章编程题

题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式:当读到的就是素数时,输出它本身. 输入格式: 一个整数,范围在[2,100000]内. 输出格式: 形如: n=axbxcxd 或 n=n 所有的符号之间都没有空格,x是小写字母x. 输入样例: 18 输出样例: 18=2x3x3 时间限制

翁恺老师C语言入门第三周编程题之《数字特征值》

题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0.按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字.比如,对于342315,这个二进制数字就是001101. 这里的计算可以用下面的表格来表示: 数字 3 4 2 3 1 5 数位 6 5 4 3 2 1 数字奇偶 奇 偶 偶 奇 奇 奇

全国计算机等级考试二级教程-C语言程序设计_第10章_字符串

字符串排序有2种: 1长度strlen 2比较strcmp 读入一个3行的二维字符串数组,使用求字符串长度函数strlen,进行从大到小排序,使用冒泡排序. 1 #include <stdio.h> 2 #include <string.h> 3 main() 4 { 5 int i, j; 6 char t[20], a[3][20]; 7 for (i = 0;i < 3;i++) /* 为a表赋值 */ 8 { 9 gets(a[i]); 10 } 11 12 prin

C语言程序设计进阶 第1周编程题

第1周编程题 查看帮助 返回 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 字符串比对(10分) 题目内容: 题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的.你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些位置,如果找不到

《java 语言程序设计》第2章编程练习

2.1 public class test { public static void main(String[] args) { Scanner input = new Scanner(System.in); double f, c; c = input.nextDouble(); f = (9.0/5)*c+32; System.out.println(f); } } 2.2 public class test { public static void main(String[] args)

网易云课堂_C语言程序设计进阶_期末考试编程题部分

123123 1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未知,但至少有一个字符:输入的第2行给出非负整数N. 输出格式: 在一行中输出循环右移N次后的字符串. 输入样例: Hello World!# 2 输出样例: d!Hello Worl 时间限制:500ms内存限制:32000kb 2 最小包围矩形(5分) 题目内容: 给定一组二维坐标,

《java 语言程序设计》第1章编程练习

1.1 public class test { public static void main(String[] args) { System.out.println("Welcome to java"); System.out.println("Welcome to Computer Science"); System.out.println("Programming is fun"); } } 1.2 public class test {