10  函数与程序结构
【练习10-1】使用递归函数计算1n之和:若要用递归函数计算 sum=1+2+3++nn为正整数),请写出该递归函数的递归式子及递归出口。试编写相应程序。
解答:
递归式子: 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 的圆周长
解答:
1 MIN(a, b):求a,b的最小值。
#define MIN(a,b)  (a<b)? a: b
2 ISLOWER(c):判断c是否为小写字母。
#define  ISLOWER(c)    (c>='a'&&c<='z')
3 ISLEAP(y):判断y是否为闰年。
#define ISLEAP(y)    (y%4==0&&y%100!=0)||y%400==0)
4 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;
}
A10            B4              C0            D.以上均不是
3.执行下列程序:
              #define MA(x, y)    ( x*y )
              i = 5;
              i = MA(i, i + 1) – 7;
后变量 i 的值应为      B   
A30                  B19                  C23                    D1
4.宏定义“#define DIV(a, b) a/b”,经 DIV(x + 5, y - 5)  引用,替换展开后是    A     
Ax + 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”,对两个参数 ab 的值进行交换,下
列表述中哪个是正确的    C     
A.不定义参数ab将导致编译错误 B.不定义参数abt将导致编译错误
C.不定义参数 t 将导致运行错误    D.不需要定义参数 abt 类型
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 ;
}
A3, 8          B8, 3          C5, 7            D7, 5
7.下面说法中正确的是    A     
A.若全局变量仅在单个 C 文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题
D.静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出
2、填空题
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;_
}
5.下面程序用于计算  f(k , n)=1k+2k++nc++判断素数k,其中 power(m , n ) mn。请填写程序中相应语句。
# include <stdio.h>
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 <stdio.h>
int fib(int g)
{    switch(g){
                case 0: return 0;
                case 1:
                case 2: return 2;
        }
        printf("g=%d,", g);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。