当前位置:首页 >> 理学 >> C++第三章习题解答

C++第三章习题解答


第三章 函数习题

1

第三章 函数习题
一.基本概念与基础知识自测题
3.1 填空题 3.1.1 被定义为形参的是在函数中起 (1) 作用的变量,形参只能用 (2) 表示。实参的 作用是 (3) ,实参可以用 (4) 、 (5) 、 (6) 表示。 答案: (1)自变量 (2)变量名 (3)将实际参数的值传递给形参 (4)具有值的变量 (5)常量 (6)表达式 3.1.2 局部域包括 (1) 、 (2) 和 (3) 。使用局部变量的意义在于 (4) 。 答案: (1)块域 (2)函数域 (3)函数原型域 (4)局部变量具有局部作用域使得程序在不同块中可以使用同名变量 3.1.3 静态局部变量存储在 (1) 区,在 (2) 时候建立,生存期为(3) ,如定义时未 显式初始化,则其初值为 (4) 。 答案: (1)全局数据区 (2)编译 (3)全局生存期 (4)全 0 3.1.4 局部变量存储在 (1) 区,在 (2) 时候建立,生存期为(3) ,如定义时未显式 初始化,则其初值为 (4) 。 答案: (1)栈 (2)在函数或块开始执行时 (3)函数或块的执行期 (4)随机值 3.1.5 编译预处理的作用是 (1) , 预处理指令的标志是 (2) 。 多文件系统中, 程序由 (3) 来管理,用户自定义头文件中通常定义一些 (4) 。 答案: (1)将源程序文件进行处理,生成一个中间文件,编译系统对此中间文件进行编译并生 成目标代码 (2)# (3)工程文件

第三章 函数习题

2

(4)用户构造的数据类型(如枚举类型) ,外部变量,外部函数、常量和内联函数等具有 一定通用性或常用的量 3.1.6 设有函数说明如下: f(int x, int y){ return x%y+1; } 假定 a=10,b=4,c=5,下列语句的执行结果分别是 (1) 和 (2) 。 (1) cout<<f(a,b)+f(a,c); (2) cout<<f(f(a+c,b),f(b,c)); 答案: (1)4 (2)5 3.1.7 下列程序的输出结果分别为 (1) 和 (2) 。 (1) #include<iostream> using namespace std; int a,b; void f(int j){ static int i=a; int m,n; m=i+j; i++; j++; n=i*j; a++; cout<<"i="<<i<<'\t'<<"j="<<j<<'\t'; cout<<"m="<<m<<'\t'<<"n="<<n<<endl; } int main(){ a=1; b=2; f(b); f(a); cout<<"a="<<a<<'\t'<<"b="<<b<<endl; return 0; } 答案: i=2 j=3 m=3 n=6 i=3 j=3 m=4 n=9 a=3 b=2 (2) #include<iostream> using namespace std; float sqr(float a){return a*a;} float p(float x,int n){ cout<<"in-process:"<<"x="<<x<<'\t'<<"n="<<n<<endl; if(n==0) return 1; else if(n%2!=0) return x*sqr(p(x,n/2)); else return sqr(p(x,n/2)); } int main(){

第三章 函数习题

3

cout<<p(2.0,13)<<endl; return 0; } 答案: in-process:x=2 n=13 in-process:x=2 n=6 in-process:x=2 n=3 in-process:x=2 n=1 in-process:x=2 n=0 8192 图解递归,共五层,f 是回归时产生: x n f 2 2 2 2 2 13 6 3 1 0 8192 64 8 2 1 f=x*sqr(下一层的 f) f=sqr(下一层的 f) f=x*sqr(下一层的 f) f=x*sqr(下一层的 f) f=1

3.2 简答题 3.2.1 函数的实参和形参怎样对应?实参和形参数目必须一致吗?什么情况下可以不同? 答:实参和形参的个数和排列顺序应一一对应,并且对应参数应类型匹配(赋值兼容) ,当 有缺省参数时可以不同。 3.2.2 函数和内联函数的执行机制有何不同?定义内联函数有何意义?又有何要求? 答:内联函数的调用机制与一般函数不同,编译器在编译过程中遇到 inline 时,为该函数建 立一段代码, 而后在每次调用时直接将该段代码嵌入到调用函数中, 从而将函数调用方式变 为顺序执行方式, 这一过程称为内联函数的扩展或内联。 内联函数的实质是牺牲空间来换取 时间。因 inline 指示符对编译器而言只是一个建议,编译器也可以选择忽略该建议,内联函 数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构控制语句, 如 switch、复杂 if 嵌套、while 语句等,以及无法内联展开的递归函数,都不能定义为内联 函数,即使定义,系统也将作为一般函数处理。 3.2.3 全局变量和全局静态变量的区别在哪里?为什么提倡尽量使用局部变量? 答:有 static 修饰的全局变量只能在定义它的文件中可见,在其他文件中不可见,而非静态 的全局变量则可以被其他程序文件访问,但使用前必须用 extern 说明。 局部变量具有局部作用域使得程序在不同块中可以使用同名变量。 这些同名变量各自在 自己的作用域中可见,在其它地方不可见。所以提倡尽量使用局部变量 3.2.4 函数重载的作用是什么?满足什么条件的函数才可以成为重载函数?重载函数在调用 时是怎样进行对应的? 答:函数重载可以定义几个功能相似,而参数类型不同使用相同的函数名的函数,以适应不 同情况下自动选用不同函数进行操作。 函数重载的好处在于, 可以用相同的函数名来定义一 组功能相同或类似的函数,程序的可读性增强。

第三章 函数习题

4

在定义重载函数时必须保证参数类型不同,仅仅返回值类型不同是不行的。 当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。 匹配过程按如下步骤进行: (1)如果有严格匹配的函数,就调用该函数; (2)参数内部转换后如果匹配,调用该函数; (3)通过用户定义的转换寻求匹配。 3.2.5 多文件结构的程序是如何进行管理并运行的?采用多文件结构有什么好处? 答:多文件结构通过工程进行管理,在工程中建立若干用户定义的头文件 .h 和源程序文 件.cpp。 头文件中定义用户自定义的数据类型, 所有的程序实现则放在不同的源程序文件中。 编译时每个源程序文件单独编译, 如果源程序文件中有编译预处理指令, 则首先经过编译预 处理生成临时文件存放在内存,之后对临时文件进行编译生成目标文件.obj,编译后临时文 件撤销。所有的目标文件经连接器连接最终生成一个完整的可执行文件.exe。 多文件结构管理程序的好处是十分明显的。首先,可以避免重复性的编译,如果修改了 个别函数,那么只需将这些函数所在的文件重新编译即可;其次,将程序进行合理的功能划 分后,更容易设计、调试和维护;另外,通常把相关函数放在一个文件中,这样形成一系列 按照功能分类的文件,便于为其他程序文件使用。 3.2.6 宏定义与常量定义从作用及效果上看是一样的,二者是否完全相同? 答:完全不同。不带参宏定义与 const 说明符定义常量从效果上看是一样的,但它们的 机制不同。首先宏定义是在预处理阶段完成,而 const 定义则是在编译阶段实现。其次宏定 义只是一种简单的字符串替代,不会为字符串分配内存单元,替代过程也不作语法检查,即 使指令中的常量字符串不符合常量要求,预处理的替代过程也照样按指令给出的格式进行。 而 const 定义则是象定义一个变量一样定义一个常量标识符,系统要按照类型要求为该标识 符分配内存单元,同时在将常量放入单元时进行类型检查,如果类型不匹配,类型相容的会 进行系统的类型转换,不相容的则要提示错误。

二.编程与综合练习题
3.3 设计函数,将小写英文字符变为对应的大写字符。 解:小写字母比大写字母 ASCII 码值大 32,或写作 ch=ch-?a?+?A?; #include<iostream> using namespace std; char capitalize(char ch){ if(ch>='a'&&ch<='z') return ch-'a'+'A'; else return ch; } int main(){ int i=0; char cp[30]; cout<<"请输入包含小写字母的句子:"<<endl; cin.getline(cp,30); while(cp[i]!='\0') cout<<capitalize(cp[i++]); cout<<endl; return 0;

第三章 函数习题

5

} 3.4 设计两个函数,分别求两个数的最大公约数和最小公倍数。 解:可用穷举法求最大公约数(从大到小找到的第 1 个公约数)和最小公倍数(从小到大找 到的第 1 个公倍数) 。 #include<iostream> using namespace std; MaxCommonDevisor(int n,int m){ int i; for( i=n;i>=1;i--) if(n%i==0 && m%i==0) break; return i; } MinCommonMultiple(int n,int m){ int i; for(i=n;i<=n*m;i++) if(i%n==0 && i%m==0) break; return i; } int main(){ int i,j; cout<<"请输入两个整数:"<<endl; cin>>i>>j; cout<<"最大公约数:"<<MaxCommonDevisor(i,j) <<'\t'<<"最小公倍数:"<<MinCommonMultiple(i,j)<<endl; return 0; } 3.5 设计函数 digit(num,k),返回整数 num 从右边开始的第 k 位数字的值。例如: digit(4647,3)=6 digit(23523,7)=0 解:把整数转换为数串,放在一个整型数组中。 #include<iostream> using namespace std; digit(int num,int k){ int s[10]={0,0,0,0,0,0,0,0,0,0}; int i=0; do{//先把整数转换为数字串 s[i]=num%10; num/=10; i++; }while(num>0); if(k<=i) return s[k-1]; //题目中位数的下标从1开始,而数组下标从0开始 else return 0;

第三章 函数习题

6

} int main(){ cout<<"digit(4647,3)="<<digit(4647,3)<<endl; cout<<"digit(23523,7)="<<digit(23523,7)<<endl; return 0; } 3.6 设计函数 factors(num,k),返回整数 num 中包含因子 k 的个数,如果没有该因子,则返 回 0。 解:必须先判断整数 m 能否被 k 整除。 #include<iostream> using namespace std; factors(int num,int k){//缺省返回值为整型 int count=0; while(num%k==0){ count++; num/=k; } return count; } int main(){ cout<<"factors(1875,5)="<<factors(1875,5)<<endl; cout<<"factors(64,3)="<<factors(64,3)<<endl; return 0; } 3.7 歌德巴赫猜想指出:任何一个充分大的偶数都可以表示为两个素数之和。例如: 4=2+2 6=3+3 8=3+5 … … 50=3+47 将 4?50 之间的所有偶数用两个素数之和表示。判断一个整数是否为素数用函数完成。 解:用 prime()函数判断是否素数,用穷举法。歌德巴赫猜想验证也用穷举法,在所有组合 中找两个数均为素数者。 #include<iostream> #include<cmath> using namespace std; bool prime(int m){ if(m==1||m==0) return false; if(m==2) return true; int k=(int)sqrt(m); for(int i=2;i<=k;i++)//穷举法 if(m%i==0) break; if(i>k) return true; else return false; } int main(){

第三章 函数习题

7

for(int n=4;n<=50;n+=2){ for(int i=2;i<=n/2;i++) if(prime(i)&&prime(n-i)) cout<<n<<'='<<i<<'+'<<n-i<<endl;//列出所有可能组合 } return 0; } 3.8 设计函数打印直方图, 直方图宽度为 3 行, 每列代表数据 1%。 如下面的图形表示 10%。 | |********** |********** |********** | 解:为简单将 a%用 a 表示。 #include<iostream> using namespace std; void PrintDiagram(int m){ int i ; for(i=0;i<3;i++){ for(int j=0;j<m;j++) cout<<'*'; cout<<endl; } cout<<endl; } int main(){ PrintDiagram(10); PrintDiagram(15); PrintDiagram(7); return 0; } 3.9 定义递归函数实现下列 Ackman 函数:
? n ?1 ? Acm( m, n ) ? ? Acm (m1 -,1 ) ? Acm( m ? 1, Acm( m, n ? 1)) ? m?0 n?0 n ? 0, m ? 0

其中 m、n 为正整数。设计程序求 Acm(2,1),Acm(3,2)。 解:递归函数实现非常简单,按公式写即可。 #include<iostream> using namespace std; Acm(int m,int n){ if(m==0) return n+1; if(n==0) return Acm(m-1,1); return Acm(m-1,Acm(m,n-1)); }

第三章 函数习题

8

int main(){ cout<<"Acm(2,1)="<<Acm(2,1)<<endl; cout<<"Acm(3,2)="<<Acm(3,2)<<endl; return 0; } 3.10 用递归函数实现勒让德多项式:
?1 ? Pn ( x ) ? ? x ?((2n ? 1) xP ( x ) ? ( n ? 1) P ( x )) / n n ?1 n ?2 ? n?0 n ?1 n ?1

在主函数中求 P4(1.5)。 解:把勒让德多项式的阶和自变量都作为参数。 #include<iostream> using namespace std; double P(int n,double x){ if(n==0) return 1; if(n==1) return x; return ((2*n-1)*x*P(n-1,x)-(n-1)*P(n-2,x))/n; } int main(){ cout<<"P(4,1.5)="<<P(4,1.5)<<endl; return 0; } 3.11 定义内联函数实现求三个实数中的最大值。 解:内联函数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构 控制语句,如 switch、复杂 if 嵌套、while 语句等,以及无法内联展开的递归函数,都不能 定义为内联函数,即使定义,系统也将作为一般函数处理。 #include<iostream> using namespace std; inline max(int a,int b,int c){ if(a>b&&a>c) return a; if(b>a&&b>c) return b; return c; } int main(){ cout<<max(3,7,4)<<endl; return 0; } 3.12 定义内联函数,判断一个字符是否为数字字符。 解:数字字符 ASCII 码值是连在一起的,可用 ch>='0'&&ch<='9'来判断。 #include<iostream> using namespace std;

第三章 函数习题

9

inline bool IfDigitChar(char ch){ if(ch>='0'&&ch<='9') return 1; else return 0; } int main(){ char ch; cout<<"请输入一个字符(输入“!”停止)"<<endl; cin>>ch; while(ch!='!'){ if(IfDigitChar(ch)) cout<<ch<<" is a digit char"<<endl; else cout<<ch<<" is not a digit char"<<endl; cout<<"请输入一个字符(输入“!”停止)"<<endl; cin>>ch; } return 0; } 3.13 设计两个重载函数,分别求两个整数相除的余数和两个实数相除的余数。两个实数求 余定义为实数四舍五入取整后相除的余数。 解:实数四舍五入取整,正数是+0.5 取整,负数是-0.5 取整。 #include<iostream> #include<cmath> using namespace std; mod(int n,int m){ return n%m; } round(double x){ //四舍五入函数 if(x>=0) return int(x+0.5); else return int(x-0.5); } mod(double x,double y){ return round(x)%round(y); } int main(){ cout<<"mod(8,3)="<<mod(8,3)<<endl; cout<<"mod(8.2,3.6)="<<mod(8.2,3.6)<<endl; cout<<"mod(-8.2,-2.6)="<<mod(-8.2,-2.6)<<endl; return 0; } 3.14 建立一个头文件 area.h,在其中定义两个面积函数 area(),分别用来计算半径为 r 的圆 的面积和边长为 a 和 b 的矩形面积。另外建立一个实现文件 area.cpp,在其中定义主函 数。通过包含 area.h,输入数据并输出圆和矩形的面积。 解:两个面积函数 area(),一个是单参数,一个是双参数。

第三章 函数习题

10

//头文件 area.h double area(double r){ return 3.14*r*r; } double area(double a,double b){ return a*b; } //实现文件 area.cpp #include<iostream> using namespace std; #include"ep3_14.h" int main(){ double a,b,r; cout<<"input radius:"<<endl; cin>>r; cout<<"input side length:"<<endl; cin>>a>>b; cout<<"area("<<r<<")="<<area(r)<<endl; cout<<"area("<<a<<','<<b<<")="<<area(a,b)<<endl; return 0; } 3.15 下面递归函数执行结果是什么? 1) void p1(int w){ int i; if(w>0){ for(i=0;i<w;i++) cout<<'\t'<<w; cout<<endl; p1(w-1); } } 调用 p1(4)。 答:用调用树来解答,如下图,注意打印是在递归调用之前:

第三章 函数习题

11

P1(0)

4

P1(1)

3

P1(2)

2

P1(3)

1

P1(4)

1 打印: ○ 2 ○ 3 ○ 4 ○

4 3 2 1

4 3 2

4 3

4

2) void p2(int w){ int i; if(w>0){ p2(w-1); for(i=0;i<w;i++) cout<<'\t'<<w; cout<<endl; p2(w-1); } } 调用 p2(4)。 答:用调用树来解答,如下图,注意打印是在两次递归调用之间:

P2(0)
1

P2(0) P2(0)
3

P2(0) P2(0)
5

P2(0) P2(0)
7

P2(0) P2(1)

P2(0)
9

P2(0) P2(0) P2(1)
10

11

P2(0) P2(0)

13

P2(0) P2(0)

15

P2(0)

P2(1)
2

P2(1) P2(2)

P2(1)
6

P2(1) P2(2)

P2(1)
14

P2(1) P2(2)

P2(2)

4

12

P2(3)

P2(3)

8

P2(4)

第三章 函数习题

12

1 打印: ○ 2 ○ 3 ○ 4 ○ 5 ○ 6 ○ 7 ○ 8 ○ 9 ○ 1 0 ○ 11 ○ 1 2 ○ 1 3 ○ 1 4 ○ 1 5 ○

1 2 1 3 1 2 1 4 1 2 1 3 1 2 1

2 3 2 4 2 3 2 3 4 4 3

3) void p3(int w){ int i; if(w>0){ for(i=0;i<w;i++) cout<<'\t'<<w; cout<<endl; p3(w-1); p3(w-2); } } 调用 p3(4)。 答:用调用树来解答,如下图,注意打印是在两次递归调用之前:

P3(0) 4 P3(1) 3

P3(-1) P3(0) P3(2) P3(0) 5 P3(1) P3(-1) P3(0) 7 P3(1) P3(-1) P3(0)

2

P3(3)

6

P3(2)

1

P3(4)

1 打印: ○ 2 ○ 3 ○ 4 ○ 5 ○

4 3 2 1 1

4 3 2

4 3

4

第三章 函数习题

13

6 2 ○ 7 1 ○

2

4) void p4(int w){ int i; if(w>0){ for(i=0;i<w;i++) cout<<'\t'<<w; cout<<endl; p4(w-1); for(i=0;i<w;i++) cout<<'\t'<<w; cout<<endl; } } 调用 p4(4)。 答:用调用树来解答,如下图,注意打印是在递归调用之前和之后各一次:
P4(0)

4

P4(1)

5

3

P4(2)

6

2

P4(3)

7

1

P4(4)

8

1 打印: ○ 2 ○ 3 ○ 4 ○ 5 ○ 6 ○ 7 ○ 8 ○

4 3 2 1 1 2 3 4

4 3 2

4 3

4

2 3 4

3 4

4


更多相关文档:

c++课后部分习题答案

c++课后部分习题答案_理学_高等教育_教育专区。里面有一些C++答案第一题 1 题目: 一位亿万富翁遇到一个陌生人, 陌生人找他谈一个换计划, 该计划如下: 我每天...

C++第三章课后答案

C++第三章课后答案_计算机软件及应用_IT/计算机_专业资料。C++第三章习题及答案 1、 什么是结构化程序设计?它有什么优缺点? 所谓结构化程序设计,是一种自顶而下...

C++课后习题解答

C++课后习题解答_计算机软件及应用_IT/计算机_专业资料。第 1 章 面向对象的...9.74 10.13 思考题 1. 利用重载求两个整数、三个整数和四个整数的最小值...

C++第三章课后习题答案-谭浩强

C++第三章课后习题答案-谭浩强_教育学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档C++第三章课后习题答案-谭浩强_教育学_高等教育_教育专区。3.2 题...

C++第三章习题解答

8页 免费 第六次上机实验 7页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 C++第三章习题解答 隐藏>> 第三章...

C++课后习题解答

C++课后习题解答_其它_高等教育_教育专区。C++课后习题程序 3-14.用递归的方法编写程序求 N 阶勒让德多项式的值,在主程序中实现输入输出。递归公 式为 1 (n=...

c++primer第五版第三章习题答案

c++primer第五版第三章习题答案_理学_高等教育_教育专区。c++primer 第三章 3.1 加 using 声明就重做,不必了吧! ! 3.2 3.3 getline 跳过空格继续读下一个字...

C++课后习题答案

C++课后习题答案 隐藏>> 章 多态性与虚函数 1.在例 12.1 程序基础上作一些...} 第 13 章 输入输出流 1.输入三角形的三边 a,b,c,计算三角形的面积的公...

C++课后习题答案

C++课后习题答案_理学_高等教育_教育专区。第一章 1.5 题 #include <iostream> using namespace std; int main() { cout<<"This"<<"is"; cout<<"a"<<"...

C++课后习题参考答案

C++课后习题参考答案_电脑基础知识_IT/计算机_专业资料。课后习题部分答案第...(2) 第三章习题 9. 指出下面程序的错误。 int &f1(int x=0,int y){ ...
更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com