第六章 函 数
一、单项选择题
1.在C语言程序中,有关函数的定义正确的是( B )。 A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义不可以嵌套,但函数的调用可以嵌套 C.函数的定义和函数的调用均不可以嵌套 D.函数的定义和函数的调用均可以嵌套
2.以下对C语言函数的有关描述中,正确的是( A )。
A.在C中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B.C函数既可以嵌套定义又可递归调用 C.函数必须有返回值,否则不能使用函数
D.C程序中有调用关系的所有函数必须放在同一个源程序文件中 3.函数调用语句f((e1,e2),(e3,e4,e5));中参数个数是( C )。 A. 5 A. auto
B. 4
C. 2
D. 1
D.无存储类型
4.C语言中函数的隐含存储类型是( C )。
B. static
C. extern
5.能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是( A )。 A. return这二个数
B. 形参用二个元素的数组 D. 用二个全局变量
C. 形参用二个这种数据类型的指针
A. void main( ) { char s[20]=―abcdefgh‖; fun(s); ?? } C. void main( ) { char s[20]=―abcdefgh‖; char *p=s; fun(p); ?? } 7.以下程序的输出结果是( C )。 fun(char **m)
{ ++m; printf(―%s\\n‖,*m); } void main( )
{ char *a[ ]={―BASIC‖,―FOXPRO‖,―C‖};
fun(a); }
A. BASIC
49
6.有一函数的定义如:void fun(char *s){??},则不正确的函数调用是( D )。
B. void main( ) { char s[20]=―abcdefgh‖; fun(&a[0]); ?? } D. void main( ) { char s[20]=―abcdefgh‖; fun(s[ ]); ?? } B. ASIC C. FOXPRO D. C
8.函数的功能是交换x和y中的值;且通过正确调用返回交换结果。不能正确执行此功能的函数是( B )。 A. funa(int *x, int *y) { int i,*p=&i; *p=*x; *x=*y; *y=*p } C. funa(int *x, int *y) { int p; p=*x; *x=*y; *y=p; } } } D. funa(int *x, int *y) { *x=*x+*y; *y=*x-*y; *x=*x-*y; B. funa(int x, int y) { int t; t=x; x=y; y=t; 9.要求函数的功能是在一维数组a中查找x值:若找到则返回所在的下标值,否则返回0;数放在a[1]到a[0]中。不能正确执行此功能的函数是( C )。 B. funa(int *a, int n, int x) A. funa(int *a, int n, int x) { int k; { *a=x; for(k=1;k<=n;k++) while(a[n]!=x) n--; if(a[k]==x) return(k); return(n); return(0); } } C. funa(int a[ ], int n, int x) D. funa(int a[ ], int n, int x) { int *k; { int k=0; do k++; a[0]=k; k=a+n; while((k
sub1(char a, char b){ char c; c=a; a=b; b=c; } sub1(char *a, char b){ char c; c=a; *a=b; b=c; } sub1(char *a, char *b){ char c; c=*a; *a=*b; *b=c; } void main( ) { char a,b;
a=?A‘; b=?B‘; sub3(&a, &b); putchar(a); puchar(b); a=?A‘; b=?B‘; sub2(&a, b); putchar(a); puchar(b); a=?A‘; b=?B‘; sub1(a, b); putchar(a); puchar(b); }
A. BABBAB
B. ABBBBA
C. BABABA
D. BAABBA
二、填充题
1.变量的作用域主要取决于变量 局部变量或是全程变量 ,变量的生存期既取决于变量 局部变量或是全程变量 ,又取决于变量 存储类型 。
2.从变量的存储类型来说, 外部声明型 变量不允许初始化。 自动型 变量、 寄存器型 变量和 静态型 变量可以初始化。其中变量如果不进行初始化,则 自动型
50
变量和 寄存器型 变量的初值不确定,而 静态型 变量初值为0。 3.静态型内部变量的作用域是 所定义的函数或复合语句内 。
4.函数中的形参和调用时的实参都是数组名时,传递方式为 地址传递 ,都是变量时,传递方式为 值传递 。
5.函数的形式参数的作用域为 函数内部 ,全局的外部变量和函数体内定义的局部变量重名时, 局部 变量优先。
6.若自定义函数要求返回一个值,则应在该函数体中有一条 return 语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型说明符 void 。
7.若函数的形式参数是指针类型,则实参可以是 变量地址 、 指针 或 数组名 。 8.函数的参数为char *类型时,虚参与实参结合的传递方式为 地址传递 。 9.函数的实参为常量时,虚参与实参结合的传递方式为 值传递 。 10.对下列递归函数,函数调用f(3)的返回值是 9 。
int f(int n) { return((n==0)?1:f(n-1)+2); }
11.函数f定义如下,调用f(“1475”)的返回值为 17 。
int f (char *s) { int k=0; while (*s)k+=*s++-?\\0‘; return k; }
12.函数change定义如下,a=0、b=5,执行change (a,b)后a、b的值分别为 10,5 。
void change (int a, int b) { int t=0; t=a; a=b; b=t; }
13.已知三角形边长a、b、c和s=(a+b+c)/2,计算其面积的算术表达式为 sqrt (s*(s-a)*(s-b)*(s-c)) 。
14.已知方程ax2+bx+c=0系数a、b、c且存在两个实根,计算其中一个实根的算术表达式为 (-b+sqrt(b*b-4*a*c))/(2*a) 。
15.p为本金,r为5年期存款年利率,计算存款p元5年到期时本金、利息总和的算术表达式为 p*pow (1+r,5) 。
16.将数学式(x+1)e2x写作算术表达式为 (x+1)*exp(2*x) 。
17.调用find函数求实参数组中最大值,再调用find函数求实参数组中最下值。
#include
{ float s,a[7]={2,6,3,8,3,12,9}; float find (float*, int, int);
s=find(a,7,1); printf(―%f\\n‖,s) ; s=find(a,7,-1) ; printf(―%f\\n‖,s); }
float find(float *p, int n, int flag) { int i; float t,fh;
if(flag>=0) fh=1; else fh=-1; t=*p ; for(i=1;i
51
18.对数组按值从大到小的顺序排序后输出。
#include
{ float a[7]={2,6,3,8,3,12,9}; void sort (float*, int); sort(a,7) ; for(int i=0;i<7;i++) printf(―%f‖,a[i]); printf(―\\n‖); }
void sort (char *p, int n) { int i,j,k; float t; for(i=o;i k=i; for(j=i+1;j { t=*(p+i); *(p+i)=*(p+k); *(p+k)=t; } } } 19.下列函数求任意阶多项式a0+a1X+a2X2+…+anXn的值并返回多项式的值。 float sum(float *a, int n) { float y,t=1; int I; scanf(―%f‖,&x); y=*a; for(I=1;I<=n;I++){ t=t*x; y+=*(a+I)*t; } return y; } 20.下列函数在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。 #include void find (float *p, int *max, int *min, int n) { int k; float t; *max=*p; *min=*p; for(k=1;k if( t>*max ) *max=t; if(t<*min) *min=t; } } 52 21.下列函数用于任意方阵(行数等于列数的二维数组)转置。 void mt(float *a, int n ) 如数组:1 { int i,j; float t; 2 for(i=0;i 22.下列程序读入六个字符串,排序后输出。 #include for(j=i+1;j if(k!=i) { temp=a[i]; a[i]=a[k]; a[k]=temp; } // 指针数组元素交换 } } void main ( ) { char *name[6], ch[6][30]; int k; for(k=0; k<6; k++) name[k]=ch[k]; for(k=0; k<6; k++) gets(name[k]); sort(name,6); for(k=0; k<6; k++) puts(name[k]); } 23.下列函数用矩形公式求f(x)在[a,b]的定积分:先M等积分区间求得积分近似值,在2M等份近似值,再4M等份求得近似值,……,当两次积分近似值之差的绝对值小于eps时返回计算结果。 float sum (float a,float b, int m, float eps) { float h,s1=0,s2,x; int i, flag=1; while(flag){ s2=0; x=a; h=(b-a)/m; for(I=1;I<=m;I++){ s2+=(f(x)+f(x+h))*h/2; x=x+h; } if(fabs(s1-s2) 53 11 3 3 5 2 3 4 5 4 6 7 4 2 -4 4 -2 5 2 -7 4 6 7 -4 5