c++第五章习题解答新教材.docx
《c++第五章习题解答新教材.docx》由会员分享,可在线阅读,更多相关《c++第五章习题解答新教材.docx(14页珍藏版)》请在冰豆网上搜索。
![c++第五章习题解答新教材.docx](https://file1.bdocx.com/fileroot1/2022-11/22/b8fd0a45-7af2-44b3-9c56-9da712ec9779/b8fd0a45-7af2-44b3-9c56-9da712ec97791.gif)
c++第五章习题解答新教材
习题
一、选择题
1.下列叙述错误的是____A_____。
A.主函数中定义的变量在整个程序中都是有效的
B.复合语句中定义的变量只在该复合语句中有效
C.其它函数中定义的变量在主函数中不能使用
D.形式参数是局部变量
2.若函数的形参为一维数组,则下列说法中错误的是____B、才_____。
A.形参数组可以不指定大小
B.函数调用时对应的实参只能是数组名
C.函数调用时,系统会为形参数组分配存储单元
D.函数中对形参的修改将会影响对应的实参值
3.若函数的类型和return语句中的表达式的类型不一致,则____D_____。
A.编译时出错
B.运行时出现不确定结果
C.不会出错,且返回值的类型以return语句中表达式的类型为准
D.不会出错,且返回值的类型以函数类型为准
4.下面的函数定义正确的是_____D____。
A.floatf(floatx;floaty)B.floatf(floatx,y)
{returnx*y;}{returnx*y;}
C.floatf(x,y)D.floatf(intx,inty)
{intx,y;returnx*y;}{returnx*y;}
5.下面函数头的定义格式正确的是____C_____。
A.voidsort(inta[n],intn)B.voidsort(inta[][],intn)
C.voidsort(inta[],intn)D.voidsort(inta[],n)
6.下面4个程序中输出结果是125的有____C_D____。
(1).#include"iostream.h"
voidcube(intx)
{x=x*x*x;}
voidmain()
{
intx=5;cube(x);
cout<}
(3).#include"iostream.h"
intcube(intx)
{x=x*x*x;return(x);}
voidmain()
{
intx=cube(5);
cout<}
A.1B.2C.3D.4
7.设函数m()的说明形式为voidm(int,int*);利用函数m()对数5和整数j作函数m()定义的计算,正确的调用形式为_____C_____。
A.m(&5,&j)B.m(5,j)C.m(5,&j)D.m(&5,j)
8.设函数的说明为:
voidfun(inta[],intm);,若有定义:
inta[10],n,x;则下面调用该函数正确的是____A_____。
A.fun(a,n);B.x=fun(a,n);C.fun(a[10],10);D.x=fun(a[],n);
9.下面函数说明正确的是____C_____。
A.voidf1(inta=3,intb,intc);B.voidf2inta,intb=3,intc);
C.voidf3(inta,intb,intc=3);D.voidf4(inta,intb,int3);
10.有两个函数分别为:
intf(int);和intf(int,int=100);,则下面说法正确的是_____B_____。
A.不能在同一个程序中定义
B.可以在同一个程序中定义,但不可以重载
C.可以在同一个程序中定义并可重载
D.以上说法均错误
11.以下几种函数模板的定义正确的是____A_____。
A.template
Tfun1(Ta,intb)
{……}
C.template
voidfun1(inta,intb)
{Ti;……}
12.下面程序的输出结果是____B_____。
#include"iostream.h"
intm=10;
voidf(intm,int&n)
{m=m+2;n=n+2;}
voidmain()
{
intn=5;
f(m,n);
cout<<"m="<}
A.m=10n=5B.m=10n=7C.m=12n=7D.m=12n=5
二、阅读程序,写出运行结果
1.yes3not4
2.4
3.12
2516921
4.21234
5.m=5n=3
6.911
三、程序填空
1.该程序功能:
对x=1,2,...,10,求f(x)=x*x-5*x+sin(x)的最大值。
#include"iostream.h"
#include"math.h"
floatf(intx)
{
floaty;
y=x*x-5*x+sin(x);
______returny_______;
}
voidmain()
{
intx;floatmax;
____max=f
(1)___;
for(x=2;x<=10;x++)
___if(f(x)>max)max=f(x)__;
cout<}
2.函数backmove()是把字符指针x所指的字符串平移m个字符,即将最后m个字符移到串首。
如“abcdefghij”,平移3个字符,成“hijabcdefg”。
#include"stdio.h"
#include"string.h"
voidbackmove(char*x,intm)
{
inti,j,n;charw;
n=strlen(x);
for(j=0;j{w=_____*(x+n-1)_____;
for(i=0;i____*x____=w;
}
}
voidmain()
{
chars[20];
gets(s);
______backmove(s,3)______;//假设平移3个字符
puts(s);
}
3.函数index()为查找字符串sub是否是字符串st的子串。
若是,返回sub在st中首次出现的下标,否则返回-1。
字符串sub和st非空。
如sub:
"cd",st:
"abcdefcd",返回2。
#include"iostream.h"
#include"stdio.h"
voidmain()
{
chars1[80],s2[80];
______intindex(char[],char[]);______;
gets(s1);gets(s2);
if(_______index(s1,s2)________)
cout<<"子串在字符串中首次出现的下标:
"<else
cout<<"找不到";
}
intindex(charst[],charsub[])
{
inti,j,k;
for(i=0;st[i]!
='\0';i++)
{
for(j=i,k=0;sub[k]!
='\0'&&st[j]==sub[k];____k++,j++_____);
if(sub[k]=='\0')_____return(i)______;
}
return0;
}
4.函数root为用二分法求方程f(x)=0在[x1,x2]的实根,精度为eps。
二分法求根的基本思想为f(x)在区间[a,b]上连续,f(a)与f(b)异号,区间中点c=(a+b)/2的f(c)符号和f(a)符号确定c代替a或b,使根所在区间每次减半,直到|a-b|下面程序为求方程x3-5x2+16x-80=0在[1,7]区间的实根,精度取10-6。
#include"math.h"
#include"iostream.h"
doubleroot(doublex1,doublex2,doubleeps=1e-6)
{
_______doublef(doublex);_______;
doublex,y,y1;
y1=f(x1);
do{
x=0.5*(x1+x2);
y=f(x);
if(y1*y>0.0)_____x1=x_____;
elseif(y1*y<0.0)_____x2=x_____;
}while(fabs(y)>=eps___&&___fabs(x2-x1)>=eps);
return(x);
}
doublef(doublex)
{returnx*x*x-5*x*x+16*x-80;}
voidmain()
{cout<<_____root(1,7)_____<5.随机生成10个1~100之间的数放在一维数组中,求其平均值及最大的元素值。
#include"iostream.h"
#include"stdlib.h"
constintN=10;
voidfun(float*p,float*p1,float*p2)
{
floatsum,max1;
_______max1=*p________;
for(inti=1;i{
if(max1<*p)max1=*p;
sum=sum+*p;
p++;
}
_______*p1=max1_________;
_______*p2=sum/N_________;
}
voidmain()
{
floata[10],aver,max,x;
for(inti=0;i<10;i++)
{
x=rand()%100+1;a[i]=x;
}
for(i=0;i<10;i++)cout<_______fun(a,&max,&aver)______;
cout<<"平均值:
"<"<}
6.函数convert的功能是将一个十进制整数转换为二到十六进制的字符串。
#include"iostream.h"
voidconvert(intm,inth,charch[])
{
charb[17]="0123456789ABCDEF";
intc[10],i=0,k=0;
do
c[___i++__]=m%h;
while(____(m=m/h)!
=0_____);
for(--i;i>=0;--i)
{ch[k++]=b[___c[i]___];}
______ch[k]='\0'_______;
}
voidmain()
{
charch[10];intm,h;
cin>>m>>h;
convert(m,h,ch);
cout<}
四、编写程序
1.编写函数,功能为将字符串s中的字符c1用字符c2替换,并加以调用。
函数形式为:
voidmatch(chars[],charc1,charc2);
#include
usingnamespacestd;
voidreplace(chars[],charc1,charc2)
{char*p=s;
while(*p!
='\0')
{
if(*p==c1)
*p=c2;
p++;
}
}
voidmain()
{chars[80],c1,c2;
cin>>s;
cin>>c1>>c2;
replace(s,c1,c2);
cout<
system("pause");
}
2.编写函数,功能为求圆的周长和面积。
函数分别定义为如下形式:
doublearea(doubler,double*girth,doublepi=3.14159);
voidfun(doubler,double&girth,double&area,doublepi=3.14159);
分别编二个程序实现,半径从键盘输入。
方法一、
#include
doublearea(doubler,double*girth,doublepi=3.14159)
{
*girth=2*pi*r;
return(pi*r*r);
}
voidmain()
{doubler,len,s;
cin>>r;
s=area(r,&len);
cout<<"len="<}
方法二
#include
voidfun(doubler,double&girth,double&area,doublepi=3.14159)
{
girth=2*pi*r;
area=pi*r*r;
}
voidmain()
{doubler,len,s;
cin>>r;
fun(r,len,s);
cout<<"len="<}
3.编写函数,功能是求二维数组中最大元素所在的行号和列号,再编写主函数调用之。
#defineSIZE13
#defineSIZE24
#include"iostream"
#include"stdlib.h"
usingnamespacestd;
floatmax_value(floatx[][4],int&ii,int&jj)
{
floatmax=x[0][0];
for(inti=0;ifor(intj=0;jif(x[i][j]>max)
{max=x[i][j];ii=i;jj=j;}
return(max);
}
voidmain()
{
inti,j,t1,t2;floata[SIZE1][SIZE2];
cout<<"enterthearray:
\n";
for(i=0;i{for(j=0;j{a[i][j]=rand()%101;
cout<cout<}
cout<<"maxvalueis"<cout<<"line="<system("pause");
}
4.编写函数,将两个字符串s和t的前n个字符拼接成新的字符串,结果存放在s中。
如果s或t中字符串的长度不足n,按实际长度处理。
例如,如果有"ABCDEFGH"和"abcdefghijk",n为3,则新的字符串为”ABCabc”,并加以调用。
函数形式为:
voidmystrcat(chars[],chart[],intn);
#include
#include
usingnamespacestd;
voidmystrcat(chars[],chart[],intn)
{
intl1=strlen(s),l2=strlen(t);
intk1=l1>n?
n:
l1,k2=l2>n?
n:
l2;
intk
for(inti=0;is[k1++]=t[i];
s[k1]='\0';
}
voidmain()
{
chars[30],t[30];
intn;
cin>>s>>t;
cin>>n;
mystrcat(s,t,n);
cout<
system("pause");
}
5.编写函数,其功能是逐字符比较两个字符串s1和s2,并将s1中第一个与s2不相同字符的地址返回给主函数。
再编写主函数调用该函数,并在主函数中输出s1从这个位置开始的子串。
函数形式为:
char*dif(chars1[],chars2[]);
#include
usingnamespacestd;
#include"stdio.h"
char*dif(chars1[],chars2[])
{
inti=0;
while(s1[i]==s2[i]&&s1[i]!
='\0')
i++;
if(s1[i]!
='\0')
return(&s1[i]);
elsereturnNULL;
}
voidmain()
{
chars[30],t[30];
cin>>s>>t;
char*p;
if((p=dif(s,t))!
=NULL)
cout<
else
cout<<"s包含于t中\n";
system("pause");
}
6.用递归方法求正整数m,n的最大公约数。
#include
intgcd(intm,intn)
{
intr=m%n;
if(r!
=0)
returngcd(n,r);
else
return(n);
}
voidmain()
{
intm,n;
cin>>m>>n;
cout<}
7.编写四个同名函数max,分别求两个整数、三个整数,两个双精度数、三个双精度数的最大值。
#include
intmax(inta,intb)
{
return(a>b?
a:
b);
}
intmax(inta,intb,intc)
{
intt=max(a,b);
return(max(t,c));
}
doublemax(doublea,doubleb)
{
return(a>b?
a:
b);
}
doublemax(doublea,doubleb,doublec)
{
doublet=max(a,b);
return(max(t,c));
}
voidmain()
{doublex,y,z;
inta,b,c;
cin>>a>>b>>c;
cin>>x>>y>>z;
cout<cout<}