第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
② ISLOWER(c):判断c是否为小写字母。
#define ISLOWER(c) (c>='a'&&c<='z') ③ ISLEAP(y):判断y是否为闰年。
#define ISLEAP(y) (y%4==0&&y0!=0)||y@0==0) ④ CIRFER(r):计算半径为r的圆周长。
#define PI 3.14159
#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; else
if(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.”stdio.h” B.”string.h” C.”math.h” D.”ctype.h”
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.1
4.宏定义“#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 ( \return 0 ; }
A.3, 8 B.8, 3 C.5, 7 D.7, 5
7.下面说法中正确的是 A 。 A.若全局变量仅在单个 C 文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题
D.静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出
二、填空题
1.C语言的编译预处理功能主要包括_条件编译_、_宏定义_和_文件包含_。 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; else
return 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;_ }
kkkn
5.下面程序用于计算 f(k , n)=1+2+…+n,其中 power(m , n )求 m。请填写程序中相应语句。 # 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
case 0: return 0; case 1:
case 2: return 2; }
printf(\
return fib(g-1) + fib(g-2); }
int main(void) {
int k;
k = fib(4);
printf(\ return 0; }
6.下列语句的运算结果为_7,-13____。 #define F(x) x - 2 #define D(x) x * F(x)
printf(\三、程序设计题
1.判断满足条件的三位数:编写一个函数,利用参数传入一个 3 位数 n,找出 101~n 间所有满足下列两个条件的数:它是完全平方数,又有两位数字相同,如 144、676 等,函数返回找出这样的数据的个数。试编写相应程序。 解答:
#include
int n;
printf(\ scanf(\
printf(\
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)||i/100==i||(i/10)==i) d++; }
return d; }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C语言程序设计(第3版)何钦铭 颜 晖 第10章 函数与程序结构在线全文阅读。
相关推荐: