C++程序设计(第二版_吴乃陵_况迎辉)课后答案_第1页
C++程序设计(第二版_吴乃陵_况迎辉)课后答案_第2页
C++程序设计(第二版_吴乃陵_况迎辉)课后答案_第3页
C++程序设计(第二版_吴乃陵_况迎辉)课后答案_第4页
C++程序设计(第二版_吴乃陵_况迎辉)课后答案_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一章 C+基础知识习题 1第一章 C+基础知识习题1.1 判断下列标识符的合法性。sin book 5arry _name Example2.1 main$1 class_cpp a3 x*y my name答:合法的:sin book _name main class_cpp a3非法的:5arry Example2.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 ch1=a,ch2=5,ch3=0,ch4;求下列表达式的值,以及运算后表达式所涉及的各变量的值。x+(int)y%a x=z*b

2、+,b=b*x,b+ ch4=ch3-ch2+ch1int(y/z)+(int)y/(int)z !(a>b)&&c&&(x*=y)&&b+ch3|(b+=a*c)|c+ z=(a<<2)/(b>>1)答:x+(int)y%a 表达式值为:4.5,运算后x、y、a的值不变,仍分别为2.5、8.2、3。提示:运算时取出y变量的数值强制转化为整型数放入寄存器参加运算,但内存中y本身的数值不变化。只有赋值运算和自增、自减运算才改变变量本身的值x=z*b+,b=b*x,b+ 表达式值为:42,运算后x为7.0,b为43。提示

3、:逗号表达式,依次运算,表达式的值是最后一次运算的值。后+是变量先参加运算然后变量自身加1,所以第1步x等于1.4*5,即7.0,然后b增为6;第2步b赋值为42;第3步,表达式的值是上一步后b的值42,但随后b的值自增1,成为43。ch4=ch3-ch2+ch1 表达式值为:,字符外斜杠。运算后ch1、ch2、ch3值不变。提示:字符型的变量实质是范围很小的整型量。int(y/z)+(int)y/(int)z 表达式值为:13。y和z自身的值不变。提示:int(y/z)是完成实数除法后,商强制转化为整型,(int)y/(int)z则是数值先转换,完成的是整除。!(a>b)&&a

4、mp;c&&(x*=y)&&b+ 表达式值为:0。运算后x仍为2.5,b仍为5提示:只要出现一个false右边的不再做,因为c为0,即false,所以其右的所有运算不再做。ch3|(b+=a*c)|c+ 表达式值为:1。运算后b为5,c为0,均不变。提示:只要出现一个true,右边不再做。ch3的值为48。z=(a<<2)/(b>>1) 表达式值为:6。运算后a与b的值不变仍为3和5。提示:a的数值为(00000011)2,左移2位为(00001100)2即12,相当整数2两次,而b的数值为(00000101)2,右移1位为(000000

5、10)2,即2,相当于整除2。1.3 判断下列哪些是常量,哪些是变量。"China" const int n=10; int m=5; 'a' char ch='a'int array5=1,2,3,4,5; char s="Hello"答:"China" 文字常量const int n=10; 常变量int m=5; 变量'a' 文字常量 1第一章 C+基础知识习题2char ch='a' 变量int array5=1,2,3,4,5; 变量char s="H

6、ello" 变量1.4 将下列算式或叙述用C+表达式描述。(1) 22)(arcsin2cx+p(2) (x+y)/(x-y)*ay)(3) 位于原点为圆心,a, b为半径的圆环中的点坐标。(4) 。 cba¹¹(5) 并且字符ch不为'0'。 20£k答: 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)(k<=2

7、0)&&(ch!='0')1.6 设有语句:int a, b;float x,y;char ch1,ch2,ch3;cin>>a>>b>>x>>y>>ch1;ch2=cin.get();cin>>ch3;若从键盘输入:3 2 1.8 7 a b c执行后各变量取值如何?注意abc三字符两两间有空格。答:a是3,b是2,x是1.8,y是7,ch1是a,ch2是空格,ch3是b。1.7 设有语句:int a,b,c,d;cin>>oct>>a>>b>&g

8、t;hex>>c>>dec>>d;若从键盘输入:23 23 23 23执行后各变量的值用十进制表示各是多少?答:a:19,b:19,c:35,d:231.8 对于习题1.7,若执行:cout<<a<<t<<hex<<b<<t<<oct<<c<<endl;显示结果是什么?答:19 0x13 0432第二章 基本控制结构程序设计习题一基本概念与基础知识自测题3.1 程序阅读题3.1.1 设有说明:int a=3, b=100;下面的循环语句执行 (1) 次,执行后a、

9、b的值分别为 (2) 、 (3) 。while(b/a>5) if(b-a>25) a+; else b/=a; 解答: 本题检查学生整除的概念。跟踪:a3b100b/a33循环次数1b-a9741002529651002039515100613851610061484171005停(1)14(2)17(3)1003.1.2 设有说明:int n,x,k,y;n下面程序段的功能是备选答案中的 (1) ,当n=10,x=10 打印结果是 (2) 。cin>>x>>n;k=0; do x/=2; k+;while(k<n);y=1+x; k=0; do y

10、=y*y; k+;while(k<n);cout<<y<<endl;备选答案:A. y = (1 + x ) nnB. y = (1 +x ) 2n2 nC. y = (1 +x ) n2 nD. y = (1 +x ) 22 n +1第二章 基本控制结构程序设计习题2解答:第一个循环使 x 成为: x2 n(1)B;y 成为:1 + x2 n;第一个循环使 y 成为: (1 +x ) 2n ;2 n考虑整除, x2 n(2)1连除 4 次以后为零,所以:3.1.3 请看如下程序段:if(num=1)cout<<”Alpha”;else if(num=

11、2)cout<<”Bata”;else if(num=3)cout<<”Gamma”;else cout<<”Delta”;当num的值分别为 1、2、3 时,上面程序段的输出分别为(1) 、(2) 、(3) 。 解答:检查条件语句与字符串输出概念:(1)Alpha(2)Bata(3)Gamma3.1.4 执行下面程序段后,m和k的值分别为 (1) 、 (2) 。int m,k; for(k=1,m=0;k<=50;k+) if(m>=10) break; if(m%2=0)m+=5;continue;m-=3;解答:注意 continue 语句

12、的使用初值m=1k=0第 1 次循环后m=5k=1第 2 次循环m=2k=2第 3 次循环m=7k=3第 4 次循环m=4k=4第 5 次循环m=9k=5第 6 次循环m=6k=6第 7 次循环m=11结束,k+未做(1)11(2)6二编程与综合练习题3.2 编程求一元二次方程 ax2+bx+c=0 的根。包括以下判断和结果:若输入 a=0,给出提示;第二章 基本控制结构程序设计习题3若>0,输出两个不等实根;若=0,输出两个相等实根;若<0,输出两个复数根。解:本题以一个绝对值极小的数作为实数 0。#include <iostream.h>#include <m

13、ath.h>#include <stdlib.h>void main()double a,b,c;double delta,x1,x2;const double zero=1e-9; /定义一个很小的常数int sign;cout<<"输入三个系数a(a!=0), b, c:"<<endl;cin>>a>>b>>c;if(fabs(a)<zero) cout<<"二次项系数为0,方程根是-c/b" exit(0); cout<<"a=&q

14、uot;<<a<<'t'<<"b="<<b<<'t'<<"c="<<c<<endl; delta=b*b-4*a*c; if(fabs(delta)<zero)/绝对值很小的数即被认为是0cout<<"方程有两个相同实根:"cout<<"x1=x2="<<-b/(2*a)<<endl;else if(delta>0)sign=1;

15、elsesign=0; delta=sqrt(fabs(delta); x1=-b/(2*a); x2=delta/(2*a);if(sign) cout<<"方程有两个不同实根:" cout<<"x1="<<x1+x2<<'t'<<"x2="<<x1-x2<<endl;else/delta<0 cout<<"方程无实根!有两个不同复数根:" cout<<"x1="&

16、lt;<x1<<"+i"<<x2<<'t'<<"x2="<<x1<<"-i"<<x2<<endl;3.3 设计程序将输入的百分制成绩转换为五分制输出,90 分以上为 5 分,8089 分为 4 分,7079 分为 3 分,6069 分为 2 分,60 分以下为 1 分。 解:10 分一档用 10 进行整除获得,转换用开关语句实行。第二章 基本控制结构程序设计习题4#include <iostream.h>v

17、oid main()int mark,result;/mark是百分制成绩,result是5分制cout<<"请输入百分制成绩:"<<endl;cin>>mark;if(mark<0) cout<<"缺考!"<<endl; return;switch (mark/10) case 9: case 10: result=5;cout<<"输出五分制成绩:"<<result<<endl;break;case 8: result=4; co

18、ut<<"输出五分制成绩:"<<result<<endl; break;case 7: result=3; cout<<"输出五分制成绩:"<<result<<endl; break;case 6: result=2; cout<<"输出五分制成绩:"<<result<<endl; break;case 5:case 4:case 3:case 2:case 1:case 0: result=1; cout<<&qu

19、ot;输出五分制成绩:"<<result<<endl; break;default:cout<<"输入错误!"<<endl;3.4 编程打印如下图形:*解:难点在三角形左边的空格的控制,嵌套一个循环语句完成此任务。第二章 基本控制结构程序设计习题5#include <iostream.h>void main()int i,j;for (i=1;i<=4;i+)for(j=4-i;j>0;j-)/三角形每行前部的空格cout<<""for(j=1;j<=2*

20、i-1;j+)cout<<" *"cout<<endl;for(i=1;i<=3;i+)cout<<"* * *n"3.5 编程输出下列图形,中间一行英文字母由输入得到。ABBBCCCCCDDD D D DD CCCCCBBB A解:分上三角和下三角两部分分别处理左边的空格。#include <iostream.h>void main() char in; int i,j; docout<<"输入一个字母:"cin>>in;if(in>=97)&

21、;&(in<=122) in-=32;/小写改大写while(in<65)|(in>90);int line=in-'A'for (i=0;i<=line;i+)/上三角for(j=line-i;j>0;j-)cout<<""/前方空格for(j=1;j<=2*i+1;j+)cout<<' '<<char(i+'A');cout<<endl;for (i=line;i>0;i-)/下三角(少一行)for(j=0;j<=lin

22、e-i;j+)cout<<""for(j=1;j<=2*i-1;j+)cout<<' '<<char(i-1+'A');第二章 基本控制结构程序设计习题6cout<<endl;3.6 输入 n,求 1!+2!+3!+n!解:通常求和作为外循环,阶乘作为内循环。这里考虑到:n!=n*(n-1)!,利用递推法运算 速度大大提高,同时两者可合并为一个循环。本程序考虑了输入的健壮性。#include <iostream.h>#include <stdlib.h>void m

23、ain()int n;double result=0;/result是结果cin>>n;if(n<1)cout<<"输入错误!"<<endl;/return;exit(0);result=1;for(int i=2,jch=1;i<=n;i+)jch*=i;/jch是i的阶乘,注意n!=n*(n-1)!这样可少一层循环result+=jch;cout<<result<<endl;3.7 猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只

24、剩下一个桃子,问猴子共摘了几个桃子。 解:采用递推法。从最后一天逆推到第一天,9 次循环。#include <iostream.h>const int day=10;void main()int i,x=1;/最后一天只有一个for(i=1;i<day;i+)/从一天前推到九天前x=(x+1)*2;cout<<"开始共有桃子"<<x<<"个。n"3.8 从键盘输入一组非 0 整数,以输入 0 标志结束,求这组整数的平均值,并统计其中的个 数。 解:将这组整数放在整型数组中,一边输入一边求和及统计正数和

25、负数的个数,平均数由和 除以整数数量取得。第二章 基本控制结构程序设计习题7#include <fstream.h>#include <iostream.h>void main()int stem256,sum=0,pnum=0,nnum=0,i=0; cout<<"从键盘输入一组非0整数,以输入0标志结束:"<<endl; cin>>stemi;while(stemi!=0) sum+=stemi;/求和 if(stemi>0) pnum+;/正数数量 else nnum+;/负数数量i+;cin>&

26、gt;stemi;if(!i) cout<<"0个数"<<endl;else cout<<"平均值"<<(double)sum/(pnum+nnum)<<endl;/平均值习惯不用整数 cout<<"正数个数"<<pnum<<endl;cout<<"负数个数"<<nnum<<endl;3.9 编程找出 1500 之中满足除以 3 余 2,除以 5 余 3,除以 7 余 2 的整数。解:

27、中国古代数学问题(韩信点兵),采用穷举法。注意三个条件同时成立用&&。#include <iostream.h>void main() int i; for(i=1;i<=500;i+)if(i%3=2)&&(i%5=3)&&(i%7=2)cout<<i<<endl;3.10 编程求 1000 之内的所有完全数。所谓完全数指的是一个数恰好等于它的所有因子和。 例如 6=1+2+3,就是一个完全数。解:采用穷举法。两重循环,外层是从 1 到 999 依次处理,内层是求该数的所有因子的和, 并判断是否等于该数

28、。#include <iostream.h>void main()int i,a,sum_yz;/sum_yz是a的因子和for(a=1;a<1000;a+) sum_yz=0; for(i=1;i<a;i+)if (a%i=0) sum_yz+=i;if (a=sum_yz)cout<<a<<endl;第二章 基本控制结构程序设计习题83.11 将 100 元换成用 10 元、5 元和 1 元的组合,共有多少种组合方法。 解:采用穷举法。考虑 10 元最多 10 张,5 元最多 20 张,余下是 1 元。#include <iostrea

29、m.h>void main()for(int i=0,j,k,count=0;i<=10;i+)/i是10元张数,j是5元张数,k是1元张数for(j=0;j<=20;j+) k=100-10*i-5*j; if(k>=0)cout<<i<<'t'<<j<<'t'<<k<<endl;count+;cout<<count<<endl;3.12 利用反正切展开计算的近似值,要求误差 10-5,公式如下:357arctg ( x) x x + x x

30、 + L357令 x=1,可计算出/4 的近似值。 解:采用递推法。初看每一项的递推通式不易写出,但每一项全看作奇数项,而偶数项全为 零,则很容易写出:第 1 项为 x,第 3 项为第 1 项乘以 x 的平方除以项序号 3 乘以-1,其余 类推。同时和的误差小于最后一项的绝对值。#include<iostream.h>#include<math.h>const double e=1e-6;void main()double x,a,sum; int i=3; cout<<"请输入弧度值:"<<endl; cin>>

31、x;a=x; sum=x; doa*=x*x*(-1); sum+=a/i; i+=2;while(fabs(a/i)>e);cout<<"arctg("<<x<<")="<<sum<<endl;第二章 基本控制结构程序设计习题93.13 用迭代法求方程x2+10cosx=0 的根,误差限为 10-5。迭代公式如下:x 2 10( x sin x + cos x )x=nnnnn +12 xn 10 sin xn解:迭代法也是用循环语句实现,数学上#include<iostream.

32、h>#include<math.h> const double e=1e-5; void main()float x0,x1; int n=0; cout<<"输入初始近似值:"<<endl; cin>>x1;dox0=x1;x1=(x0*x0-10*(x0*sin(x0)+cos(x0)/(2*x0-10*sin(x0);/x0是上次算出的结果,x1用作保存新算出的结果n+;while(fabs(x1-x0) >e)&&(n<=1e5);if(n>1e5)cout<<&qu

33、ot;超出迭代1e5次n"else cout<<"方程x*x+10*cos(x)=0的一个根为:"<<x1<<endl;cout<<"方程误差为:"<<x1*x1+10*cos(x1)<<endl;3.14 两队选手每队 5 人进行一对一的比赛,甲队为 A、B、C、D、E,乙队为 J、K、L、M、N,经过抽签决定比赛配对名单。规定 A 不和 J 比赛,M 不和 D 及 E 比赛。列出所有可能 的比赛名单。解:这是一个组合问题,使用穷举法。共有 5 个位置,设甲队 5 名队员

34、位置不变,乙队改变 队员位置,进行配对。注意第 1 个位置可在 5 个队员中任选一个,以后的位置必须扣除已选 过的队员。并扣除不能配对的情况,即得所有可能的比赛名单。#include<iostream.h>void main()char st15='A','B','C','D','E',st25='J','K','L','M','N'int i=0,j,k,l,m,n;for(j=0;j<5;j+)/0号位if(j=0

35、) continue;/A不与J比赛,即st10不与st20比赛for(k=0;k<5;k+)/1号位 if(k=j) continue; for(l=0;l<5;l+)/2号位if(l=j|l=k) continue;for(m=0;m<5;m+)/3号位if(m=j|m=k|m=l) continue;第二章 基本控制结构程序设计习题10if(m=3) continue;/M不与D比赛,即st13不与st23比赛for(n=0;n<5;n+)/4号位if(n=3) continue;/M不与E比赛,即st14不与st23比赛if(n=j|n=k|n=l|n=m) c

36、ontinue;cout<<st10<<'-'<<st2j<<'t'<<st11<<'-'<<st2k<<'t'cout<<st12<<'-'<<st2l<<'t'<<st13<<'-'<<st2m<<'t'cout<<st14<<'-'&

37、lt;<st2n<<endl;i+;cout<<i<<endl;3.15 编程模拟选举过程。假定四位候选人:zhang、wang、li、zhao,代号分别为 1、2、3、4。选举人直接键入候选人代号,14 之外的整数视为弃权票,-1 为终止标志。打印各位候 选人的得票以及当选者(得票数超过选票总数一半)名单。解:用 5 个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。#include<iostream.h>#include<iomanip.h>void main()enum candidatefeipiao,

38、zhang,wang,li,zhaocand;int vote5=0,i,k=0,n;cin>>n;while(n!=-1)k+;if(n>=1&&n<=4) voten+;else vote0+;cin>>n;for(i=0;i<5;i+) cand=(candidate)i; switch(cand)case feipiao:cout<<setw(10)<<"feipiao"<<'t'<<votecand<<endl;break;case

39、 zhang:cout<<setw(10)<<"zhang"<<'t'<<votecand;if(votecand>k/2) cout<<"当选"<<endl;else cout<<endl;break;case wang:cout<<setw(10)<<"wang"<<'t'<<votecand;if(votecand>k/2) cout<<&qu

40、ot;当选"<<endl;第二章 基本控制结构程序设计习题11else cout<<endl;break;case li:cout<<setw(10)<<"li"<<'t'<<votecand; if(votecand>k/2) cout<<"当选"<<endl; else cout<<endl;break;case zhao:cout<<setw(10)<<"zhao"&

41、lt;<'t'<<votecand;if(votecand>k/2) cout<<"当选"<<endl;else cout<<endl;break;3.16 改造【例 3.11】,将运行结果(Fibonacii 数列的前 20 项)存入文件。解:采用 3 步法。首先建立或打开一个输出文件,并与磁盘文件联系:ofstream ofile("myfile3_16.txt"); 再按一定格式存入数据:ofile<<setw(15)<<fib0<<se

42、tw(15)<<fib1;等 然后关闭文件:ofile.close(); 如要读出数据,则用输入文件打开,并与同一磁盘文件联系:ifstream ifile("myfile3_16.txt"); 再按同一格式读入数据:ifile>>i>>j>>k>>l;等,并输出 最后关闭文件:file.close();#include<fstream.h>#include<iomanip.h>const int m=20;void main()int fib0=0,fib1=1,fib2,i,j,k,l;

43、char ch,a256;ofstream ofile("myfile3_16.txt"); ofile<<setw(15)<<fib0<<setw(15)<<fib1; for(int n=3;n<=m;n+)fib2=fib0+fib1;ofile<<setw(15)<<fib2;if(n%5=0)ofile<<endl;/控制每行5个数据fib0=fib1;fib1=fib2; ofile.close(); cout<<"是否要将文件输出?Y或N"

44、<<endl; cin>>ch;if(ch='y'|ch='Y')ifstream ifile("myfile3_16.txt");while(1)ifile>>i>>j>>k>>l;/由文件读入第二章 基本控制结构程序设计习题12if(ifile.eof()!=0) break;cout<<setw(15)<<i<<setw(15)<<j<<setw(15)<<k<<setw(15)&l

45、t;<l<<endl;/屏幕显示ifile.close();3.17 改造【例 3.16】,将运行结果(100 以内素数)存入文件。解:采用 4 步法。首先定义一个输出文件:ofstream ofile; 再打开该文件并与并与磁盘文件联系:ofile.open("myfile3_17.txt"); 按一定格式把数据存入文件。最后关闭文件。效果与 3 步法相同。 读文件同样可用 3 步法或 4 步法。#include<fstream.h>#include<iomanip.h>#include<math.h> const i

46、nt n=100; void main()int an,i,j; char ch,b256; ofstream ofile; ifstream ifile;for(i=0;i<n;i+) ai=1+i;/用数组保存整数1-100 a0=0;/1不是素数,置0 for(i=0;i<n;i+)if(ai=0)continue;/该数已经置0,判断下一个数for(j=i+1;j<n;j+) if(aj%ai=0) aj=0; /是ai倍数的元素置0; ofile.open("myfile3_17.txt"); int count=0;ofile<<&

47、quot;1-"<<n<<"之间的素数:"<<endl;for(i=0;i<n;i+)/输出所有素数if(ai!=0) ofile<<setw(6)<<ai; count+;if(count%10=0)ofile<<endl;/每行10个数据 ofile.close(); cout<<"是否要将文件输出?Y或N"<<endl; cin>>ch;if(ch='y'|ch='Y') ifile.open(

48、"myfile3_17.txt"); i=0;while(ifile.get(bi)/不可用>>,它不能读白字符,第二章 基本控制结构程序设计习题13if(bi='n') break;i+;bi='0' cout<<b<<endl; count=0; while(1)ifile>>i;/由文件读入 cout<<setw(6)<<i;/屏幕显示 count+;if(count%10=0)cout<<endl;/每行10个数if(ifile.eof()!=0) b

49、reak;/这里与例3.20不同,最后一个数据后面可能没有回车,直接为文件结束 ifile.close(); cout<<endl;3.18 改造【例 3.10】,文本由文本文件输入。解:文本文件读入要用成员函数:ifile.get(),而不可用插入运算符<<,否则会丢失空白字 符。#include<fstream.h>void main()char ch;int nline=0,nword=0,nch=0;int isword=0;ifstream ifile("ep3_18.cpp"); cout<<"读入ep3

50、_18.cpp"<<endl; doch=ifile.get();if(ch='n')nline+; /遇换行符行数+1 if(ch!=' '&&ch!='t'&&ch!='n'&&ch!=EOF)/读到非间隔符if(!isword)nword+;/在单词的起始处给单词数+1 nch+;/字符数加+1isword=1;elseisword=0;/读到间隔符while(ch!=EOF);/读到文本结束符为止ifile.close(); cout<<&q

51、uot;行数:"<<nline<<endl; cout<<"单词数:"<<nword<<endl; cout<<"字符数:"<<nch<<endl;第二章 基本控制结构程序设计习题14第三章 函数习题 1第三章函数习题一基本概念与基础知识自测题3.1 填空题3.1.1 被定义为形参的是在函数中起(1) 作用的变量,形参只能用(2) 表示。实参的作用是(3) ,实参可以用 (4) 、 (5) 、 (6) 表示。答案:(1)自变量(2)变量名(3)将实际

52、参数的值传递给形参(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)全03.1.4局部变量存储在(1) 区,在 (2) 时候建立,生存期为(3) ,如定义时未显式初始化,则其初值为(4) 。答案:(1)栈(2)在函数或块开始执行时(3)

53、函数或块的执行期(4)随机值3.1.5 编译预处理的作用是(1) ,预处理指令的标志是(2) 。多文件系统中,程序由(3) 来管理,用户自定义头文件中通常定义一些(4) 。答案:(1)将源程序文件进行处理,生成一个中间文件,编译系统对此中间文件进行编译并生成目标代码(2)#(3)工程文件第三章 函数习题 2(4)用户构造的数据类型(如枚举类型),外部变量,外部函数、常量和内联函数等具有一定通用性或常用的量3.1.6 设有函数说明如下:int f(int x, int y) return x%y+1; 假定a=10,b=4,c=5,下列语句的执行结果分别是(1) 和 (2) 。(1) cout&

54、lt;<f(a,b)+f(a,c); (2) cout<<f(f(a+c,b),f(b,c);解答:(1)答案:4 411035abcf(a,b)f(a,c)main()f(a,b)f(a,c)410xy510xyreturn x%y+1;return x%y+1;(2)答案:53.1.7下列程序的输出结果分别为(1) 和 (2) 。(1)#include<iostream>using namespace std;int a,b;void f(int j)第三章 函数习题 3static int i=a; /注意静态局部变量int m,n;m=i+j; i+; j

55、+; 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'&

56、lt;<"b="<<b<<endl;return 0;解: 21abmain()f(b)f(a)ji+j=2+2=4i*j=3*3=9nmf()321i3232j32i+j=1+2=3i*j=2*3=6nm答案: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

57、-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()cout<<p(2.0,13)<<endl;return 0;第三章 函数习题 4图解递归,共五层,返回值是回归时产生: 13nmain()1()p(2.0,13)81922.0

58、xp(2.0,6)646n2()2.0xp(2.0,3)83n3()2.0xp(2.0,1)21n4()2.0xp(2.0,0)10n5()2.0xx*sqr(p(x,n/2)x*sqr(p(x,n/2)x*sqr(p(x,n/2)sqr(p(x,n/2)答案:in-process:x=2 n=13in-process:x=2 n=6in-process:x=2 n=3in-process:x=2 n=1in-process:x=2 n=081923.2 简答题3.2.1 函数的实参和形参怎样对应?实参和形参数目必须一致吗?什么情况下可以不同?答:实参和形参的个数和排列顺序应一一对应,并且对应

59、参数应类型匹配(赋值兼容),当有缺省参数时可以不同。3.2.2 函数和内联函数的执行机制有何不同?定义内联函数有何意义?又有何要求?答:内联函数的调用机制与一般函数不同,编译器在编译过程中遇到inline时,为该函数建立一段代码,而后在每次调用时直接将该段代码嵌入到调用函数中,从而将函数调用方式变为顺序执行方式,这一过程称为内联函数的扩展或内联。内联函数的实质是牺牲空间来换取时间。因inline指示符对编译器而言只是一个建议,编译器也可以选择忽略该建议,内联函数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构控制语句,如switch、复杂if嵌套、while语句等,以及无法

60、内联展开的递归函数,都不能定义为内联函数,即使定义,系统也将作为一般函数处理。3.2.3 全局变量和全局静态变量的区别在哪里?为什么提倡尽量使用局部变量?答:有static修饰的全局变量只能在定义它的文件中可见,在其他文件中不可见,而非静态的全局变量则可以被其他程序文件访问,但使用前必须用extern说明。第三章 函数习题 5局部变量具有局部作用域使得程序在不同块中可以使用同名变量。这些同名变量各自在自己的作用域中可见,在其它地方不可见。所以提倡尽量使用局部变量3.2.4 函数重载的作用是什么?满足什么条件的函数才可以成为重载函数?重载函数在调用时是怎样进行对应的?答:函数重载可以定义几个功能

61、相似,而参数类型不同使用相同的函数名的函数,以适应不同情况下自动选用不同函数进行操作。函数重载的好处在于,可以用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强。在定义重载函数时必须保证参数类型不同,仅仅返回值类型不同是不行的。当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。匹配过程按如下步骤进行:(1)如果有严格匹配的函数,就调用该函数;(2)参数内部转换后如果匹配,调用该函数;(3)通过用户定义的转换寻求匹配。3.2.5 多文件结构的程序是如何进行管理并运行的?采用多文件结构有什么好处?答:多文件结构通过工程进行管理,在工程中建立若干用户定义的头文件

62、.h和源程序文件.cpp。头文件中定义用户自定义的数据类型,所有的程序实现则放在不同的源程序文件中。编译时每个源程序文件单独编译,如果源程序文件中有编译预处理指令,则首先经过编译预处理生成临时文件存放在内存,之后对临时文件进行编译生成目标文件.obj,编译后临时文件撤销。所有的目标文件经连接器连接最终生成一个完整的可执行文件.exe。多文件结构管理程序的好处是十分明显的。首先,可以避免重复性的编译,如果修改了个别函数,那么只需将这些函数所在的文件重新编译即可;其次,将程序进行合理的功能划分后,更容易设计、调试和维护;另外,通常把相关函数放在一个文件中,这样形成一系列按照功能分类的文件,便于为其

63、他程序文件使用。3.2.6 宏定义与常量定义从作用及效果上看是一样的,二者是否完全相同?答:完全不同。不带参宏定义与const说明符定义常量从效果上看是一样的,但它们的机制不同。首先宏定义是在预处理阶段完成,而const定义则是在编译阶段实现。其次宏定义只是一种简单的字符串替代,不会为字符串分配内存单元,替代过程也不作语法检查,即使指令中的常量字符串不符合常量要求,预处理的替代过程也照样按指令给出的格式进行。而const定义则是象定义一个变量一样定义一个常量标识符,系统要按照类型要求为该标识符分配内存单元,同时在将常量放入单元时进行类型检查,如果类型不匹配,类型相容的会进行系统的类型转换,不相

64、容的则要提示错误。二编程与综合练习题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;第三章 函数习题 6int main()int i=0;char cp30;cout<<"请输入包含小写字母的句子:"<<endl;cin.getline(cp,30);while(cpi!='0') cou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论