c语言第8章函数
第8章函数
1.以下程序的输出结果是( )
A、6 9 9
B、6 6 9
C、6 15 15
D、6 6 15
int d=1;
fun(int p)
{ static int d=5;
d+=p;
printf("%d ",d);
return(d);
}
main( )
{ int a=3;printf("%d \n",fun(a+fun(d)));}
答案:C
注解:函数fun调用两次,第一次调用的实参是全局变量d的值1,在函数调用执行过程中,输出的是局部静态变量d;第二次调用的实参是第一次调用的返回值和变量a的和,输出的仍是局部静态变量d的值。注意静态变量的定义和初始化是在第一次使用时进行的,在以后的使用过程中,保留上一次的值,不再初始化。2.若有以下调用语句,则不正确的fun函数的首部是()
A、void fun(int m,int x[])
B、void fun(int s,int h[41])
C、void fun(int p,int *s)
D、void fun(int n,int a)
main( )
{ …
int a[50],n;
…
fun(n,&a[9]);
…
}
答案:D
注解:从主函数中fun函数的调用格式可以看出,fun函数的两个形参的类型,第一个形参是整型变量,第二个形参是变量的地址,则必须是数组名或者是指针。
3.有如下函数调用语句
func(rec1,rec2+rec3,(rec4,rec5));
该函数调用语句中,含有的实参个数是()
A、3
B、4
C、5
D、有语法错
答案:A
注解:该函数调用语句中,含有的实参分别是rec1,rec2+rec3表达式计算后的值和(rec4,rec5)逗号表达式计算后值。
4.有如下程序
int runc(int a,int b)
{ return(a+b);}
main( )
{ int x=2,y=5,z=8,r;
r=func(func(x,y),z);
printf("%d\n",r);
}
该程序的输出的结果是()
A、12
B、13
C、14
D、15
答案:D
注解:函数func第一次调用的返回值作为第二次调用的实参,第一次调用func(x,y)即func(2,5)的返回值是7,第二次调用func(7,z)即func(7,8)的返回值是15,所以r的值为15。
5.有如下程序
long fib(int n)
{ if(n>2)return(fib(n-1)+fib(n-2));
else return(2);
}
main( )
{printf("%d\n",fib(3));
该程序的输出结果是()
A、2
B、4
C、6
D、8
答案:B
注解:函数fib是递归函数,递归终止条件是n<=2。则fib(3)的调用过程是:条件n>2成立,则再次调用fib(2)和fib(1),而fib(1)和fib(2)在函数调用时,不再递归调用,均返回2到它的上一级调用,即到调用fib(3)的执行过程,所以fib(3)调用返回值为4。
6.在C语言中,函数的隐含存储类别是()
A、auto
B、static
C、extern
D、无存储类别
答案:C
7.以下所列的各函数首部中,正确的是()
A、void play(var:Integer,var b:Integer)
B、void play(int a,b)
C、void play(int a,int b)
D、Sub play(a as integer,b as integer)
答案:C
注解:选项A、D不是C语言的函数定义格式,C语言在函数定义的函数头部,形参的定义是每一个形参都要有自己的关键字。
8.以下程序的输出结果是()
A、0
B、29
C、31
D、无定值
fun(int x,int y,int z)
{ z=x*x+y*y;}
main( )
{ int a=31;
fun(5,2,a);
printf("%d",a);
}
答案:C
注解:函数fun的调用时,参数传递是传值方式,所以形参值的变化并不会影响实参值的变化,故变量a的值保留原值。
9.当调用函数时,实参是一个数组名,则向函数传送的是()
A、数组的长度
B、数组的首地址
C、数组每一个元素的地址
D、数组每个元素中的值
答案:B
注解:函数调用时,参数是数组名或指针时,参数传递是传地址方式。
10.以下只有在使用时才为该类型变量分配内存的存储类说明是()
A、auto和static
B、auto和register
C、register和static
D、extern和register
答案:B
11.以下程序的输出结果是()
A、1
B、2
C、3
D、4
long fun( int n)
{ long s;
if(n= =1 || n= =2)s=2;
else s=n-fun(n-1)
return s;}
main( )
{ printf("%ld\n",fun(3));}
答案:A
注解:fun函数调用是递归调用,主函数中fun(3)调用的执行过程是:初始n=3,if语句的条件n= =1 || n= =2不成立,执行else子句,再次调用fun函数,s=3-fun(2),则此次执行过程中,if语句的条件n= =1 || n= =2成立,执行if后的子句s=2;,然后再返回到调用它的上一级函数fun(3),fun(3)调用再返回到主函数,返回值为1。
12.以下程序的输出结果是()
main( )
{ int num= 0;
while(num<=2)
{ num++;
printf("%d\n",num);
}
A、1
B、1
C、1
D、l
2 2 2
3 3
4
答案:B
注解:循环的执行过程是:(1)变量num的初值为0,则条件num<=2满足,执行循环体,输出num自增后的值1;(2)变量num的值变为1,条件满足,输出num自增后的值2;(3)变量num的值变为2,条件满足,输出num自增后的值3;(4)变量num的值变为3,条件不满足,则退出循环的执行。
13.以下程序的输出结果是()
int f( )
{static int i=0;
int s=1;
s+=i;i++;
return s;
}
main( )
{int i,a=0;
for(i=0;i<5;i++)a+=f();
printf("%d\n",a);
}
A、20
B、24
C、25
D、15
答案:D
注解:在主函数中,函数f( )被调用5次,第一次调用时定义静态变量i,并给i赋初值0,s累加和为1,变量i的值自增为1,将s值返回给a,则a的值为1,第二次调用时,静态变量i保留第一次调用时的值1,s 累加和为2,变量i的值自增为2,将s值返回到a+=f( ),则a的值为1+2=3,第三、四、五次调用类似执行。14.以下程序的输出结果是()
f(int b[ ],int m,int n)
{int i,s=0;
for(i=m;i return s; } main( ) {int x,a[ ]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf("%d\n",x); } A、10 B、18 C、8 D、15 答案:A 注解:函数f(a,3,7)调用时,a是传数组地址,形参数组b与a使用同一片存储空间。f函数的执行是循环控制变量I的初值是3,变量s中累加上b[3]的值4,s的值为4,然后变量I增为5,条件I<7成立,s中累加上b[5]的值6,s的值为10,变量I的值增为7,条件不成立,则退出循环,返回值给x,则最后输出的值为10。 填空题 1.以下程序的输出结果是____________________ main( ) {int x=0; sub(&x,8,1); printf("%d\n",x); } sub(int *a,int n,int k) {if(k<=n) sub(a,n/2,2*k); *a+=k; } 答案: 注解:函数调用sub(&x,8,1),将变量x的地址传给指针变量a,数值8传给n,数值1传给k,在函数体的执行中,条件k<=n成立,再次调用sub(a,4,2)函数,执行函数体,条件k<=n成立,第三次调用sub(a,2,4)函数,数值2传给n,数值4传给k,执行循环体,条件不成立,执行语句*a+=k;,指针a所指单元内 的值为4,返回上一级调用,执行语句*a+=k;,指针a所指单元内的值为6,再一次返回到第一次函数调用,执行语句*a=k;,指针a所指单元内的值为7,则变量x的值为7。 2.以下程序输出的最后一个值是_____________ int ff(int n) { static int f=l; f=f*n; return f; } main( ) { int i; for(i=1;i<=5;i++ ) printf("%d\n",ff(i)); } 答案:120 注解:函数ff在循环中调用5次,第一次调用ff(1),函数体执行,静态变量f的值为1,执行1*n,返回值为1,第二次调用ff(2),静态变量f的值保留第一次调用的值1,执行1*n,返回值为2,依次类推,第五次调用ff(5),f保留第四次调用的值24,执行24*n=24*5=120,返回值为120。 3.以下函数的功能是:求x的y次方,请填空。 double fun( double x,int y) { int i; double z; for(i=1,z=x;i return z; } 答案:x 注解:求x的y次方,即是x*x*…*x,一共有y个x相乘,在for循环中,变量z用为存放累乘的积,所以z=z*x,变量z的初值为x,所以只要循环y-1即可。 4.若已定义:int a[10],i;,以下fun函数的功能是:在第一个循环中给前10个数组元素依次赋1、2、3、 4、5、6、7、8、9、10;在第二个循环中使a数组前10个元素中的值对称折叠,变成1、2、3、4、5、5、 4、3、2、1。请填空。 fun( int a[ ]) { int i; for(i=0;i<10;i++) (1) =i; for(i=0;i<5;i++) (2) =a[i]; } 答案:(1)a[i] (2)a[9-i] 注解:根据要求,第二个循环将数组前10个元素中值对称折叠,即将数组的a[5]中存放a[4]的值,a[6]中存放a[3]的值,依次类推,a[9]中存放a[0]的值,由此可知(2)中应填入的是a[9-i]。 5.若变量n中的值为24,则prnt函数共输出(1) 行,最后一行有(2) 个数。 void prnt(int n,int aa[ ]) { int i; for(i=1;i<=n;i++) { printf("%6d",aa[i]); if( !(i%5) ) printf("\n"); } printf("\n"); } 答案:(1)5(2) 4 注解:变量n的值为24,则在prnt函数中,循环条件为I<=24,执行循环,从aa[1]开始输出,每当下标是5的倍数就换行,输出aa[5]、aa[10]、aa[15]、aa[20]后均要换行输出下面的数据,则prnt函数共输出5行,最后一行输出的元素为aa[21]、aa[22]、aa[23]、aa[24],即最后一行有4个数。 6.以下程序中,主函数调用了LineMax函数,实现在N行M列的二维数组中,找出每一行上的最大值。请填空。 #define N 3 #define M 4 void LineMax(int x[N][M]) { int i,j,p; for(i=0;i { p=0; for(j=1;j if(x[i][p] printf("The max value in line %d is %d\n",i,(2) ); }} main() { int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1}; (3) } 答案:(1)x[i][p]=x[i][j](2)x[i][p](3)LineMax(x) 注解:在函数LineMax中,二重循环求数组的每一行的最大值,取数组中的每一行的第一个元素与后面的元素比较,每一行的最大值存放在第一个元素中,则可知(1)、(2)该填的内容。(3)是要在主函数中调用LineMax 函数,只要给出正确的调用格式即可。 7.以下函数用来求出两整数之和,并通过形参将结果传回,请填空。 void func(int x,int y,______ z) { *z=x+y;} 答案:int * 注解:要通过形参将结果传回,使用指针才能实现,存入的整数之和,所以变量z应定义为整型指针类型。8.以下函数把b字符串连接到a字符串的后面,并返回a中新字符串的长度,请填空。 Strcen(char a[],char b[ ]) { int num=0,n=0; while(*(a+num)!= _________ )num++; while(b[n]){*(a+num)=b[n];num++;n++ ;} return(num); } 答案:'\0' 注解:第一个循环是求a字符串的长度,循环结束条件是计算到字符串的最后一个结束标志。 1.给定程序中函数fun 的功能是:求k!(k<13),所求的阶乘的值作为函数值返回,例:若k=10,则应输出:3628800。请改正fun 程序中的错误,使它能得出正确的结果。 #include long fun(int k) {if (k>0) return(k*fun(k-1)); else if(k =0) return(1); } main( ) {int k=10; clrscr( ); printf("%d!=%d\n",k ,fun(k)); } 答案:将if(k =0)改为if(k ==0) 注解:本题通过递归调用求一个数的阶乘,若数值大于0时,则递归调用函数,若数值等于0,则0!=1,在else 子句的if 语句的判断中,判断变量k 是否为0的条件表达式应该为if(k ==0),而不是赋值表达式k=0。 2.给定的程序中函数fun 的功能是用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num )为止:??≈+-+-7 1513114π例:程序运行后,输入0.0001,则程序输出3.1414。请改正fun 程序中的错误,使它能得出正确的结果。 程序: #include float fun(float num) {int s ; float n ,t ,pi ; t=1; pi=0; n=1; s=1; while(t>=num) {pi=pi+t ; n=n+2; s=-s ; t=s%n ; } pi=pi*4; return pi ; } main( ) {float n1,n2; clrscr( ); printf("Enter a float number :"); scanf("%f",&n1); n2=fun(n1); printf("%6.4f\n",n2); } 答案:将while(t>=num)改为while(fabs(t)>=num) t=s%n改为t=s/n 注解:通过有规律的表达式来求π的值,在while循环中,条件是最后一项的绝对值小于指定的数num,正确的表示应为fabs(t)>=num,pi用来存放所求的和,n为每一项的分母,s控制每一项的符号,t为表达式的每一项,根据给定的条件,t应为s/n。 3.给定程序中fun函数的功能是:判断整数N能否同时被3和7整除,如能则打印YES!,否则打印NO!。请改正fun程序中的错误,使它能得出正确的结果。 #include void fun(int n) {int flag; if((n%3)==&&(n%7)==0) flag=1; else flag=-1; return(flag); } main( ) {int m; printf("\nPlease a number:"); scanf("%d",&m); fun(m); if(fun(m)==1) printf("YES!"); else printf("NO!"); } 答案:将void fun(int n) 改为int fun(int n) 注解:函数fun是判断N能否被3和7整除,如能则标志变量flag的值为1,否则flag的值为-1,函数fun 返回flag值到主函数,则定义函数fun时,应该将函数类型定义为int型,和返回值flag的类型一致。4.程序中函数fun的功能是:打印1到5的阶乘值。 运行结果是:1!=1 2!=2 3!=6 4!=24 5!=120 请改正fac函数中的错误,使它能得出正确的结果。 #include #include int fac(int n) {int f=1; f=f*n; return(f); } main( ) {int j; for(j=1;j<5;j++) printf("%d!=%d\n",j,fac(j)); } 答案:将int f=1;改为static int f=1; 注解:在主函数的循环中,要输出阶乘,则必须在fac函数中将变量f的值保留,若f是动态变量,则每次调用结束,则释放所分配到的临时空间,所以要定义为静态变量,每次调用结束将上次执行的数值保留,参加下一次的执行。 1.给定程序中,编写函数fun的功能是:用“冒泡法”对输入的10个字符按由小到大的顺序排序。 程序: #include #define n 10 char str[n]; fun(char str[ ]) { } main( ) {int j,f; for(f=1;f==1;) {scanf("%s",str); if(strlen(str)>n) printf("超过长度,请重新输入!"); else f=0; } fun(str);