第三章习题答案.docx

上传人:b****5 文档编号:3374197 上传时间:2022-11-22 格式:DOCX 页数:28 大小:42.90KB
下载 相关 举报
第三章习题答案.docx_第1页
第1页 / 共28页
第三章习题答案.docx_第2页
第2页 / 共28页
第三章习题答案.docx_第3页
第3页 / 共28页
第三章习题答案.docx_第4页
第4页 / 共28页
第三章习题答案.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

第三章习题答案.docx

《第三章习题答案.docx》由会员分享,可在线阅读,更多相关《第三章习题答案.docx(28页珍藏版)》请在冰豆网上搜索。

第三章习题答案.docx

第三章习题答案

第3章函数

3.1选择题

1.以下正确的函数原型为(D)。

(A)f1(intx;inty);(B)voidf1(x,y);

(C)voidf1(intx,y);(D)voidf1(int,int);

2.有函数原型voidfun2(int);,在下列选项中,不正确的调用是(C)。

(A)inta=21;fun2(a);(B)inta=15;fun2(a3);

(C)intb=100;fun2(&b);(D)fun2(256);

3.有函数原型voidfun3(int);,在下列选项中,正确的调用是(C)。

(A)doublex=2.17;fun3(&x);(B)inta=15;fun3(a3.14);

(C)intb=100;fun3(&b);(D)fun3(256);

4.有函数原型voidfun4(int&);,在下列选项中,正确的调用是(C)。

(A)inta=2.17;fun4(&a);(B)inta=15;fun4(a3.14);

(C)intb=100;fun4(b);(D)fun4(256);

5.有声明

voidfun5(int&);inta,intp=&a;

在下列选项中,正确的调用是(B)。

(A)fun5(&a);(B)fun5(p);(C)fun5(a);(D)fun5(p);

6.有声明

intfun6(int);int(pf)(int)=fun6;

在下列选项中,正确的调用是(C)。

(A)inta=15;intn=fun6(&a);(B)inta=15;cout<<(&pf)(a);

(C)cout<<(pf)(256);(D)cout<

7.在VC中,若定义一个函数的返回类型为void,则以下叙述正确的是(C)。

(A)函数返回值需要强类型转换(B)函数不执行任何操作

(C)函数本身没有返回值(D)函数不能修改实际参数的值

8.函数参数的默认值不允许为(C)。

(A)全局常量(B)直接常量(C)局部变量(D)函数调用

9.使用重载函数编程序的目的是(A)。

(A)使用相同的函数名调用功能相似的函数(B)共享程序代码

(C)提高程序的运行速度(D)节省存储空间

10.在下列的描述中,(B)是错误的。

(A)使用全局变量可以从被调用函数中获取多个操作结果

(B)局部变量可以初始化,若不初始化,则系统默认它的值为0

(C)当函数调用完后,静态局部变量的值不会消失

(D)全局变量若不初始化,则系统默认它的值为0

11.在下列选项中,(C)具有文件作用域。

(A)语句标号(B)局部变量(C)全局变量(D)静态变量

3.2阅读下列程序,写出运行结果

1.

#include

usingnamespacestd;

#include

intf(int);

intmain()

{

inti;

for(i=0;i<3;i++)

cout<

}

intf(inta)

{

intb=0,c=1;

b++;c++;

returnint(a+pow(double(b),2)+c);

}

【解答】

3

4

5

2.

#include

usingnamespacestd;

voidfunc(inta,intb,intc=3,intd=4);

intmain()

{

func(10,15,20,30);

func(10,11,12);

func(12,12);

}

voidfunc(inta,intb,intc,intd)

{

cout<

}

【解答】

10152030

1011124

121234

3.

#include

usingnamespacestd;

voidfunc(int,int,int);

intmain()

{

intx,y,z;

func(5,6,&x);

func(7,x,&y);

func(x,y,&z);

cout<

}

voidfunc(inta,intb,intc)

{

b+=a;c=b-a;

}

【解答】

6,6,6

4.

#include

usingnamespacestd;

voidfunc(int,int,int&);

intmain()

{

intx=0,y=1,z=2;

func(1,2,x);

func(x+y,y,y);

func(z,x+y,z);

cout<

}

voidfunc(inta,intb,int&c)

{

b+=a;c=b-a;

}

【解答】

2,1,3

5.

#include

usingnamespacestd;

voidfunc(int,int,int&);

intmain()

{

inta=10,b=20;

intp=&a,q=&b;

func(p,q,p);

cout<<"p="<

}

voidfunc(intt1,intt2,int&rt)

{

t1+=5;t2+=5;

rt=t1;

rt+=5;

cout<<"t1="<

}

【解答】

*t1=20,*t2=25,*rt=20

*p=20,*q=25

6.

#include

usingnamespacestd;

intf2(int,int);

intf1(inta,intb)

{

intc;

a+=a;b+=b;

c=f2(a+b,b+1);

returnc;

}

intf2(inta,intb)

{

intc;

c=b%2;

returna+c;

}

intmain()

{

inta=3,b=4;

cout<

}

【解答】

15

7.

#include

usingnamespacestd;

intage(intn)

{

intf;

if(n==1)

f=10;

else

f=age(n-1)+2;

returnf;

}

intmain()

{

cout<<"age:

"<

}

【解答】

age:

18

8.

#include

usingnamespacestd;

intf1(inta,intb)

{

returna+b;

}

intf2(inta,intb)

{

returna-b;

}

intf3(int(t)(int,int),inta,intb)

{

return(t)(a,b);

}

intmain()

{

int(p)(int,int);

p=f1;

cout<

p=f2;

cout<

}

【解答】

12

4

9.

#include

usingnamespacestd;

intsub(int,int);

inta=1;

intmain()

{

intm=1,n=2,f;

f=sub(m,n);

cout<

f=sub(m,n);

cout<

}

intsub(intc,intd)

{

staticintm=2,n=5;

cout<

a=++a;c=m++;d=n++;

returnc+d;

}

【解答】

25

27

36

39

3.3思考题

1.函数的作用是什么?

如何定义函数?

什么是函数原型?

【解答】

函数的两个重要作用:

(1)任务划分,把一个复杂任务划分为若干小任务,便于分工处理和验证程序正确性;

(2)软件重用,把一些功能相同或相近的程序段,独立编写成函数,让应用程序随时调用,而不需要编写雷同的代码。

函数的定义形式:

类型函数名([形式参数表])

{

语句序列

}

函数原型是函数声明,告诉编译器函数的接口信息:

函数名、返回数据类型、接收的参数个数、参数类型和参数顺序,编译器根据函数原型检查函数调用的正确性。

2.什么是函数值的返回类型?

什么是函数的类型?

如何通过指向函数的指针调用一个已经定义的函数?

编写一个验证程序进行说明。

【解答】

(1)函数的返回类型是函数返回的表达式的值得类型;

(2)函数类型是指函数的接口,包括函数的参数定义和返回类型;

(3)若有

functionTypefunctionName;//functionType是已经定义的函数类型

functionType*functionPointer=functionName;//定义函数指针并获取函数地址

则可以通过函数指针调用函数:

(*functionPointer)(argumentList);

或functionPointer(argumentList);

其中argumentList是实际参数表。

验证程序:

#include

usingnamespacestd;

intmain()

{

typedefintmyfunc(int,int);

myfuncf,*fp;

inta=10,b=6;

fp=f;

cout<<"Usingf(a):

"<

cout<<"Usingfp(a):

"<

cout<<"Using(*fp)(a):

"<<(*fp)(a,b)<

return0;

}

intf(inti,intj)

{

returni*j;

}

3.什么是形式参数?

什么是实际参数?

C++函数参数有什么不同的传递方式?

编写一个验证程序进行说明。

【解答】

参数是调用函数与被调用函数之间交换数据的通道。

函数定义首部的参数称为形式参数,调用函数时使用的参数称为实际参数。

C++有三种参数传递机制:

值传递(值调用);指针传递(地址调用);引用传递(引用调用)。

验证程序:

#include

usingnamespacestd;

voidfuncA(inti)

{i=i+10;}

voidfuncB(int*j)

{*j=*j+20;}

voidfuncC(int&k)

{k=k+30;}

intmain()

{

inta=1;

funcA(a);cout<<"a="<

funcB(&a);cout<<"a="<

funcC(a);cout<<"a="<

}

程序输出:

a=1//传值参数,实际参数值不变

a=21//指针参数,形式参数通过间址修改实际参数

a=51//引用参数,形式参数通过别名方式修改实际参数

4.C++函数通过什么方式传递返回值?

当一个函数返回指针类型时,对返回表达式有什么要求?

当返回引用类型时,是否可以返回一个算术表达式?

为什么?

【解答】

C++首先计算表达式的值,然后把该值赋给函数返回类型的匿名对象,通过这个对象,把数值带回调用点,继续执行后续代码。

当函数返回指针类型时,返回的地址值所指对象不能是局部变量。

因为局部变量在函数运行结束后会被销毁,返回这个指针是毫无意义的。

返回引用的对象不能是局部变量,也不能返回表达式。

算术表达式的值被储存在匿名空间中,函数运行结束后会被销毁,返回这个变量的引用也是无意义的。

5.变量的生存期和变量作用域有什么区别?

请举例说明。

【解答】

变量的生存期是指程序运行后,变量占有内存的时间;变量作用域指的是指变量声明之后,在程序正文中有效的那部分区域。

例如,定义函数:

voidcount()

{

staticintn=0;

//……

}

该函数中n被定义为static变量,生存期是整个程序运行时期;但作用域只在count函数中。

6.静态局部变量有什么特点?

编写一个应用程序,说明静态局部变量的作用。

【解答】

静态局部变量的生存期是全程的,作用域是局部的。

程序开始执行时就分配和初始化存储空间(默认初始化值为0)。

定义静态局部变量的函数退出时,系统保持其存储空间和数值。

下次调用这个函数时,static变量还是上次退出函数时的值。

直至整个程序运行结束,系统才收回存储空间。

程序略。

7.在一个语句块中能否访问一个外层的同名局部变量?

能否访问一个同名的全局变量?

如果可以,应该如何访问?

编写一个验证程序进行说明。

【解答】

一个语句块中不能访问外层的同名局部变量。

可以访问一个同名的全局变量。

验证程序:

#include

usingnamespacestd;

inta=0;//全局变量a

intmain()

{

inta=1;//外层局部变量a

{

inta=2;//内层局部变量a

cout<<"Localais"<

}

cout<<"Mainais"<

cout<<"Globalais"<<:

:

a<

}

8.有函数原型

voidf(int&n);

和函数调用

inta;

//…

f(a);

有人说,因为n是a的引用,则在函数f中访问n相当于访问a,所以,可以在f的函数体内直接使用变量名a。

这种说法正确吗?

为什么?

编写一个验证程序。

【解答】

形式参数n的作用域是f函数,实际参数a的作用域是调用f函数的模块(例如main函数),所以在f函数中可见n而不可见a。

因此,这种说法不正确。

f函数内不能直接使用变量名a,只能通过别名n访问a。

验证程序:

#include

usingnamespacestd;

voidf(int&n);

intmain()

{

inta=1;

f(a);

cout<<"a="<

}

voidf(int&n)

{

a++;//错误,直接使用a

n++;//正确

}

产生编译错误:

errorC2065:

“a”:

未声明的标识符

9.有以下程序:

#include

usingnamespacestd;

intmain()

{

charc;

cin>>c;

if(c=='y'||c=='Y')

inta=1;

else

inta=0;

cout<<"a="<

}

编译错误为:

errorC2065:

'a':

undeclaredidentifier,指示语句行

cout<<"a="<

变量a没有定义。

请分析原因,并进行修改。

【解答】

if-else语句中分别出现变量a的说明语句,是作用域为if分支和else分支的两个变量。

在if-else语句之后,这两个变量都是没有定义的,因此出现编译错误。

正确的程序是:

#include

usingnamespacestd;

intmain()

{

charc;

inta;

cin>>c;

if(c=='y'||c=='Y')

a=1;

else

a=0;

cout<<"a="<

}

10.有函数原型

doublefunction(int,double);

函数function的返回值类型是什么?

函数的类型是什么?

使用typedef定义函数的类型。

有函数调用语句

x=function(10,(2(0.314+5));

其中的括号“()”与函数原型中括号有什么语义区别?

【解答】

函数function的返回值类型是double

函数类型是:

double(int,double)

可以定义为:

typedefdoublefunType(int,double);

函数调用function(10,(2*(0.314+5))中,外层括号表示调用函数匹配的实际参数表,里面的两层括号是表达式运算。

11.请分析以下各语句的意义。

intfun();

int(pf)();

fun();

pf=fun;

pf();

【解答】

int*fun();//函数原型声明。

fun是返回int*类型,没有参数的函数

int*(*pf)();//声明指针变量。

pf是指向函数的指针,函数类型为int*()

fun();//调用函数语句

pf=fun;//向指针变量赋值。

函数指针pf指向函数fun

pf();//用指针变量间址调用函数

3.4编程题

1.已知

,其中,sh为双曲正弦函数,即

编写一个程序,输入x的值,求y的值。

【解答】

#include

#include

usingnamespacestd;

doublesh(doublet);

intmain()

{

doublex,y;

cout<<"x=";

cin>>x;

y=sh(1+sh(x))/(sh(2*x)+sh(3*x));

cout<<"y="<

}

doublesh(doublet)

{return(exp(t)-exp(-t))/2;}

2.输入m、n和p的值,求s=

的值。

注意判断运算中的溢出。

【解答】

usingnamespacestd;

doublef(longk,longnum);

intmain()

{

longm,n,p;doubles,f1,f2,f3;

cout<<"m,n,p=";

cin>>m>>n>>p;

f1=f(1,m);

f2=f(3,n);

f3=f(5,p);

if(f1&&f2&&f3)

{

s=(f1+f2)/f3;

cout<<"s="<

}

else

cout<<"溢出!

\n";

}

doublef(longk,longnum)

{

longi;

doublesum=0;

for(i=1;i<=num&&sum<2147483647;i++)

{

sum=sum+pow(double(i),double(k));

}

if(i<=num)

return0;//溢出时返回

returnsum;

}

3.输入a、b和c的值,编写一个程序求这三个数的最大值和最小值。

要求:

把求最大值和最小值操作分别编写成一个函数,并使用指针或引用做为形式参数把结果返回main函数。

【解答】

(1)使用指针参数

#include

usingnamespacestd;

voidfmaxmin(double,double,double,double*,double*);

intmain()

{

doublea,b,c,max,min;

cout<<"a,b,c=";

cin>>a>>b>>c;

fmaxmin(a,b,c,&max,&min);

cout<<"max="<

cout<<"min="<

}

voidfmaxmin(doublex,doubley,doublez,double*p1,double*p2)

{

doubleu,v;

if(x>y)

{u=x;v=y;}

else

{u=y;v=x;};

if(z>u)u=z;

if(z

*p1=u;

*p2=v;

}

(2)使用引用参数

#include

usingnamespacestd;

voidfmaxmin(double,double,double,double&,double&);

intmain()

{

doublea,b,c,max,min;

cout<<"a,b,c=";

cin>>a>>b>>c;

fmaxmin(a,b,c,max,min);

cout<<"max="<

cout<<"min="<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1