函数-习题八参考答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

习题八+一、单项选择题1、C语言程序由函数组成。它的()。A)主函数必须在其它函数之前,函数内可以嵌套定义函数B)主函数可以在其它函数之后,函数内不可以嵌套定义函数C)主函数必须在其它函数之前,函数内不可以嵌套定义函数D)主函数必须在其它函数之后,函数内可以嵌套定义函数2、一个C语言程序的基本组成单位是()。A)主程序B)子程序C)函数D)过程3、以下说法中正确的是()。A)C语言程序总是从第一个定义的函数开始执行B)在C语言程序中,要调用的函数必须在main()函数中定义C)C语言程序总是从main()函数开始执行D)C语言程序中的main()函数必须放在程序的开始部分4、已知函数abc的定义为:voidabc(){......}则函数定义中void的含义是()。A)执行abc后,函数没有返回值B)执行函数abc后,函数不再返回C)执行函数abc后,可以返回任意类型D)以上三个答案全是错误的5、在以下对C语言的描述中,正确的是()。A)在C语言中调用函数时,只能将实参数的值传递给形参,形参的值不能传递给实参B)C语言函数既可以嵌套定义又可以递归调用C)函数必须由返回值,否则不能使用函数D)C语言程序中有定义关系的所有函数都必须放在同一源文件中6、以下叙述中错误的是()。A)在C语言中,函数中的自动变量可以赋初值,每调用一次赋一次初值B)在C语言中,在定义函数时,实参和对应的形参在类型上只需赋值兼容C)在C语言中,外部变量的隐含类别是自动存储类别D)在C语言中,函数形参的存储类型是自动(auto)类型的变量7、说明语句“staticinti=10;”中“i=10”的含义是()。A)说明了一个静态变量B)与“autoi=10;”在功能上等价C)将变量i初始化为10D)将变量i赋值为108、C语言中的函数()。A)可以嵌套定义B)不可以嵌套定义C)可以嵌套调用,但不能递归调用D)嵌套调用和递归调用均可9、C语言中函数返回值的类型是由()决定的。A)return语句中的表达式类型B)调用该函数的主调函数类型C)调用函数时临时D)定义函数时所指定的函数类型10、C语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是()。A)地址传递B)值传递C)由实参传给形参,并由形参传回给实参D)由用户指定传递方式11、下列的结论中只有()是正确的。A)所有的递归程序均可以采用非递归算法实现B)只有部分递归程序可以用非递归算法实现C)所有的递归程序均不可以采用非递归算法实现D)以上三种三种说法都不对12、在以下结论中,只有一个是错误的,它是()。A)C语言允许函数的递归调用B)C语言中的continue语句,可以通过改变程序的结果而省略C)有些递归程序是不能用非递归算法实现的D)C语言中不允许在函数中再定义函数13、在下列结论中,只有一个是正确的,它是()。A)递归函数中的形式参数是自动变量B)递归函数中的形式参数是外部变量C)递归函数中的形式参数是静态变量D)递归函数中的形式参数可以根据需要自己定义存储类别14、下列结论中只有一个是正确的,它是()。A)在递归函数中使用自动变量要十分小心,因为在递归过程中,不同层次的同名变量在赋值的时候一定会产生相互影响B)在递归函数中使用自动变量要十分小心,因为在递归过程中,不同层次的同名变量在赋值的时候可能会产生相互影响C)在递归函数中使用自动变量要十分小心,因为在递归过程中,不同层次的同名变量在赋值的时候肯定不会产生相互影响D)在C语言中无法得出上述三个结论之一15、在C语言的函数定义过程中,如果函数finA调用了函数funB,函数funB又调用了函数funA,则()。A)称为函数的直接递归B)称为函数的间接递归C)称为函数的递归定义D)C语言中不允许这样的递归形式二、填空题1、下面的函数sum(intn)完成计算1~n的累加和。sum(intn){if(n=0)printf(dataerror\n);if(n==1)①;/*return(1)*/else②;/*return(n+sum(n-1))*/}2、下面的函数是一个求阶乘的递归调用函数。facto(intn){if(n==1)①;/*return(1)*/elsereturn(②);/*return(n*facto(n-1))*/}三、编程题1、编写一个判断一个整数是否是素数的函数,使用该函数编写验证1000以内的哥德巴赫猜想是成立。(每个不小于6的偶数都是两个素数之和)#includestdio.hmain(){inti,j;for(i=6;i=1000;i+=2)for(j=3;j=i/2;j+=2)if(flag(j)&&flag(i-j)){printf(%d=%d+%d\n,i,j,i-j);break;}}flag(n)/*函数flag的功能是判断整数n是否为素数*/intn;{inti;if(n%2==0)return(0);for(i=3;in/2;i++)if(n%i==0)return(0);return(1);}2、编写一个程序,调用函数已知一个圆筒的半径、外径和高,计算该圆筒的体积。参考程序:#includestdio.hdoublev(doubler,doubleh){return(3.1415926*r*r*h);}main(){doubler1,r2,h,v();/*r1:外圆半径r2:内圆半径h:圆筒的高*/printf(Enterr1r2h:);scanf(%lf%lf%lf,&r1,&r2,&h);printf(v=%lf\n,v(r1,h)-v(r2,h));}3、编写一个求水仙花数的函数,求100到999之间的全部水仙花数。所谓水仙花数是指一个三位数,其各位数字立方的和等于该数。例如:153就是一个水仙花数:153=1*1*1+5*5*5+3*3*3参考程序:main(){inti=0,j,k,a,b,c,s;for(a=1;a=9;a++)for(b=0;b=9;b++)for(c=0;c=9;c++){j=100*a+10*b+c;if(ex(j))printf(%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\n,j,a,a,a,b,b,b,c,c,c);}}intex(intm){intsum=0,z,k;z=m;while(z0){k=z%10;sum+=k*k*k;z/=10;}return(m==sum);}4、请编写一个函数,输出整数m的全部素数因子。例如:m=120时,因子为:2,2,2,3,5参考答案:main(){intm;printf(\nEnterm=);scanf(%d,&m);primedec(m);}primedec(m)intm;{intk=2;while(k=m)if(m%k==0){printf(%d,,k);m=m/k;}elsek++;}5、已知某数列前两项为2和3,其后继项根据当前的前两项的乘积按下列规则生成:①若乘积为一位数,则该乘积就是数列的后继项;②若乘积为二位数,则乘积的十位和个位数字依次作为数列的后继项。当N=10,求出该数列的前十项为:2361886424。参考程序:#includestdio.h#defineMAXNUM100voidsum(n,pa)intn,pa[];{intcount,temp;pa[0]=2;pa[1]=3;count=2;while(countn){temp=pa[count-1]*pa[count-2];if(temp10)pa[count++]=temp;else{pa[count++]=temp/10;if(countn)pa[count++]=temp%10;}}}main(){intn,i,num[MAXNUM];do{printf(InputN=?(2N=%d):,MAXNUM);scanf(%d,&n);}while(n=2||nMAXNUM);printf(\nsum(%d)=,n);sum(n,num);for(i=0;in;i++)printf(%4d,num[i]);printf(\n);}程序2/*P244_5.c*/#defineN20main(){inti,n,a[N];shul(a,N);for(i=0;iN;i++)printf(%3d,a[i]);printf(\n);}shul(intx[],intk){inti=0,m,n;x[0]=2;x[1]=3;for(i=2;ik;i++){m=x[i-1]*x[i-2];if(m=10){x[i++]=m/10;x[i]=m%10;}elsex[i]=m;}}_6、求组合数。编程计算:)!(!!),(nmnmnmc参考答案:#includestdio.hmain(){intm,n;longcmn,facto();/*说明函数facto的类型*/printf(Inputmandn=);scanf(%d%d,&m,&n);cmn=facto(m)/(facto(n)*facto(m-n));/*三次调用facto函数*/printf(Thecombinationis%ld\n,cmn);}longfacto(x)/*定义facto函数。从在源程序中的位置*/intx;/*来说,facto函数定义在后,调用在前*/{longy;for(y=1;x0;--x)y*=x;return(y);}7、已知ackermann函数,对于m=0和n=0有如下定义:ack(0,n)=n+1ack(m,0)=ack(m-1,1)ack(m,n)=ack(m-1,ack(m,n-1))请编程输入m和n,求出ack(m,n)之值。参考程序:#includestdio.hackerman(intm,intn){if(m==0)return(n+1);if(n==0)return(ackerman(m-1,1));elsereturn(ackerman(m-1,ackerman(m,n-1)));}main(){intm,n;printf(Enterackermanmn:);scanf(%d%d,&m,&n);printf(ackerman(%d,%d)=%d\n,m,n,ackerman(m,n));}8、用递归的方法打印杨辉三角形。11112113311464115101051……………………………………参考答案:杨辉三角形中的数,正是(x+y)的N次方幂展开式中各项的系数。本题作为程序设计中具有代表性的题目,求解的方法很多(可以使用一维数组,也可以使用二维数组),这里仅给出一种使用递归求解的方法。从杨辉三角形的特点出发,可以总结出:①第N行有N+1个值(设起始行为第0行);②对于第N行的第J个值:(N=2)当J=1或J=N+1时:其值为1当J!=1且J!=N+1时:其值为第N-1行的第J-1个值与第N-1行第J个值之和将这些特点提炼成数学公式可表示为:c(x,y)=1x=1或x=N+1c(x,y)=c(x-1,y-1)+c(x-1,y)其它下面程序就是根据以上递归的数学表达式编制的。#includestdio.hmain(){inti,j,n=13;printf(N=);while(n12)scanf(%d,&n);/*最大输入值不能大于12*/for(i=0;i=n;i++)/*控制输出N行*/{for(j=0;j12-i;j++)printf();/*控制输出第i行前面的空格*/for(j=1;ji+2;j++)printf(%6d,c(i,j));/*输出第i行的第j个值*/printf(\n);}}intc(x,y)/*求杨辉三角形中第x行第y列的值*/intx,y;{intz;if((y==1)||(y==x+1))return(1);/*若为x行的第1或第x+1列,则输出1*/else/*否则;其值为前一行中第y-1列与第y列值之和*/z=c(x

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功