C++程序设计(第2版)课后习题答案.pdf
《C++程序设计(第2版)课后习题答案.pdf》由会员分享,可在线阅读,更多相关《C++程序设计(第2版)课后习题答案.pdf(196页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章C+基础知识习题1.1判断下列标识符的合法性。sin book$1 classcpp5 airy _name Example2.1 main答:合 法 的:sina3非法的:5arryL2假定有下列变量:a3 x*y my namebook_namemainExample2.1$1 x*ymy nameclass_cppint a=3,b=5,c=0;float x=2.5,y=8.2,z=1.4;char chl=a,ch2=5,ch3=0,ch4;求下列表达式的值,以及运算后表达式所涉及的各变量的值。x+(int)y%aint(y/z)+(int)y/(int)zch31|(b+=a
2、*c)|c-H-x=z*b+,b=b*x,b+ch4=ch3-ch2+chl!(ab)&c&(x*=y)&b+z=(a2)/(bl)答:x+(int)y%a 值 为:4.5x=z*b+,b=b*x,b+值为:42,x 为7,b 为43ch4=ch3-ch2+chl 值为:Nint(y/z)+(int)y/(int)z 值为:13!(ab)&c&(x*=y)&b+值为:0,b 为5 注:只要出现一个 false右边的不再做。ch3|(b+=a*c)|c+值为:1,c 为0 注:只要出现一个tru e,右边不再做。z=(a v2)/(b 1)值为:61.3判断下列哪些是常量,哪些是变量。China
3、 const int n=10;int m=5;a char cha*int array5=l,2,3,4,5;char s=t,HelloM;答:China”文字常量const int n=10;常变量int m=5;变量宣 文字常量char ch=a变量int array5=1,2,3,4,5;变量char s=”HeDo”;变量L4将下列算式或叙述用C+表达式描述。(1)(2)(x+y)/(x-y)*ay)(3)位于原点为圆心,a,b 为半径的圆环中的点坐标。(4)o(5)并且字符ch不为VT。答:pi/2+sqrt(asin(x)*asin(x)+c*c)(x+y)/(x-y)*pow
4、 (a,y)(x*x+y*y)=a*a)&(x*x+y*y)=b*b)(a!=b)&(a!=c)&(b!=c)(k 5)if(b-a 2 5)a+;elseb/=a;解答:本题检查学生整除的概念。跟踪:abb/a循环次数b-a310033197410025296510020395 15100613851610061484171005停(1)14(2)17(3)1002.1.2设有说明:int x,y,n,k;下面程序段的功能是备选答案中的(1),当 n=10、x=10打 印 结 果 是(2)。cin x n;k=0;dox/=2;k-H-;while(kn);y=l+x;k=0;doy=y*y
5、;k+;while(k=10)break;iRm%2=0)m+=5;continue;m-=3;解答:注意continue语句的使用初值m=0k=l第1次循环后m=5k=2第2次循环后m=2k=3第3次循环后m=7k=4第4次循环后m=4k=5第5次循环后m=9k=6第6次循环后m=6k=7第7次循环后m=llk=8第8次循环m=ll结束k=8,k+未做(1)11(2)8二.编程与综合练习题2.2有一个函数:编写程序,输入x,输出y0解:#include using namespace std;int main()double x,y;coutw”输入 x-1;cinx;if(xl)y=x;e
6、lse if(x 10)y=2*x-l;else y=3*x-l 1;coutny=yendl;return 0;)2.3设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,8089分为4分,7079分为3分,6069分为2分,60分以下为1分。解:10分一档用10进行整除获得,转换用开关语句实行。#includc using namespace std;int main()int mark,result;/mark 是百分制成绩,result 是5分制coutw”请输入百分制成绩:“Wendi;cinmark;if(mark0)coutw”缺考!nendl;return 0;swi
7、tch(mark/10)case 9:case 10:result=5;cout输出五分制成绩:Mresultendl;break;case 8:result=4;coutvv”输出五分制成绩:nresultendl;break;case 7:result=3;coutw”输出五分制成绩:vvresultendl;break;case 6:result=2;coutw”输出五分制成绩:Mresultendl;break;case 5:case 4:case 3:case 2:case 1 :case 0:result=l;coutvv”输出五分制成绩:lfresultendl;break;de
8、fault:coutw”输入错误!wendl;return 0;2.4编程计算个人所得税。个人所得税率表如下:月收入1200元起征,超过起征点500元以内部分税率5%,超过500元到2,000元部分税率10%,超过2,000元到5,000元部分税率15%,超过5,000元到20,000元部分税率20%,超过20,000元到40,000元部分税率25%,超过40,000元到60,000元部分税率30%,超过60,000元到80,000元部分税率35%,超过80,000元到100,000元部分税率40%,超过100,000元部分税率45%。解:应该从最高税率段开始计算,分段叠加。先算两万元以上各段
9、,每 两 万 为 档,采用switch语句,注意没有使用break语句。后面各低收入段,用 if语句,也没有使用e lse,这两种方法是对应的。第二要注意计算的入口处,收入减去该段的下限,进行计算,以后各段都是完整的段,计算十分简单。#include using namespace std;int main()double income,tax=0;int k;coutw”请输入个人月收入:endl;cinincome;if(income20000)(k=income/20000;switch(k)default:tax+=(income-100000)*0.45;income=l00000;
10、case 4:tax+=(income-80000)*0.40;income=80000;case 3:tax+=(income-60000)*0.35;income=60000;case 2:tax+=(incomc-40000)*0.30;income=40000;case 1:tax+=(income-20000)*0.25;income=20000;if(income5000)(tax+=(income-5000)*0.20;income=5000;if(income2000)tax+=(income-2000)*0.15;income=2000;if(income500)tax+=(
11、income-500)*0.10;income=500;tax+=income*0.05;cout应征所得税:n tax en d l;return 0;)2.5编程打印如下图形:*解:难点在三角形左边的空格的控制,嵌套个循环语句完成此任务。#include using namespace std;int main()int i,j;for(i=l;i0;j-)coutw”;三角形每行前部的空格fdr(j=l;j=2*i-l;j+)coutn*”;coutendl;)fbr(i=l;i=3;i+)coutH*nM;return 0;2.6编程输出下列图形,中间一行英文字母由输入得到。AB B
12、BC C C C CD D D D D D DC C C C CB B BA解:分上三角和F 三角两部分分别处理左边的空格。#include using namespace std;int main()char in;int i,j;doCOUtVV”输入一个字母:”;cinin;if(in=97)&(in=122)in=32;/小写改大写 while(in90);int line=in-,A,;fbr(i=O;iv=line;i+)上三角fbr(j=line-i;jOJ-)coutvv”;/前方空格for(j=1 ;j0;i)下三角(少一行)fbr(j=O;j=line-i;j-H-)cou
13、tnfbr(j=l;j=2*i-l cout vvchar(il+A);coutendl;return 0;2.7输入 n,求l!+2!+3!+n!解:通常求和作为外循环,阶乘作为内循环。这里考虑到:n!=n*(n-l)!,利用递推法运算速度大大提高,同时两者可合并为一个循环。本程序考虑了输入的健壮性。#include#include using namespace std;int main()int n,i,jch=l;double result=0;/result 是结果coutvv”请输入正整数n:Hendl;cinn;if(nl)coutw”输入错误!endl;return 1;res
14、ult=l;for(i=2;i=n;i+)jch*=i;/jch是 i 的阶乘,注意n!=n*(n-l)!这样可少一层循环result+jch;)coutresultendl;return 0;2.8猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。解:采用递推法。从最后一天逆推到第一天,9次循环。#include using namespace std;const int day=10;int main()int i,x=l;最后一天只有-一 个fdr(i=l;ivday;i+)x=(x+
15、l)*2;从一天前推至U 九天前cout”开始共有桃子“v v x v v”个o nn;return 0;)2.9 从键盘输入组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中正数和负数的个数。解:将这组整数放在整型数组中,一边输入一边求和及统计正数和负数的个数,平均数由和除以整数数量取得。#includc#include using namespace std;int main()int stem256,sum=0,pnum=0,nnum=0,i=0;coutw”从键盘输入一组非0整数,以输入0标志结束:“wendl;cinstemi;while(stemi!=0)sum+=ste
16、mi;求和if(stemi0)pnum+;正数数量else nnum+;负数数量i+;cinstemi;if(!i)couB O 个数“vvendl;else coutw”平均值=v(double)sum/(pnum+nnum)vvendl;平均值习惯不用整数coutw”正数个数=pnumendl;coutn 负数个数=nnumendl;)return 0;)2.10 编程找出1500之中满足除以3余2,除以5余3,除以7余2的整数。解:中国古代数学问题(韩信点兵),采用穷举法。注意三个条件同时成立用&。#include using namespace std;int main()int i;
17、fbr(i=l;iv=500;i+)if(i%3=2)&(i%5=3)&(i%7=2)coutiendl;return 0;)2.11 编程求1000之内的所有完全数。所谓完全数指的是个数恰好等于它的所有因子和。例如6=1+2+3,就是一个完全数。解:采用穷举法。两重循环,外层是从1到999依次处理,内层是求该数的所有因子的和,并判断是否等于该数。#includc using namespace std;int main()int i,a,sum_yz;/sum_yz 是 a 的因子和for(a=l;al 000;a-H-)sum_yz=0;fbr(i=l;ia;i+)if(a%i=0)sum
18、_yz+=i;求因子运算未改变循环控制变量a 的值,否则要用另一个变量b 来代替a 来参加运算if(a=sum_yz)coutaendl;return 0;2.12 将100元换成用10元、5元和1元的组合,共有多少种组合方法。解:采用穷举法。考虑10元最多10张,5元最多20张,余下是1元。#includc using namespace std;int main()int i,j,k,count=0;fbr(i=0;iv=10;i+)/i是10元张数,j 是5元张数,k 是1元张数for(j=0j=0)c o u t i t j,t,k en d l;count+;)coutcounten
19、dl;return 0;)2.13 利用反正切展开计算兀的近似值,要求误差10工公式如下:令 x=l,可计算出兀/4的近似值。解:采用递推法。初看每一项的递推通式不易写出,但每一项全看作奇数项,而偶数项全为零,则很容易写出:第1项为X,第3项为第1项乘以X的平方除以项序号3乘 以 其 余 类 推。同时和的误差小于最后一项的绝对值。#include#includeusing namespace std;const double e=le-5;int main()double x,a,sum;int i=3;coutvv”请输入正切值:endl;cinx;a=x;sum=x;doa*=x*x*(-
20、l);sum+=a/i;i+=2;while(fabs(a/i)e);coutnarctg(n x n)=Hsum endl;return 0;2.14用迭代法求方程*2+1085*=0的根,误差限为1 0 迭代公式如下:解:迭代法也是用循环语句实现,数学上迭代法可能收敛,也可能发散,解答中加了最大迭代次数的限制。#include#includeusing namespace std;const double e=le-5;int main()double x0,xl;int n=0;coutvv”输入初始近似值:“vvendl;cinx 1;dox0=x1;xl=(x0*x0-l 0*(x0
21、*sin(x0)+cos(x0)/(2*x0-10*sin(x0);x0是上次算出的结果,xl用作保存新算出的结果n+;while(fabs(xl-xO)e)&(nle5)cout”超出迭代1 e5次n”;else coutw”方程 x*x+10*cos(x)=0的一个根为:xlendl;coutH 方程误差为:“vVx 1 *x 1+10*cos(x 1 )endl;return 0;)2.15两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛配对名单。规定A 不和J 比赛,M 不和D 及 E 比赛。列出所有可能的比赛名单。解:这是一个组合
22、问题,使用穷举法。共有5个位置,设甲队5名队员位置不变,乙队改变队员位置,进行配对。注意第1个位置可在5个队员中任选个,以后的位置必须扣除已选过的队员。并扣除不能配对的情况,即得所有可能的比赛名单。#includcusing namespace std;int main()char stl5=,A7B,C,D;E,st25=T;K,L,M7N,;int i=0J,k,l,m,n;for(j=0;j5;j+4-)/0 号位if(j=O)continue;/A选手不与选手J 比赛,即 stlO不与st20比赛fbr(k=0;k5;k+)/1 号位if(k=j)continue;/剔除乙队占据0号位
23、的选手fbr(l=0;l 5;l+)/2 号位if(l=j|l=k)continue;剔除乙队占据0、1号位的选手fbr(m=0;mv5;m+)/3 号位if(m=j|m=kUm=l)continue;易!J除乙队占据0、1 2号位的选手if(m=3)continue;stl3不与 st23比赛,即 D 不与 M比赛fbr(n=0;n5;n+)4 号位|n=k|n=l|n=m)continue;剔除乙队占据0、1、2、3号位的选手if(n=3)continue;stl 4不可 st23比赛,即 E不与M 比赛coutstl 0,-,st2 j,t,s tl 1 ,-,st2kV;coutst
24、1 2,-,st2 l V stl 3,-,st2mrt,;coutstl4,-st2nendl;i+;coutiendl;return 0;2.16编程模拟选举过程。假定四位候选人:zhang、wang、li、zhao,代号分别为1、2、3、4。选举人直接键入候选人代号,14之外的整数视为弃权票,-1为终止标志。打印各位候选人的得票以及当选者(得票数超过选票总数一半)名单。解:用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。#includc#includeusing namespace std;int main()enum candidate fcipiao,zhan
25、g,wang,li,zhao cand;int vote5=0,i,k=0,n;cinn;while(n!=-1)k-H-;if(n=1&n=4)voten+;else vote0+;cinn;fbr(i=0;i5;i+)cand=(candidate)i;switch(cand)case feipiao:coutsetw(10),feipiao,tvotecandendl;break;case zhang:coutsetw(10)k/2)coutM 当选 Wendi;else coutendl;break;case wang:coutsetw(10)k/2)coutM 当选 vvendl;e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 课后 习题 答案
限制150内