第5章 函数.docx

上传人:b****7 文档编号:10148375 上传时间:2023-02-08 格式:DOCX 页数:25 大小:34.12KB
下载 相关 举报
第5章 函数.docx_第1页
第1页 / 共25页
第5章 函数.docx_第2页
第2页 / 共25页
第5章 函数.docx_第3页
第3页 / 共25页
第5章 函数.docx_第4页
第4页 / 共25页
第5章 函数.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

第5章 函数.docx

《第5章 函数.docx》由会员分享,可在线阅读,更多相关《第5章 函数.docx(25页珍藏版)》请在冰豆网上搜索。

第5章 函数.docx

第5章函数

第5章函数

5.1知识要点

1.1. 掌握C++中函数的定义、调用以及主调函数和被调函数之间的数据传递规则。

2.2. 掌握函数的返回值和它的类型。

3.3. 理解函数递归调用的过程,掌握简单的递归算法。

4.4. 掌握内联函数的概念和应用。

5.5. 理解函数重载的概念和使用场合。

6.6. 理解宏的概念,掌握定义无参宏和带参宏的方法。

7.7. 了解文件包含和条件编译。

5.2典型例题分析与解答

例题1:

关于函数的调用下面不正确的是()。

A.A. 由于程序总是从主函数开始,所以函数的调用总是在主函数和其他函数之间进行

B.B. 函数的调用可以在任意函数之间进行,只要有需要

C.C. 一个函数可以自己调用自己

D.D. 函数返回时可以不必带返回值,这时函数在定义时其类型应用void表示

答案:

A

分析:

因为在C++中程序从主函数开始是正确的,但并未规定函数的调用只能发生在主函数和其他函数之间。

 

例题2:

关于函数的声明和定义正确的是()。

A.A. 函数的声明是必须的,只有这样才能保证编译系统对调用表达式和函数之间的参数进行检测,以确保参数的传递正确

B.B. 函数的定义和声明可以合二为一,可以只有函数定义即可

C.C. 函数在声明时,其参数标识符可省略,但参数的类型、个数与顺序不能省略

D.D. 函数的存储类型为外部型,所以可以在其他函数中被调用,它在定义时象其他外部变量一样,可以在其他函数内定义

答案:

C

分析:

函数的声明并非必须,可以只要函数定义而不要声明,但要注意符合一定条件,函数不可嵌套定义。

 

例题3:

在函数的返回值类型与返回值表达式的类型的描述中,错误的是()。

A.A. 函数返回值的类型是在定义函数时确定,在函数调用时是不能改变的

B.B. 函数返回值的类型就是返回值表达式的类型

C.C. 函数返回值表达式类型与返回值类型不同时,函数表达式类型应转换成返回值类型

D.D. 函数返回值类型决定了返回值表达式的类型

答案:

B

分析:

因为函数的返回值类型与返回值表达式的类型可能不同,在不同时将返回值表达式类型自动转换为函数返回值的类型。

 

例题4:

下面程序的输出结果为()。

#include”iostream.h”

f(inta)

{intb=0;

staticintc=3;

b++;c++;

return(a+b+c);

}

voidmain()

{inta=2,I;

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

cout<

}

A.7B.7C.7D.7

87109

971311

答案:

A

分析:

注意静态局部变量c的特点:

在编译时候只赋一次初值,以后每次调用函数时不再重新赋初值而是保留上次函数调用结束时的值,故本题选A。

 

例题5:

编写一个函数来检验输入的一个字符是大写字母还是小写字母或不是26个英文字母。

分析:

本题要掌握判断字符是大写或者小写字母的方法,程序代码如下:

#include”iostream.h”

charch;

fun(charch)

{intI;

if((ch>=’a’)&&(ch<=’z’))

I=1;

elseif((ch>=’A’)&&(ch<=’Z’))I=2;

elseI=3;

returnI;}

voidmain()

{intI;

cout<<”请输入一个字符:

”;

cin>>ch;

I=fun(ch);

If(I==1)

cout<<”是小写字母!

”<

elseif(I==2)

cout<<”是大写字母!

”<

elsecout<<”是其他字符!

”<

}

 

例题6:

使用函数重载的方法定义两个重名函数,分别求出整型数的两点间距离和浮点型数的两点间距离。

分析:

本题要求我们理解函数重载,另外两点间距离公式为:

d=sqrt((x1-x2)2+(y1-y2)2),程序代码如下:

#include”iostream.h”

#include”math.h”

doublefunc(int,int,int,int),func(double,double,double,double);

voidmain()

{cout<

cout<

}

doublefunc(intx1,inty1,intx2,inty2)

{returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}

doublefunc(doublex1,doubley1,doublex2,doubley2)

{returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}

5.3教材习题分析与解答

1.选择题

(1)以下正确的说法是()。

A.用户若需要调用标准函数,调用前必须重新定义

B.用户可以直接调用所有标准库函数

C.用户可以定义和标准库函数重名的函数,但是在使用时调用的是系统库函数

D.用户可以通过文件包含命令将系统库函数包含到用户源文件中,然后调用系统库函数

答案:

D

 

(2)如果一个函数无返回值,定义时它的函数类型应是()。

A.任意B.intC.voidD.无

答案:

C

 

(3)关于函数返回值的的描述正确的是()。

A.函数返回表达式的类型一定与函数的类型相同

B.函数返回值的类型决定了返回值表达式的类型

C.当函数类型与返回值表达式类型不同,将对返回值表达式的值进行类型转换

D.函数返回值类型就是返回值表达式类型

答案:

C

 

(4)下列哪个不是重载函数在调用时选择的依据()。

A.参数类型B.参数个数C.函数类型D.函数名

答案:

C

 

(5)在参数传递过程中,对形参和实参的要求是()。

A.函数定义时,形参一直占用存储空间B.实参可以是常量、变量或表达式

C.形参可以是常量、变量或表达式D.形参和实参类型和个数都可以不同

答案:

B

 

(6)下列各类变量,哪个不是局部变量()。

A.register型变量B.外部static变量

C.auto型变量D.函数形参

答案:

B

 

(7)在C++语言中,关于参数默认值的描述正确的是()。

A.只能在函数定义时设置参数默认值

B.设置参数默认值时,应当从右向左设置

C.设置参数默认值时,应当全部设置

D.设置参数默认值后,调用函数不能再对参数赋值

答案:

B

 

(8)对于一个功能不太复杂,并且要求加快执行速度,选用(A)合适。

A.内联函数B.重载函数C.递归调用D.嵌套调用

答案:

A

 

(9)预处理命令以()开头。

A.*B.#C./D.:

答案:

B

 

(10)对数组名作函数的参数,下面描述正确的是(B)。

A.数组名作函数的参数,调用时将实参数组复制给形参数组

B.数组名作函数的参数,主调函数和被调函数共用一段存储单元

C.数组名作参数时,形参定义的数组长度不能省略

D.数组名作参数,不能改变主调函数中的数据

答案:

B

 

2.分析程序并写出结果

(1)#include

voidfun();

intn=5;

voidmain()

{intn=10;

cout<

fun();

}

voidfun()

{cout<

运行结果:

10

5

 

(2)#include

voidfun();

voidmain()

{inti;

for(i=0;i<5;i++)fun();

}

voidfun()

{staticintm=0;

cout<

}

运行结果:

0

1

2

3

4

(3)#include

#include

voidfun(intarray[],intn);

voidmain()

{inta[10]={5,8}; inti;

 fun(a,10);

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

cout<

cout<

}

voidfun(intarray[],intn)

{ inti;

 for(i=2;i

array[i]=array[i-1]+array[i-2];

}

运行结果:

581321345589144233377

 

(4)#include

#defineM20

#defineN10

#defineL(r)r*r

voidmain()

{cout<

  cout<

运行结果:

400

120

(5)#include

intadd(intx,inty=8);

voidmain()

{ inta=4;

cout<

  cout<

}

intadd(intx,inty)

{ returnx+y;}

运行结果:

12

16

 

(6)#include

intfun(doublea,doubleb);

voidmain()

{cout<

intfun(doublea,doubleb)

{ returna*b;}

运行结果:

8

 

(7)#include

#include

voidfun(charstring[]);

voidmain()

{charstr[20]="thisisabook";

 cout<

 fun(str);

 cout<

}

voidfun(charstring[])

{inti;

for(i=0;i

  if(string[i]>='a'&&string[i]<='z')string[i]-=32;

}

运行结果:

thisisabook.

THISISABOOK.

 

3.编写函数将化氏温度转换为摄氏温度,公式为C=(F-32)*5/9;并在主函数中调用。

#include

floatfun(floatf)

{floatc;

c=5.0/9*(f-32);//注意这里是5.0/9,不能写成5/9

returnc;

}

voidmain()

{floatx;

cout<<"请输入一个温度值";

cin>>x;

cout<<"转换值为"<

}

 

4.分别利用非递归和递归的方法编写函数求斐波那契数列第n项。

分析:

斐波那契数列具有这样的特点,数列的第一项和第二项都等于1,从第三项开始每项的数值都等于它前面两项之和。

非递归:

#include

floatfeb(intn0,intn1)

{returnn0+n1;}

voidmain()

{inta=1,b=1,c,i;

cout<

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

{c=feb(a,b);cout<

if(i%5==0)cout<

a=b;b=c;

}}

递归:

#include

floatfeb(intn)

{if(n==0)return1;

elseif(n==1)return1;

elsereturnfeb(n-1)+feb(n-2);

}

voidmain()

{for(inti=0;i<20;i++)

{cout<

if(i%5==4)cout<

}}

 

5.编写函数将字符串按逆序存放。

#include

#include

#include

voidmain()

{inti,n;

chars[100],temp;

cout<<"inputstring:

"<

gets(s);

n=strlen(s);

for(i=0;i

{temp=s[i];s[i]=s[n-i-1];s[n-i-1]=temp;}

cout<<"Now,string:

"<

puts(s);

}

 

6.编写函数实现字符串拷贝功能。

#include

#include

voidmain()

{chars1[80],s2[80];

inti;

cout<<"Inputs2:

"<

cin>>s2;

for(i=0;i<=strlen(s2);i++)s1[i]=s2[i];

cout<<"s1:

"<

}

 

7.编写函数利用数组名作参数计算数组arr[3][4]所有元素的和。

#include

intsum(inta[][4],intn,intm)

{intp=0,i,j;

for(i=0;i

for(j=0;j

p+=a[i][j];

returnp;

}

voidmain()

{intb[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

cout<

}

 

8.编写函数利用递归的方法计算x的n阶勒让德多项式的值。

该公式如下:

#include

voidmain()

{intx,n;

floatp(int,int);

cout<<"inputn&x:

"<

cin>>n;cin>>x;

cout<

cout<<"pn(x)=:

"<

}

floatp(intn,intx)

{if(n==0)return

(1);

elseif(n==1)return(x);

elsereturn(((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n);

}

 

9.利用重载编写求整数绝对值和求实数绝对值两个函数。

#include

floatfabnum(floatnum1)

{floatnum;

if(num1>=1e-6)num=num1;

elsenum=-num1;

returnnum;

}

intfabnum(intnum2)

{intnum;

if(num2>=0)num=num2;

elsenum=-num2;

returnnum;

}

voidmain()

{floatnum1;

intnum2;

cout<<"Pleaseinputafloatnumber:

"<

cin>>num1;

cout<<"AbsoluteValueis:

"<

cout<<"Pleaseinputaintnumber:

"<

cin>>num2;

cout<<"AbsoluteValueis:

"<

}

 

10.利用全局变量并编写函数统计数组中奇数和偶数的个数。

#include

#include

intoddnum=0,evennum=0;

voidmain()

{intn,i,a[100];

cout<<"Entern:

"<

cin>>n;

cout<<"inputarraya:

"<

for(i=0;i

cin>>a[i];

cout<<"Arrayais:

"<

for(i=0;i

cout<

cout<

for(i=0;i

{if(a[i]%2==0)oddnum++;

elseevennum++;

}

cout<<"Thenumberofevenis:

"<

cout<<"Thenumberofoddis:

"<

}

5.4补充习题

1.1. 空题:

(1)C++语言程序由构成,其至少包含,C++语言编写的程序总是从

开始,到结束。

(2)在函数中使用语句返回值,其只能返回,但返回值可随的变化而变化。

(3)函数声明是对以后用到的函数的特征进行必要的,它是一个,它不要求。

(4)函数的形参在未被调用之前分配空间,函数的形参的要和实参的相同。

(5)函数调用一般分为和,前者的特点是,后者的特点是。

(6)函数的递归分为和,递归由与两部分组成。

 

 

2.编程题:

(1)设计两个求面积的函数:

area();//求圆面积,需传递一个参数

area();//求矩形面积,需传递两个参数

然后自行输入数据进行测试。

(2)编写一个函数求满足以下条件的最大的n:

12+22+32+…+n2<1000

(3)编写一个函数判定一个字符在一个字符串中出现的次数,如果该字符不出现,则返回值为0。

(4)在主程序中提示输入n,编写函数用递归的方法求1+2+…+n的和。

(5)输入一个整数m,判断它能否被3整除,要求利用带参的宏来实现该程序。

C++程序设计单元测试卷5(第8章)

1.1. 选择题

(1)以下有关构造函数的叙述不正确的是()。

A.构造函数名必须和类名一致B.构造函数在定义对象是自动执行

C.构造函数无任何函数类型D.在一个类中构造函数有且仅有一个

(2)以下叙述中正确的是()

A.在类中,不作特别说明的数据成员均为私有类型

B.在类中,不作特别说明的数据成员均为公有类型

C.类成员的定义必须是成员变量在前、成员函数在后

D.类成员的定义必须放在类定义体内部

(3)有以下类的定义,其中出错的位置是()

classCsample

{Csample();//A

public:

inta=10;//B

Csample(inta0);//C

~Csample();//D

};

(4)以下叙述中不正确的是()

A.在类定义中,通常是用成员变量描述对象的属性;用成员函数描述对象的行为

B.类的一个成员只能具有一种访问控制属性

C.构造函数和析构函数是特殊的成员函数,因此不允许重载

D.通过对象只能访问类的公有成员

(5)以下属于析构函数特征的是()

A.析构函数名与类名不能相同B.析构函数的定义必须在类体内

C.析构函数可以带或不带参数D.在一个类中析构函数有且仅有一个

(6)设有以下类和对象的定义:

classA

{public:

intm;

...

};

Ak1,k2,*p1,*p2;

则下面针对成员变量m的引用,正确的是()

A.k1.m=1;B.k2->m=2;C.p1.m=3;D.(*p2)->m=4;

(7)以下叙述中不正确的是()

A.构造函数和析构函数都是成员函数

B.构造函数和析构函数都可以带参数

C.程序中不能直接调用构造函数,但可以调用析构函数

D.构造函数可以重载但析构函数不可以

(8)设A为test类的对象且赋有初值,则语句testB=A;表示()

A.语法错误B.为对象A定义一个别名

C.将对象A复制给对象BD.仅说明B和A属于同一个类

(9)以下不属于类成员函数的是()

A.构造函数B.析构函数C.友员函数D.虚函数

(10)以下有关成员函数特征的叙述不正确的是()

A.成员函数一定是内联函数B.成员函数可以重载

C.成员函数可以设置缺省数值D.成员函数可以是静态的

(11)友元函数的作用是()

A.提高程序的效率B.加强类的封装性

C.实现数据的隐蔽性D.增加成员函数的种类

(12)以下叙述中不正确的是()

A.A. 一个类的友元函数可以无条件的使用这个类的私有成员

B.B. 静态成员函数可以直接访问非静态数据成员

C.C. 不可以声明抽象类的对象,但可以声明抽象类的指针变量

D.D.静态数据成员为类的所有对象所共享

(13)以下关于静态成员函数的叙述不正确的是()

A.A. 静态成员函数属于整个类

B.B. 对静态成员函数的引用允许使用对象名

C.C. 在静态成员函数中不能直接引用类的非静态成员

D.D.使用类名可以直接调用其静态成员函数

(14)以下关于友元函数的叙述不正确的是()

A.A. 友元函数提供了类之间数据共享的一个途径

B.B. 一个友元函数可以访问任何类的任何成员

C.C. 友元函数破坏了数据的封装

D.D.友元函数增加了程序设计的灵活性

2.填空题

(1)类的成员按访问权限可分为三类:

[1]、[2]、[3]。

(2)构造函数的主要作用是[1],析构函数的主要作用是[2]。

(3)类是对象的[1];而对象则是类的具体[2]。

(4)如果不做特殊说明,类成员的默认访问权限是[1];结构成员的默认访问权限

是[2]。

(5)在C++中定义类时,通常是利用[1]描述对象的“特征”;利用[2]描述对象的“行为”。

(6)在定义对象的同时初始化其成员变量,需要利用[1]函数,用于初始化变量的值可以是固定的常量,也可以通过[2]获得。

(7)若类中没有明确定义析构函数,清除对象的工作[1]来完成,原因是

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

当前位置:首页 > 考试认证 > 其它考试

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

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