C语言函数章节题库及答案部分注释
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、选择题
1.以下正确的说法是(C)。
建立函数的目的之一是A)提高程序的执行效率。
B)提高程序的可读性。
C)减少程序的篇幅
D)减少程序文件所占的内存
2.以下正确的说法是(B)。
A)用户若需调用标准库函数,调用前必须重新定义。
B)用户可以重新定义标准库函数,若如此,该函数将失去原有含义
C)系统根本不允许用户重新定义标准库函数
D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包含到用户源文件中,系统自动去调。
3.以下正确的函数定义形式是(A)。
A)double fun(int x, int y)
B)d ouble fun(int x; int y)
C)d ouble fun(int x, int y);
D)double fun(int x,y);
4.以下正确的说法是(A)。
在C语言中
A)实参和与其对应的形参各占用独立的存储单元
B)实参和与其对应的形参共占用一个存储单元
C)只有当实参和与其对应的形参同名时才共占用存储单元
D)形参时虚拟的,不占用存储单元
5.若调用一个函数,且此函数中没有return语句,则正确的说法是(A)。
该函数A)没有返回值
B)返回若干个系统默认值
C)能返回一个用户所希望的函数值
D)返回一个不确定的值
6.以下正确的说法是(C)。
A)定义函数时,形参的类型说明可以放在函数体内
B)r eturn后边的值不能为表达式
C)如果函数值的类型与返回值的类型不一致,以函数值类型为准
D)如果形参与实参的类型不一致,以实参类型为准
7.C语言规定,简单变量作实参时,它和对应形参之间的数据传递方式是(B)。
A)地址传递
B)单向值传递实参传给形参
C)由实参传给形参,再由形参传回给实参
D)由用户指定传递方式
8.以下程序有语法性的错误,有关错误原因的正确的说法是(C)。
main()
{ int G=5, k;
void prt_char(); void是不返回值,但却有k=prt_char(G)
…..
k=prt_char(G);
…..
}
A)语句void prt_char();有错,它是函数调用语句,不能用void说明
B)变量名不能用大写字母
C)函数说明和函数调用语句之间有矛盾
D)函数名不能使用下划线
9.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是(B)。
A)float型
B)i nt型
C)l ong型
D)double型
10.C语言规定,函数返回值的类型是由(D)。
A)return语句中的表达式类型所决定
B)调用该函数时的主调函数类型所决定
C)调用该函数时系统临时决定
D)再定义该函数时所指定的函数类型所决定
11.以下错误的描述是(D)。
函数调用可以
A)出现在执行语句中
B)出现在一个表达式中
C)作为一个函数的实参
D)作为一个函数的形参
12.以下正确的描述是(B)。
在C语言程序中
A)函数的定义可以嵌套,但函数的调用不可以嵌套
B)函数的定义不可以嵌套,但函数的调用可以嵌套
C)函数的定义和调用均不可以嵌套
D)函数的定义和函数的调用均可以嵌套
13.若用数组名作为函数调用的实参,传递给形参的是(A)。
A)数组的首地址
B)数组第一个元素的值
C)数组中全部元素的值
D)数组元素的个数
14.已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错定
义方式为(D)。
int a[3][4];
f(a);
A)f( int array[ ][6])
B)f( int array[3][ ])
C)f( int array[ ][4])
D)f( int array[2][5])
15.若用一维数组名作函数实参,则以下正确的说法是(C)。
A)必须在主调函数中说明此数组的大小
B)实参数组类型与形参数组类型可以不匹配
C)在被调函数中,不需要考虑形参数组的大小
D)实参数组名与形参数组名必须一致
16.以下程序的正确运行结果是(C)。
#include “stdio.h”
void num()
{ extern int x,y; int a=15,b=10;
x=a-b;
y=a+b;
}
int x ,y;
main()
{ int a=7, b=5;
x=a+b;
y=a-b;
num();
printf(“%d, %d\n”, x, y);
}
A) 12, 2 B)不确定C) 5, 25 D) 1, 12
17.凡是函数中未指定存储类别的局部变量,其隐含的存储类别是(A)。
A)自动(auto)B)静态(static)
C)外部(extern)C)寄存器(register)
18.在一个C源程序文件中,若定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是(D)。
A)extern B)register C)auto D)static
19.以下程序的正确运行结果是(D)。
main()
{ int a=2, I;
for (i=0;i<3; i++) pirntf(“%4d”, f(a));
}
f(int a)
{ int b=0; static int c=3;
b++; c++;
return(a+b+c);
}
A) 7 7 7 B) 7 10 13 C) 7 9 11 D) 7 8 9
20.以下程序运行结果是(A)。
#include “stdio.h”
main()
{ int k=4, m=1, p;
p=func(k, m); pirntf(“%d, ”, p);
p=func(k,m); printf(“%d\n”,p);
}
func( int a, int b)
{ static int m=0, i=2; 此句中若无static则选D,
i+=m+1; 有则是第二次调用函数时I=3,m=8,而不是I=2,m=0.
m=i+a+b; 但是传下来的m主函数中的m=1.
return(m);
}
A) 8, 17 B) 8, 20 C)8, 20 D)8, 8
二、编程题
1.已有函数调用语句c=add(a, b);请编写add函数,计算两个实数a和b的和,并返回和值。
float add(float a,float b)
{
return(a+b);}
main()
{float a,b,c;
printf("\n input the number a,b:");
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("a+b=%5.2f",c);}
2.A是个2×4的整型数组,且各元素均已赋值。
函数max_value可求出其中最大元素值max,并将此值返回主调函数。
今有函数调用语句max=max_value(int arr[ ][4]) main()
{int max_value(int arr[][4]);
int arr[2][4],i,j,max;
printf("\n input the number:");
for(i=0;i<4;i++)
for(j=0;j<2;j++)
scanf("%d",&arr[i][j]);
printf("array is:\n");
for(i=0;i<4;i++)
{for(j=0;j<2;j++)
printf("%d ",arr[i][j]);printf("\n");}
max=max_value(arr);
printf("the biggest number is:%d",max);}
int max_value(int arr[][4])
{int i,j,max;
max=arr[0][0];
for(i=0;i<4;i++)
for(j=0;j<2;j++)
{if(max<arr[i][j])max=arr[i][j];}
return(max);}
3.编程,输入n个数,根据下式计算并输出y的值,要求:
(1)在主函数中输入n个数,调用相应的函数求出函数的值并输出结果。
(2)用三个自定义函数分别求分段函数的值。
x2-sinx x<-2
y= 2x+x -2≤x≤2
(x+1+x2 )1/2x>2
# include<math.h>
float y;
float y_x(float x)
{return(x*x-sin(x));}
float y_m(float x)
{return(pow(2,x)+x);}
float y_b(float x)
{return(sqrt(x*x+x+1));}
main()
{float x,y;
printf("\ninput the number:");
scanf("%f",&x);
printf("y=");
if(x<-2){y=y_x(x);printf("%5.2f\n",y);}
else if(x>=-2&&x<=2){y=y_m(x);printf("%5.2f\n",y);}
else {y=y_b(x);printf("%5.2f\n",y);}}
# include<math.h>
double y;
double y_x(double x)
{return(x*x+sin(abs(x)));}
double y_m(double x)
{return(pow(2,x)+x);}
double y_b(double x)
{return(sqrt(x*x+x+1));}
main()
{double x,y;
printf("\ninput the number:");
scanf("%lf",&x);
printf("y=");
if(x<-2){y=y_x(x);printf("%5.2f\n",y);}
else if(x>=-2&&x<=2){y=y_m(x);printf("%5.2f\n",y);}
else {y=y_b(x);printf("%5.2f\n",y);}}
4.用递归法求:Y=1+x+x2/2!+x3/3!+….到第n项,n和x的值由键盘输入。
#define N 10
int z(int n)
{int c;
if(n==1)c=1;
else if(n>1)c=z(n-1)*n;
return(c);}
float y_(int n,int x[N])
{int i;
float y;
y=1;
for(i=1;i<n;i++)
y=y+(float)x[i]/z(i);
return(y);}
main()
{int i,n,x[N];
float y;
printf("input n:");
scanf("%d",&n);
printf("input x:");
for(i=1;i<n;i++)
scanf("%d",&x[i]);
y=y_(n,x);
printf("y=%5.2f\n",y);}
5 .输入n个整数,求出最大数和最小数。
要求:
(1)在main函数中输入n个数。
(2)编写一个函数,求出这几个数中的最大数和最小数,并输出。
# define N 10
int max_(int a[N])
{int max,i;
max=a[0];
for(i=0;i<N;i++)
if(a[i]>max)max=a[i];
return(max);}
int min_(int a[N])
{int min,i;
min=a[0];
for(i=0;i<N;i++)
if(a[i]<min)min=a[i];
return(min);}
main()
{int a[N],max,min,i;
printf("input the number:");
for(i=0;i<N;i++)
scanf("%d",&a[i]);max=max_(a);min=min_(a);
printf("the bigest number is:%d\n",max);
printf("the smallest number is:%d\n",min);}
[这题可只用一个调用函数,即在一个函数中,令max=min=a[0];for(….) if(a[I]>max) max=a[I];if(a[I]<min)min=a[I];其后不用return,因为return只能返回一个值,而是将max与min 定义为全局变量]
6. 用二分法求方程f(x)=x3-5x2+16x-80=0的根。
#include <math.h>
float f(float x)
{float y;
y=x*x*x-5.0*x*x+16.0*x-80.0;
return(y);}
float root(float x1,float x2)
{float x,y,y1;
y1=f(x1);
do{x=(x1+x2)/2;
y=f(x);
if(y*y1>0)
{y1=y;x1=x;}
else x2=x;}
while(fabs(y)>=0.0001);
return(x);}
main()
{float x,x1,x2,f1,f2;
do{printf("input x1,x2:\n");
scanf("%f,%f",&x1,&x2);
f1=f(x1);f2=f(x2);}
while(f1*f2>=0);
x=root(x1,x2);
printf("A root of equation is %8.4f",x);}。