浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案

你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题。
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

一、选择题
1.在 C 语言程序中,若对函数类型未加显式说明,则函数的隐含类型为( )。
A. void
B. double
C. char
D. int
答:D
解析:在不返回结果的函数定义中,void 不能省略;否则,函数类型被默认定义为 int 。
2.以下正确的说法是( )。
A.实参与其对应的形参共同占用一个存储单元
B.实参与其对应的形参各占用独立的存储单元
C.只有当实参与其对应的形参同名时才占用一个共同的存储单元
D.形参是虚拟的,不占用内存单元
答:B
解析:按照 C 语言的规定,在参数传递过程中,将实参的值复制给形参。所以他们各自占用独立的存储单元。
3.以下不正确的说法是( )。
A.实参可以是常量、变量或表达式
B.实参可以是任何类型
C.形参可以是常量、变量或表达式
D.形参应与对应的实参类型一致
答:B
解析:实参和形参一一对应,数量应相同,顺序应一致。实参可以是常量、变量或表达式。
4.在函数调用 Fume(exp1, exp2+exp3, exp4*exp5) 中,实参的数量是( )。
A.3
B.4
C.5
D.语法错误
答:A
【浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案】解析:参数使用逗号分割,所以题目中是3个参数。
5.下列程序的输出结果是( )。

fun(int a, int b, int c) { c = a * b; } int main(void) { int c; fun(2, 3, c); printf("%d\n", c); return 0; }

A.0
B.1
C.6
D.无法确定
答:D
解析:在 main() 中,变量 c 并没有初始值,因为它是局部变量,在没有初始化的时候,系统会分配随机值。在调用函数时,这里将数值 2,3,c 作为实参传递给形参 a,b,c。在函数中 c 的值为 a *b 是 6,但是不影响 main() 中变量 c 的值。main() 中的打印变量 c 的值,还是最初系统分配的那个随机值。
6.以下程序的运行结果是( )。
int x = 5, y = 6; void incxy() { x++; y++; } int main(void) { int x = 3; incxy(); printf("%d,%d\n", x, y); return 0; }

A.3,6
B.4,7
C.3,7
D.6,7
答:C
解析:
首先分析变量,第一行定义了两个变量 x 和 y ,值分别是 5 和 6 。这是两个全局变量。就是在所有的函数中都可以使用。然后是自定义函数 incxy() ,里面就 2 行代码,x++ 和 y++。然后是 main(),而实际上程序是从 mian() 函数开始执行,这里先定义了一个变量,也叫 x ,初始值为 3,然后调用自定义函数 incxy(),执行函数后,x 和 y 分别子增 1,这里的 x 和 y 也就是上面的全局变量,所以自定义函数执行结束后,全局变量 x 和 y 的值分别是 6 和 7 。自定义函数结束后,main() 继续向下执行,打印 x 和 y 的值,那么这个 x ,是哪个呢?根据 C 语言的规则,当一个函数中,局部变量和全局变量名相同的时候,那么函数中操作的是局部变量,所以打印的是 main() 里面定义的局部变量 x 的值为 3,而 y,在main() 没有定义,那么自然就是全局变量 y 值为 7。
二、填空题
1.下列程序的输出结果为( )。
int funp(int m); int main(void) { int n; for(n=1; n<10; n++) if(funp(n)==1)printf("%d#", n); return 0; } int funp( int m) { int i; if(m==2||m==3)return 1; if(m<2|| m%2==0)return 0; for(i=3; i

答:2#3#5#7#
解析:
main() 中主要就是一个 for 循环,变量 n 的值从 1 累加到 10后,结束循环。
第一次循环 n 为 1,循环条件成立,执行循环体,循环里是一个 if 语句,if 条件是一个函数调用 funp(),判断函数的返回值是否为 1。将 n 的值为 1,作为参数,传递给自定义函数,形参 m 的值就是 1。该函数中,当 m 的值为 1 时第一个 if 语句条件不成立, 第二个 if语句条件成立,因为 m < 2,函数返回 0。回到 main() 的循环中,if 语句的条件就不成立了。然后 n++,n的值为 2。
第二次循环 n 为 2,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 2。那么在自定义函数中 m 的值就是 2。第一个 if 语句条件成立,自定义函数返回值为 1。回到 main() 的循环中, if 语句的条件成立,打印 2#。然后 n++,n 的值为3。
第三次循环 n 为 3,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 3。那么在自定义函数中 m 的值就是 3。第一个 if 语句条件成立,自定义函数返回值为 1。回到 main() 的循环中, if 语句的条件成立,打印 3#。然后 n++,n 的值为4。
第四次循环 n 为 4,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 4。那么在自定义函数中 m 的值就是 4。第一个 if 语句条件不成立,第二个 if 语句条件成立,自定义函数返回值为 0。回到 main() 的循环中,if 语句的条件就不成立了。然后 n++,n的值为 5。
第五次循环 n 为 5,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 5。那么在自定义函数中 m 的值就是 5。第一个 if 语句条件不成立,第二个 if 语句条件也不成立,进入 for 循环,整个循环结束也没有返回值,那么执行最后的return 1。回到 main() 的循环中, if 语句的条件成立,打印 5#。然后 n++,n 的值为6。
往下依次类推。。。
2.判断正整数的各位数字是否按从小到大排列。输入一批正整数(以零或负数为结束标志),判断每个数从高位到低位的各位数字是否按值从小到大排列。要求定义和调用函数 fun( m) 判断 m 中各位数字是否按值从小是小到大排列,满足条件返回 1 ,否则返回 0。请填空。
_________________; int main(void) { int n; scanf("%d", &n); while (n > 0) { if (_________________) { printf("%d 中各位数字按从小到大排列\n", n); } else { printf("%d 中各位数字没有按从小到大排列\n", n); } scanf("%d", &n); } return 0; } int fun(_________________) { int cur_digit, old_digit = m % 10; while (m > 10) { _________________; cur_digit = m % 10; if (cur_digit >= old_digit) { return 0; } _________________; }return 1; }

答:
int fun(int m)
fun(n)
int m
m = m / 10
old_digit = cur_digit
解析:
因为函数的定义在下面,那首先需要函数声明,所以第一行先声明函数。在 main() 的 if 语句中调用函数。这个自定义函数是需要传入参数的,所以第三个空是定义参数 m。自定义函数里的思路就是循环获取数值的每个位上的数字,判断是否从小到大排序。
3.输出 Yes 或 No 。输入字符 'y' ,或 'Y' ,则在屏幕上输出字符串 "Yes. " ; 输入其他字符,则在屏幕上输出字符串 "No! " 。要求定义和调用函数 YesNo(ch) ,当 ch 为 'y' 或 'Y' 时输出 "Yes. " ,当 ch 为其他字符时输出 "No! " 。请填空。
void YesNo(_________________) { switch (ch) { case 'y': case 'Y': _________________ default: _________________ } } int main(void) { char ch; printf("Please input a character: \n"); ch = getchar(); _________________ return 0; }

答:
char ch
printf("Yes."); break;
printf("No!");
YesNo(ch);
解析:
自定义函数,主要是用来判断输入的字符是否是 y 或者 Y 的。所以需要通过参数传入,那么在定义函数的时候需要形参,所以第一个空是定义参数。然后进行判断字符是否是 y 或 Y。如果是打印 "Yes. ",其他的字符都打印 "No! ",那么写在 default 里就可以了。最后在 main() 中调用该函数。
三、程序设计题
题目1:使用函数计算分段函数的值:输入 x ,计算并输出下列分段函数 f(x) 的值。要求定义和调用函数 sign(x) 实现该分段函数。试编写相应程序。
$$ f(x)= \begin{cases} 1 & (x \gt 0) \\ 0 & (1 = 0) \\ -1 & (x \lt 0) \end{cases} $$
答案代码:
#include int sign(int x) { int f; if (x < 0) { f = -1; } else if (x > 0) { f = 1; } else f = 0; return f; } int main(void) { // 习题(5.3.1) /* 使用函数计算分段函数的值:输入 x ,计算并输出下列分段函数 f(x) 的值。 要求定义和调用函数 sign(x) 实现该分段函数。 */ int x, y; printf("input x:"); scanf("%d", &x); y = sign(x); printf("f(x) = %d\n", y); return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

题目2:使用函数求奇数和:输入一批正整数(以零或负数为结束标志),求其中的奇数和。要求定义和调用函数 even(n) 判断数的奇偶性,当 n 为偶数时返回 1 ,否则返回 0。试编写相应程序。
答案代码:
#include int even(int n) { if (n % 2 == 0) { return 1; } else return 0; } int main(void) { // 习题(5.3.2) /* 使用函数求奇数和:输入一批正整数(以零或负数为结束标志),求其中的奇数和。 要求定义和调用函数 even(n) 判断数的奇偶性,当 n 为偶数时返回 1 ,否则返回 0。 */ int n, sum = 0; printf("input n:\n"); while (n > 0) { scanf("%d", &n); if (even(n) == 0) //调用函数返回值为0时,奇数和。当even(n)==1时,偶数和。 { sum += n; } } printf("sum= %d\n", sum); return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

题目3:使用函数计算两点间的距离:给定平面任意两点坐标 (x1, y1) 和 (x2, y2) , 求这两点之间的距离 (保留 2 位小数) 。要求定义和调用函数 dist(x1, y1, x2, y2)计算两点间的距离。试编写相应程序。
答案代码:
#include #include double dist(double x1, double y1, double x2, double y2) { double s = 0; s = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)); return s; } int main(void) { // 习题(5.3.3) /* 使用函数计算两点间的距离:给定平面任意两点坐标 (x1, y1) 和 (x2, y2) , 求这两点之间的距离 (保留 2 位小数) 。 要求定义和调用函数 dist(x1, y1, x2, y2)计算两点间的距离。 */ double x1, y1, x2, y2, dis; printf("input x1,y1,x2,y2:"); scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2); dis = dist(x1, y1, x2, y2); printf("两点之间的距离是: %.2lf\n", dis); return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

题目4:利用函数计算素数个数并求和:输入两个正整数 m 和 n ( 1≤m, n≤500), 统计并输出 m 和 n 之间的素数的个数以及这些素数的和。要求定义并调用函数 prime(m) 判断 m 是否为素数。试编写相应程序。
答案代码:
#include #include //判断m是否为素数 int prime(int m) { int j; // 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。 if (m == 1) { return 0; } // 判断除 1 外的自然数 for (j = 2; j <= sqrt(m); j++) { if (m % j == 0) { return 0; } } return 1; } int main(void) { // 习题(5.5.4) /* 利用函数计算素数个数并求和:输入两个正整数 m 和 n ( 1≤m, n≤500), 统计并输出 m 和 n 之间的素数的个数以及这些素数的和。 要求定义并调用函数 prime(m) 判断 m 是否为素数。 */ int m = 1, n = 100, i, sum = 0, count = 0; printf("input m,n(m>=1,n<=500):"); scanf("%d%d", &m, &n); for (i = m; i <= n; i++) //将i的值传到自定义函数里 { if (prime(i) == 1) { sum += i; count++; } } printf("%d~%d 之间的素数个数为 %d,和为 %d\n", m, n, count, sum); return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

题目5:使用函数统计指定数字的个数:读入一个整数,统计并输出该数中 “2” 的个数。要求定义并调用函数 countdigit( number, digit),它的功能是统计整数 number 中数字 digit 的个数。例如,countdigit( 12 292, 2) 的返回值是 3 。试编写相应程序。
答案代码:
#include int countdigit(int number, int digit) { int count = 0; while (number > 0) { if (number % 10 == 2) { count++; } number = number / 10; } return count; } int main(void) { // 习题(5.3.5) /* 使用函数统计指定数字的个数:读入一个整数,统计并输出该数中 “2”的个数。 要求定义并调用函数 countdigit( number, digit),它的功能是统计整数 number 中数字 digit 的个数。 例如,countdigit( 12 292, 2) 的返回值是 3 。 */ int number, digit = 2, count; printf("input number:"); scanf("%d", &number); count = countdigit(number, digit); printf("%d 中的 %d 的个数为 %d\n", number, digit, count); return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

题目6:使用函数输出水仙花数:输入两个正格数 m 和 n (1≤m, n≤1000) 输出 m~n 之间的所有满足各位数字的立方和等于它本身的数。要求定义并调用函数 is(number) 判断 number 的各位数字之立方和是否等于它本身。试编写相应程序。
答案代码:
#include #include int is(int number) { int x, sum, y; y = number; sum = 0; do { x = y % 10; sum += pow(x, 3); y = y / 10; } while (y > 0); if (sum == number) { return sum; } else return 0; } int main(void) { // 习题(5.5.6) /* 使用函数输出水仙花数:输入两个正格数 m 和 n (1≤m, n≤1000) 输出 m~n 之间的所有满足各位数字的立方和等于它本身的数。 要求定义并调用函数 is(number) 判断 number 的各位数字之立方和是否等于它本身。 */ int m, n, i, result = 0; printf("input m,n(m>=1,n<=1000):"); scanf("%d%d", &m, &n); for (i = m; i <= n; i++) { result = is(i); if (result >= m && result <= n) { printf("%d\n", result); } }return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

题目7:使用函数求余弦函数的近似值:输入精度口,用下列公式求 cosx 的近似值,精确到最后项的绝对值小于 e 。 要求定义和调用函数 funcos(e,x) 求余弦函数的近似值。试编写相应程序。
$$ cosx = \frac{x^0}{0!}-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+... $$
答案代码:
#include #include double fact(int n) { int i; double f = 1; for (i = 1; i <= n; i++) { f *= i; } return f; } double fumcos(double e, double x) { int flag = 1, i = 0; double cosx = 0, item = 1; // item 必须为1,才能进while循环 。cosx为0,则直接从第一项开始累加 while (fabs(item) >= e) { item = flag * pow(x, i) / fact(i); cosx += item; i += 2; flag = -flag; } cosx += item; return cosx; } int main(void) { // 习题(5.5.7) /* 使用函数求余弦函数的近似值:输入精度口,用下列公式求 cosx 的近似值,精确到最后项的绝对值小于 e 。 要求定义和调用函数 funcos(e,x) 求余弦函数的近似值。 */ double e, x, sum; printf("input e,x:"); scanf("%lf%lf", &e, &x); sum = fumcos(e, x); printf("cosx = %lf\n", sum); return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

题目8:输入一个正整数 n ,输出 n 行空心的数字金字塔。要求定义和调用晒数hollow_pyramid(n) 输出 n 行空心的数字金字塔。当 n=5 时,5 行空心的数字金字塔如下所示。
1 2 2 33 44 555555555

答案代码:
#include void hollow_pyramid(int n) { int i, j; for (i = 1; i < n; i++) //共n-1行 { for (j = 1; j <= n - i; j++) //上三角空格 { printf(" "); } printf("%d", i); //左斜下数字,只打印一个数字,不用在内循环里 if (i == 1) { printf("\n"); continue; } for (j = 1; j <= 2 * (i - 1) - 1; j++) //中间三角空格 .i=2时,j=1;i=3时,j=3 { printf(" "); } printf("%d", i); //右斜下数字 printf("\n"); } for (j = 1; j <= 2 * n - 1; j++) //底层数字 { printf("%d", n); } printf("\n"); } int main(void) { // 习题(5.3.8) /* 输入一个正整数 n ,输出 n 行空心的数字金字塔。 要求定义和调用晒数hollow_pyramid(n) 输出 n 行空心的数字金字塔。 */ int n; printf("input n:"); scanf("%d", &n); hollow_pyramid(n); return 0; }

运行结果:
浙大版《C语言程序设计》第四版(何钦铭颜晖) 第5章 函数 课后习题答案
文章图片

    推荐阅读