• 沒有找到結果。

习题参考答案

在文檔中 第 8 章 指针 (頁 27-34)

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;

}

在文檔中 第 8 章 指针 (頁 27-34)

相關文件