第5章 函数与宏思考与练习题答案Word格式文档下载.docx
《第5章 函数与宏思考与练习题答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第5章 函数与宏思考与练习题答案Word格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。
![第5章 函数与宏思考与练习题答案Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/96183f77-df38-4d64-83a1-3d6ef9fed249/96183f77-df38-4d64-83a1-3d6ef9fed2491.gif)
内嵌"
到调用他的程序代码中,这样做的目的是为了节省了调用函数的开销。
8、什么叫函数重载?
函数重载是指使用一个函数名称定义了多个完成不同功能的函数,这些函数的输入参数类型或个数不一样,相应的函数类型也有可能改变。
9、什么叫预编译语句?
在C++程序的源代码中可以包括各种编译用的命令语句,这些语句都称为预编译语句。
10、什么叫宏?
谈谈带参数宏与内联函数之间的异同点.
宏是指定义一个标识符来代替一个字符序列。
内联函数和宏都是在程序出现的地方展开,是在调用该函数的程序处或应用宏处将它展开。
但内联函数可以多行的程序段,而宏通常是单行代码段。
11、指出下列函数说明语句有哪些错误并说出原因。
(1)char*volume(intheight,width,charbackground);
函数的参数部分说明错误;
width参数没有指出数据类型。
(2)doublework(double&
matrix[10]);
参数部分引用数组的说明形式错误;
不符合引用数组的说明形式。
(3)voiddisplay(intarr[][],intsize);
参数二维数组的说明不对;
右下标大小不能为空。
(4)voidsum(int(&
a)[]);
不符合引用数组的说明形式;
大小不能缺省。
(5)intfun(doublea,intb=0,intc);
缺省值位置说明错误;
指定缺省值必须从右向左给出,不能跳跃指定缺省值。
(6)doubleMatrix(double*m[]);
指针变量数组的说明形式不对;
(7)char*fetch(inta=24,intb,charc=0);
(8)voidlength(int&
a[2]);
引用数组说明错误;
12、什么叫递归函数?
简述其执行过程。
递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数。
递归函数调用的执行过程分为两个阶段:
(1)递推阶段:
从原问题出发,按递归公式递推,从未知到已知,最终达到递归终止条件。
(2)回归阶段:
按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解。
13、阅读下列程序并给出运行结果。
(1)#include<
iostream.h>
intfun(intx,inty)
{
returnx*y;
}
voidmain(void)
intk=5;
cout<
<
fun(k,2)<
endl;
运行结果是:
10
(2)#include<
#include<
math.h>
voidfun(inta,intb,double&
s,double&
t)
{
s=sqrt(a*a+b*b);
t=sqrt(a*a-b*b);
}
doublem,n;
fun(4,3,m,n);
cout<
m+n<
运行结果是:
7.64575
(3)#include<
intn=0;
int&
fun(intx)//引用型函数
n-=x;
returnn;
fun(100)+=10;
"
n="
n<
输出结果是:
n=-90
(4)#include"
stdio.h"
intd=0;
intfun(intp)
{
staticintg=10;
g+=++d-p;
printf("
%d"
,g);
return(g);
voidmain(void)
intd=10;
printf("
%d\n"
,fun(fun(d)-fun
(2)));
1,1,4,4
(5)#include"
iostream.h"
intafox(intx,int&
y,int*v,int*w)
*v=--x+y++;
*w=x-y;
return(v);
voidmain(void)
inta=3,b=3,c=3,d=3;
afox(a,b,&
c,&
d);
a<
"
"
b<
"
c<
d<
endl;
}
3,4,6,-1
14、已知三角形的三边,求三角形面积,将其编写成一个函数。
#include<
doublearea(doublea,doubleb,doublec,doubles)//求三角行的面积
doublep;
p=sqrt(s*(s-a)*(s-b)*(s-c));
returnp;
voidmain()
doublex,y,z,q;
请输入三角形三边的长度"
cin>
>
x>
y>
z;
//输入三边长度
if(!
(((x+y)>
z)&
&
((x+z)>
y)&
((y+z)>
x)))//判断给出的三边能否构成三角形
cout<
你输入的三边不能构成三角形"
else
q=area(x,y,z,(x+y+z)/2);
三角形面积是:
Area="
q<
15、编写函数求两个整型参数a和b的最小公倍数。
#include<
voidnum(intx,inty)
{
intarg[100];
intm=0,n=0,j=0;
for(inti=0;
i<
100;
i++)
arg[i]=0;
m=n=x>
y?
x:
y;
for(;
=(x*y);
n++)
if((n%x==0)&
(n%y==0))
arg[j]=n;
j++;
}
}
for(intk=0;
k<
j;
k++)
{intt=0;
if(arg[0]>
arg[k])
{
t=arg[0];
arg[0]=arg[k];
arg[k]=t;
这两个数的最小公倍数是:
arg[0]<
inta,b;
请输入两个整数:
a>
b;
num(a,b);
16、编写判断一个正整数是否为素数的函数。
voidmain()
intm,i,z;
boolq=false;
请输入一个数:
;
m;
z=(int)sqrt(m);
//求m的平方根
for(i=2;
=z;
i++)
if(m%i==0)//数m是否能被小于m平方根的数整除
q=true;
break;
if(q)
你输入的数不是素数!
你输入的数是素数!
17、分析并指出下列函数或程序实现的功能。
(1)voidTrans(intx)
chara[10];
inti=0,rem;
do
rem=x%16;
x=x/16;
if(rem<
10)
a[i]=48+rem;
//'
0'
字符的ASCII码为48
else
a[i]=65+rem;
A'
字符的ASCII码为65
i++;
}while(x!
=0);
while(i>
0)
a[i--];
实现的功能是:
将a[i]中的元素转换成十六进制。
(2)#include<
doubleTest(intn)
doublesign=-1,s
(1);
for(inti=2;
i<
=n;
i++)
{s+=sign/(i*i);
sign*=-1;
returns;
inta(7);
Test(a)<
endl;
求公式
(3)doubleCalculate(doublea,doubleb,charop)
switch(op)
case'
+'
:
returna+b;
-'
returna-b;
*'
returna*b;
/'
if(b==0)
cout<
dividedby0!
return(-9999.999999);
}
else
returna/b;
default:
operatorerror!
return(-9999.999999);
两个数的加减乘除运算。
(4)#include<
#include<
stdlib.h>
constN=10;
intToCompute(intx,inty)
intz;
x<
'
<
y<
='
;
cin>
if(x+y==z)
return1;
else
return0;
inta,b,c=0;
srand(100);
//初始化随机数序列
N;
a=rand()%20+1;
//rand()函数产生0-32767之间的一个随机数
b=rand()%20+1;
c+=ToCompute(a,b);
得分:
c*10<
对20以内任意两个加发运算能力的测试。
18、编写一个函数,要求将一个double型的一维数组和数组长度作为参数,并返回该数组中的正数之和。
doubleTestArray(doubleb[],intSize);
intn=0;
doublea[100],r=0;
请输入数组元素的个数(n小于100)n="
//输入元素的个数
in>
n;
for(inti=0;
i++)//输入数组的元素
{
cout<
a["
i+1<
]="
cin>
a[i];
r=TestArray(a,5);
//调用函数TestArray,将返回值赋给r
Result="
r<
//输出r
doubleTestArray(doubleb[],intSize)//求数组中非负元素的和
doubles=0;
b++;
for(inti=0;
Size;
i++)
if(b[i-1]<
0)continue;
s+=b[i-1];
return(s);
19、编写一个函数,能够实现将一个double型的二维矩阵转置的功能。
voidTurarr(doublearg[][],inta,intb)//数组转置
doublek;
for(inti=0;
a;
for(intj=i;
j<
j++)
if(i!
=j)
{
k=arg[i][j];
arg[i][j]=arg[j][i];
arg[j][i]=k;
}
double*q;
doublea[][]={1.0,2.0,3.0,4.0};
//初始化数组
q=a[0][0];
Turarr(q,2,2);
20、汉诺塔(Hanoi)是在欧洲比较流行的一种游戏。
游戏的要求是这样的:
设有A,B,C三个竿,A竿上有若干个由大到小的穿心圆盘,大的圆盘在下面,小的圆盘在上面,B和C都是空杆,请你把A杆上的圆盘都倒到C杆上,但在倒盘的过程中不允许大的圆盘压在小的圆盘之上(如下图所示)。
请用递归函数方法实现该程序。
voidhanoi(intn,charp,charq,charr)
if(n==1)
move"
p<
to"
r<
hanoi(n-1,p,r,q);
hanoi(n-1,q,p,r);
intn;
chara='
charb='
B'
charc='
C'
Enterthenumberofdisks:
Thesolutionforn="
hanoi(n,a,b,c);