习题5.docx
《习题5.docx》由会员分享,可在线阅读,更多相关《习题5.docx(21页珍藏版)》请在冰豆网上搜索。
习题5
习题5和参考解答
1)选择题
(1)在下列关于C函数定义的叙述中,正确的是()。
A.函数可以嵌套定义,但不可以嵌套调用
B.函数不可以嵌套定义,但可以嵌套调用
C.函数不可以嵌套定义,也不可以嵌套调用
D.函数可以嵌套定义,也可以嵌套调用
【答案】B
【解析】C语言规定:
函数不可以嵌套定义,但可以嵌套调用。
(2)以下描述错误的是()。
A.调用函数时,实参可以是表达式
B.调用函数时,实参与形参可以共用内存单元
C.调用函数时,将为形参分配内存单元
D.调用函数时,实参与形参的类型应该一致
【答案】B
【解析】调用函数时实参与形参各自占用独立的内存单元。
(3)以下说法正确的是()。
A.对于用户自定义函数,在使用之前必须加以说明
B.说明函数必须指明其参数类型和返回类型
C.函数可以返回一个值,也可以什么值也不返回
D.空函数不完成任何操作,所以在程序设计中没有用处
【答案】C
【解析】在主函数之前定义的函数不必声明;传统函数说明不说明参数类型。
(4)函数调用不可以()。
A.出现在执行语句中B.出现在一个表达式中
C.作为一个函数的实参D.作为一个函数的形参
【答案】D
【解析】函数的形参只能是变量。
(5)函数调用语句“func((exp1,exp2),(exp3,exp4,exp5));”包含的实参个数为()。
A.1B.2C.4D.5
【答案】B
【解析】本题主要考查对于函数形参的理解。
(6)将一个函数声明为static后,该函数将()。
A.既可以被同一源文件中的函数调用,也可以被其他源文件中的函数调用
B.只能被同一源文件中的函数调用,不能被其他源文件中的函数调用
C.只能被其他源文件中的函数调用,不能被同一源文件中的函数调用
D.既不能被同一源文件中的函数调用,也不能被其他源文件中的函数调用
【答案】B
【解析】静态函数只能被同一编译单元(源文件)中的函数调用。
(7)以下叙述中错误的是()。
A.在不同函数中可以使用相同名称的变量
B.函数中的形参是局部变量
C.在一个函数内定义的变量只在本函数范围内有效
D.在一个函数的复合语句中定义的变量在本函数范围内有效
【答案】D
【解析】在一个函数内的复合语句中定义的变量只在本复合语句范围内有效。
(8)以下叙述中正确的是()。
A.全局变量的作用域一定比局部变量的作用域范围大
B.静态类别变量的生存期贯穿于整个程序的运行期间
C,函数的形参都属于全局变量
D.未在定义语句中赋初值的auto变量和static变量都将是随机值
【答案】B
【解析】静态类别变量的生存期贯穿于整个程序的运行期间,即使退出对应的函数后,该类型的变量也没有释放存储空间,下次调用该函数时仍有效。
(9)以下说法正确的是()。
A.定义函数时,形参的类型说明可以放在函数体内
B.return之后不能紧跟表达式
C.若函数类型与返回值类型不一致,则以函数类型为准
D.若形参与实参类型不一致,则以实参类型为准
【答案】C
【解析】函数类型决定最终返回值的类型。
(10)以下描述正确的是()。
A.调用函数时的实参只能是有确定值的变量
B.return语句的括号中可以是变量、常量或有确定值的表达式
C.函数调用时实参和形参间的参数传递方式不都是值传递
D.实参和形参若类型不匹配,则编译时将报错
【答案】B
【解析】函数调用时实参与形参间的参数传递方式只有值传递,而且实参可以是变量,也可以是常量或表达式,实参类型和形参不匹配时,编译时不会报错,而是在执行时报错。
(11)凡是函数中未指定存储类别的局部变量,其隐含的存储类别为()。
A.自动(auto)B.静态(static)
C.外部(extern)D.寄存器(register)
【答案】A
【解析】对于未加特殊说明的局部变量,其存储类别为自动型。
(12)递归函数f(n)=f(n-1)+n(n>1)的递归体是()。
A.f
(1)=0B.f(0)=1
C.f(n)=f(n-1)+nD.f(n)=n
【答案】C
【解析】递归函数的两个要素为递归体和递归出口,这里主要考查递归体。
(13)下列程序的输出结果是()。
#include
fun(inta,intb,intc)
{
c=a*b;
}
intmain()
{
intc;
fun(2,3,c);
printf("%d\n",c);
return0;
}
A.0B.1C.6D.无法确定
【答案】D
【解析】函数之间的参数传递方式为单向值传递,因为变量c在定义时没有初始化,所以函数调用结束后c的值仍无法确定。
(14)下列程序的输出结果是()。
#include
intx=1;
func(intx)
{
x=3;
}
intmain()
{
func(x);
printf("%d\n",x);
return0;
}
A.3B.1C.0D.无法确定
【答案】B
【解析】局部变量的作用域为其所在的函数,并且当局部变量与全局变量同名时,局部变量将屏蔽全局变量。
(15)下列程序的输出结果是()。
#include
floatfun(intx,inty)
{
return(x+y);
}
voidmain()
{
inta=2,b=5,c=8;
printf(“%3.0f\n”,fun((int)fun(a+c,b),a-c));
}
A.编译出错B.9C.21D.9.0
【答案】B
【解析】该题主要考查函数调用作为函数实参的情况。
2)填空题
(1)下列程序的执行结果是。
#include
voidfunc(inta,intb,intc)
{
printf(“a=%d,b=%d,c=%d\n”,a,b,c);
}
voidmain()
{
inti=2;
func(i,i++,i--);
}
【答案】a=2,b=1,c=2
(2)下列程序的运行结果是。
#include
invert(int*s,inti,intj)
{
intt;
if(i{
invert(s,i+1,j-1);
t=*(s+i);*(s+i)=*(s+j);*(s+j)=t;
}
}
voidmain()
{
inta[6]={10,6,23,-90,0,3},i;
invert(a,0,5);
for(i=0;i<6;i++)
printf(“%d,”,a[i]);
printf(“\n”);
}
【答案】3,0,-90,23,6,10
(3)下列程序的输出结果是。
#include
intfac_sum(intn)
{
staticintf=1,t=1,s=0;
inti;
if(n>t)
for(i=t+1;i<=n;i++)
f=f*i;
else
{
f=1;
for(i=1;i<=n;i++)
f=f*i;
}
t=n;s=s+f;
return(s);
}
voidmain()
{
inta[]={3,5,2},i,sum;
for(i=0;i<3;i++)
sum=fac_sum(a[i]);
printf(“sum=%d\n”,sum);
}
【答案】sum=128
(4)下列程序的输出结果是。
#include
voidss(char*s,chart)
{
while(*s)
{
if(*s==t)
*s=t-‘a’+’A’;
s++;
}
}
voidmain()
{
charstr1[100]=”abcddfefdbd”,c=’d’;
ss(str1,c);
printf(“%s\n”,str1);
}
【答案】abcDDfefDbD
(5)函数voidfun(float*sn,intn)的功能是:
根据以下公式计算S,计算结果通过形参指针sn传回。
要求n通过形参传入,n≥0。
请填空。
S=1-
+
-
+…
voidfun(float*sn,intn)
{
floats=0.0,w,f=-1.0;
inti=0;
for(i=0;i<=n;i++)
{
f=*f;
w=f/(2*i+1);
s+=w;
}
=s;
}
【答案】-1*sn
(6)下列程序的运行结果是。
#include
#include
char*ss(char*s)
{
returns+strlen(s)/2;
}
voidmain()
{
char*p,*str=”abcdefgh”;
p=ss(str);
printf(“%s\n”,p);
}
【答案】efgh
(7)下列程序的运行结果是。
#include
intn=1;
func()
{
staticintx=4;
inty=10;
x=x+2;
n=n+10;
y=y+n;
printf(“FUNC:
x=%2dy=%2dn=%2d\n”,x,y,n);
}
voidmain()
{
staticintx=5;
inty;y=n;
printf(“MAIN:
x=%2dy=%2dn=%2d\n”,x,y,n);
func();
printf(“MAIN:
x=%2dy=%2dn=%2d\n”,x,y,n);
func();
}
【答案】MAIN:
x=5y=1n=1
FUNC:
x=6y=21n=11
MAIN:
x=5y=1n=11
FUNC:
x=8y=31n=21
(8)函数gongyu()的作用是求整数num1和num2的最大公约数,并返回该值,请填空。
gongyu(intnum1,intnum2)
{
inttemp,a,b;
if(num1num2)
{
temp=num1;
num1=num2;
num2=temp;
}
a=num1;b=num2;
while()
{
;a=b;b=temp;
}
return(a);
}
【答案】
=0temp=a%b
(9)函数pi()的功能是:
根据以下公式,返回满足精度(0.0005)要求的π值,请填空。
=1+
+
+
+
+…
#include
#include
#include
doublepi(doubleeps)
{
doubles,t;
intn;
for(;t>eps;n++)
{
s+=t;
t=n*t/(2*n+1);
}
return();
}
voidmain()
{
doublex;
printf(“\nPleaseinputaprecision:
”);
scnaf(“%lf”,&x);
printf(“\neps=%lf,π=%lf”,x,pi(x));
}
【答案】n=1,s=0.0,t=1.02.0*s
(10)若输入整数10,则下列程序的运行结果是。
#include
sub(inta)
{
intc;
c=a%2;
returnc;
}
voidmain()
{
inta,e[10],c,i=0;
printf(“输入一个整数\n”);
scanf(“%d”,&a);
while(a!
=0)
{
c=sub(a);
a=a/2;
e[i]=c;
i++;
}
for(;i>0;i--)
printf(“%d”,e[i-1]);
}
【答案】1010
3)编程题
(1)编写程序,调用函数求一个圆柱体的表面积和体积。
【参考源程序】
#include
voidfun(intr,inth)
{
floatarea;
area=2*3.14*r*h;
vol=3.14*r*r*h;
printf("area=%.2f,vol=%.2f",area,vol);
}
intmain()
{
intr,h;
scanf("%d%d",&r,&h);
fun(r,h);
return0;
}
(2)编写一个函数,输出一个整数的全部素数因子。
例如,m=120时,因子为2,3,5。
【参考源程序】
#include
intfun(intn)
{
intflag=1,i;
for(i=2;iif(n%i==0)
flag=0;
returnflag;
}
intmain()
{
intm,i;
scanf("%d",&m);
for(i=2;iif(m%i==0)
if(fun(i))
printf("%d",i);
return0;
}
(3)编写程序,调用函数使输入的一个字符串反序存放并输出。
【参考源程序】
#include
#include
voidfun(chars[])
{
inti=0,n;
chart;
n=strlen(s)-1;
while(i<=n)
{
t=s[i];s[i]=s[n];s[n]=t;
i++;n--;
}
}
intmain()
{
chars[20];
gets(s);
fun(s);
puts(s);
return0;
}
(4)编写一个函数,输入一个十六进制数,输出相应的十进制数。
【参考源程序】
#include
intfun(chars[])
{
inti=0,n,m=0;
if(s[i]>='a')
n=s[i]-'a'+10;
else
n=s[i]-'0';
while(s[++i]!
='\0')
{
if(s[i]>='a')
m=s[i]-'a'+10;
else
m=s[i]-'0';
n=n*16+m;
}
returnn;
}
voidmain()
{
chars[6];
intn;
gets(s);
n=fun(s);
printf("%d\n",n);
}
(5)编写程序完成以下功能:
在主函数中通过键盘输入10个互不相同的整数并存入一维数组中,调用函数找出数组中的最大值,并从数组中删除该值,最后在主函数中输出删除后的数组。
【参考源程序】
#include
voidfun(inta[10])
{
inti,j=0,max=a[0];
for(i=1;i<10;i++)
{
if(max{
max=a[i];j=i;
}
}
for(i=j;i<9;i++)
a[i]=a[i+1];
}
intmain()
{
inti,a[10];
for(i=0;i<10;i++)
scanf("%d",&a[i]);
fun(a);
for(i=0;i<9;i++)
printf("%d",a[i]);
return0;
}
(6)编写程序,调用函数输出如下杨辉三角形。
【参考源程序】
#include
voidyhui(inta[7][7])
{
inti,j;
for(i=1;i<7;i++)
{
a[i][1]=1;a[i][i]=1;
}
for(i=3;i<7;i++)
for(j=2;j
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i<7;i++)
{
for(j=1;j<=i;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
intmain()
{
inta[7][7];
yhui(a);
return0;
}
(7)用递归法计算
的值,n的值由键盘输入。
【参考源程序】
#include
intsum(intn)
{
intr;
if(n<=0)
printf("dataerror\n");
if(n==1)
r=1;
else
r=sum(n-1)+n*n;
returnr;
}
intmain()
{
intn;
scanf("%d",&n);
printf("result=%d\n",sum(n));
return0;
}
(8)用递归法计算
的值,n的值由键盘输入。
【参考源程序】
#include
intsum(intn)
{
intr;
if(n<=0)
printf("dataerror\n");
if(n==1)
r=1;
else
r=sum(n-1)+n;
returnr;
}
intmain()
{
intn;
scanf("%d",&n);
printf("sum(%d)=%d\n",n,sum(n));
return0;
}
(9)已知
可以用下面的公式表示。
编写函数求
,要求最后一项近似到
。
利用该函数求
,
和
。
【参考源程序】
#include
floatfun1(intn)
{
inti;
floatr=1;
for(i=1;i<=n;i++)
r=r*i;
returnr;
}
floatfun2(floatx,intn)
{
inti;
floatr=1;
for(i=1;i<=n;i++)
r=r*x;
returnr;
}
floatfun(floatx)
{
floatp,s=0;
intn=0;
p=fun2(x,n)/fun1(n);
while(p>1e-4)
{
s+=p;
n++;
p=fun2(x,n)/fun1(n);
}
returns;
}
intmain()
{
printf("%f\n",fun
(1));
printf("%f\n",fun
(2));
printf("%f\n",fun(-0.5));
return0;
}