C语言程序设计第3版何钦铭 颜 晖 第10章函数与程序结构Word文档下载推荐.docx
《C语言程序设计第3版何钦铭 颜 晖 第10章函数与程序结构Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第3版何钦铭 颜 晖 第10章函数与程序结构Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
y%100!
=0)||y%400==0)
4CIRFER(r):
计算半径为r的圆周长。
#definePI
#defineCIRFER(r)2*PI*(r)
【练习10-3】分别用函数和带参宏实现从3个数中找出最大数,请比较两者在形式上和使用上的区别。
(1)函数实现
intmax(intx,inty,intz)
{
intt;
if(x>
=y)
=z)t=x;
elset=z;
else
if(y>
=z)t=y;
returnt;
}
(2)宏实现
#defineMAX(x,y,z)x>
=y(x>
=zx:
z):
(y>
=zy:
z)两者在定义形式上完全不同。
使用上函数是在执行时,从主调函数转到函数max(),然后再返回到主调函数,函数体始终存在;
而宏是在编译预处理时,用条件表达式去替换
MAX(intx,inty,intz),等程序执行时,执行的是条件表达式,而不再存在MAX(intx,inty,intz)的式子。
习题10
一、选择题
1.要调用数学函数时,在#include命令行中应包含C。
A.””B.””C.””D.””
2.对于以下递归函数f,调用f(4),其返回值为A。
intf(intn)
{if(n)returnf(n-1)+n;
elsereturnn;
A.10B.4C.0D.以上均不是
3.执行下列程序:
#defineMA(x,y)(x*y)
i=5;
i=MA(i,i+1)–7;
后变量i的值应为B。
A.30B.19C.23D.1
4.宏定义“#defineDIV(a,b)a/b”,经DIV(x+5,y-5)引用,替换展开后是A。
A.x+5/y-5B.(x+5/y–5)
C.(x+5)/(y-5)D.(x+5)/(y-5);
5.定义带参数的宏“#defineJH(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。
intx=5,y=7;
voidswap()
{intz;
z=x;
x=y;
y=z;
intmain(void)
intx=3,y=8;
swap();
printf("
%d,%d\n"
x,y);
return0;
A.3,8B.8,3C.5,7D.7,5
7.下面说法中正确的是A。
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题
D.静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出
二、填空题
语言的编译预处理功能主要包括_条件编译_、_宏定义_和_文件包含_。
2.执行完下列语句段后,i的值为5。
inti;
intf(intx)
return((x>
0)f(x-1)+f(x-2):
1);
i=f(3);
3.下列程序段A与B功能等价,请填写程序段B中相应语句。
程序段A:
intf(intn)
{if(n<
=1)
returnn;
returnf(n-1)+f(n-2);
程序B:
intf(intn)
{_intt,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<
>
intpower(intm,intn)
{inti;
intp=1;
for(i=1;
i<
=n;
i++)
p=p*m;
returnp;
intf(intk,intn){
inti;
ints=0;
s=s+power(i,k);
returns;
intmain(void)
{intk,n;
scanf(“%d%d”,&
k,&
n);
printf(“f(%d,%d)=%ld”,k,n,f(k,n));
return0;
5.下列递归程序的输出结果为g=4,g=3,k=6。
#include<
intfib(intg)
{switch(g){
case0:
return0;
case1:
case2:
return2;
printf("
g=%d,"
g);
returnfib(g-1)+fib(g-2);
{
intk;
k=fib(4);
k=%ld\n"
k);
6.下列语句的运算结果为_7,-13____。
#defineF(x)x-2
#defineD(x)x*F(x)
printf("
%d,%d"
D(3),D(D(3)));
三、程序设计题
1.判断满足条件的三位数:
编写一个函数,利用参数传入一个3位数n,找出101~n间所有满足下列两个条件的数:
它是完全平方数,又有两位数字相同,如144、676等,函数返回找出这样的数据的个数。
#include<
intfun(intn);
intn;
Inputn:
"
);
scanf("
%d"
&
n);
total=%d\n"
fun(n));
intfun(intn)
inti,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++;
returnd;
2.递归求阶乘和:
输入一个整数n(n>
0且n<
=10),求1!
+2!
+3!
+……n!
。
定义并调用函数fact(n)计算n!
,函数类型是double。
doublefact(intn);
"
1~%d的阶乘和:
%.0lf"
n,fact(n));
doublefact(intn)
inti;
doubleresult=1;
if(n==1)
result=1;
else{
for(i=1;
result=result*i;
result=result+fact(n-1);
returnresult;
3.递归实现计算xⁿ:
输入实数x和正整数n,用递归函数计算xⁿ的值。
doublepower(doublex,intn);
doublex;
Inputx:
%lf"
x);
%lf的%d次方=%lf"
x,n,power(x,n));
doublepower(doublex,intn)
doubleresult;
result=x;
result=x*power(x,(n-1));
4.递归求式子和:
输入实数x和正整数n,用递归的方法对下列计算式子编写一个函数。
f(x,n)=x-x²
+x³
-x4+…+(-1)n-1xⁿ(n>0)
doublef(doublex,intn);
f(%lf,%d)=%lf\n"
x,n,f(x,n));
doublef(doublex,intn)
if(n==1)
returnx;
returnpow(-1,n-1)*pow(x,n)+f(x,n-1);
5.递归计算函数ack(m,n):
输入m和n。
编写递归函数计算Ackermenn函数的值:
n+1m=0
ack(m,n)=ack(m-1,1)n=0&
m>
0
ack(m-1,ack(m,n-1))m>
0&
n>
试编写相应程序。
intAck(intm,intn);
intm,n;
intresult;
%d%d"
&
m,&
result=Ack(m,n);
Ackerman(%d,%d)=%d\n"
m,n,result);
intAck(intm,intn)
if(m==0)returnn+1;
elseif(n==0&
0)
returnAck(m-1,1);
elseif(m>
returnAck(m-1,Ack(m,n-1));
6.递归实现求Fabonacci数列:
用递归方法编写求斐波那契数列的函数,函数类型为整型,并写出相应主函数。
斐波那契数列的定义如下。
f(n)=f(n-2)+f(n-1)(n>1)其中f(0)=0,f
(1)=1。
longfib(intn);
Entern:
fib(%d)=%ld\n"
n,fib(n));
longfib(intn)
longres;
if(n==0)res=0;
elseif(n==1)
res=1;
res=fib(n-2)+fib(n-1);
returnres;
7.递归实现十进制转换二进制:
输入一个正整数n,将其转换为二进制输出。
要求定义并调用函数dectobini(n),它的功能是输出n的二进制。
intdectobini(intn);
Inputn(十进制整数):
输出二进制:
dectobini(n));
intdectobini(intn)
if(n==0)
result=0;
result=dectobini(n/2)*10+n%2;
8.递归实现顺序输出整数:
输入一个正整数n,编写递归函数实现对其进行按位顺序输出的递归函数。
intinorder(intn);
按位顺序输出:
%d\n"
inorder(n));
intinorder(intn)
if(n<
10)returnn;
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)使用宏实现
#defineS(a,b,c)((a)+(b)+(c))/2
#defineAREA(s,a,b,c)sqrt((s)*((s)-(a))*((s)-(b))*((s)-(c)))
doublea,b,c,s;
inputa,b,c:
scanf("
%lf%lf%lf"
a,&
b,&
c);
s=S(a,b,c);
s=%lf,area=%lf\n"
s,AREA(s,a,b,c));
(2)使用函数实现
doublef1(doublea,doubleb,doublec)
return(a+b+c)/2;
doublef2(doubles,doublea,doubleb,doublec)
returnsqrt(s*(s-a)*(s-b)*(s-c));
s=f1(a,b,c);
s,f2(s,a,b,c));