C++程序设计(第二版_吴乃陵_况迎辉)课后答案(5)

2019-01-07 13:07

int main(){ int i,j;

cout<<\请输入两个整数:\cin>>i>>j;

cout<<\最大公约数:\

<<'\\t'<<\最小公倍数:\return 0; }

3.5 设计函数digit(num,k),返回整数num从右边开始的第k位数字的值。例如: digit(4647,3)=6 digit(23523,7)=0

解:把整数转换为数串,放在一个整型数组中。 #include 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; num/=10; i++;

}while(num>0);

if(k<=i) return s[k-1]; //题目中位数的下标从1开始,而数组下标从0开始 else return 0; }

int main(){

cout<<\cout<<\return 0; }

3.6 设计函数factors(num,k),返回整数num中包含因子k的个数,如果没有该因子,则返回0。

解:必须先判断整数m能否被k整除。 #include using namespace std;

factors(int num,int k){//缺省返回值为整型 int count=0;

while(num%k==0){ count++; num/=k; }

return count; }

int main(){

cout<<\cout<<\return 0; }

3.7 歌德巴赫猜想指出:任何一个充分大的偶数都可以表示为两个素数之和。例如: 4=2+2 6=3+3 8=3+5 … … 50=3+47

将4.50之间的所有偶数用两个素数之和表示。判断一个整数是否为素数用函数完成。

解:用prime()函数判断是否素数,用穷举法。歌德巴赫猜想验证也用穷举法,在所有组合中找两个数均为素数者。 #include #include using namespace std; bool prime(int m){

if(m==1||m==0) return false; if(m==2) return true; int k=(int)sqrt(m); if(m%i==0) break;

for(int i=2;i<=k;i++)//穷举法

if(i>k) return true; else return false; }

int main(){

for(int n=4;n<=50;n+=2){ for(int i=2;i<=n/2;i++)

if(prime(i)&&prime(n-i)) cout<

return 0; }

3.8 设计函数打印直方图,直方图宽度为3行,每列代表数据1%。如下面的图形表示10%。 |

|********** |********** |********** |

解:为简单将a%用a表示。 #include using namespace std;

void PrintDiagram(int m){ int i ;

cout<<'|'<

for(int j=0;j

cout<<'|'<

int main(){

PrintDiagram(10); PrintDiagram(15); PrintDiagram(7); return 0; }

3.9 定义递归函数实现下列Ackman函数:

.............0m0,n ))1,(,1( 0n 11 0m 1),(nmAcmmAcm),Acm(m-nnmAcm 第三章 函数习题 9

其中m、n为正整数。设计程序求Acm(2,1),Acm(3,2)。 解:递归函数实现非常简单,按公式写即可。 #include 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)); }

int main(){

cout<<\cout<<\return 0; }

3.10 用递归函数实现勒让德多项式:

..............1n /))()1()()12((1n 0n 1)(21nxPnxxPnxxPnnn 在主函数中求P4(1.5)。

解:把勒让德多项式的阶和自变量都作为参数。 #include 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<<\return 0; }

3.11定义内联函数实现求三个实数中的最大值。

解:内联函数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构控制语句,如switch、复杂if嵌套、while语句等,以及无法内联展开的递归函数,都不能定义为内联函数,即使定义,系统也将作为一般函数处理。 #include 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; }

第三章 函数习题 10 int main(){

cout<

3.12 定义内联函数,判断一个字符是否为数字字符。

解:数字字符ASCII码值是连在一起的,可用ch>='0'&&ch<='9'来判断。 #include using namespace std;

inline bool IfDigitChar(char ch){ if(ch>='0'&&ch<='9') return 1; else return 0; }

int main(){ char ch;

cout<<\请输入一个字符(输入“!”停止)\cin>>ch;

while(ch!='!'){

if(IfDigitChar(ch)) cout<

cout<<\请输入一个字符(输入“!”停止)\cin>>ch; }

return 0; }

3.13 设计两个重载函数,分别求两个整数相除的余数和两个实数相除的余数。两个实数求余定义为实数四舍五入取整后相除的余数。

解:实数四舍五入取整,正数是+0.5取整,负数是-0.5取整。 #include #include 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<<\第三章 函数习题 11

cout<<\cout<<\return 0;

}

注意:mod(double x,double y)形参类型不可以写成float,因为在入口函数中

mod(8.2,3.6)的实参8.2、3.6都认为是double型常数,重载时系统不知应转换为float还是int,出现歧义。

3.14 建立一个头文件area.h,在其中定义两个面积函数area(),分别用来计算半径为r的圆的面积和边长为a和b的矩形面积。另外建立一个实现文件area.cpp,在其中定义主函数。通过包含area.h,输入数据并输出圆和矩形的面积。 解:两个面积函数area(),一个是单参数,一个是双参数。 //头文件area.h

double area(double r){ return 3.14*r*r; }

double area(double a,double b){ return a*b; }

//实现文件area.cpp #include using namespace std; #include\int main(){ double a,b,r;

cout<<\cin>>r;

cout<<\cin>>a>>b;

cout<<\

cout<<\return 0; }

注意:例题源代码中,为了使文件命名方式一致,采用Exp3_14.h和Exp3_14.cpp来命名。

3.15 下面递归函数执行结果是什么? 1) void p1(int w){ int i; if(w>0){

for(i=0;i

调用p1(4)。

第三章 函数习题 12

答:用调用树来解答,如下图,注意打印是在递归调用之前: 按照打印语句:

for(i=0;i

① 4 4 4 4 //第1次W=4 ② 3 3 3 //第2次W=3 ③ 2 2 //第3次W=2 ④ 1 //第4次W=1 2) void p2(int w){ int i; if(w>0){ p2(w-1);

for(i=0;i

调用p2(4)。

答:用调用树来解答,如下图,注意打印是在两次递归调用之间: 按照次序和打印语句,可得输出为:

① 1 ② 2 2 ③ 1 ④ 3 3 3 ⑤ 1 ⑥ 2 2 ⑦ 1

⑧ 4 4 4 4 ⑨ 1

第三章 函数习题 13 ⑩ 2 2 ⑾ 1 ⑿ 3 3 3 ⒀ 1 ⒁ 2 2 ⒂ 1

3) void p3(int w){ int i; if(w>0){

for(i=0;i

p3(w-1); p3(w-2); } }

调用p3(4)。

答:用调用树来解答,如下图,注意打印是在两次递归调用之前: 按照次序和打印语句,可得输出为: ① 4 4 4 4 ② 3 3 3 ③ 2 2 ④ 1 ⑤ 1 ⑥ 2 2 ⑦ 1

4) void p4(int w){ int i; if(w>0){

for(i=0;i

for(i=0;i

调用p4(4)。

答:如下图用调用树解答,注意打印是在递归调用之前和之后各一次: 按照次序和打印语句,可得输出为: ① 4 4 4 4 ② 3 3 3 ③ 2 2 ④ 1 ⑤ 1 ⑥ 2 2 ⑦ 3 3 3 ⑧ 4 4 4 4


C++程序设计(第二版_吴乃陵_况迎辉)课后答案(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2014年7月《设计原理》试卷Doc1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: