C语言 习题八参考答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void abc()
{... ...}
则函数定义中 void 的含义是( )。
A)执行 abc 后,函数没有返回值
B)执行函数 abc 后,函数不再返回
C)执行函数 abc 后,可以返回任意类型 D)以上三个答案全是错误的
5、在以下对 C 语言的描述中,正确的是( )。
A)在 C 语言中调用函数时,只能将实参数的值传递给形参,形参的值不能传递给实参
① 第 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 个值之和
A)主程序 B)子程序 C)函数 D)过程
3、以下说法中正确的是( )。
A)C 语言程序总是从第一个定义的函数开始执行
B)在 C 语言程序中,要调用的函数必须在 main()函数中定义
C)C 语言程序总是从 main()函数开始执行
D)C 语言程序中的 main()函数必须放在程序的开始部分
4、已知函数 abc 的定义为:
scanf ("%lf%lf%lf", &r1, &r2, &h);
printf ("v=%lf\n", v(r1,h)-v(r2,h) );
}
3、编写一个求水仙花数的函数,求 100 到 999 之间的全部水仙花数。所谓水仙花数是指一个三位数, 其各位数字立方的和等于该数。例如:153 就是一个水仙花数:
立。(每个不小于 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);
printf("c(%d,%d)=%lf\n",m,n,c);
}
7、已知 ackermann 函数,对于 m>=0 和 n>=0 有如下定义:
ack(0,n)=n+1
ack(m,0)=ack(m-1,1)
ack(m,n)=ack(m-1,ack(m,n-1))
请编程输入 m 和 n,求出 ack(m,n)之值。
A)C 语言允许函数的递归调用
B)C 语言中的 continue 语句,可以通过改变程序的结果而省略
C)有些递归程序是不能用非递归算法实现的
D)C 语言中不允许在函数中再定义函数
13、在下列结论中,只有一个是正确的,它是( )。
A)递归函数中的形式参数是自动变量
B)递归函数中的形式参数是外部变量
C)递归函数中的形式参数是静态变量
}
2、下面的函数是一个求阶乘的递归调用函数。
facto (int n)
{ if ( n == 1 ) ① ;
/* return (1) */
else return ( ② );
/* return(n*facto(n-1)) */
}
三、编程题
1、编写一个判断一个整数是否是素数的函数,使用该函数编写验证 1000 以内的哥德巴赫猜想是成
习题八
一、单项选择题
1、C 语言程序由函数组成。它的( )。
A)主函数必须在其它函数之前,函数内可以嵌套定义函数
B)主函数可以在其它函数之后,函数内不可以嵌套定义函数
C)主函数必须在其它函数之前,函数内不可以嵌套定义函数
D)主函数必须在其它函数之后,函数内可以嵌套定义函数
2、一个 C 语言程序的基本组成单位是( )。
c(m, n) 6、求组合数。编程计算:
m! n!( mn)!
参考答案: 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);
参考程序:
#include <stdio.h>
ackerman ( int m, int n )
{ if ( m==0 ) return (n+1);
if ( n==0 ) return ( ackerman ( m-1, 1) );
else
return ( ackerman ( m-1, ackerman(m, n-1) ) );
5
…… ……
1
11
1
2
1
3
3
4
6
4
10
10
…… …… ……
参考答案:
1
1
5
1
…… ……
杨辉三角形中的数,正是(x+y)的 N 次方幂展开式中各项的系数。本题作为程序设计中具有代表
性的题目,求解的方法很多(可以使用一维数组,也可以使用二维数组),这里仅给出一种使用递归
求解的方法。
从杨辉三角形的特点出发,可以总结出:
参考答案: 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++; }
} 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
C)在 C 语言中,外部变量的隐含类别是自动存储类别
D)在 C 语言中,函数形参的存储类型是自动(auto)类型的变量
7、说明语句“static int i=10;”中“i=10”的含义是( )。
A)只说明了一个静态变量
B)与“auto i=10;”在功能上等价
C)将变量 i 初始化为 10
D)将变量 i 赋值为 10
D)递归函数中的形式参数可以根据需要自己定义存储类别
14、下列结论中只有一个是正确的,它是( )。
A)在递归函数中使用自动变量要十分小心,因为在递归过程中,不同层次的同名变量在赋值的时候
一定会产生相互影响
B)在递归函数中使用自动变量要十分小心,因为在递归过程中,不同层次的同名变量在赋值的时候
可能会产生相互影响
B)C 语言函数既可以嵌套定义又可以递归调用
C)函数必须由返回值,否则不能使用函数
D)C 语言程序中有定义关系的所有函数都必须放在同一源文件中
6、以下叙述中错误的是( )。
A)在 C 语言中,函数中的自动变量可以赋初值,每调用一次赋一次初值
B)在 C 语言中,在定义函数时,实参和对应的形参在类型上只需赋值兼容
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; } }_
8、C 语言中的函数( )。
A)可以嵌套定义
B)不可以嵌套调用
C)可以嵌套调用,但不能递归调用 D)嵌套调用和递归调用均可
9、C 语言中函数返回值的类型是由( )决定的。
A)return 语句中的表达式类型
B)调用该函数的主调函数类型
C)调用函数时临时
D)定义函数时所指定的函数类型
10、C 语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是( )。
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) ) */
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); }
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:");
A)地址传递
B)值传递
C)由实参传给形参,并由形参传回给实参 D)由用户指定传递方式
11、下列的结论中只有( )是正确的。
A)所有的递归程序均可以采用非递归算法实现
B)只有部分递归程序可以用非递归算法实现
C)所有的递归程序均不可以采用非递归算法实现
D)以上三种三种说法都不对
12、在以下结论中,只有一个是错误的,它是( )。
} main( ) { int m, n;
printf ("Enter ackerman m n:"); scanf ("%d%d", &m, &n); printf ("ackerman(%d,%d)=%d\n", m,n,ackerman(m,n) ); }
8、用递归的方法打印杨辉三角形。
1
1
1
5、已知某数列前两项为 2 和 3,其后继项根据当前的前两项的乘积按下列规则生成:① 若乘积为 一位数,则该乘积就是数列的后继项;② 若乘积为二位数,则乘积的十位和个位数字依次作为数列 的后继项。当 N=10,求出该数列的前十项为:
2 3 6 1 8 8 6 4 2 4。 参考程序:
#include "stdio.h" #define MAXNUM 100 void 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;
C)在递归函数中使用自动变量要十分小心,因为在递归过程中,不同层次的同名变量在赋值的时候
肯定不会产生相互影响
D)在 C 语言中无法得出上述三个结论之一
15、在 C 语言的函数定义过程中,如果函数 finA 调用了函数 funB,函数 funB 又调用了函数 funA,
则( )。
A)称为函数的直接递归