8.3 练习与习题答案
8.3.2 习题参考答案
8.3.2 习题参考答案
一 、 选 择 题
1 2 3 4 5
B A C B A
二 、 填 空 题
1. __ (i<*n)__ __ j>=i __ __ a[j+1]__ ___x___
2. ___ s___ ___p++___ ___s+n-1__ __q--___ __p<q__ __q--___
3. _a, 10, &max, &min_ __*max=i__ __*min=i_
4. 0 0 1 2 2 4 0 0 2 3 4 6
三 、 程 序 设 计 题
1. 拆分实数的整数与小数部分:要求自定义一个函数 void splitfloat(float x, int
*intpart, float *fracpart),其中 x 是被拆分的实数,*intpart 和*fracpart 分别是将实 数 x 拆分出来的整数部分与小数部分。编写主函数,并在其中调用函数 splitfloat()。试 编写相应程序。
解答:
#include <stdio.h>
void splitfloat(float x, int *intpart, float *fracpart) {
*intpart = (int) x;
*fracpart = x - *intpart;
}
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;
}
2. 在数组中查找指定元素:输入一个正整数 n (1<n<=10),然后输入 n 个整数存入数组 a 中,再输入一个整数 x,在数组 a 中查找 x,若找到则输出相应的下标,否则显示“Not found”。
要求定义和调用函数 search(int list[ ],int n,int x),在数组 list 中查找元素 x,
若找到则返回相应下标,否则返回-1,参数 n 代表数组 list 中元素的数量。试编写相应程 序。
解答:
#include <stdio.h>
int main(void) {
int i, n, res, x;
int a[10];
int search(int list[], int n, int x);
scanf("%d", &n);
for(i = 0; i < n; i++) scanf("%d", &a[i]);
scanf("%d", &x);
res = search(a, n, x);
if(res != -1)
printf("index = %d\n", res);
else
printf("Not found\n");
}
int search(int list[], int n, int x) {
int i;
for(i = 0; i < n; i++) if(list[i] == x) return i;
return -1;
}
3. 循环后移:有 n 个整数,使前面各数顺序向后移 m 个位置,移出的数再从开头移入。编 写一个函数实现以上功能,在主函数中输入 n 个整数并输出调整后的 n 个数。试编写相应程 序。
解答:
#include <stdio.h>
void mov(int *x, int n, int m);
int main(void) {
int i, m, n;
int a[80];
scanf("%d%d", &n, &m);
for(i = 0; i < n; i++) scanf("%d", &a[i]);
mov(a, n, m);
printf("After move: ");
for(i = 0; i < n; i++) printf("%d ", a[i]);
printf("\n");
}
/*函数 mov(x,n,m) 实现循环移动的功能,函数形参 x 的类型是整型指针,形参 n 和 m 的类 型是int,函数的类型是 void。*/
void mov(int *x, int n, int m) {
int i, j, k;
for(i = 1; i <= m; i++){
k = x[n-1];
for(j = n - 1; j > 0; j--) x[j] = x[j-1];
x[0] = k;
} }
4. 报数:有 n 个人围成一圈,按顺序从 1 到 n 编好号。从第一个人开始报数,报到 m(m<n)
的人退出圈子,下一个人从 1 开始报数,报到 m 的人退出圈子。如此下去,直到留下最后一 个人。输入整数 n 和 m,并按退出顺序输出退出圈子的人的编号。试编写相应程序。
解答:
#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,count, no,num[MAXN];
int *p=num;
count = no = 0;
for(i = 0; i < n; i++) num[i] = i + 1;
while(no < n-1){
if(*p != 0) count++;
if(count == m){
no++;
out[no-1]= *p;
*p = 0;
count = 0;
} p++;
if(p == num + n) p = num;
} p = num;
while(*p == 0) p++;
out[no]= *p;
}
5. 使用函数实现字符串复制:输入一个字符串 t 和一个正整数 m,将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,再输出字符串 s。要求自定义并调用函数 void strmcpy(char *s, char *t, int m)。试编写相应程序。
解答:
#include<stdio.h>
#include<string.h>
void main() {
char s[80], t[80];
int m;
void strmcpy(char *s, char *t, int m);
gets(t);
scanf("%d", &m);
getchar();
if(strlen(t) < m)
printf("error input");
else{
strmcpy(s, t, m);
puts(s);
} }
void strmcpy(char *s, char *t, int m) {
t = t + m - 1;
while(*t != '\0'){
*s = *t;
s++;
t++;
} *s = '\0';
}
6. 删除字符: 输入一个字符串,再输入一个字符 ch,将字符串中所有的 ch 字符删除后输 出该字符串。要求定义和调用函数 delchar(s,c),该函数将字符串 s 中出现的所有 c 字符 删除。试编写相应程序。
解答:
#include<stdio.h>
void main() {
char c;
char str[80];
void delchar(char *str, char c);
gets(str);
scanf("%c", &c);
getchar();
delchar(str, c);
printf("result: ");
puts(str);
}
void delchar(char *str, char c) {
int i, j;
i = j = 0;
while(str[i] != '\0'){
if(str[i] != c){
str[j] = str[i];
j++;
} i++;
}
str[j] = '\0';
}
7. 字符串排序:输入 5 个字符串,按由小到大的顺序输出。试编写相应程序。
解答:
#include <stdio.h>
#include <string.h>
int main( ) {
int i, j, index;
char sx[5][80], stemp[80];
for(i=0;i<5;i++) scanf("%s", sx[i]);
for(i=0; i<4; i++){
index=i;
for(j=i+1;j<5;j++)
if (strcmp(sx[j],sx[index])<0) index=j;
strcpy(stemp,sx[i]);
strcpy(sx[i],sx[index]);
strcpy(sx[index],stemp);
}
printf("After sorted:\n");
for (i=0;i<5;i++) puts(sx[i]);
return 0;
}
8. 判断回文:判断输入的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样 的字符串。如“XYZYX”和“xyzzyx”都是回文。试编写相应程序。
解答:
#include <stdio.h>
void main() {
char s[80];
int mirror(char *p);
gets(s);
if(mirror(s) != 0) printf("YES\n");
else
printf("NO\n");
}
int mirror(char *p) {
char *q;
q = p;
while(*q != '\0') q++;
q--;
while(p < q){
if(*p != *q) return 0;
p++;
q--;
}
return 1;
}
9. 分类统计字符个数:输入一行文字,统计其中的大写字母、小写字母、空格、数字以及 其他字符各有多少。试编写相应程序。
解答:
#include<stdio.h>
void main() {
char s[80];
char *p;
int blank, digit, lower, other, upper;
gets(s);
upper = lower = blank = digit = other = 0;
for(p = s; *p != '\0'; p++) if(*p >= 'A' && *p <= 'Z') upper++;
else if(*p >= 'a' && *p <= 'z') lower++;
else if(*p >= '0' && *p <= '9') digit++;
else if(*p == ' ') blank++;
else
other++;
printf("upper: %d lower: %d blank: %d digit: %d other: %d\n", upper, lower, blank, digit, other);
}
10. (选做)输出学生成绩(动态分配):输入学生人数后输入每个学生的成绩,最后输出 学生的平均成绩、最高成绩和最低成绩。要求使用动态内存分配来实现。试编写相应程序。
解答:
# include <stdio.h>
# include <stdlib.h>
int main ( ) {
int n, i;
float *p, sum, max, min, avg;
printf("input students’ number n: ");
scanf("%d", &n);
/*为数组 p 动态分配 n 个浮点数 float 类型大小的空间 */
if ((p=(float *)calloc(n, sizeof(float))) == NULL) { printf("Not able to allocate memory. \n");
exit(1);
}
sum=0.0;
max=-1; /*初始化 */
min=1000;
printf("input %d students’ scores: ", n); /* 提示输入 n 个整数 */
for (i = 0; i < n; i++){
scanf("%f", p+i);
sum=sum+*(p+i);
if (min>*(p+i)) min=*(p+i);
if (max<*(p+i)) max=*(p+i);
}
avg=sum/n;
printf("The avg is %f, max is %f, min is %f\n",avg,max,min);
free(p); /* 释放动态分配的空间 */
return 0;
}