第10章函数与程序结构【练习10-1】使用递归函数计算1到n之和:若要用递归函数计算sum=1+2+3+…+n(n为正整数),请写出该递归函数的递归式子及递归出口。
试编写相应程序。
解答:递归式子: sum(i) = sum(i-1) + i;递归出口: sum(i) = 0;【练习10-2】请完成下列宏定义:① MIN(a,b) 求 a,b 的最小值② ISLOWER(c) 判断 c 是否为小写字母③ ISLEAP(y) 判断 y 是否为闰年④ CIRFER(r) 计算半径为 r 的圆周长解答:① MIN(a, b):求a,b的最小值。
#define MIN(a,b) (a<b) a: b② ISLOWER(c):判断c是否为小写字母。
#define ISLOWER(c) (c>='a'&&c<='z')③ ISLEAP(y):判断y是否为闰年。
#define ISLEAP(y) (y%4==0&&y%100!=0)||y%400==0)④ CIRFER(r):计算半径为r的圆周长。
#define PI#define CIRFER(r) 2*PI*(r)【练习10-3】分别用函数和带参宏实现从 3 个数中找出最大数,请比较两者在形式上和使用上的区别。
解答:(1)函数实现int max(int x,int y,int z){int t;if(x>=y)if(x>=z) t=x;else t=z;elseif(y>=z) t=y;else t=z;return t;}(2)宏实现#define MAX( x, y, z ) x>=y (x>=z x:z) : (y>=z y:z)两者在定义形式上完全不同。
使用上函数是在执行时,从主调函数转到函数 max(),然后再返回到主调函数,函数体始终存在;而宏是在编译预处理时,用条件表达式去替换MAX(int x, int y, int z ),等程序执行时,执行的是条件表达式,而不再存在 MAX(int x, int y,int z )的式子。
习题10一、选择题1.要调用数学函数时,在#include 命令行中应包含 C 。
A.”” B.”” C.”” D.””2.对于以下递归函数 f,调用 f(4),其返回值为 A 。
int f(int n){ if (n) return f(n - 1) + n;else return n;}A.10 B.4 C.0 D.以上均不是3.执行下列程序:#define MA(x, y) ( x*y )i = 5;i = MA(i, i + 1) – 7;后变量 i 的值应为 B 。
A.30 B.19 C.23 D.14.宏定义“#define DIV(a, b) a/b”,经 DIV(x + 5, y - 5) 引用,替换展开后是 A 。
A.x + 5 / y - 5 B.(x + 5 / y – 5)C.(x + 5) / (y - 5) D.(x + 5) / (y - 5);5.定义带参数的宏“#define JH(a,b,t) t = a; a = b; b = t”,对两个参数a、b 的值进行交换,下列表述中哪个是正确的 C 。
A.不定义参数a和b将导致编译错误 B.不定义参数a、b、t将导致编译错误C.不定义参数 t 将导致运行错误 D.不需要定义参数 a、b、t 类型6.执行下面程序,正确的输出是 A 。
int x = 5, y = 7;void swap ( ){ int z ;z = x ; x = y ; y = z ;}int main(void){int x = 3, y = 8;swap ( ) ;printf ( " %d , %d \n", x , y ) ;return 0 ;}A.3, 8 B.8, 3 C.5, 7 D.7, 57.下面说法中正确的是 A 。
A.若全局变量仅在单个 C 文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题D.静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出二、填空题语言的编译预处理功能主要包括_条件编译_、_宏定义_和_文件包含_。
2.执行完下列语句段后, i 的值为 5 。
int i;int f(int x){return ((x>0) f(x-1)+f(x-2):1);}i=f(3);3.下列程序段 A 与 B 功能等价,请填写程序段 B 中相应语句。
程序段A:int f( int n ){ if(n<=1)return n;elsereturn f(n-1)+f(n-2);}程序B:int f( int n ){ _int t, t0, t1;_t0=0; t1=1; t=n;while ( _n>1_ ){t = _t0+t1_;t0 = t1;t1 = t;n - -;}return _t;_}5.下面程序用于计算 f(k , n)=1k+2k+…+n k,其中 power(m , n )求 m n。
请填写程序中相应语句。
# include <>int power(int m , int n){ int i ;int p=1;for( i=1 ; i<=n ; i++)p = p * m ;return p ;}int f(int k , int n){int i ;int s=0 ;for( i=1 ; i<=n ; i++)s = s + power(i, k) ;return s ;}int main(void){ int k , n ;scanf(“%d%d”, &k, &n ) ;printf(“f(%d, %d)=%ld” , k, n, f(k, n)) ;return 0;}5.下列递归程序的输出结果为 g=4,g=3,k=6 。
#include <>int fib(int g){ switch(g){case 0: return 0;case 1:case 2: return 2;}printf("g=%d,", g);return fib(g-1) + fib(g-2);}int main(void){int k;k = fib(4);printf("k=%ld\n", k);return 0;}6.下列语句的运算结果为_7,-13____。
#define F(x) x - 2#define D(x) x * F(x)printf("%d,%d", D(3), D(D(3))) ;三、程序设计题1.判断满足条件的三位数:编写一个函数,利用参数传入一个 3 位数 n,找出101~n 间所有满足下列两个条件的数:它是完全平方数,又有两位数字相同,如 144、676 等,函数返回找出这样的数据的个数。
试编写相应程序。
解答:#include<>#include<>int fun(int n);int main(void){int n;printf("Input n: ");scanf("%d",&n);printf("total=%d\n",fun(n));return 0;}int fun(int n){int i,d=0;for(i=101;i<=n;i++)if(((int)sqrt(i)*(int)sqrt(i))==i){if(i/100==(i/10)%10||i/100==i%10||(i/10)%10==i%10)d++;}return d;}2.递归求阶乘和:输入一个整数n(n>0且n<=10),求1!+2!+3!+……n!。
定义并调用函数fact(n)计算n!,函数类型是double。
试编写相应程序。
解答:#include<>double fact(int n);int main(void){int n;printf("Input n:");scanf("%d",&n);printf("1~%d的阶乘和:%.0lf",n,fact(n));return 0;}double fact(int n){int i;double result=1;if(n==1)result=1;else{for(i=1;i<=n;i++)result=result*i;result=result+fact(n-1);}return result;}3.递归实现计算xⁿ:输入实数x和正整数n,用递归函数计算xⁿ的值。
试编写相应程序。
解答:#include<>double power(double x,int n);int main(void){double x;int n;printf("Input x:");scanf("%lf",&x);printf("Input n:");scanf("%d",&n);printf("%lf的%d次方=%lf",x,n,power(x,n));return 0;}double power(double x,int n){double result;if(n==1)result=x;elseresult=x*power(x,(n-1));return result;}4.递归求式子和:输入实数x和正整数n,用递归的方法对下列计算式子编写一个函数。
f(x , n) = x-x²+x³-x4+… + (-1)n-1xⁿ(n>0)试编写相应程序。
解答:#include<>#include<>double f(double x,int n);int main(void){int n;double x;printf("Input x:");scanf("%lf",&x);printf("Input n:");scanf("%d",&n);printf("f(%lf,%d)=%lf\n",x,n,f(x,n));return 0;}double f(double x, int n){if(n==1)return x;elsereturn pow(-1,n-1)*pow(x,n)+f(x,n-1);}5.递归计算函数ack(m,n):输入m和n。