1、C语言程序设计第3版何钦铭 颜 晖 第5章 函数第5章 函数【练习5-1】使用函数求1到n之和:输入一个正整数 n,输出1n之和。要求自定义和调用函数sum(n)求 1n 之和。若要计算 mn(mn)之和,又该如何定义函数?试编写相应程序。解答:#include int sum(int n);int main(void) int n; int sum; printf(Enter n:) scanf(%d, &n); printf(sum = %dn, sum(n);return 0;int sum(int n)int result, i;result = 0; for(i = 1; i = n
2、; i+) result = result + i; return result;若要计算 mn(mn)之和,则需要在 main()中定义 2 个变量 m 和 n: scanf(%d%d, &m, &n); printf(sum = %dn, sum(m, n);同时在函数定义时需设置 2 个形参:int sum(int m, int n)int result, i;result = 0; for(i = m; i = n; i+) result = result + i; return result;【练习5-2】使用函数找最大值: 输入2个数,输出其中较大的数。要求定义和调用函数 max(
3、a, b)找出并返回 a、b 中较大的数。试编写相应程序。解答:#include double max(double a, double b);int main(void) int a, b; printf(“Input a and b:”); scanf(%lf%lf,&a, &b); printf(max= %lfn, max(a, b);return 0;double max(double a, double b) if(a b) return a; else return b;【练习5-3】数字金字塔:输入一个正整数 n,输出n行数字金字塔。试编写相应程序。解答:#include in
4、t main(void) int n,i,j; printf(“Enter n:”); scanf(%d, &n); for(i = 1; i = n; i+) for(j = 1; j = n - i; j+) printf( ); for(j = 1; j = i; j+) printf(%d , i); putchar(n); return 0;【练习5-4】 思考:若把例 5-9 中静态变量 f 定义成普通局部变量,还能实现计算 n!吗?请上机检验。若把 f 换成全局变量又会如何?解答:若把例 5-9 中静态变量 f 定义成普通局部变量,无法实现计算 n!,因为函数返回后 f 单元被系
5、统回收,不再保存原有数据。若把 f 换成全局变量,则能实现计算 n!,因为 f 的作用范围和生命周期一直存在。习题5一、选择题1在 C 语言程序中,若对函数类型未加显式说明,则函数的隐含类型为 D 。Avoid Bdouble Cchar Dint 2下列程序的输出结果是 D 。fun(int a, int b, int c) c = a * b; int main(void) int c; fun(2, 3, c); printf(”%dn”, c);return 0;A0 B1 C6 D无法确定3建立自定义函数的目的之一是 B(优先)、C 。A提高程序的执行效率 B提高程序的可读性C减少程
6、序的篇幅 D减少程序文件所占内存4以下正确的函数定义形式是 A 。Adouble fun(int x, int y) Bdouble fun(int x; int y)Cdouble fun(int x, int y); Ddouble fun(int x, y)5以下不正确的说法是 C 。A实参可以是常量、变量或表达式C形参可以是常量、变量或表达式B实参可以是任何类型D形参应与对应的实参类型一致6以下正确的说法是 D 。A实参与其对应的形参共同占用一个存储单元B实参与其对应的形参各占用独立的存储单元C只有当实参与其对应的形参同名时才占用一个共同的存储单元D形参是虚拟的,不占用内存单元二、填空
7、题1下列程序的输出结果为 2357 。#include int fun3(int m);int main(void) int n; for (n = 1; n 10; n+) if (fun3(n) = 1) printf(%d , n); return 0;int fun3(int m) int i; if (m = 2 | m = 3) return 1; if (m 2 | |m % 2 = 0) return 0; for (i = 3; i m; i = i + 2) if (m % i = 0) return 0; return 1; 2输入若干个正整数,判断每个数从高位到低位各位
8、数字是否按值从小到大排列,请根据题意,将程序补充完整。#include int fun1( int m );int main(void) int n; scanf(%d, &n); while (n 0) if(fun1(n) printf(%d 中各位数字按从小到大排列n, n); scanf(%d, &n); int fun1( int m ) int k; k = m % 10; while(m) if( m / 10 % 10 k) return 0; else m = m/10 ; k = m % 10; return 1;3下列函数输出一行字符:先输出 kb 个空格,再输出 n 个
9、指定字符(由实参指定)。请根据题意,将程序补充完整。#include void print( int kb, int n, char zf ) int i; for(i = 1; i = kb; i+) printf(“ ”); for (i = 1; i = n; i+ ) printf(“%c”, zf);三、程序设计题1使用函数计算分段函数的值:输入 x,计算并输出下列分段函数 f(x) 的值。要求定义和调用函数 sign(x) 实现该分段函数。试编写相应程序。 1 x 0f(x)= 0 x 0-1 x 0解答:#include int main(void) int sign(int x
10、); int x, y;scanf(%d,&x); y = sign(x);printf(sign(%d) = %dn, x, y);return 0;int sign(int x) int y;if(x0) y=1;else if (x=0) y=0;else y=-1;return y;2使用函数求奇数和:输入一批正整数(以零或负数为结束标志),求其中的奇数和。要求定义和调用函数 even(n)判断数的奇偶性,当 n 为偶数时返回 1,否则返回 0。试编写相应程序。解答:#include int even(int n);int main(void) int n, sum; scanf(%d
11、,&n); sum = 0; while(n 0) if(even(n) = 0) sum = sum + n; scanf(%d, &n); printf(The sum of the odd numbers is %d.n, sum);return 0;int even(int n) int y; if (n % 2 = 0) y = 1; else y = 0; return y;3.使用函数计算两点间的距离:给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留2位小数)。要求定义和调用函数dist(x1,y1,x2,y2)计算两点之间的距离。试编写相应程序。解答
12、:#include#includedouble dist(double x1,double y1,double x2,double y2);int main(void) double x1,y1,x2,y2; printf(Enter x1 and y1:); scanf(%lf%lf,&x1,&y1); printf(Enter x2 and y2:); scanf(%lf%lf,&x2,&y2); printf(Distance=%.2lf,dist(x1,y1,x2,y2); return 0;double dist(double x1,double y1,double x2,doubl
13、e y2) double distance; distance=sqrt(pow(fabs(x2-x1),2)+pow(fabs(y2-y1),2); return distance;4利用函数计算素数个数并求和:输入两个正整数 m 和 n(1=m, n=500),统计并输出 m 和 n 之间的素数的个数以及这些素数的和。要求定义并调用函数 prime(m)判断 m 是否为素数。试编写相应程序。解答:#include#includeint prime(int m);int main(void) int m,n,sum,count; printf(Input m:); scanf(%d,&m);
14、 printf(Input n:); scanf(%d,&n); sum=0; count=0; for(;m=n;m+) if(prime(m)=1) sum=sum+m; count+; printf(%d和%d之间素数的个数:%dn,m,n,count); printf(%d和%d之间素数的和:%dn,m,n,sum); return 0;int prime(int m) int i; for(i=2;ih&m!=1)return 1;5.使用函数统计指定数字的个数:读 入 一 个 整 数 , 统 计 并 输 出 该 数 中“2” 的 个 数 。 要 求 定 义 并 调 用 函 数cou
15、ntdigit(number,digit),它的功能是统计整数 number 中数字 digit 的个数。例如,countdigit(12292,2)的返回值是 3。试编写相应程序。解答:#includeint countdigit(int number,int digit);int main(void) int number,digit; printf(Enter an integer:); scanf(%d,&number); printf(Number of digit ); scanf(%d,&digit); printf(:%d,countdigit(number,digit); r
16、eturn 0;int countdigit(int number,int digit) int a,count; if(number0) a=number; if(number%10=digit) count+; number=number/10; return count;6使用函数输出水仙花树:输入两个正整数 m 和 n(1=m,n=1000),输出 mn 之间所有满足各位数字的立方和等于它本身的数。要求定义并调用函数 is(number),判断number的各位数字之立方和是否等于它本身。试编写相应程序。解答:#includeint is(int number);int main(vo
17、id) int i, m, n; printf(Input m and n:); scanf(%d%d, &m, &n); printf(result:n); for(i = m; i = n; i+) if(is(i) != 0) printf(%dn, i);return 0;int is(int number) int digit, sum, temp; temp = number; sum = 0; while(temp != 0) digit = temp % 10; temp = temp / 10; sum = sum + digit * digit * digit; retur
18、n sum = number;7使用函数求余弦函数的近似值:输入精度e,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数 funcos(e, x)求余弦函数的近似值。试编写相应程序。cosx=x0/0!-x/2!+x4/4!-x6/6!+解答:#include#includedouble funcos(double e, double x);int main(void) double e, sum, x; printf(Input e and x:); scanf(%lf%lf,&e,&x); sum=funcos(e,x); printf(cos%lf=%lfn,x,sum); return 0;double funcos(double e,double x) int flag, i; double item, sum, tmp, power; flag=1; power=1; tmp=1; i=0; item=1; sum=0; while(fabs(item)=e) item=flag*power/tmp; sum=sum+item; power=power*x*x; tmp=tmp*(i+1)*(i+2); flag=-flag; i=i+2; return sum;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1