習(xí)題
1單詞長度(5分)
題目內(nèi)容:
你的程序要讀入一行文本,其中以空格分隔為若干個單詞,以‘.’結(jié)束溉旋。你要輸出這行文本中每個單詞的長度。這里的單詞與語言無關(guān)嫉髓,可以包括各種符號观腊,比如“it's”算一個單詞,長度為4算行。注意梧油,行中可能出現(xiàn)連續(xù)的空格。
輸入格式:
輸入在一行中給出一行文本州邢,以‘
.
’結(jié)束儡陨,結(jié)尾的句號不能計(jì)算在最后一個單詞的長度內(nèi)。輸出格式:
在一行中輸出這行文本對應(yīng)的單詞的長度量淌,每個長度之間以空格隔開骗村,行末沒有最后的空格。
輸入樣例:
It's great to see you here.
輸出樣例:
4 5 2 3 3 4
思路
- 用
in.next
讀取單詞呀枢; - 通過判斷讀入內(nèi)容是否與
.
相同來判斷是否有單詞輸入叙身; - 通過判斷讀入內(nèi)容是否含有
.
來判斷是否為最后一個單詞,并調(diào)整輸出硫狞。
代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int len, flag = 0;
String word = in.next();
while(word.equals(".") == false) { //通過判斷讀入內(nèi)容是否與`.`相同來判斷是否有單詞輸入
if(flag == 0) { //flag用于控制空格輸出
flag = 1;
}
else {
System.out.print(" ");
}
if(word.indexOf('.') == -1) { //通過判斷讀入內(nèi)容是否含有`.`來判斷是否為最后一個單詞
System.out.print(word.length());
}else {
System.out.print(word.length() - 1);
}
word = in.next();
}
}
}
2GPS數(shù)據(jù)處理(5分)
題目內(nèi)容:
NMEA-0183協(xié)議是為了在不同的GPS(全球定位系統(tǒng))導(dǎo)航設(shè)備中建立統(tǒng)一的BTCM(海事無線電技術(shù)委員會)標(biāo)準(zhǔn),由美國國家海洋電子協(xié)會(NMEA-The National Marine Electronics Associa-tion)制定的一套通訊協(xié)議。GPS接收機(jī)根據(jù)NMEA-0183協(xié)議的標(biāo)準(zhǔn)規(guī)范残吩,將位置财忽、速度等信息通過串口傳送到PC機(jī)、PDA等設(shè)備泣侮。
NMEA-0183協(xié)議是GPS接收機(jī)應(yīng)當(dāng)遵守的標(biāo)準(zhǔn)協(xié)議即彪,也是目前GPS接收機(jī)上使用最廣泛的協(xié)議,大多數(shù)常見的GPS接收機(jī)活尊、GPS數(shù)據(jù)處理軟件隶校、導(dǎo)航軟件都遵守或者至少兼容這個協(xié)議。
NMEA-0183協(xié)議定義的語句非常多蛹锰,但是常用的或者說兼容性最廣的語句只有$GPGGA深胳、$GPGSA、$GPGSV铜犬、$GPRMC舞终、$GPVTG、$GPGLL等癣猾。其中$GPRMC語句的格式如下:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
這里整條語句是一個文本行敛劝,行中以逗號“,”隔開各個字段,每個字段的大蟹子睢(長度)不一夸盟,這里的示例只是一種可能,并不能認(rèn)為字段的大小就如上述例句一樣像捶。
字段0:$GPRMC上陕,語句ID,表明該語句為Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦最小定位信息
字段1:UTC時間作岖,hhmmss.sss格式
字段2:狀態(tài)唆垃,A=定位,V=未定位
字段3:緯度ddmm.mmmm痘儡,度分格式(前導(dǎo)位數(shù)不足則補(bǔ)0)
字段4:緯度N(北緯)或S(南緯)
字段5:經(jīng)度dddmm.mmmm辕万,度分格式(前導(dǎo)位數(shù)不足則補(bǔ)0)
字段6:經(jīng)度E(東經(jīng))或W(西經(jīng))
字段7:速度,節(jié)沉删,Knots
字段8:方位角渐尿,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角矾瑰,(000 - 180)度(前導(dǎo)位數(shù)不足則補(bǔ)0)
字段11:磁偏角方向砖茸,E=東W=西
字段16:校驗(yàn)值
這里,“*”為校驗(yàn)和識別符殴穴,其后面的兩位數(shù)為校驗(yàn)和凉夯,代表了“$”和“*”之間所有字符(不包括這兩個字符)的異或值的十六進(jìn)制值货葬。上面這條例句的校驗(yàn)和是十六進(jìn)制的50,也就是十進(jìn)制的80劲够。
提示:^運(yùn)算符的作用是異或震桶。將$和*之間所有的字符做^運(yùn)算(第一個字符和第二個字符異或,結(jié)果再和第三個字符異或征绎,依此類推)之后的值對65536取余后的結(jié)果蹲姐,應(yīng)該和*后面的兩個十六進(jìn)制數(shù)字的值相等,否則的話說明這條語句在傳輸中發(fā)生了錯誤人柿。注意這個十六進(jìn)制值中是會出現(xiàn)A-F的大寫字母的柴墩。另外,如果你需要的話凫岖,可以用Integer.parseInt(s)從String變量s中得到其所表達(dá)的整數(shù)數(shù)字江咳;而Integer.parseInt(s, 16)從String變量s中得到其所表達(dá)的十六進(jìn)制數(shù)字現(xiàn)在,你的程序要讀入一系列GPS輸出隘截,其中包含
$GPRMC
扎阶,也包含其他語句。在數(shù)據(jù)的最后婶芭,有一行單獨(dú)的
END
表示數(shù)據(jù)的結(jié)束东臀。你的程序要從中找出
$GPRMC
語句,計(jì)算校驗(yàn)和犀农,找出其中校驗(yàn)正確惰赋,并且字段2表示已定位的語句,從中計(jì)算出時間呵哨,換算成北京時間赁濒。一次數(shù)據(jù)中會包含多條$GPRMC
語句,以最后一條語句得到的北京時間作為結(jié)果輸出孟害。你的程序一定會讀到一條有效的$GPRMC語句拒炎。
輸入格式:
多條GPS語句,每條均以回車換行結(jié)束挨务。最后一行是END三個大寫字母击你。
輸出格式:
6位數(shù)時間,表達(dá)為:
hh:mm:ss
其中谎柄,hh是兩位數(shù)的小時丁侄,不足兩位時前面補(bǔ)0;mm是兩位數(shù)的分鐘朝巫,不足兩位時前面補(bǔ)0鸿摇;ss是兩位數(shù)的秒,不足兩位時前面補(bǔ)0劈猿。輸入樣例:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
END輸出樣例:
10:48:13
思路
這道題題目冗長拙吉,實(shí)際有效的信息不多:
- 有效語句要求字段0為
$GPRMC
潮孽; - 有效語句要求字段2為
A
; - *后的校驗(yàn)值為十六進(jìn)制數(shù)庐镐;
- 有效語句要求$和*之間字符的異或值對65536取余后的值與校驗(yàn)值相等;
- 以END為結(jié)束輸入標(biāo)志恩商;
- 輸出時以最后一條有效語句的信息為準(zhǔn);
- 輸出時必逆,時分秒均輸出兩位數(shù);
- 注意將語句中的時間轉(zhuǎn)換成北京時間揽乱;
代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String str;
String h = null, m = null, s = null;
str = in.nextLine();
while(str.equals("END") == false && str.length() > 6) {
int xor1 = 0, xor2 = 1, oh;
String gps;
char posi = 'V', c;
int countd = 0, flag = 0;
gps = str.substring(0, 6);
if(gps.equals("$GPRMC")) {
for(int i = 1; i < str.length() - 2; i++) { //遍歷字符串
c = str.charAt(i);
if(c == '*') { //獲得校驗(yàn)值
xor2 = Integer.valueOf(str.substring(i+1, i+3), 16);
flag = 2;
}
if(flag < 2) { //取異或值
xor1 = xor1 ^ str.charAt(i);
}
if(c == ',') {
countd++;
}
if(countd == 2 && flag == 0) { //獲得字段2信息
posi = str.charAt(i+1);
flag = 1;
}
}
}
xor1 = xor1 % 65536;
if(xor1 == xor2 && posi == 'A') { //時間轉(zhuǎn)換
oh = Integer.parseInt(str.substring(7,9));
if(oh < 16) {
oh += 8;
}
else {
oh += 8 - 24;
}
h = String.format("%02d", oh);
m = str.substring(9, 11);
s = str.substring(11,13);
}
str = in.nextLine();
}
System.out.print(h+":"+m+":"+s);
}
}
---END---