1. 程式人生 > 其它 >浙大版《C語言程式設計(第3版)》題目集 (8下)

浙大版《C語言程式設計(第3版)》題目集 (8下)

技術標籤:程式設計演算法c語言

習題8-1 拆分實數的整數與小數部分 (15 分)

本題要求實現一個拆分實數的整數與小數部分的簡單函式。

函式介面定義:

void splitfloat( float x, int *intpart, float *fracpart );

其中x是被拆分的實數(0≤x<10000),intpart和fracpart分別是將實數x拆分出來的整數部分與小數部分。

裁判測試程式樣例:

#include <stdio.h>

void splitfloat( float x, int *intpart, float *fracpart );

int
main() { float x, fracpart; int intpart; scanf("%f", &x); splitfloat(x, &intpart, &fracpart); printf("The integer part is %d\n", intpart); printf("The fractional part is %g\n", fracpart); return 0; }

補充程式碼:

void splitfloat( float
x, int *intpart, float *fracpart){ *intpart = (int)x; //將浮點型轉換取出整數 *fracpart = x- (*intpart); }

輸入樣例:

2.718

輸出樣例:

The integer part is 2

The fractional part is 0.718

習題8-2 在陣列中查詢指定元素 (15 分)

本題要求實現一個在陣列中查詢指定元素的簡單函式。

函式介面定義:

int search( int list[], int n, int x );

其中list[]是使用者傳入的陣列;n(≥0)是list[]中元素的個數;x是待查詢的元素。如果找到

則函式search返回相應元素的最小下標(下標從0開始),否則返回−1。

裁判測試程式樣例:

#include <stdio.h>
#define MAXN 10

int search( int list[], int n, int x );

int main()
{
    int i, index, n, x;
    int a[MAXN];

    scanf("%d", &n);
    for( i = 0; i < n; i++ )
        scanf("%d", &a[i]);
    scanf("%d", &x);
    index = search( a, n, x );
    if( index != -1 )
        printf("index = %d\n", index);
    else
        printf("Not found\n");

    return 0;
}

補充程式碼:

int search( int list[], int n, int x ){
	for(int i = 0;i<n;i++)
		if(list[i]==x) {
		  return i;
		  break;
		  }
	return -1;
}

輸入樣例1:

5

1 2 2 5 4

2

輸出樣例1:

index = 1

輸入樣例2:

5

1 2 2 5 4

0

輸出樣例2:

Not found

習題8-3 陣列迴圈右移 (20 分)

本題要求實現一個對陣列進行迴圈右移的簡單函式:一個數組a中存有n(>0)個整數,將每個整數迴圈向右移m(≥0)個位置,即將a中的資料由在這裡插入圖片描述

變換為在這裡插入圖片描述
(最後m個數迴圈移至最前面的m個位置)。

函式介面定義:

int ArrayShift( int a[], int n, int m );

其中a[]是使用者傳入的陣列;n是陣列的大小;m是右移的位數。函式ArrayShift須將迴圈右移後的陣列仍然存在a[]中。

裁判測試程式樣例:

#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

補充程式碼:

int ArrayShift( int a[], int n, int m ){
    m=m%n;
	int b[m],i,j;
	for(j=m-1,i=n-1;i>=0;i--){
	     if(i>n-m-1) {
		 b[j]=a[i];
		 j--;
	}
	     else a[i+m]=a[i];
	 }
	 for(i=0;i<m;i++) a[i]=b[i];
return 0;
} 

輸入樣例:

6 2

1 2 3 4 5 6

輸出樣例:

5 6 1 2 3 4

習題8-4 報數 (20 分)

報數遊戲是這樣的:有n個人圍成一圈,按順序從1到n編好號。從第一個人開始報數,報到m(<n)的人退出圈子;下一個人從1開始報數,報到m的人退出圈子。如此下去,直到留下最後一個人。

本題要求編寫函式,給出每個人的退出順序編號。

函式介面定義:

void CountOff( int n, int m, int out[] );

其中n是初始人數;m是遊戲規定的退出位次(保證為小於n的正整數)。函式CountOff將每個人的退出順序編號存在陣列out[]中。因為C語言陣列下標是從0開始的,所以第i個位置上的人是第out[i-1]個退出的。

裁判測試程式樣例:

#include <stdio.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
    int out[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    CountOff( n, m, out );   
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");

    return 0;
}

補充程式碼:

void CountOff( int n, int m, int out[] ){
	int i=0,j=0,k=0;
	for(;i<n;i++) out[i]=0;
    i=0;
	while(k!=n){
		if(out[i++]==0) j++;	
		if(j==m) {
			k++;
			out[i-1]=k;
			j=0;
		}
        i=i%n;
	}
}

輸入樣例:

11 3

輸出樣例:

4 10 1 7 5 2 11 9 3 6 8

習題8-5 使用函式實現字串部分複製 (20 分)

本題要求編寫函式,將輸入字串t中從第m個字元開始的全部字元複製到字串s中。

函式介面定義:

void strmcpy( char *t, int m, char *s );

函式strmcpy將輸入字串char *t中從第m個字元開始的全部字元複製到字串char *s中。若m超過輸入字串的長度,則結果字串應為空串。

裁判測試程式樣例:

#include <stdio.h>
#define MAXN 20

void strmcpy( char *t, int m, char *s ); void ReadString( char s[] ); /* 由裁判實現,略去不表 */

int main() {
    char t[MAXN], s[MAXN];
    int m;

    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s )## 標題;
    printf("%s\n", s);

    return 0; }

補充程式碼:

void strmcpy( char *t, int m, char *s ){
    int i,j;
    for(i=m-1,j=0;t[i]!='\0';i++) s[j++]=t[i];
    s[j]='\0';
}

輸入樣例:

7

happy new year

輸出樣例:

new year

習題8-6 刪除字元 (20 分)

本題要求實現一個刪除字串中的指定字元的簡單函式。

函式介面定義:

void delchar( char *str, char c );

其中char *str是傳入的字串,c是待刪除的字元。函式delchar的功能是將字串str中出現的所有c字元刪除。

裁判測試程式樣例:

#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c ); void ReadString( char s[] ); /* 由裁判實現,略去不表 */

int main() {
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);

    return 0; }

補充程式碼:

void delchar( char *str, char c ) {
	char *p;
	p = str;
	while ( *str ) {
		if ( *str != c )
			*p++ = *str;
		str++;
	}
}
 

輸入樣例:

a

happy new year

輸出樣例:

hppy new yer

習題8-8 判斷迴文字串 (20 分)

本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。

函式介面定義:

bool palindrome( char *s );

函式palindrome判斷輸入字串char *s是否為迴文。若是則返回true,否則返回false。

裁判測試程式樣例:

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

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
    char s[MAXN];

    scanf("%s", s);
    if ( palindrome(s)==true )
        printf("Yes\n");
    else
        printf("No\n");
    printf("%s\n", s);

    return 0;
}

補充程式碼:

bool palindrome( char *s )
{
	int n=strlen(s);
	if(n%2){
		for(int i=0,j=n-1;i<(n-1)/2;i++){
			if(s[i]!=s[j--]){
			    return false;
			    break;
		    } 
	    }
	}
	else{
		for(int i=0,j=n-1;i<n/2;i++){
			if(s[i]!=s[j--]){
			    return false;
			    break;
		    } 
	    }
	}
 return true;	
} 

輸入樣例1:

thisistrueurtsisiht

輸出樣例1:

Yes

thisistrueurtsisiht

輸入樣例2:

thisisnottrue

輸出樣例2:

No

thisisnottrue

習題8-9 分類統計各類字元個數 (15 分)

本題要求實現一個函式,統計給定字串中的大寫字母、小寫字母、空格、數字以及其它字元各有多少。

函式介面定義:

void StringCount( char *s );

其中 char *s 是使用者傳入的字串。函式StringCount須在一行內按照

大寫字母個數 小寫字母個數 空格個數 數字個數 其它字元個數
的格式輸出。

裁判測試程式樣例:

#include <stdio.h>
#define MAXS 15

void StringCount( char *s );
void ReadString( char *s ); /* 由裁判實現,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

補充程式碼:

void StringCount( char *s )
{
    int a,b,c,d,e;
    a=b=c=d=e=0;
    while(*s)
    {
        if('A'<=*s&&*s<='Z') a++;
        else if('a'<=*s&&*s<='z') b++;
        else if(*s==' ') c++;
        else if('0'<=*s&&*s<='9') d++;
        else e++;
        s++;
    }
    printf("%d %d %d %d %d\n",a,b,c,d,e);
}

輸入樣例:

aZ&*?

093 Az

輸出樣例:

2 2 1 3 4

經供參考***