函数习题及答案Word文档下载推荐.docx
《函数习题及答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《函数习题及答案Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
8.C语言规定,函数返回值的类型是由D决定的。
A)return语句中的表达式类型B)调用该函数时的主调函数类型
C)调用该函数时由系统临时D)在定义函数时所指定的函数类型
9.以下正确的描述是B。
A)函数的定义可以嵌套,但函数的调用不可以嵌套
B)函数的定义不可以嵌套,但函数的调用可以嵌套
C)函数的定义和函数的调用均不可以嵌套
D)函数的定义和函数的调用均可以嵌套
10.若用数组名作为函数调用的实参,传递给形参的是A。
A)数组的首地址B)数组中第一个元素的值
C)数组中的全部元素的值D)数组元素的个数
11.如果在一个函数中的复合语句中定义了一个变量,则该变量A。
A)只在该复合语句中有定义B)在该函数中有定义
C)在本程序范围内有定义D)为非法变量
12.以下不正确的说法是D。
A)在不同函数中可以使用相同名字的变量
B)形式参数是局部变量
C)在函数内定义的变量只在本函数范围内有定义
D)在函数内的复合语句中定义的变量在本函数范围内有定义
13.以下不正确的说法是B。
A)形参的存储单元是动态分配的
B)函数中的局部变量都是动态存储
C)全局变量都是静态存储
D)动态分配的变量的存储空间在函数结束调用后就被释放了
14.下面程序的输出是A。
(不同的编译系统可能有不同的结果,6,3,2)
inti=2;
printf(“%d%d%d”,i*=2,++i,i++);
A)8,4,2B)8,4,3C)4,4,5D)4,5,6
15.已知一个函数的定义如下:
doublefun(intx,doubley)
{……}
则该函数正确的函数原型声明为:
C
A)doublefun(intx,doubley)B)fun(intx,doubley)
C)doublefun(int,double);
D)fun(x,y);
16关于函数声明,以下不正确的说法是C。
A)如果函数定义出现在函数调用之前,可以不必加函数原型声明
B)如果在所有函数定义之前,在函数外部已做了声明,则各个主调函数不必再做函数原型声明
C)函数再调用之前,一定要声明函数原型,保证编译系统进行全面的调用检查
D)标准库不需要函数原型声明
17.以下不正确的说法是D。
A)全局变量,静态变量的初值是在编译时指定的
B)静态变量如果没有指定初值,则其初值为0
C)局部变量如果没有指定初值,则其初值不确定
D)函数中的静态变量在函数每次调用时,都会重新设置初值
18.以下不正确的说法是B。
A)register变量可以提高变量使用的执行效率
B)register变量由于使用的是CPU的寄存器,其数目是有限制的
C)extern变量定义的存储空间按变量类型分配
D)全局变量使得函数之间的“耦合性”更加紧密,不利于模块化的要求
二.填空题
1.C语言函数返回类型的默认定义类型是int。
2.函数调用语句:
fun((a,b),(c,d,e))实参个数为2。
3.函数的实参传递到形参有两种方式:
值传递和地址传递。
4.在一个函数内部调用另一个函数的调用方式称为嵌套调用。
在一个函数内部直接或间接调用该函数自身成为函数递归的调用方式。
5.C语言变量按其作用域分为外部变量和内部变量。
按其生存期分为全局变量和局部变量。
6.已知函数定义:
voiddothat(intn,doublex){……},其函数声明的两种写法为
voiddothat(intn,doublex);
和
voiddothat(int,double);
。
7.C语言变量的存储类别有auto,extern,register和static。
8.凡在函数中未指定存储类别的局部变量,其默认的存储类别为auto。
9.在一个C程序中,若要定义一个只允许本源程序文件中所有函数使用的全局变量,则该变量需要定义的存储类别为static。
10.变量被赋初值可以分为两个阶段:
即编译阶段和运行阶段。
三.程序阅读题
1.写出下面程序的运行结果。
func(inta,intb)
{staticintm=0,i=2;
i+=m+1;
m=i+a+b;
return(m);
main()
{intk=4,m=1,p1,p2;
p1=func(k,m);
p2=func(k,m);
printf(“%d,%d\n”,p1,p2);
8,17
2.写出下面程序的运行结果。
#defineMAX10
inta[MAX],i;
sub1()
{for(i=0;
i<
MAX;
i++)a[i]=i+i;
sub2()
{inta[MAX],i,max;
max=5;
for(i=0;
i++)a[i]=i;
sub3(inta[])
{inti;
i++)printf(“%d”,a[i]);
printf(“\n”);
{sub1();
sub3(a);
sub2();
024681012141618
3.若输入的值是-125,写出下面程序的运行结果。
#include<
math.h>
fun(intn)
{intk,r;
for(k=2;
k<
=sqrt(n);
k++){
r=n%k;
while(!
r){
printf(“%d”,k);
n=n/k;
if(n>
1)printf(“*”);
if(n!
=1)printf(“%d\n”,n);
{intn;
scanf(“%d”,&
n);
printf(“%d=”,n);
if(n<
0)printf(“-”);
n=fabs(n);
fun(n);
-125=-5*5*5
4.写出下面程序的运行结果。
inti=0;
fun1(inti)
{i=(i%i)*(i*i)/(2*i)+4;
printf(“i=%d\n”,i);
return(i);
fun2(inti)
{i=i<
=2?
5:
0;
{inti=5;
fun2(i/2);
printf(“i=%d\n”,i);
fun2(i=i/2);
fun1(i/2);
i=5
i=2
i=4
5.写出下面程序的功能。
func(intn)
{inti,j,k;
i=n/100;
j=n/10-i*10;
k=n%10;
if(i*100+j*10+k)==i*i*i+j*j*j+k*k*k)returnn;
return0;
{intn,k;
for(n=100;
n<
1000;
n++)
if(k=func(n))printf(“%d”,k);
153370371407
四.程序判断题
1.下面add函数求两个参数的和;
判断下面程序的正误,如果错误请改正过来。
voidadd(inta,intb)改为int
{intc;
c=a+b;
return(c);
2.下面函数fun的功能是:
将长整型数中偶数位置上的数依次取出,构成一个新数返回,例如,当s中的数为:
87653142时,则返回的数为:
8642;
longfun(longs)
{longt,sl=1;
intd;
t=0;
while(s>
0){
d=s%10;
if(d%2=0){改为==
t=d*sl+t;
sl*=10;
s\=10;
return(t);
3.下面函数fun的功能是:
统计字符串s中各元音字母(即A,E,I,O,U)的个数,注意:
字母不分大,小写;
fun(chars[],intnum[5])
{intk;
i=5;
for(k=0;
i;
k++)
num[i]=0;
s[k];
i=-1;
switch(s){
case‘a’:
case‘A’:
i=0;
break;
添加红色部分
case‘e’:
case‘E’:
i=1;
case‘i’:
case‘I’:
i=2;
break;
case‘o’:
case‘O’:
i=3;
case‘u’:
case‘U’:
i=4;
if(i>
=0)
num[i]++;
4.函数fun的功能是:
根据整型形参m,计算如下公式的值:
判断下面程序的正误,如果错误请改正过来。
fun(intm)
{doubley=0,d;
inti;
for(i=100;
i<
=m;
i+=100){
d=(double)i*(double)I;
改为i
y+=1.0/d;
return(y);
5.下面函数fun的功能是:
依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串;
voidfun(chars[])
{inti,j;
for(i=0,j=0;
s[i]!
=’\0’;
i++)
if(s[i]>
=’0’&
&
s[i]<
=’9’)
s[j]=s[i];
改为s[j++]
s[j]=”\0”;
五.程序填空题
1.下面函数用“折半查找法”从有10个数的a数组中对关键字m查找,若找到,返回其下标值,否则返回-1,请填
(2)空使程序完整。
经典算法提示:
折半查找法的思路是先确定待查元素的范围,将其分成两半,然后比较位于中间点元素的值。
如果该待查元素的值大于中间点元素的值,则将范围重新定义为大于中间点元素的范围,反之亦反。
intsearch(inta[10],intm)
{intx1=0,x2=0,mid;
while(x1<
=x2){
mid=(x1+x2)/2;
if(m<
a[mid])【1x2=mid-1】;
elseif(m>
a[mid])【2x1=mid+1】;
elsereturn(mid);
return(-1);
2.del函数的作用是删除有序数组a中的指定元素x,n为数组a的元素个数,函数返回删除后的数组a元素个数,请填
(2)空使程序完整。
intdel(inta[10],intn,intx)
{intp=0,i;
while(x>
=a[p]&
p<
n)
【1p++】;
for(i=p-1;
n-1;
【2a[i]=a[i+1]】;
return(n-1);
3.以下程序的功能是计算函数
请填(3)空使程序完整。
#include<
stdio.h>
【1floatfun(floata,floatb)】;
{floatx,y,z,f;
scanf(“%f,%f,%f”,&
x,&
y,&
z);
f=fun(【2x+y,x-y】);
f+=fun(【3z+y,z-y】);
printf(“f=%d”,f);
floatfun(floata,floatb)
{return(a/b);
4.avg函数的作用是计算数组array的平均值返回,请填(3)空使程序完整。
floatavg(floatarray[10])
floatavgr,sum=0;
for(i=1;
【1i<
10】;
sum+=【2array[i]】;
avgr=sum/10;
【3returnavgr】;
六.编程题
1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,且两个整数的输入也在主函数。
intmax(intm,intn)
{intw;
while(n){
w=m%n;
m=n;
n=w;
returnm;
intmin(intm,intn){
returnm*n/max(m,n);
main(){
intm,n;
scanf("
%d,%d"
&
m,&
printf("
%d,%d\n"
max(m,n),min(m,n));
2.写一个判素数的函数,在主函数输入一个数,输出是否为素数的信息。
intprime(intm)
{inti;
for(i=2;
i<
=sqrt(m);
i++)
if(m%i==0)
return0;
return1;
intm;
%d"
m);
if(prime(m))
%dis\n"
m);
else
%disnot\n"
3.写一个函数,使给定的一个二维数组(N×
N)转置,即行列互换。
(N是不大于10的数,由输入决定)。
(可不作)
4.编写一个fun函数voidfun(chars1[],chars2[]),将两个字符串s1和s2连接起来存放在s1中。
voidfun(chars1[],chars2[])
{
inti,j;
for(i=0;
s1[i]!
i++);
for(j=0;
(s1[i]=s2[j])!
i++,j++);
5.编写一个fun函数:
longfun(chars[]),将一个数字字符串转换为一个整数(不得调用标准库函数)。
例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。
ctype.h>
longfun(chars[]){
inti,n,sign;
for(i=0;
isspace(s[i]);
i++)/*skipwhitespace*/
;
sign=(s[i]=='
-'
)?
-1:
1;
if(s[i]=='
+'
||s[i]=='
)/*skipsign*/
i++;
for(n=0;
isdigit(s[i]);
n=10*n+(s[i]-'
0'
);
returnsign*n;
6.编写一个fun函数:
intfun(inta[],intn),删去一维数组中所有相同的数,使之只剩一个。
数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,一维数组中的数据是:
222344566677899101010,删除后,数组中的内容应该是:
2345678910(可不作)
intfun(inta[],intn){
for(i=1,j=0;
n;
if(a[j]!
=a[i]){
j++;
a[j]=a[i];
}
returnj+1;
inta[100]={1,2,2,2,3,3,4,4,4,5,5,6};
n=fun(a,12);
for(m=0;
m<
m++)
%d"
a[m]);
7.提高题:
写一个函数,输入一个4位整数,要求输出这个数的4个数字字符,但每个字符间空一个格。
#defineN5
voidfun(intn){
inti,j=0;
chars[N];
while(n)
{
i=n%10;
s[j++]=i+'
;
n=n/10;
s[j]='
\0'
for(i=j-1;
i>
=0;
i--)
printf("
%c"
s[i]);
fun(m);