当前位置:文档之家› C语言 习题八 参考答案

C语言 习题八 参考答案

习题八一、单项选择题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的定义为:void abc(){... ...}则函数定义中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、说明语句“static int i=10;”中“i=10”的含义是()。

A)只说明了一个静态变量 B)与“auto i=10;”在功能上等价C)将变量i初始化为10 D)将变量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 (int n)完成计算1~n的累加和。

sum (int n){ if (n<0)retuen -1;if (n==1) ① ; /* return (1) */else ② ; /* return ( n+sum(n-1) ) */}2、下面的函数是一个求阶乘的递归调用函数。

facto (int n){ if ( n == 1 ) ① ; /* return (1) */else return ( ② ); /* return(n*facto(n-1)) */}三、编程题1、编写一个判断一个整数是否是素数的函数,使用该函数编写验证1000以内的哥德巴赫猜想是成立。

(每个不小于6的偶数都是两个素数之和)#include <stdio.h>main( ){ int i, 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是否为素数 */int n;{ int i;if ( n%2 == 0) return(0);for ( i=3; i<n/2; i++ )if ( n%i==0 )return(0);return(1);}2、编写一个程序,调用函数已知一个圆筒的半径、外径和高,计算该圆筒的体积。

参考程序:#include <stdio.h>double v ( double r, double h ){ return (3.1415926*r*r*h);}main( ){ double r1, r2, h, v(); /* r1:外圆半径 r2:内圆半径 h:圆筒的高 */printf ("Enter r1 r2 h:");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( ){ int i=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);}}int ex (int m){ int sum=0, z, k;z=m;while (z>0) {k= z%10;sum += k*k*k;z /= 10;}return ( m==sum );}4、请编写一个函数,输出整数m的全部素数因子。

例如:m=120时,因子为:2,2,2,3,5参考答案:main ( ){ int m;printf ("\nEnter m=");scanf ("%d", &m);primedec (m);}primedec(m)int m;{ int k=2;while (k<=m)if (m%k == 0 ){ printf ("%d, " , k);m = m/k;}else k++;}5、已知某数列前两项为2和3,其后继项根据当前的前两项的乘积按下列规则生成:①若乘积为一位数,则该乘积就是数列的后继项;②若乘积为二位数,则乘积的十位和个位数字依次作为数列的后继项。

当N=10,求出该数列的前十项为:2 3 6 1 8 8 6 4 2 4。

参考程序:#include "stdio.h"#define MAXNUM 100void sum (n, pa)int n, pa[];{ int count, temp;pa[0] = 2;pa[1] = 3;count=2;while ( count < n ){ temp = pa[count-1] * pa[count-2];if ( temp<10 )pa[count++] = temp;else{ pa[count++] = temp/10;if ( count<n )pa[count++] = temp%10; } } }main( ){ int n, i, num[MAXNUM]; do{ printf ("Input N=? (2<N<=%d):", MAXNUM); scanf("%d", &n);} while ( n<=2 || n>MAXNUM ); printf ("\nsum(%d)=", n); sum(n, num);for ( i=0 ; i<n; i++ ) printf ("%4d", num[i]); printf ("\n"); } 程序2/*P244_5.c*/ #define N 20 main(){int i,n,a[N]; shul(a,N); for(i=0;i<N;i++) printf("%3d",a[i]); printf("\n"); }shul(int x[],int k) {int i=0,m,n; x[0]=2;x[1]=3; for(i=2;i<k;i++) {m=x[i-1]*x[i-2];if(m>=10){x[i++]=m/10;x[i]=m%10;} else x[i]=m; } }_6、求组合数。

编程计算:)!(!!),(n m n m n mc -=参考答案:double facton(int n) {double s=1; for(;n>0;n--) s=s*n; return s; }main(){int m,n;double c;scanf("%d %d",&m,&n);c=facton(m)/facton(n)/facton(m-n);printf("c(%d,%d)=%lf\n",m,n,c);}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)之值。

相关主题