c语言中fint_max_i,C语言程序设计(第3版)何钦铭-颜-晖-第10章--函数与程序结构.doc...

44cb7578e1df5412b94317daaa3307ba.gifC语言程序设计(第3版)何钦铭-颜-晖-第10章--函数与程序结构.doc

下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。

2.下载的文档,不会出现我们的网址水印。

3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。

文档包含非法信息?点此举报后获取现金奖励!

下载文档到电脑,查找使用更方便

15

积分

还剩页未读,继续阅读

关 键 词:语言程序设计

10

函数

程序结构

资源描述:

第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=a&&c<=z)

③ ISLEAP(y):判断y是否为闰年。

#define ISLEAP(y) (y%4==0&&y%100!=0)||y%400==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 ( " %d , %d \n", x , y ) ;

return 0 ;

}

A.3, 8 B.8, 3 C.5, 7 D.7, 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+…+nk,其中 power(m , n )求 mn。请填写程序中相应语句。

# 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#includeint 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。试编写相应程序。

解答:

#includedouble 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ⁿ的值。试编写相应程序。

解答:

#includedouble 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;

else

result=x*power(x,(n-1));

return result;

}

4.递归求式子和:输入实数x和正整数n,用递归的方法对下列计算式子编写一个函数。

f(x , n) = x-x+x-x4+… + (-1)n-1xⁿ(n>0)

试编写相应程序。

解答:

#include#includedouble 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;

else

return pow(-1,n-1)*pow(x,n)+f(x,n-1);

}

5. 递归计算函数ack(m,n):输入m和n。编写递归函数计算Ackermenn函数的值:

n+1 m=0

ack(m,n)= ack(m-1,1) n=0&&m>0

ack(m-1,ack(m,n-1)) m>0&&n>0

试编写相应程序。

解答:

#includeint Ack(int m,int n);

int main(void)

{

int m,n;

int result;

scanf("%d%d", &m, &n);

result=Ack(m,n);

printf("Ackerman(%d,%d)=%d\n",m,n,result);

return 0;

}

int Ack(int m, int n)

{

if (m==0) return n+1;

else if(n==0&&m>0)

return Ack(m-1,1);

else if(m>0&&n>0)

return Ack(m-1,Ack(m,n-1));

}

6. 递归实现求Fabonacci数列:用递归方法编写求斐波那契数列的函数,函数类型为整型,并写出相应主函数。斐波那契数列的定义如下。试编写相应程序。

f(n) = f(n - 2) + f(n - 1)(n>1)其中 f(0) = 0,f(1) = 1。

解答:

#includelong fib(int n);

int main(void)

{

int n;

printf("Enter n:");

scanf("%d",&n);

printf("fib(%d)=%ld\n",n,fib(n));

return 0;

}

long fib(int n)

{

long res;

if(n==0) res=0;

else if(n==1)

res=1;

else

res=fib(n-2)+fib(n-1);

return res;

}

7. 递归实现十进制转换二进制:输入一个正整数n,将其转换为二进制输出。要求定义并调用函数dectobini(n),它的功能是输出n的二进制。试编写相应程序。

解答:

#includeint dectobini(int n);

int main(void)

{

int n;

printf("Input n(十进制整数):");

scanf("%d",&n);

printf("输出二进制:%d",dectobini(n));

return 0;

}

int dectobini(int n)

{

int result;

if(n==0)

result=0;

else

result=dectobini(n/2)*10+n%2;

return result;

}

8.递归实现顺序输出整数:输入一个正整数n,编写递归函数实现对其进行按位顺序输出的递归函数。试编写相应程序。

解答:

#include int inorder(int n);

int main(void)

{

int n;

printf("Input n:");

scanf("%d",&n);

printf("按位顺序输出:%d\n",inorder(n));

return 0;

}

int inorder(int n)

{

if(n<10) return n;

else

return(inorder(n/10)*10+n%10);

}

9. 输入n(n<10)个整数,统计其中素数的个数。要求程序有两个文件组成,一个文件中编写main函数,另一个文件中编写素数判断的函数。使用文件包含的方式实现。试编写相应程序。

解答:

10.三角形面积为:

area = s=(a+b+c)/2

其中a、b、c 分别是三角形的 3 条边。请分别定义计算 s 和 area 的宏。再使用函数实现,比较两者在形式上和使用上的区别。

解答:

(1) 使用宏实现

#include #include #define S(a ,b, c) ((a)+(b)+(c))/2

#define AREA(s,a,b,c) sqrt((s)*((s)-(a))*((s)-(b))*((s)-(c)))

int main(void)

{

double a, b, c, s;

printf("input a, b, c: ");

scanf("%lf%lf%lf", &a, &b, &c);

s = S(a,b,c);

printf("s = %lf, area = %lf\n", s, AREA(s,a,b,c));

return 0;

}

(2) 使用函数实现

#include #include double f1(double a, double b, double c)

{

return (a+b+c)/2;

}

double f2(double s, double a, double b, double c)

{

return sqrt(s*(s-a)*(s-b)*(s-c));

}

int main(void)

{

double a, b, c, s;

printf("input a, b, c: ");

scanf("%lf%lf%lf", &a, &b, &c);

s = f1(a,b,c);

printf("s = %lf, area = %lf\n", s, f2(s,a,b,c));

return 0;

}

展开阅读全文

温馨提示:

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。

2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。

3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。

4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。

5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。

6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。

7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

bb6249c6567dd4384e6ab3556cfc22ed.gif 

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

关于本文

本文标题:C语言程序设计(第3版)何钦铭-颜-晖-第10章--函数与程序结构.doc

链接地址:https://www.renrendoc.com/p-25643361.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值