程序設計入門——C語言 習題匯總


<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" />  

程序設計入門——C語言

翁愷

測驗與作業

次匯總由CSDN-fjinhao原創,轉載請注明來源,此匯總由於本人

能力有限,難免會些問題,歡迎各位程序愛好者來此討論交流,給予指正,本人

聯系郵箱fjinhao@qq.com,謝謝。


老師還沒有發布測試和作業,請耐心等待

第1周:計算

 

第1周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月4日 0:00
1
逆序的三位數 (5分)

題目內容:

逆序的三位數:


程序每次讀入一個正三位數,然后輸出逆序的數字。注意,當輸入的數字含有結尾的0時,輸出不應帶有前導的0。比如輸入700,輸出應該是7。


提示:用%10可以得到個位數,用/100可以得到百位數...。將這樣得到的三個數字合起來:百位*100+十位*10+個位,就得到了結果。


輸入格式:

每個測試是一個3位的正整數。


輸出格式:

輸出逆序的數。


輸入樣例:

123


輸出樣例:

321

時間限制:500ms 內存限制:32000kb
代碼參考:
#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周:判斷

 

第2周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月4日 0:00

1
時間換算 (5分)

題目內容:

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

時間限制:500ms 內存限制:32000kb
參考代碼:
# 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;
 }
2
信號報告 (5分)

題目內容:

無線電台的RS制信號報告是由三兩個部分組成的:

  • R(Readability) 信號可辨度即清晰度.

  • S(Strength)    信號強度即大小.

其中R位於報告第一位,共分5級,用1—5數字表示.

  1. Unreadable

  2. Barely readable, occasional words distinguishable

  3. Readable with considerable difficulty

  4. Readable with practically no difficulty

  5. Perfectly readable

報告第二位是S,共分九個級別,用1—9中的一位數字表示

  1. Faint signals, barely perceptible

  2. Very weak signals

  3. Weak signals

  4. Fair signals

  5. Fairly good signals

  6. Good signals

  7. Moderately strong signals

  8. Strong signals

  9. Extremely strong signals

現在,你的程序要讀入一個信號報告的數字,然后輸出對應的含義。如讀到59,則輸出:


Extremely strong signals, perfectly readable.


輸入格式:

一個整數,信號報告。整數的十位部分表示可辨度,個位部分表示強度。輸入的整數范圍是[11,59]中的個位不為0的數字,這個范圍外的數字不可能出現在測試數據中。


輸出格式:

一句話,表示這個信號報告的意義。按照題目中的文字,先輸出表示強度的文字,跟上逗號和空格,然后是表示可辨度的文字,跟上句號。注意可辨度的句子的第一個字母是小寫的。注意這里的標點符號都是英文的。


輸入樣例:

33


輸出樣例:

Weak signals, readable with considerable difficulty.

時間限制:500ms 內存限制:32000kb
參考代碼:
# 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周:循環

 

第3周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月4日 0:00

1
奇偶個數 (5分)

題目內容:

你的程序要讀入一系列正整數數據,輸入-1表示輸入結束,-1本身不是輸入的數據。程序輸出讀到的數據中的奇數和偶數的個數。


輸入格式:

一系列正整數,整數的范圍是(0,100000)。如果輸入-1則表示輸入結束。


輸出格式:

兩個整數,第一個整數表示讀入數據中的奇數的個數,第二個整數表示讀入數據中的偶數的個數。兩個整數之間以空格分隔。


輸入樣例:

9 3 4 2 5 7 -1 


輸出樣例:

4 2

時間限制:500ms 內存限制:32000kb
# 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;	
}

2
數字特征值 (5分)

題目內容:

對數字求特征值是常用的編碼算法,奇偶特征是一種簡單的特征值。對於一個整數,從個位開始對每一位數字編號,個位是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

時間限制:500ms 內存限制:32000kb
# 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周:循環控制

 

第4周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月4日 0:00
1
素數和 (5分)

題目內容:

我們認為2是第一個素數,3是第二個素數,5是第三個素數,依次類推。

現在,給定兩個整數n和m,0<n<=m<=200,你的程序要計算第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。


輸入格式:

兩個整數,第一個表示n,第二個表示m。


輸出格式:

一個整數,表示第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。


輸入樣例:

2 4


輸出樣例:

15

時間限制:500ms 內存限制:32000kb
#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; 
}
2
念整數 (5分)

題目內容:

你的程序要讀入一個整數,范圍是[-100000,100000]。然后,用漢語拼音將這個整數的每一位輸出出來。

如輸入1234,則輸出:

yi er san si

注意,每個字的拼音之間有一個空格,但是最后的字后面沒有空格。當遇到負數時,在輸出的開頭加上“fu”,如-2341輸出為:

fu er san si yi


輸入格式:

一個整數,范圍是[-100000,100000]。


輸出格式:

表示這個整數的每一位數字的漢語拼音,每一位數字的拼音之間以空格分隔,末尾沒有空格。


輸入樣例:

-30


輸出樣例:

fu san ling

時間限制:500ms 內存限制:32000kb
# 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周:數據類型

 

第一次單元測驗

截止時間:2015年5月4日 0:00
前往測驗
測驗得分:30.00分
截止時間
2015年5月4日 0:00
請務必在截止時間之前提交,截止時間后的提交不再計分
有效分數
30.00/30.00
你的每一次測驗系統都將為你計分,並提取 最高得分作為你的有效分數
有效提交次數
2/2

第一次單元測驗

返回
本次得分為: 30.00/30.00, 本次測試的提交時間為: 2015-03-31, 如果你認為本次測試成績不理想,你可以選擇 再做一次,也可以去 測驗作業討論區分享你的測試成績和想法。
1
單選(2分)
以下代碼片段的輸出是:

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.

    ***#

2
單選(2分)
下列程序段輸出結果為:
int x=1, y=012;
printf(“%d”,y*x++);
  • A.
    12
  • B.
    20
  • C.
    24
  • D.
    10
    2.00 /2.00
3
單選(2分)
以下哪個不是C語言的關鍵字?
  • A.
    include
    2.00 /2.00
  • B.
    int
  • C.
    if
  • D.
    for
4
單選(2分)
以下哪個直接量是十進制的124?
  • A.
    124d
  • B.
    0124
  • C.
    0x124
  • D.
    124
    2.00 /2.00
5
單選(2分)
對於以下代碼:
int i=6;
if ( i<= 6 ) 
printf("hello\n");;
else
printf("bye-bye\n");;
哪句話是對的?
  • A.
    打印出"hello"
  • B.
    無法編譯
    2.00 /2.00
  • C.
    打印出"hello bye-bye"
  • D.
    打印出"bye-bye"
6
單選(2分)
對於以下代碼:
int i,j=6;
以下哪句話是對的?
  • A.
    i不會被初始化,而j是6
    2.00 /2.00
  • B.
    i被初始為0,而j是6
  • C.
    i和j的初始值都是6
  • D.
    不能通過編譯
7
單選(2分)
對於以下代碼:
char ch = -1;
printf("%d\n", ch);

輸出結果是?
  • A.
    255
  • B.
    -1
    2.00 /2.00
  • C.
    編譯錯誤,因為賦值的時候類型不一致
  • D.
    編譯錯誤,因為賦值的時候不能把負數賦給char
8
單選(2分)
對於以下代碼:
int i=6;
do {
printf("%d", i--);
} while (0);
哪句話是對的?
  • A.
    打印不出東西
  • B.
    因為while(0),無法編譯
  • C.
    打印出6
    2.00 /2.00
  • D.
    打印出5
9
單選(2分)

對於以下代碼:

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沒有確定的值

10
單選(2分)
以下哪個for語句是錯誤的?
  • 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 (;;);
11
填空(2分)
表達式ch =‘B’+‘8’-‘3’表示的字符是:
2.00/2.00
12
填空(2分)
以下代碼的輸出是 _____.
int x=0, y=0, z=0;
z = (x==1) && (y=2);
printf("%d ", y);
2.00/2.00
13
填空(2分)
以下代碼段的結果是:
int i=10;
long long t = sizeof(i++);
printf("%d", i);
2.00/2.00
14
填空(2分)

表達式(double)(10/4*4) 的結果是_____

2.00/2.00
15
填空(2分)
以下代碼的輸出是 :
int i,x,y;i=x=y=0;do {++i;if ( i%2 ) x+=i, i++;y +=i++;} while ( i<=7 );printf("%d %d %d", i, x, y);
 

第5周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月5日 0:00

1
高精度小數 (10分)

題目內容:

由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就需要自己設計實現方法。

(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


時間限制:500ms 內存限制:32000kb
# 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周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月5日 0:00

1
分解質因數 (5分)

題目內容:

每個非素數(合數)都可以寫成幾個素數(也可稱為質數)相乘的形式,這幾個素數就都叫做這個合數的質因數。比如,6可以被分解為2x3,而24可以被分解為2x2x2x3。


現在,你的程序要讀入一個[2,100000]范圍內的整數,然后輸出它的質因數分解式;當讀到的就是素數時,輸出它本身。


提示:可以用一個函數來判斷某數是否是素數。


輸入格式:

一個整數,范圍在[2,100000]內。


輸出格式:

形如:

n=axbxcxd

n=n

所有的符號之間都沒有空格,x是小寫字母x。abcd這樣的數字一定是從小到大排列的。


輸入樣例:

18


輸出樣例:

18=2x3x3

時間限制:500ms 內存限制:32000kb

# 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;
}
2
完數 (5分)

題目內容:

一個正整數的因子是所有可以整除它的正整數。而一個數如果恰好等於除它本身外的因子之和,這個數就稱為完數。例如6=1+2+3(6的因子是1,2,3)。


現在,你要寫一個程序,讀入兩個正整數n和m(1<=n<m<1000),輸出[n,m]范圍內所有的完數。


提示:可以寫一個函數來判斷某個數是否是完數。


輸入格式:

兩個正整數,以空格分隔。


輸出格式:

其間所有的完數,以空格分隔,最后一個數字后面沒有空格。如果沒有,則輸出一行文字:

NIL

(輸出NIL三個大寫字母加回車)。


輸入樣例:

1 10


輸出樣例:

6

時間限制:500ms 內存限制:32000kb
# 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周:數組

 

第7周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月5日 0:00

1
多項式加法 (5分)

題目內容:

一個多項式可以表達為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

時間限制:500ms 內存限制:32000kb

#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;
}
2
鞍點 (5分)

題目內容:

給定一個n*n矩陣A。矩陣A的鞍點是一個位置(i,j),在該位置上的元素是第i行上的最大數,第j列上的最小數。一個矩陣A也可能沒有鞍點。

你的任務是找出A的鞍點。




輸入格式:

輸入的第1行是一個正整數n, (1<=n<=100),然后有n行,每一行有n個整數,同一行上兩個整數之間有一個或多個空格。


輸出格式:

對輸入的矩陣,如果找到鞍點,就輸出其下標。下標為兩個數字,第一個數字是行號,第二個數字是列號,均從0開始計數。

如果找不到,就輸出

NO

題目所給的數據保證了不會出現多個鞍點。


輸入樣例:

1 7 4 1 

4 8 3 6 

1 6 1 2 

0 7 8 9


輸出樣例:

2 1

時間限制:500ms 內存限制:32000kb

#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;
}


第八周:指針與字符串

 

第8周編程練習

截止時間:2015年5月4日 0:00
前往作業
作業類型
Online Judge作業
作業截止時間
2015年5月4日 0:00
成績公布時間
2015年5月5日 0:00

1
單詞長度 (4分)

題目內容:

你的程序要讀入一行文本,其中以空格分隔為若干個單詞,以‘.’結束。你要輸出這行文本中每個單詞的長度。這里的單詞與語言無關,可以包括各種符號,比如“it's”算一個單詞,長度為4。注意,行中可能出現連續的空格。


輸入格式:

輸入在一行中給出一行文本,以‘.’結束,結尾的句號不能計算在最后一個單詞的長度內。


輸出格式:

在一行中輸出這行文本對應的單詞的長度,每個長度之間以空格隔開,行末沒有最后的空格。


輸入樣例:

It's great to see you here.


輸出樣例:

4 5 2 3 3 4

時間限制:500ms 內存限制:32000kb
#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;
}
2
GPS數據處理 (6分)

題目內容:

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()
{
	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點擊打開鏈接





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM