浙大版《C語言程式設計(第3版)》題目集 (8下)
習題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
經供參考***