<img width="108" height="40" alt="浙江大學" src="http://imgsize.ph.126.net/?enlarge=true&imgurl=http://img1.ph.126.net/DRP1fc7IDe3Jux_yvA0OnQ==/3186859686418268890.jpg_108x40x1x95.png" />
第1周:計算
題目內容:
逆序的三位數:
程序每次讀入一個正三位數,然后輸出逆序的數字。注意,當輸入的數字含有結尾的0時,輸出不應帶有前導的0。比如輸入700,輸出應該是7。
提示:用%10可以得到個位數,用/100可以得到百位數...。將這樣得到的三個數字合起來:百位*100+十位*10+個位,就得到了結果。
輸入格式:
每個測試是一個3位的正整數。
輸出格式:
輸出逆序的數。
輸入樣例:
123
輸出樣例:
321
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int t1=n%10;
int t2=(n-n/100*100)/10;
int t3=n/100;
int t=t1*100+t2*10+t3;
printf("%d",t);
return 0;
}
第2周:判斷
題目內容:
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到2359以外的輸入數據。
你的程序要輸出這個時間對應的UTC時間,輸出的格式和輸入的相同,即輸出一個整數,表示UTC的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位上的0;如果小時是0而分小於10分的,則不需要保留十位上的0。
提醒:要小心跨日的換算。
輸入格式:
一個整數,表示BJT的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位上的0;如果小時是0而分小於10分的,則不需要保留十位上的0。
輸出格式:
一個整數,表示UTC的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位上的0;如果小時是0而分小於10分的,則不需要保留十位上的0。
輸入樣例:
803
輸出樣例:
3
# include <stdio.h>
int main()
{
int i;
scanf("%d",&i);
if(i >= 0 && i <= 2359) {
if(i > 0 && i < 10) {
i = 1600 + i;
printf("%d",i);
}
else if(i == 0){
i = 1600;
printf("%d",i);
}
else if(i >= 10 && i < 100 ){
i = 1600 + i;
printf("%d",i);
}
else if(i >= 100 && i < 1000) {
if(i/100 == 8) {
i = i % 100;
printf("%d",i);
}
else if(i/100 > 0 && i/100 < 8) {
i = (i/100 - 8 + 24) *100 + (i % 100);
printf("%d",i);
}
else if(i/100 == 9) {
i = (i/100 - 8)*100 + i % 100;
printf("%d",i);
}
}
else if(i >= 1000 && i <= 2359) {
i = (i /100 -8)*100 + (i % 100);
printf("%d",i);
}
}
return 0;
}
題目內容:
無線電台的RS制信號報告是由三兩個部分組成的:
-
R(Readability) 信號可辨度即清晰度.
-
S(Strength) 信號強度即大小.
其中R位於報告第一位,共分5級,用1—5數字表示.
-
Unreadable
-
Barely readable, occasional words distinguishable
-
Readable with considerable difficulty
-
Readable with practically no difficulty
-
Perfectly readable
報告第二位是S,共分九個級別,用1—9中的一位數字表示
-
Faint signals, barely perceptible
-
Very weak signals
-
Weak signals
-
Fair signals
-
Fairly good signals
-
Good signals
-
Moderately strong signals
-
Strong signals
-
Extremely strong signals
現在,你的程序要讀入一個信號報告的數字,然后輸出對應的含義。如讀到59,則輸出:
Extremely strong signals, perfectly readable.
輸入格式:
一個整數,信號報告。整數的十位部分表示可辨度,個位部分表示強度。輸入的整數范圍是[11,59]中的個位不為0的數字,這個范圍外的數字不可能出現在測試數據中。
輸出格式:
一句話,表示這個信號報告的意義。按照題目中的文字,先輸出表示強度的文字,跟上逗號和空格,然后是表示可辨度的文字,跟上句號。注意可辨度的句子的第一個字母是小寫的。注意這里的標點符號都是英文的。
輸入樣例:
33
輸出樣例:
Weak signals, readable with considerable difficulty.
# include <stdio.h>
int main()
{
int n;
int R,S;
scanf("%d",&n);
R = n/10;
S = n%10;
switch(S) {
case 1:
printf("Faint signals, barely perceptible, ");
break;
case 2:
printf("Very weak signals, ");
break;
case 3:
printf("Weak signals, ");
break;
case 4:
printf("Fair signals, ");
break;
case 5:
printf("Fairly good signals, ");
break;
case 6:
printf("Good signals, ");
break;;
case 7:
printf("Moderately strong signals, ");
break;
case 8:
printf("Strong signals, ");
break;
case 9:
printf("Extremely strong signals, ");
break;
}
switch(R) {
case 1:
printf("unreadable.");
break;
case 2:
printf("barely readable, occasional words distinguishable.");
break;
case 3:
printf("readable with considerable difficulty.");
break;
case 4:
printf("readable with practically no difficulty.");
break;
case 5:
printf("perfectly readable.");
break;
}
}
第3周:循環
題目內容:
你的程序要讀入一系列正整數數據,輸入-1表示輸入結束,-1本身不是輸入的數據。程序輸出讀到的數據中的奇數和偶數的個數。
輸入格式:
一系列正整數,整數的范圍是(0,100000)。如果輸入-1則表示輸入結束。
輸出格式:
兩個整數,第一個整數表示讀入數據中的奇數的個數,第二個整數表示讀入數據中的偶數的個數。兩個整數之間以空格分隔。
輸入樣例:
9 3 4 2 5 7 -1
輸出樣例:
4 2
# include <stdio.h>
int main()
{
int i,j = 0,k = 0;
scanf("%d",&i);
while (i != -1) {
if (i % 2 == 0) {
++j;
}
else {
++k;
}
scanf("%d",&i);
}
printf("%d %d",k,j);
return 0;
}
題目內容:
對數字求特征值是常用的編碼算法,奇偶特征是一種簡單的特征值。對於一個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下一個1,否則記下一個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄下來,就形成了一個二進制數字。比如,對於342315,這個二進制數字就是001101。
這里的計算可以用下面的表格來表示:
| 數字 |
3 |
4 |
2 |
3 |
1 |
5 |
| 數位 |
6 |
5 |
4 |
3 |
2 |
1 |
| 數字奇偶 |
奇 |
偶 |
偶 |
奇 |
奇 |
奇 |
| 數位奇偶 |
偶 |
奇 |
偶 |
奇 |
偶 |
奇 |
| 奇偶一致 |
0 |
0 |
1 |
1 |
0 |
1 |
| 二進制位值 |
32 |
16 |
8 |
4 |
2 |
1 |
你的程序要讀入一個非負整數,整數的范圍是[0,1000000],然后按照上述算法計算出表示奇偶性的那個二進制數字,輸出它對應的十進制值。
提示:將整數從右向左分解,數位每次加1,而二進制值每次乘2。
輸入格式:
一個非負整數,整數的范圍是[0,1000000]。
輸出格式:
一個整數,表示計算結果。
輸入樣例:
342315
輸出樣例:
13
# include <stdio.h>
int main()
{
int a,m,two = 1,s = 0;
int cout = 0;
scanf("%d",&a);
while(a != 0) {
m = a % 10;
a /= 10;
++cout;
if(m % 2 == cout % 2) {
s += two;
}
two *= 2;
}
printf("%d\n",s);
return 0;
}
第4周:循環控制
題目內容:
我們認為2是第一個素數,3是第二個素數,5是第三個素數,依次類推。
現在,給定兩個整數n和m,0<n<=m<=200,你的程序要計算第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。
輸入格式:
兩個整數,第一個表示n,第二個表示m。
輸出格式:
一個整數,表示第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。
輸入樣例:
2 4
輸出樣例:
15
#include <stdio.h>
int isPrime(long n);
int main(int argc, char const *argv[])
{
int n, m, count;
long l, sum;
while(1) {
scanf("%d%d", &n, &m);
if (n > 0 && n <= m && m <= 200) break;
}
count = 0; sum = 0; l = 2;
do {
if (isPrime(l)) {
count ++;
if (count >= n) sum += l;
}
l++;
} while (count < m);
printf("%d\n", sum);
return 0;
}
int isPrime(long n)
{
int i;
if (n == 2)
return 1;
for (i = 2; i*i <= n;i++)
if (n % i == 0)
return 0;
return 1;
}
題目內容:
你的程序要讀入一個整數,范圍是[-100000,100000]。然后,用漢語拼音將這個整數的每一位輸出出來。
如輸入1234,則輸出:
yi er san si
注意,每個字的拼音之間有一個空格,但是最后的字后面沒有空格。當遇到負數時,在輸出的開頭加上“fu”,如-2341輸出為:
fu er san si yi
輸入格式:
一個整數,范圍是[-100000,100000]。
輸出格式:
表示這個整數的每一位數字的漢語拼音,每一位數字的拼音之間以空格分隔,末尾沒有空格。
輸入樣例:
-30
輸出樣例:
fu san ling
# include <stdio.h>
# include <math.h>
int main()
{
int n,c = 0;
scanf("%d",&n);
if(n == 0){
printf("ling");
}
else{
if(n < 0){
printf("fu ");
n = -n;
}
int t = n;
while(t != 0){
t /= 10;
++c;
}
int w = n,p,z;
while(c > 0){
z = pow(10.0,c-1);
p = w / z;
if(p == 0){
printf("ling");
}
else if(p == 1){
printf("yi");
}
else if(p == 2){
printf("er");
}
else if(p == 3){
printf("san");
}
else if(p == 4){
printf("si");
}
else if(p == 5){
printf("wu");
}
else if(p == 6){
printf("liu");
}
else if(p == 7){
printf("qi");
}
else if(p == 8){
printf("ba");
}
else if(p == 9){
printf("jiu");
}
if(c != 1){
printf(" ");
}
c--;
w = w - p*z;
}
}
return 0;
}
第5周:數據類型
第一次單元測驗
返回
int j=4;
for ( int i=j; i<=2*j; i++ ) {
switch ( i/j ) {
case 0:
case 1: printf(“*”); break;
case 2: printf(“#”);
}
}
-
A.
****
-
B.
*#
-
C.
****#
2.00 /2.00 -
D.
***#
-
A.12
-
B.20
-
C.24
-
D.102.00 /2.00
-
A.include2.00 /2.00
-
B.int
-
C.if
-
D.for
-
A.124d
-
B.0124
-
C.0x124
-
D.1242.00 /2.00
-
A.打印出"hello"
-
B.無法編譯2.00 /2.00
-
C.打印出"hello bye-bye"
-
D.打印出"bye-bye"
int i,j=6;
-
A.i不會被初始化,而j是62.00 /2.00
-
B.i被初始為0,而j是6
-
C.i和j的初始值都是6
-
D.不能通過編譯
-
A.255
-
B.-12.00 /2.00
-
C.編譯錯誤,因為賦值的時候類型不一致
-
D.編譯錯誤,因為賦值的時候不能把負數賦給char
-
A.打印不出東西
-
B.因為while(0),無法編譯
-
C.打印出62.00 /2.00
-
D.打印出5
對於以下代碼:
int i;
for ( i=0; i<10; i++)
printf("%d", i);
for循環結束后,i的值是多少?
-
A.
9
-
B.
10
2.00 /2.00 -
C.
11
-
D.
i沒有確定的值
-
A.for (i=0; i<10, j<10; i++);
-
B.for (i=0; i<10; i--);
-
C.for (i=0; i++ );2.00 /2.00
-
D.for (;;);
int i=10;
long long t = sizeof(i++);
printf("%d", i);
表達式(double)(10/4*4) 的結果是_____
題目內容:
由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就需要自己設計實現方法。
(0,1)之間的任何浮點數都可以表達為兩個正整數的商,為了表達這樣兩個數的商,可以將相除的結果以多個整數來表示,每個整數表示結果的一位。即商的第一位用一個整數來表示,第二位用另一個整數來表示,以此類推,就可以輸出一個高精度的除法結果了。
如16/19的結果0.8421052631...就可以依次輸出8、4、2、1、0、5、2、6、3、1...。
而除法的過程,則可以模仿人工列豎式做除法的方式,先將被除數乘以10,得到一位商以后,將余數乘以10作為下一輪計算的被除數:
160/19->8余8
80/19->4余4
...
當某次余數為0時,則表明除盡。
現在,請寫一個程序,輸入一個分數,計算出它的小數形式。無論是否可以除盡,輸出最多小數點后200位。
輸入格式:
形如
a/b
的兩個數,其中10<=a<b<100。也就是說,這個小數一定是小於1的正數。
提示:輸入是帶着兩個數中間的“/”的,所以scanf應采用“%d/%d”這樣的輸入格式。
輸出格式:
形如
0.xxxxxxxxx
的小數,小數點后最多200位。輸出結束的時候要帶着回車換行。如果a/b是一個有限不循環小數,則輸出完所有的有效位就可以了,不需要再輸出后面的0來湊滿200位。
輸入樣例:
16/19
輸出樣例:
0.84210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684
# include <stdio.h>
int main()
{
int n,m,c = 0;
scanf("%d/%d",&n,&m);
printf("0.");
while ( c < 200) {
c++;
n *= 10;
printf("%d",n/m);
n %= m;
if ( n == 0)
break;
}
return 0;
}
第6周:函數
題目內容:
每個非素數(合數)都可以寫成幾個素數(也可稱為質數)相乘的形式,這幾個素數就都叫做這個合數的質因數。比如,6可以被分解為2x3,而24可以被分解為2x2x2x3。
現在,你的程序要讀入一個[2,100000]范圍內的整數,然后輸出它的質因數分解式;當讀到的就是素數時,輸出它本身。
提示:可以用一個函數來判斷某數是否是素數。
輸入格式:
一個整數,范圍在[2,100000]內。
輸出格式:
形如:
n=axbxcxd
或
n=n
所有的符號之間都沒有空格,x是小寫字母x。abcd這樣的數字一定是從小到大排列的。
輸入樣例:
18
輸出樣例:
18=2x3x3
# include <stdio.h>
int is(int i) {
int j;
for ( j = 2; j < i; ++j ) {
if ( i%j == 0)
break;
}
if ( j != i)
return 0;
else
return 1;
}
int main()
{
int n,i;
scanf("%d",&n);
printf("%d=",n);
if ( is(n))
printf("%d\n",n);
else
{
while ( n != 1 ){
for ( i = 2; i <= n; ++i) {
if (is(i) && n%i == 0){
printf("%d",i);
if ( i != n)
printf("x");
else
printf("\n");
n /= i;
i = 1;
}
}
}
}
return 0;
}
題目內容:
一個正整數的因子是所有可以整除它的正整數。而一個數如果恰好等於除它本身外的因子之和,這個數就稱為完數。例如6=1+2+3(6的因子是1,2,3)。
現在,你要寫一個程序,讀入兩個正整數n和m(1<=n<m<1000),輸出[n,m]范圍內所有的完數。
提示:可以寫一個函數來判斷某個數是否是完數。
輸入格式:
兩個正整數,以空格分隔。
輸出格式:
其間所有的完數,以空格分隔,最后一個數字后面沒有空格。如果沒有,則輸出一行文字:
NIL
(輸出NIL三個大寫字母加回車)。
輸入樣例:
1 10
輸出樣例:
6
# include <stdio.h>
int w(int n)
{
int i,s = 0;
for ( i = 1; i < n; ++i) {
if ( n%i == 0){
s += i;
}
}
if ( n == s)
return 1;
else
return 0;
}
int main()
{
int i,j,k,c = 0;
scanf("%d%d",&i,&j);
for ( k = i; k <= j; ++k) {
if (w(k)) {
if ( c == 2)
printf(" ");
printf("%d",k);
c = 1;
c++;
}
}
if ( k == j+1 && c != 0)
printf("\n");
if (c == 0 )
printf("NIL\n");
return 0;
}
第7周:數組
題目內容:
一個多項式可以表達為x的各次冪與系數乘積的和,比如:
2x6+3x5+12x3+6x+20
現在,你的程序要讀入兩個多項式,然后輸出這兩個多項式的和,也就是把對應的冪上的系數相加然后輸出。
程序要處理的冪最大為100。
輸入格式:
總共要輸入兩個多項式,每個多項式的輸入格式如下:
每行輸入兩個數字,第一個表示冪次,第二個表示該冪次的系數,所有的系數都是整數。第一行一定是最高冪,最后一行一定是0次冪。
注意第一行和最后一行之間不一定按照冪次降低順序排列;如果某個冪次的系數為0,就不出現在輸入數據中了;0次冪的系數為0時還是會出現在輸入數據中。
輸出格式:
從最高冪開始依次降到0冪,如:
2x6+3x5+12x3-6x+20
注意其中的x是小寫字母x,而且所有的符號之間都沒有空格,如果某個冪的系數為0則不需要有那項。
輸入樣例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20
輸出樣例:
4x6+6x5+12x3+12x2+12x+40
#include <stdio.h>
#include <math.h>
void outNum(int j,int k)
{
int absk = abs(k);
if(absk==1 && j!=1 && j!=0)
{
printf("x%d",j);
}
else if(absk==1 && j!=0)
{
printf("x");
}
else if(absk==1)
{
printf("%d",absk);
}
else if(j==0)
{
printf("%d",absk);
}
else if(j==1)
{
printf("%dx",absk);
}
else
{
printf("%dx%d",absk,j);
}
}
int main()
{
int num[101] = { (0) };
int cut = 0;
int ent = 0;
int i,j,k;
while(cut < 2)
{
k=0;
scanf("%d %d",&j,&k);
num[j] += k;
if(j==0)
cut++;
}
for(i=100;i>-1;i--)
{
j=i;
k=num[j];
if(k!=0)
{
ent++;
if(cut==2)
{
if(k<0)
printf("-");
outNum(j,k);
cut ++;
}
else
{
if(k<0)
{
printf("-");
outNum(j,k);
}
else
{
printf("+");
outNum(j,k);
}
}
}
}
if(ent==0)
printf("0");
return 0;
}
題目內容:
給定一個n*n矩陣A。矩陣A的鞍點是一個位置(i,j),在該位置上的元素是第i行上的最大數,第j列上的最小數。一個矩陣A也可能沒有鞍點。
你的任務是找出A的鞍點。
輸入格式:
輸入的第1行是一個正整數n, (1<=n<=100),然后有n行,每一行有n個整數,同一行上兩個整數之間有一個或多個空格。
輸出格式:
對輸入的矩陣,如果找到鞍點,就輸出其下標。下標為兩個數字,第一個數字是行號,第二個數字是列號,均從0開始計數。
如果找不到,就輸出
NO
題目所給的數據保證了不會出現多個鞍點。
輸入樣例:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
輸出樣例:
2 1
#include <stdio.h>
#define M 100
#define N 100
int main(void) {
int i,j,m,n;
int max,jmax,flag,f = 1;
int a[M][N];
while(scanf("%d",&n) != EOF){
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
scanf("%d",&a[i][j]);
for(i = 0; i < n; ++i){
max = a[i][0];
jmax = 0;
for(j = 1; j < n; ++j) {
if(max < a[i][j]){
max = a[i][j];
jmax = j;
}
}
flag = 1;
int ii;
for(ii = 0; ii < n && flag; ++ii) {
if(a[ii][jmax] < max)
flag = 0;
}
if(flag == 1){
printf("%d %d\n",i,jmax);
f = 0;
}
}
if(f) printf("NO\n");
}
return 0;
}
第八周:指針與字符串
題目內容:
你的程序要讀入一行文本,其中以空格分隔為若干個單詞,以‘.’結束。你要輸出這行文本中每個單詞的長度。這里的單詞與語言無關,可以包括各種符號,比如“it's”算一個單詞,長度為4。注意,行中可能出現連續的空格。
輸入格式:
輸入在一行中給出一行文本,以‘.’結束,結尾的句號不能計算在最后一個單詞的長度內。
輸出格式:
在一行中輸出這行文本對應的單詞的長度,每個長度之間以空格隔開,行末沒有最后的空格。
輸入樣例:
It's great to see you here.
輸出樣例:
4 5 2 3 3 4
#include <stdio.h>
int main()
{ int i=0;
char a;
while(1){
scanf("%c",&a);
if(a == '.'){
if(i!=0){
printf("%d",i);
}
printf("\n");
break;
}
if(a==' '){
if(i!=0){
printf("%d ",i);
i=0;
}
}
else{
i+=1;
}
}
return 0;
}
題目內容:
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
#include "stdio.h"
#include "string.h"
int main()
{
int i,j,k,sum=0,r,num,t,d;
char c[80][100];
char time[9]="00:00:00";
for(i=0;;i++)
{
gets(c[i]);
if(c[i][0]=='E'&&c[i][1]=='N'&&c[i][2]=='D'&&c[i][3]=='\0')
{
num=i;break;
}
}
for(i=0;i<num;i++)
{
if(c[i][0]=='$'&&c[i][1]=='G'&&c[i][2]=='P'&&c[i][3]=='R'&&c[i][4]=='M'&&c[i][5]=='C'&&c[i][6]!='\0')
{
sum=0;
for(j=1;c[i][j]!='*';j++)
{
sum=sum^c[i][j];
}
if(c[i][j+1]>='0'&&c[i][j+1]<='9')
r=16*(c[i][j+1]-'0');
else r=16*(c[i][j+1]-'A'+10);
if(c[i][j+2]>='0'&&c[i][j+2]<='9')
r=r+c[i][j+2]-'0';
else r=r+c[i][j+2]-'A'+10;
for(k=0;!(c[i][k]=='A'||k=='V');k++)
{
;
}
if(sum==r&&c[i][k]=='A')
{
time[3]=c[i][9],time[4]=c[i][10],time[6]=c[i][11],time[7]=c[i][12];
t=10*(c[i][7]-'0')+c[i][8]-'0';
t=(t+8)%24;
if(t<10)
{
time[0]='0',time[1]='0'+t;
}
else
{
time[1]=(t%10)+'0',time[0]=(t-t%10)/10 + '0';
}
}
}
}
for(i=0;i<8;i++)
{
printf("%c",time[i]);
}
return 0;
}
此題有參考討論區的朋友做出的解答,在此給予十分的感謝,同時討論區的同學做出的解答更好些,附上鏈接
討論區地址:
http://mooc.study.163.com/learn/ZJU-1000002011?tid=1000003007#/learn/forumdetail?pid=1000078086點擊打開鏈接
