C++程序设计课后习题答案1-4章.pdf
C+程序设计课后习题答案第一章C+基础知识习题1.1 判断下列标识符的合法性。sin book5arry name Example2.1 main$1 class_cpp a3 x*y my name答:合法的:sina3非法的:5arrybook _name main classcppExample2.1$1 x*y my name1.2 假定有下列变量:int 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%a x=z*b+,b=b*x,b+ch4=ch3-ch2+chlint(y/z)+(int)y/(int)z!(ab)&c&(x*=y)&b+ch3|(b+=a*c)|c+z=(a2)/(b 1)答:x+(int)y%a 值为:4.5x=z*b+,b=b*x,lrH值为:42,x 为7,b 为43ch4=ch3-ch2+chl值为:Nint(y+(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=(a2)/(bl)值为:6L3判断下列哪些是常量,哪些是变量。“China”const int n=10;int m=5;a char ch=,a,int array5=l,2,3,4,5;char s 尸Hello”;答:China文字常量const int n=10;常变量int m=5;变量a 文字常量char ch=a变量int array5=l,2,3,4,5;变量char s=HeHo;变量1.4将下列算式或叙述用C+表达式描述。(1)(2)(x+y)/(x-y)*ay)(3)位于原点为圆心,a,b 为半径的圆环中的点坐标。(4)。(5)并且字符ch不为XT。答:pi/2+sqrt(asin(x)*asin(x)+c*c)(x+y)/(x-y)*pow(a,y)(x*x+y*y)=a*a)&(x*x+y*y)=b*b)(a!=b)&(a!=c)&.&(b!=c)(k5)if(b-a25)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)。cinxn;k=0;dox/=2;k+;while(kn);y=l+x;k=0;doy=y*y;k+;while(kn);coutyendl;备选答案:A.B.C.D.解答:第一个循环使x 成为:;y 成为:;第二个循环使y 成为:;(1)B考虑整除,当x 连除4次2以后即为0,所以:为0(2)12.1.3 请看如下程序段:if(num=l)cout,Alpha,;else if(num=2)coutBata;else ififnum=3)coutGamma;else coutDelta;当num的值分别为1、2、3时,上面程序段的输出分别为(1)、(2)、(3)。解答:检查条件语句与字符串输出概念:(1)Alpha(2)Bata(3)Gamma2.1.4 执行下面程序段后,m 和 k 的值分别为(1)、(2)oint m,k;for(k=l,m=0;k=10)break;if(m%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,kH未做(1)11(2)8二.编程与综合练习题2.2有一个函数:编写程序,输入x,输出y。解:#include using namespace std;int main()double x,y;cout”输入 x-1;cinx;if(xl)y=x;else if(x10)y=2*x-l;else y=3*x-l 1;coutny=nyendl;return 0;2.3设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,80 89分为4分,70 79分为3分,60 69分为2分,60分以下为1分。解:10分一档用10进行整除获得,转换用开关语句实行。#include using namespace std;int main()int mark,result;/mark 是百分制成绩,result 是5分制coutw”请输入百分制成绩:”v endl;cinmark;if(mark0)cout”缺考!nendl;return 0;)switch(mark/10)case 9:case 10:result=5;coutw”输出五分制成绩:!resultendl;break;case 8:result=4;coutw”输出五分制成绩:resultendl;break;case 7:result=3;coutw”输出五分制成绩:!resultendl;break;case 6:result=2;coutw”输出五分制成绩:resultendl;break;case 5:case 4:case 3:case 2:case l:case 0:result=l;cout”输出五分制成绩:wresultv Vendl;break;default:coutw”输入错误!vvendl;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%。解:应该从最高税率段开始计算,分段叠加。先算两万元以上各段,每两万为一档,采用switch语句,注意没有使用break语句。后面各低收入段,用 if语句,也没有使用else,这两种方法是对应的。第二要注意计算的入口处,收入减去该段的下限,进行计算,以后各段都是完整的段,计算十分简单。#include using namespace std;int main()double income,tax=0;int k;coutw”请输入个人月收入:nendl;cinincome;if(income20000)k=income/20000;switch(k)default:tax+=(income-100000)*0.45;income=100000;case 4:tax+=(income-80000)*0.40;income=80000;case 3:tax+=(income-60000)*0.35;income=60000;case 2:tax4-=(income-40000)*0.30;income=40000;case 1:tax+=(income-20000)*0.25;income=20000;I?if(income5000)tax+=(income-5000)*0.20;income=5000;)if(income2000)tax+=(income-2000)*0.15;income=2000;if(income500)tax+=(income-500)*0.10;income=500;tax+=income*0.05;coutw”应征所得税:Mtaxend 1;return 0;)2.5编程打印如下图形:*解:难点在三角形左边的空格的控制,嵌套一个循环语句完成此任务。#include using namespace std;int main()int i,j;for(i=1 ;i0;j-)coutw 三角形每行前部的空格for(j=1 ;j=2*i-1 ;j+)coutn*;coutendl;)for(i=l;i=3;i+)coutn*n”;return 0;2.6编程输出下列图形,中间一行英文字母由输入得到。ABBBCCCCCD D DDD DDCCCCCBBBA解:分上三角和下三角两部分分别处理左边的空格。#include using namespace std;int main()char in;int i,j;docout w”输入一个字母:”;cinin;if(in=97)&(in=122)in-=32;小写改大写while(in90);int line=in-,A,;for(i=O;iv=line;i+)上 三角for(j=line-i;j0;j)coutw”;前方空格8r(j=l;j0;i)/下三角(少一行)fbr(j=O;j=line-i;j-w-)coutn n;for(j=l;j=2*i-l;j+)cout*vvchar(i-l+A);coutendl;return 0;2.7输 入n,求l!+2!+3!+.+n!解:通常求和作为外循环,阶乘作为内循环。这里考虑到:n!=n*(n-l)!,利用递推法运算速度大大提高,同时两者可合并为一个循环。本程序考虑了输入的健壮性。#include#include using namespace std;int main()int n,ijch=l;double result=0;/result 是结果coutw”请输入正整数n:nendl;cinn;if(nl)coutw”输入错误!nendl;return 1;)result=l;fbr(i=2;i=n;i+)jch*=i;/4ch是i的阶乘,注 意n!=n*(n-l)!这样可少一层循环result+ch;jicoutresultendl;return 0;)2.8猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。解:采用递推法。从最后一天逆推到第一天,9次循环。#include using namespace std;const int day=10;int main()int i,x=l;最后一天只有一个for(i=l;iday;i+)x=(x+l)*2;从一天前推到九天前coutw”开始共有桃子“v v x ”个。nn;return 0;)2.9从键盘输入一组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中正数和负数的个数。解:将这组整数放在整型数组中,一边输入一边求和及统计正数和负数的个数,平均数由和除以整数数量取得。#include#include using namespace std;int main()int stem256,sum=0,pnum=0,nnum=0,i=0;coutw”从键盘输入一组非0整数,以输入0标志结束:vendl;cinstemi;while(stemi!=0)sum+=stemi;求和if(stemi0)pnum+;正数数量else nnum;负数数量i+;cinstemi;)if(!i)cout”0个数”wendl;else(coutvv”平均值=vv(double)sum/(pnum+nnum)vvendl;平均值习惯不用整数coutw”正数个数=Upnumendl;coutn 负数个数=Unnumendl;)return 0;)2.10 编程找出1 500之中满足除以3余2,除以5余3,除以7余2的整数。解:中国古代数学问题(韩信点兵),采用穷举法。注意三个条件同时成立用#include using namespace std;int main()int i;for(i=l;i=500;i-H-)if(i%3=2)&(i%5=3)&(i%7=2)coutiendl;return 0;)2.11 编程求1000之内的所有完全数。所谓完全数指的是一个数恰好等于它的所有因子和。例如6=1+2+3,就是一个完全数。解:采用穷举法。两重循环,外层是从1到999依次处理,内层是求该数的所有因子的和,并判断是否等于该数。#include using namespace std;int main()int i,a,sum_yz;/sum_yz 是 a 的因子和for(a=l;al 000;a+)sum_yz=0;fbr(i=l;ia;i-H-)if(a%i=0)sum_yz+=i;/求因子运算未改变循环控制变量a 的值,否则要用另一个变量b 来代替 a 来参加运算if(a=sum_yz)coutaendl;)return 0;)2.12将100元换成用10元、5元和1元的组合,共有多少种组合方法。解:采用穷举法。考虑10元最多10张,5元最多20张,余下是1元。#include using namespace std;int main()int i,j,k,count=0;for(i=0;iv=10;i+)/i是10元张数,j 是5元张数,k 是1元张数for(j=0;j=0)co u t i,t,j,t,kendl;count+;fcoutcountendl;return 0;)2.13利用反正切展开计算兀的近似值,要求误差I O r 公式如下:令 x=l,可计算出兀/4的近似值。解:采用递推法。初看每一项的递推通式不易写出,但每一项全看作奇数项,而偶数项全为零,则很容易写出:第1项为x,第3项为第1项乘以x 的平方除以项序号3乘以1,其余类推。同时和的误差小于最后一项的绝对值。#include#includeusing namespace std;const double e=le-5;int main()double x,a,sum;int i=3;coutw”请输入正切值:vvendl;cinx;a=x;sum=x;doa*=x*x*(-l);sum+=a/i;i+=2;while(fabs(a/i)e);cout,arctg(!x,)=,sumendl;return 0;2.14用迭代法求方程x2+10cosx=0的根,误差限为l o t 迭代公式如下:解:迭代法也是用循环语句实现,数学上迭代法可能收敛,也可能发散,解答中加了最大迭代次数的限制。#include#includeusing namespace std;const double e=le-5;int main()double xO,xl;int n=0;coutvv”输入初始近似值:Hendl;cinx 1;do(xO=xl;x 1 =(xO*xO-l 0*(x0*sin(x0)+cos(x0)/(2*x0-10*sin(x0);x0是上次算出的结果,xl用作保存新算出的结果n+;while(fabs(xl-xO)e)&(nle5)coutvv”超出迭代1 e5次n;else coutvv”方程 x*x+10*cos(x尸0的一个根为:vvxlendl;coutw”方程误差为:“vvxl*xl+10*cos(xl)wendl;return 0;2.15两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛配对名单。规定A 不和J 比赛,M 不和D 及E 比赛。列出所有可能的比赛名单。解:这是一个组合问题,使用穷举法。共有5个位置,设甲队5名队员位置不变,乙队改变队员位置,进行配对。注意第1个位置可在5个队员中任选一个,以后的位置必须扣除已选过的队员。并扣除不能配对的情况,即得所有可能的比赛名单。#includeusing namespace std;int main()char stl5=,A7B,;C,;D7E,st25=,J7K,;L7M,;N,;int i=0j,k,l,m,n;fbr(j=0;jv5;j+)0 号位if(j=O)continue;/A选手不与选手J 比赛,即stlO不与st2比赛for(k=0;k5;k+)/l 号位if(k=j)continue;易!除乙队占据0号位的选手for(l=0;lv5;l+)/2 号位if(l=j|l=k)continue;剔除乙队占据0、1号位的选手for(m=0;m5;m-H-)3 号位if(m=j|m=k|m=l)continue;易 lj 除乙队占据0、1、2号位的选手if(m=3)continue;/stl3不与 st23比赛,即D 不与M 比赛for(n=0;n 5;n+)4 号位if(n=j 1 1 n=k|n=l 1 1 n=m)continue;剔除乙队占据0、1、2、3号位的选手if(n=3)continue;stl4不与st23比赛,即E 不与M 比赛coutstl 0 -,st2j,t,s t 1 1 ,-,wang li z h a o,代号分别为1、2、3、4 o选举人直接键入候选人代号,1 4之外的整数视为弃权票,-1为终止标志。打印各位候选人的得票以及当选者(得票数超过选票总数一半)名单。解:用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。#include#includeusing namespace std;int main()enum candidate feipiao,zhang,wang,li,zhao cand;int vote5=0,i,k=0,n;cinn;while(n!=-l)k+;if(n=l&n=4)voten+;else vote0-H-;cinn;for(i=0;ik/2)co u tn 当选Wendi;else coutendl;break;case wang:coutsetw(10)k/2)c o u t n 当选 v v e n d l;e l s e c o u t e n d l;b r e a k;c a s e l i:c o u t s e t w(1 0)k/2)c o u t n 当选 v v e n d l;e l s e c o u t e n d l;b r e a k;c a s e z h a o:c o u t s e t w(1 0),z h a o,t,v o t e c a n d ;i f(v o t e c a n d k/2)c o u t n 当选v v e n d l;e l s e c o u t e n d l;b r e a k;)r e t u r n 0;)2.1 7改造【例2.1 4 ,将运行结果(F i b o n a c i i数歹i j的前2 0项)存入文件。解:采用3步法。所谓3步法,是将书上的第1和第2步合并,格式如下:首先建立或打开一个输出文件,并与磁盘文件联系:o f s t r e a m o f i l e (,zm y f i l e 2_ 17.t x t);再按一定格式存入数据:o f i l e s e t w(15)f i b 0 l;等,并输出最后关闭文件:f i l e.c l o s e O;#i n c l u d e#i n c l u d e#i n c l u d e u s i n g n a m e s p a c e s t d;const int m=20;int main()int fib0=0,fib 1=1 ,fib2,i,j,k,l,n;char ch;ofstream ofile(,myfile2_17.txtn);ofilesetw(l 5)fib0setw(15)fib 1;fbr(n=3;n=m;n+)fib2=fib0+fibl;ofilesetw(l 5)fib2;if(n%5=0)ofileendl;控制每行5个数据fibO=fibl;fibl=fib2;iofile.close();coutw”是否要将文件输出?Y或N”vendl;cinch;if(ch=,y,|ch=,Y,)ifstream ifile(,myfile2_l 7.txtH);while(l)ifile i j k l n;/由文件读入if(ifile.eof()!=0)break;coutsetw(15)isetw(l 5)jsetw(l 5)ksetw(15)lsetw(l 5)vvnvendl;/显示ifile.close();)return 0;2.18改 造【例2.19】,将 运 行 结 果(100以内素数)存入文件。解:采用4步法。首先定义一个输出文件:of stream o file;再打开该文件并与并与磁盘文件联系:o file.open(z,myfile2_18.tx t);按一定格式把数据存入文件。最后关闭文件。效果与3步法相同。读文件同样可用3步法或4步法。#include#include#include#includeusing namespace std;const int n=100;int main()int an,i,j;char ch,b256;ofttream ofile;ifstream ifile;for(i=0;in;i-H-)ai=l+i;用数组保存整数l100a0=0;/I不是素数,置0for(i=0;in;i-H-)if(ai=断下一个数for(j=i+l;jn;j+)if(aj%ai=O)aj=O;是 ai倍数的元素置ofile.open(nmyfile2_l 8.txtH);int count=0;ofile 1 w n v v”之间的素数:endl;fbr(i=O;in;i-H-)输出所有素数if(ai!=0)ofilesetw(6)ai;count-H-;if(count%10=0)ofileendl;每行 10个数据)ofile.close();coutw”是否要将文件输出?Y 或 Nnendl;cinch;if(ch=y|ch=Y)ifile.open(Mmyfile2_ 18.txt);i=0;while(ifile.get(bi)不 可用,它不能读白字符,if(bi=,n,)break;i+;b iWcoutbendl;count=0;while(l)由文件读入coutsetw(6)i;屏 幕显示count+;if(count%10=0)coutendl;每行 10个数if(ifile.eof()!=0)break;/最后一个数据后面可能没有回车,直接为文件结束ifile.close();coutendl;return 0;)2.19改造【例2.13】,文本由文本文件输入。解:文本文件读入要用成员函数:ifle.g et(),而不可用插入运算符 ,否则会丢失空白字符。#include#includeusing namespace std;int main()char ch;int nline=0,nword=0,nch=0;int isword=0;ifstream ifile(nep2_19.cppn);coutvv”读入 ep2_19.cpp,!endl;doch=ifile.get();if(ch=M)nline-H-;/遇换行符行数+1if(ch!=*,&ch!=,t,&ch!=,n,&ch!=EOF)/读到非间隔符if(!isword)nword+;在单词的起始处给单词数+1nch+;字符数加+1isword=l;else isword=0;读到间隔符while(ch!=EOF);读到文本结束符为止ifile.close();c o u t 行数:n l i n e e n d l;c o u t 单词数:n w o r d e n d l;c o u t 字符数:n c h e n d l;r e t u r n 0;当前位置:学习资源下载 课后习题答案第三章函数习题-基本概念与基础知识自测题3.1 填空题3.1.1 被审义为形参的是在函数中起一(1)作用的变量,形参只能用(2)表示。实参的作用是0,实参可 以用(4)、(5)、(6)表示。答案:(1)自变量(2)变量名(3)将实际参数的值传递给形参(4)具有值的变量(5)常量(6)表达式3.1.2 局部域包括 和(3)o使用局部变量的意义在于(4)o答案:(1)块域(2)函数域(3)函数原型域(4)局部变量具有局部作用域使得程序在不同块中可以使用同名变量3.1.3 静态局部变量存储在 区,在(2)时候建立,生存期为(3),如定义时未显式初始化,则其初值为(4)。答案:(1)全局数据区(2)编译(3)全局生存期(4)全。3.1.4 局部变量存储在区,在(2)时候建立,生存期为(3),如定义时未显式初始化,则其初值为 I4)o答案:栈(2)在函数或块开始执行时(3)函数或块的执行期(4)随机值3.1.5 编译预处理的作用是3,预处理指令的标志是0多文件系统中,程序 由(3)来管理,用户自定义头文件中通常定义一些(4)。答案:(1)将源程序文件进行处理,生成一个中间文件,编译系统对此中间文件进行编译并生成目标代码(2)#(3)工程文件(4)用户构造的数据类型(如枚举类型),外部变量,外部函数、常量和内联函数等具有一定通用性或常用的量3.1.6 设有函数说明如下:int f(int x,int y)return x%y+l;假定a=10,b=4,c=5,下列语句的执行结果分别是和(2)。(1)coutf(a,b)+f(a,c);(2)coutf(f(a+c,b),f(b,c);解答:(1)a:x:y:f(a,b)返回值c:b:45f(a,c)返回值31f(a,b)域:f(a,c)域:104return x%y+l;x:y:io5return x%y+l;main()域10答案:4(2)b:xx:y:y:X:a:c:1045y45f(a+c,b)域:f(b,c)域:154return x%y+l;45return x%y+l;f(Ra+c,b),f(b,c)域:return x%y+l;f(f(a+c,b),f(b,c)返回值:5main()域答案:53.1.7下列程序的输出结果分别为(1)和(2)(1)#includeusing namespace std;int a,b;void fifint j)static int i=a;注意静态局部变量int m,n;m=ij;i+;j+;n=i*j;a+;coutni=n i,t,j=,j,t,;cout,m=n m,t,nn=,nendl;int main()a=l;b=2;f(b);f(a);couta=atb=bendl;return 0;解:n:m:m:a:b:22f(a)返回值f(b)返回值45f(b)域:i:13全局域:f(a)域:main。域i+j=1+2=3i*j=2*3=68j4静 态f()域:2323i+j=2+2=4i*j=3*3=98j4213答案:i=2 j=3 m=3 n=6(对应蓝色)i=3 j=3 m=4 n=9(对应绿色)a=3 b=2(2)#includeusing namespace std;float sqr(float a)return a*a;float p(float x,int n)co u tnin-process:!,x=l,x,f nn=,l n e n d l;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()coutp(2.0,l 3)endl;return 0;)图解递归,共五层,返回值是回归时产生:sqr(p(x,n/2)x*sqr(p(x,n/2)P(2.0,3)P(2.0,6)x*sqr(p(x,n/2)x*sqr(p(x,n/2)13x2.0P(2.0,13)648192n6x2.0832.02n02.0n1X2.0P(2.0,0)=11m a i n()域:第1层p()域:第2层p()域:第3层p()域:第4层p()域:第5层 p()域:P(2.0,l)答案:in-process:x=2 n=13in-process:x=2 n=6in-process:x=2 n=3in-process:x=2 n=lin-process:x=2 n=081923.2简答题3 2 1 函数的实参和形参怎样对应?实参和形参数目必须一致吗?什么情况下可以不同?答:实参和形参的个数和排列顺序应一一对应,并且对应参数应类型匹配(赋值兼容),当有缺省参数时可以不同。3 2 2 函数和内联函数的执行机制有何不同?定义内联函数有何意义?又有何要求?答:内联函数的调用机制与一般函数不同,编译器在编译过程中遇到inline时,为该函数建立一段代码,而后在每次调用时直接将该段代码嵌入到调用函数中,从而将函数调用方式变为顺序执行方式,这一过程称为内联函数的扩展或内联。内联函数的实质是牺牲空间来换取时间。因 inline指示符对编译器而言只是一个建议,编译器也可以选择忽略该建议,内联函数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构控制语句,如switch、复杂if嵌套、while语句等,以及无法内联展开的递归函数,都不能定义为内联函数,即使定义,系统也将作为一般函数处理。3.2.3 全局变量和全局静态变量的区别在哪里?为什么提倡尽量使用局部变量?答:有static修饰的全局变量只能在定义它的文件中可见,在其他文件中不可见,而非静态的全局变量则可以被其他程序文件访问,但使用前必须用extern说明。局部变量具有局部作用域使得程序在不同块中可以使用同名变量。这些同名变量各自在自己的作用域中可见,在其它地方不可见。所以提倡尽量使用局部变旦里3.2.4 函数重载的作用是什么?满足什么条件的函数才可以成为重载函数?重载函数在调用时是怎样进行对应的?答:函数重载可以定义儿个功能相似,而参数类型不同使用相同的函数名的函数,以适应不同情况下自动选用不同函数进行操作。函数重载的好处在于,可以用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强。在定义重载函数时必须保证参数类型不同,仅仅返回值类型不同是不行的。当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。匹配过程按如下步骤进行:(1)如果有严格匹配的函数,就调用该函数;(2)参数内部转换后如果匹配,调用该函数;(3)通过用户定义的转换寻求匹配。3 2 5多文件结构的程序是如何进行管理并运行的?采用多文件结构有什么好处?答:多文件结构通过工程进行管理,在工程中建立若干用户定义的头文件.h和源程序文件.cpp。头文件中定义用户自定义的数据类型,所有的程序实现则放在不同的源程序文件中。编译时每个源程序文件单独编译,如果源程序文件中有编译预处理指令,则首先经过编译预处理生成临时文件存放在内存,之后对临时文件进行编译生成目标文件.o b j,编译后临时文件撤销。所有的目标文件经连接器连接最终生成一个完整的可执行文件.exe。多文件结构管理程序的好处是十分明显的。首先,可以避免重复性的编译,如果修改了个别函数,那么只需将这些函数所在的文件重新编译即可;其次,将程序进行合理的功能划分后,更容易设计、调试和维护;另外,通常把相关函数放在一个文件中,这样形成一系列按照功能分类的文件,便于为其他程序文件使用。326宏定义与常量定义从作用及效果上看是一样的,二者是否完全相同?答:完全不同。不带参宏定义与const说明符定义常量从效果上看是样的,但它们的机制不同。首先宏定义是在预处理阶段完成,而const定义则是在编译阶段实现。其次宏定义只是一种简单的字符串替代,不会为字符串分配内存单元,替代过程也不作语法检查,即使指令中的常量字符串不符合常量要求,预处理的替代过程也照样按指令给出的格式进行。而const定义则是象定义一个变量一样定义一个常量标识符,系统要按照类型要求为该标识符分配内存单元,同时在将常量放入单元时进行类型检查,如果类型不匹配,类型相容的会进行系统的类型转换,不相容的则要提示错误。二.编程与综合练习题3.3设计函数,将小写英文字符变为对应的大写字符。解:小写字母比大写字母ASCII码值大3 2,或写作ch=ch/a,+,A,;#includeusing namespace std;char capitalize(char ch)if(ch=a&ch-z)return ch-a+A;else return ch;)int main()int i=0;char cp30;coutvv”请输入包含小写字母的句子:Hendl;cin.getline(cp,30);while(cpi!-0()coutcapitalize(cpi-H-);coutendl;return 0;3.4设计两个函数,分别求两个数的最大公约数和最小公倍数。解:可用穷举法求最大公约数(从大到小找到的第1个公约数)和最小公倍数(从小到大找到的第1个公倍数)。#includeusing namespace std;MaxCommonDevisor(int n,int m)int i;fbr(i=n;i=l;i)if(n%i=0&m%i=0)break;return i;)MinCommonMultiple(int n,int m)int i;fbr(i=n;i=n*m;i+)if(i%n=0&i%m=0)break;return i;)int main()int i,j;coutw”请输入两个整数:!endl;cinij;coutw”最大公约数:”wMaxCommonDevisor(i,j)v v f v v”最小公倍数:vvMinCommonMultiple(i,j)v Vendl;return 0;)3.5 设计函数digit(num,k),返回整数num从右边开始的第k 位数字的值。例如:digit(4647,3)=6digit(23523,7)=0解:把整数转换为数串,放在一个整型数组中。#includeusing namespace std;digit(int num,int k)int s 10=0,0,0,0,0,0,0,0,0,0;int i=0;do 先把整数转换为数字串si=num%10;num/=10;i+;while(num0);if(k=i)return sk-l;题目中位数的下标从1开始,而数组下标从0开始else return 0;iint main()coutHdigit(4647,3)=ndigit(4647,3)endl;coutHdigit(23523,7)=Mdigit(23523,7)endl;return 0;)3.6设计函数factors(num,k),返回整数num中包含因子k 的个数,如果没有该因子,则返回0。解:必须先判断整数m 能否被k 整除。#includeusing namespace std;factors(int num,int k)缺省返回值为整型int count=0;while(num%k=O)count+;num/=k;ireturn count;)int main()coutMfactors(1875,5)=nfactors(1875,5)endl;coutnfactors(64,3)=nfactors(64,3)endl;return 0;3.7歌德巴赫猜想指出:任何一个充分大的偶数都可以表示为两个素数之和。例如:4=2+2 6=3+3 8=3+5.50=3+47将4 50之间的所有偶数用两个