MOOC 上一道 GPS 字符串处理的题目,通过了题目的输入和输出,却一直通不过 OJ 用例 - V2EX
zeroday
V2EX    C

MOOC 上一道 GPS 字符串处理的题目,通过了题目的输入和输出,却一直通不过 OJ 用例

  •  1
     
  •   zeroday Jan 20, 2015 1135 views
    This topic created in 4134 days ago, the information mentioned may be changed or developed.

    MOOC 上一道 GPS 字符串处理的题目,通过了题目的输入和输出,却一直通不过 OJ 用例。代码重写了2次却一个用例都没通过,感觉没有思路了,MOOC 上也没人回答,还请大家指点一下,谢谢了。

    题目内容

    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 MinimumSpecific 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

    我的思路:

    判断头是不是 "GPRMC,"

    判断第三个字段是不是 "A"

    判断‘$'到’*’之间的校验和是不是一致

    前面三个判断通过时

    对最后一个判断通过的语句,输出bjt时间。

    我的代码

    https://gist.github.com/arcticlion/a1351c034afffb15ddc4

    4 replies    2015-01-24 12:56:37 +08:00
    zhwfreewill
        1
    zhwfreewill  
       Jan 23, 2015   1
    我在github上面回复了,希望有点用
    zeroday
        2
    zeroday  
    OP
       Jan 23, 2015
    @zhwfreewill 还是没通过...又写了一段更新在 gist 上了,这已经是第 n 个版本了... 发现一个奇怪的现象,现在这段代码能过用例三,当我同样的代码再提交时,又能过用例一和三了,我也不清楚怎么回事了。
    zhwfreewill
        3
    zhwfreewill  
       Jan 24, 2015
    判断是否定位的'A'或者'V'好像还是注释,没生效啊,你检查一下
    zeroday
        4
    zeroday  
    OP
       Jan 24, 2015
    @zhwfreewill 终于通过了,问题出在 str_split, 指针真的不好用,非常容易出错,我重写了一遍代码,去掉复杂的指针的使用,尽量让代码已最简单的实现来完成符合题目要求的事。

    突然意识到简单才是好的。
    About   Help     Advertise     Blog     API     FAQ     Solana     1557 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 617ms UTC 16:45 PVG 00:45 LAX 09:45 JFK 12:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86