- 396.00 KB
- 2022-04-22 11:46:06 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'21程序设计教程--用C++语言编程(第二版习题解答)目录第1章概述2第2章基本数据类型和表达式4第3章程序的流程控制――语句7第4章过程抽象――函数16第5章构造数据类型22第6章数据抽象――类37第7章操作符重载53第8章继承――派生类77第9章类属(泛型)机制――模板87第10章输入/输出(I/O)89第11章异常处理90第12章实例--面向对象的Windows应用程序框架90
21第1章概述1、简述冯•诺依曼计算机的工作模型。答:冯•诺依曼计算机的工作模型是:待执行的程序从外存装入到内存中,CPU从内存中逐条地取程序中的指令执行;程序执行中所需要的数据从内存或从外设中获得,程序执行中产生的中间结果保存在内存中,程序的执行结果通过外设输出。2、简述寄存器、内存以及外存的区别。答:寄存器主要用于记录下一条指令的内存地址、当前指令的执行状态以及暂时保存指令的计算结果供下一(几)条指令使用,其作用主要是减少访问内存的次数,提高指令的执行效率。内存用于存储计算机程序(指令和数据),内存由许多存储单元构成,每个存储单元都有一个地址,对存储单元的访问是通过其地址来进行的,与寄存器相比,内存的容量要大得多,但指令访问内存单元所花费的时间比访问寄存器要多得多。外存是大容量的低速存储部件,用于永久性地存储程序、数据以及各种文档等信息,存储在外存中的信息通常以文件形式进行组织和访问,外存储了在容量和速度上与内存不同,另一个区别在于内存中存储的是正在运行的程序和正在使用的数据,外存中存储的则是大量的、并非正在使用的程序和数据。3、CPU能执行哪些指令?答:CPU所能执行的指令通常有:算术指令:实现加、减、乘、除等运算。比较指令:比较两个操作数的大小。数据传输指令:实现CPU的寄存器、内存以及外设之间的数据传输。执行流程控制指令:用于确定下一条指令的内存地址,包括转移、循环以及子程序调用/返回等指令。4、什么是软件?软件是如何分类的?答:计算机软件是计算机系统中的程序以及有关的文档。程序是对计算任务的处理对象(数据)与处理规则(算法)的描述;文档是为了便于人理解程序所需的资料说明,供程序开发与维护使用。软件通常
21可以分为系统软件、支撑软件和应用软件。系统软件居于计算机系统中最靠近硬件的一级,它与具体的应用领域无关,其他软件一般要通过系统软件发挥作用,如操作系统属于系统软件。支撑软件是指支持软件开发与维护的软件,一般由软件开发人员使用,如软件开发环境就是典型的支撑软件。应用软件是指用于特定领域的专用软件,如人口普查软件、财务软件等。1、什么是虚拟机?答:在由硬件构成的计算机(称为“裸机”)之上,加上一些软件就得到了一个比它功能更强的计算机,称为“虚拟机”。2、十进制数0.1的二进制表示是什么?答:(0.1)10=(0.000110011...)2,它是无限循环小数。也就是说,十进制数0.1无法精确用二进制表示!3、简述程序设计范型。答:基于不同的计算模型来对计算进行描述就形成了不同的程序设计范型。典型的程序设计范型有:过程式、对象式、函数式以及逻辑式等。过程式程序设计是一种以功能为中心、基于功能分解和过程抽象的程序设计范型。一个过程式程序由一些子程序构成,每个子程序对应一个子功能,它实现了功能抽象。对象式程序设计是一种以数据为中心、基于数据抽象的程序设计范型。一个面向对象程序由一些对象构成,对象是由一些数据及可施于这些数据上的操作所组成的封装体。函数式程序设计是围绕函数来进行的,计算过程体现为一系列的函数应用。逻辑程序设计是把程序组织成一组事实和一组推理规则,在事实基础上运用推理规则来实施计算。4、简述程序设计的步骤。答:程序设计一般遵循以下步骤:明确问题;系统设计;用某种语言进行编程;测试与调试;运行与维护5、低级语言与高级语言的不同之处是什么?答:低级语言是指与特定计算机体系结构密切相关的程序语言,它是特定计算机能够直接理解的语言(或与之直接对应的语言),包括机器语言和汇编语言。低级语言的优点在于:写出的程序效率比较高,包括执行速度快和占用空间少。其缺点是:程序难以设计、理解与维护,难以保证程序的正确性。高级语言是指人容易理解和有利于人对解题过程进行描述的程序语言。高级语言的优点在于:程序容易设计、理解与维护,容易保证程序正确性。高级语言的缺点是:用其编写的程序相对于用低级语言编写的程序效率要低,翻译成的目标代码量较大。
211、简述编译与解释的区别。答:编译是指把高级语言程序首先翻译成功能上等价的机器语言程序或汇编语言程序,然后执行目标代码程序,在目标代码程序的执行中不再需要源程序。解释则是指对源程序中的语句进行逐条翻译并执行,翻译完了程序也就执行完了,这种翻译方式不产生目标程序。一般来说,编译执行比解释执行效率要高。2、简述C++程序的编译执行过程。在你的C++开发环境中运行1.3.2节中给出的简单C++程序。答:首先可以利用某个编辑程序把C++源程序输入到计算机中,并作为文件保存到外存中,文件名为“*.cpp”和“*.h”。然后利用某个C++编译程序对保存在外存中的C++源程序进行编译,编译结果作为目标文件保存到外存,文件名为“*.obj”。然后再通过一个联接程序把由源文件产生的目标文件以及程序中用到的一些系统功能所在的目标文件联接起来,作为一个可执行文件保存到外存,文件名为“*.exe”。最后通过操作系统提供的应用程序运行机制,把可执行文件装入内存,运行其中的可执行程序。在VisualC++6.0环境中,首先要建立一个project(项目);其次往该project中添加、编辑程序模块(源文件);然后选择菜单Build中的Build...或RebuildAll;最后选择菜单Build中的Execute...运行程序。3、C++的单词分成哪些种类?答:构成C++的单词有:标识符、关键词、字面常量、操作符以及标点符号等。4、下面哪一些是合法的C++标识符?extern,_book,Car,car_1,ca1r,1car,friend,car1_Car,Car_Type,No.1,123答:合法的C++标识符:_book,Car,car_1,ca1r,car1_Car,Car_Type第2章基本数据类型和表达式1、C++提供了哪些基本数据类型?检查你的计算机上各种类型数据所占内存空间的大小(字节数)。答:C++提供了以下5种基本数据类型:整数类型、实数类型、字符类型、逻辑类型以及空值类型。一台计算机上各种数据类型的数据所占用的内存大小(字节数)可以通过“sizeof(类型名)”来计算。2、下面哪一些是合法的C++字面常量,它们的类型是什么?-5.23,1e+50,-25,105,20.20,e5,1e-5,-0.0e5,"n"
21-000,"A","5","3.14",falsered,"r","f""TodayisMonday.","""答:字面常量是指在程序中直接写出常量值的常量。-5.23,1e+50,-25,20,.20,1e-5,-0.0e5,"n",-000,"A","5","r","f","TodayisMonday.","""都是字面常量。其中:整数类型常量:-25,20,-000实数类型常量:-5.23,1e+50,.20,1e-5,-0.0e5字符常量:"n","A","5","r","f"字符串常量:"TodayisMonday.","""1、什么是符号常量?符号常量的优点是什么?答:符号常量是指有名字的常量,在程序中通过常量的名字来使用这些常量。程序中使用符号常量有以下优点:1)增加程序易读性2)提高程序对常量使用的一致性3)增强程序的易维护性2、如何理解变量?变量定义和声明的作用是什么?答:在程序中,其值可以改变的量称为变量。变量可以用来表示可变的数据。程序中使用到的每个变量都要有定义。变量定义指出变量的类型和变量名,另外还可以为变量提供一个初值。C++中使用变量之前,必须对使用的变量进行声明(变量定义属于一种声明,即:定义性声明),变量声明指出了一个变量的类型,使得编译程序能对变量的操作进行类型检查并做相应的类型转换。整个程序中,某变量的定义只能由一个,但它的声明可以有多个。3、什么是表达式?其作用是什么?答:表达式是由操作符、操作数以及圆括号所组成的运算式。在程序设计语言中,对数据操作的具体实施是通过表达式来描述的。4、操作符的优先级和结合性分别是指的什么?答:运算符的优先级和结合性决定表达式中各个运算符的运算次序。操作符的优先级规定了相邻的两个操作符谁先运算:优先级高的先计算;如果相邻的两个操作符具有相同的优先级,则需根据操作符的结合性来决定先计算谁,操作符的结合性通常分为左结合和右结合:左结合表示从左到右计算,右结合表示从右到左计算。5、表达式中的类型转换规则是什么?下面的表达式计算时如何进行操作数类型转换?(1)3/5*12.3(2)"a"+10*5.2(3)12U+3.0F*24L答:表达式中类型转换规则是:基于单个操作符依次进行转换。1)3与5同类型,不转换,结果为0,转换成double型后与12.3做乘法。2)10转换成double型与5.2做乘法,’a’转换成double型后与前者结果做加法。
213)3.0F与24L均转换成double型后做乘法,12U转换成double型后与前者结果做加法。1、将下列公式表示成C++的表达式:(1)(可利用C++标准库中的求平方根的函数:sqrt(x))(2)(3)答:1)(-1*b+sqrt(b*b-4*a*c))/(2*a)2)sqrt(s*(s-a)*(s-b)*(s-c))3)((a*b)/(c*d))*(3/(1+(b/(2.5+c))))+(4*pi*r*r*r/3)2、写出下列条件的C++表达式(1)i能被j整除。(2)ch为字母字符。(3)m为偶数。(4)n是小于100的奇数。(5)a、b、c构成三角形的三条边。答:1)i%j==02)((ch>="a")&&(ch<="z"))||((ch>="A")&&(ch<="Z"))3)m%2==04)(n<100)&&(n%2!=0)5)(a>0)&&(b>0)&&(c>0)&&(a+b>c)&&(b+c>a)&&(c+a>b)或((a+b)>c)&&(abs(a-b)0)&&(b>0)&&(c>0)可以不用判断3、在你的计算机上运行下面的程序:#includeusingnamespacestd;intmain(){doublea=3.3,b=1.1;inti=a/b;cout<usingnamespacestd;intmain(){doublec,f;cout<<"PleaseinputanF-temperature:"<>f;c=(f-32)*5/9;cout<<"TheC-temperatureis:"<
21usingnamespacestd;intmain(){inthour,minute;charnoon;cout<<"Pleaseinputatimein24-hourformat:"<>hour;if(hour<0||hour>23){cout<<"Theinputhouriswrong!"<12){hour=hour-12;noon="p";}elsenoon="a";cout<<"minute:";cin>>minute;if(minute<0||minute>59){cout<<"Theinputminuteiswrong!"<usingnamespacestd;intmain(){charc;for(c="a";c<="z";c++)cout<="a";c--)cout<usingnamespacestd;intmain(){unsignedintgzint;intcount=0;while(1){cout<<"Pleaseinputaninteger(greaterthanzero):"<>gzint;if(gzint<=0)cout<<"Yourinputiswrong!Pleaseinputagain..."<usingnamespacestd;intmain(){intcount=0;charch;cout<<"Pleaseinputanexpression:"<>ch;ch!="#";cin>>ch){if(ch=="(")count++;elseif(ch==")")
21count--;}if(count==0)cout<<"配对!"<0)cout<<"多左括号!"<=”进行计数。解:#includeusingnamespacestd;intmain(){intcount=0;charch1=" ",ch2;cout<<"Pleaseinputastring(terminatedwith#):"<>ch2;ch2!="#";cin>>ch2){if(ch2=="="&&ch1==">")count++;ch1=ch2;}cout<<"Numberof>=:"<usingnamespacestd;
21intmain(){intcharge;doubleweight;cout<<"Pleaseinputtheweightofthepackage:"<>weight;if(weight<=0)cout<<"Theinputweightiswrong!"<>distance;if(distance<=0)cout<<"Theinputeddistanceiswrong!"<#includeusingnamespacestd;intmain()
21{doubleitem=1.0,sum=0.0;inti=1,sign=1;while(fabs(item)>=1e-8){sum+=item;sign*=-1;i+=2;item=sign/(double)i;}cout<usingnamespacestd;intmain(){for(intn=100;n<=999;n++){inti,j,k;i=n/100;//百位数字j=n%100/10;//十位数字k=n%10;//个位数字if(n==i*i*i+j*j*j+k*k*k)cout<usingnamespacestd;intmain(){for(inti=1;i<=9;i++){intn=i*100,m=i*i*i;for(intj=0;j<=9;j++){intn1=n+j*10,m1=m+j*j*j;for(intk=0;k<=9;k++){if(n1+k==m1+k*k*k)cout<usingnamespacestd;intmain(){inta,b;cout<<"Pleaseinputa,b:"<>a>>b;intc=(a>b)?b:a;while(c>0){if(a%c==0&&b%c==0)break;c--;}cout<usingnamespacestd;intmain(){inta,b;cout<<"Pleaseinputa,b:"<>a>>b;intc;do{c=a-b*(a/b);a=b;b=c;}while(c!=0);cout<usingnamespacestd;intmain(){for(inti=0;i<10;i++){if(i!=0)cout<b?a:b;for(inti=max;i>0;i--)if((a%i==0)&&(b%i==0))returni;}1、写出下面程序的执行结果:#includeusingnamespacestd;intcount=0;intfib(intn){count++;if(n==1||n==2)return1;elsereturnfib(n-1)+fib(n-2);}intmain(){cout<1)答:#include
21usingnamespacestd;doubleHermit_Iterative(int,double);//迭代方法doubleHermit_Recursion(int,double);//递归方法voidmain(){constintn=3;//n与x可自行指定doublex=3.14;cout<0,n>0)答:intAck(intm,intn){if(m==0)returnn+1;elseif(n==0)returnAck(m-1,1);elsereturnAck(m-1,Ack(m,n-1));}
211、根据下图写一个函数:intpath(intn);用于计算从结点1到结点n(n大于1)共有多少条不同的路径。24681357答:intpath(intn){if(n==1)return1;if(n==2)return1;if(n==3)return2;if(n%2==0)returnpath(n-1)+path(n-2)+path(n-3);elsereturnpath(n-1)+path(n-2);}2、编程解决下面的问题:若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年有多少头母牛?答:除了第一年到第三年外,每一年的母牛数应该是上一年的母牛数加上三年前的母牛数(现在它们是第四年了,要生小牛了!)intf(intn){if(n==1||n==2||n==3)return1;returnf(n-3)+f(n-1);}3、假设有三个重载的函数:voidfunc(int,double);voidfunc(long,double);voidfunc(int,char);对下面的函数调用,指出它们分别调用了哪一个重载函数;如果有歧义,指出导致歧义的重载函数定义。func("c",3.0);func(3L,3);func("three",3.0);func(3L,"c");func(true,3);答:func("c",3.0);与voidfunc(int,double);匹配func(3L,3);与voidfunc(long,double);匹配func("three",3.0);没有与之匹配的函数func(3L,"c");与voidfunc(long,double);和voidfunc(int,char);均能匹配
21func(true,3);与voidfunc(int,double);和voidfunc(int,char);均能匹配1、下面的函数定义为什么是正确的?在函数f中如何区分(使用)它们?voidf(){intf;.......}答:两个f的作用域不一样,voidf()中的f为全局作用域,intf;中的f为局部作用域。在函数f中如果使用局部变量,则用f;如果使用函数f,则用::f。2、为什么一般把内联函数的定义放在个头文件中?答:为了防止同一个内联函数的各个定义之间的不一致,往往把内联函数的定义放在某个头文件中,在需要使用该内联函数的源文件中用文件包含命令#include把该头文件包含进来。由于内联函数名具有文件作用域,因此,不会出现重复定义问题。3、用循环实现Error!Referencesourcenotfound.中的辗转相除法计算最大公约数。
103答:intgcd(intx,inty){while(y!=0){intt=y;y=x%y;x=t;}returnx;}第5章构造数据类型1、枚举类型有什么好处?C++对枚举类型的操作有何规定?答:使用枚举类型有利于提高程序的易读性;使用枚举类型也有利于保证程序的正确性。首先,可以对枚举类型实施赋值操作,但不同枚举类型之间不能相互赋值,而且不能把一个整型数直接赋值给枚举类型的变量。还可以对枚举类型实施比较运算。还可以对枚举类型实施算术运算,对枚举类型的运算前要转换成对应的整型值,且运算结果类型为算术类型,而且不能对枚举类型的值直接进行输入/输出。2、指针类型主要用于什么场合?引用类型与指针类型相比,其优势在哪里?答:指针类型主要用于参数传递和对动态变量的访问。在C++中,指针类型还用于访问数组元素,以提高访问效率。引用类型与指针类型都可以实现通过一个变量访问另一个变量,但访问的语法形式不同:引用是采用直接访问形式,指针则采用间接访问形式。在作为函数参数类型时,引用类型参数的实参是一个变量,而指针类型参数的实参是一个变量的地址。除了在定义时指定的被引用变量外,引用类型变量不能再引用其他变量;而指针变量定义后可以指向其他同类型的变量。因此,引用类型比指针类型要安全。引用类型的间接访问对使用者而言是透明的。3、写出下面程序的运行结果:#includeusingnamespacestd;voidf(int&x,inty){y=x+y;x=y%3;cout<usingnamespacestd;enumDay{SUN,MON,TUE,WED,THU,FRI,SAT};intmain(){doublemax,min,maxsum=0,minsum=0;for(Dayd=SUN;d<=SAT;d=(Day)(d+1)){cout<<"Pleaseinput";switch(d){caseSUN:{cout<<"Sunday";break;}caseMON:{cout<<"Monday";break;}caseTUE:{cout<<"Tuesday";break;}caseWED:{cout<<"Wednesday";break;}caseTHU:{cout<<"Thursday";break;}caseFRI:{cout<<"Friday";break;}caseSAT:{cout<<"Saturday";break;}}cout<<""stemperature(maxmin):"<>max>>min;maxsum+=max;minsum+=min;}cout<<"Theaveragetemperatureofmaxismis:"<