




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ly_新标准C++程序设计教材11-20章课后题答案ly_新标准C++程序设计教材11-20章课后题答案ly_新标准C++程序设计教材11-20章课后题答案资料仅供参考文件编号:2022年4月ly_新标准C++程序设计教材11-20章课后题答案版本号:A修改号:1页次:1.0审核:批准:发布日期:新标准C++程序设计教材11-20章课后题答案第11章:1.简述结构化程序设计有什么不足,面向对象的程序如何改进这些不足。答案:结构化程序设计的缺点:(1)用户要求难以在系统分析阶段准确定义,致使系统在交付使用时产生许多问题。(2)用系统开发每个阶段的成果来进行控制,不适应事物变化的要求。(3)系统的开发周期长。面向对象的程序设计如何改进这些不足:面向对象程序设计技术汲取了结构忧程序设计中好的思想,并将这些思想与一些新的、强大的理念相结台,从而蛤程序设计工作提供了一种全新的方法。通常,在面向对象的程序设计风格中,会将一个问题分解为一些相互关联的子集,每个子集内部都包含了相关的数据和函数。同时会以某种方式将这些子集分为不同等级,而一个对象就是已定义的某个类型的变量。2.以下说怯正确的是()。A.每个对象内部都有成员函数的实现代码B.一个类的私有成员函数内部不能访问本类的私有成员变量C.类的成员函数之间可以互相调用D.编写一个类时,至少要编写一个成员函数答案:C3.以下对类A的定义正确的是()。A.classA{ B.classA{private:intv; intv;A*next; public:voidFunc(){} voidFunc(){}}};C.classA{D.classA{intv;intv;public:public:voidFunc();Anext;};voidFunc(){} A::voidFunc(){} };答案:B4.假设有以下类A:classA{public:intfunc(inta){returna*a;} }; 以下程序段不正确的是()。 A.Aa; (5); B.A*p=newA; p->func(5); C.Aa; A&r=a; (5); D.Aa,b; if(a!=b) (5); 答案:D5.以下程序段不正确的是(A)。A.intmain(){classA{intv;}Aa; =3; return0;B.intmain(){ classA{public:intv;A*p;}; Aa;=&a;return0;C.intmain(){classA{public:intv;};A*p=newA;p->v=4;deletep;return0;D.immain(){classA{public:intv;A*p;};Aa:a.p=newA;delete;return0; 答案:A6.实现一个学生信息处理程序。输入:姓名,年龄,学号(整数)。第一学年平均成绩·第二学年平均成绩,第三学年平均成绩,第四学年平均成绩。输出:姓名,年龄,学号,4年平均成绩。例如:输入:Tom18781780809070输出:Tom,18,7817,80要求实现一个代表学生的类,并非所有成员变量都是私有的。 答案:#include<iostream>#include<cstring>#include<cstdlib>面程序的输出结构是:5,55,5请填空:#include<iostream>usingnamespacestd;classBase{ public: intk; Base(intn):k(n){ }};classBig{ public: intv; Baseb; Big__________{ }; Big___________{ };};intmain(){ Biga1(5); Biga2=a1; cout<<<<","<< cout<<<<","<< return0;}答案:(intn):v(n),b(n)(Big&x):v,b完成附录“魔静世界大作业”中提到的第一阶段作业(省略)第13章1如果将运算符“[]”重载为某个类的成员运算符(也即成员函数),则该成员函数的参数个数是()。A.0个B.1个C.2个D.3个答案:B2.如果将运算符“*”重载为菜个类的成员运算符(也即成员函数),则该成员函数的参数个数是()。A.0个B.1个C.2个D.0个或1个均可答案:D3.下面程序的输出是3+4i5+6i请补充Complex类的成员函数,不能加成员变量。#include<iostream>#include<cstring>usingnamespacestd;classComplex{private: doubler,i;public: voidPrint(){ cout<<r<<"+"<<i<<"i"<<endl; }abcd-efgh-abcd-2.abcd-3.4.abcd-efgh-5.efgh-6.c7.abcd-8.ijAl-9.ijAl-mnop10.qrst-abcd-11.abcd-qrst-abcd-uvwxyzaboutbigmetakeabcdqrst-abcd-答案:#include<cstdlib>#include<iostream>#include<string>#include<algorithm>usingnamespacestd;classMyString:publicstring{public: MyString():string(){}; MyString(constchar*s):string(s){}; MyString(conststring&s):string(s){}; MyStringoperator()(ints,intl){ returnthis->substr(s,l); }};intmain(){ MyStrings1("abcd-"),s2,s3("efgh-"),s4(s1); MyStringSArray[4]={"big","me","about","take"}; cout<<"1."<<s1<<s2<<s3<<s4<<endl; s4=s3; s3=s1+s3; cout<<"2."<<s1<<endl; cout<<"3."<<s2<<endl; cout<<"4."<<s3<<endl; cout<<"5."<<s4<<endl; cout<<"6."<<s1[2]<<endl; s2=s1; s1="ijkl-"; s1[2]='A'; cout<<"7."<<s2<<endl; cout<<"8."<<s1<<endl; s1+="mnop"; cout<<"9."<<s1<<endl; s4="qrst-"+s2; cout<<"10."<<s4<<endl; s1=s2+s4+"uvw"+"xyz"; cout<<"11."<<s1<<endl;sort(SArray,SArray+4); for(inti=0;i<4;i++) cout<<SArray[i]<<endl; 成附魔兽世界作业中的的二阶段。(省略)第15章1.以下说法正确的是()A.在虚函数中不能使用this指针B.在构造甬数中调用虚函数,不是动态联编C.抽象类的成员函数都是纯虚函数D.构造函数和析构函数都不是虚构函数答案:B2.写出下面程序的输出结果#include<iostream>usingnamespacestd;classA{ public: A(){ } virtualvoidfunc(){ cout<<"A::func"<<endl; } ~A(){ } virtualvoidfund(){ cout<<"A::fund"<<endl; }};classB:publicA{ public: B(){ func(); } voidfun(){ func(); } ~B(){ fund(); }};classC:publicB{ public: C(){} voidfunc(){ cout<<"C::func"<<endl; } ~C(){ fund(); } voidfund(){ cout<<"C::fund"<<endl; }};intmain(){ Cc; return0;}答案:A::funcC::fundA::fund3.写出下面程序的输出结果。#include<iostream>usingnamespacestd;classA{ public: virtual~A(){ cout<<"DestructA"<<endl; }};classB:publicA{ public: virtual~B(){ cout<<"DestructB"<<endl; }};classC:publicB{ public: virtual~C(){ cout<<"DestructC"<<endl; }};intmain(){ A*pa=newC; deletepa; Aa; return0;}答案:DestructCDestructBDestructADestructA4.写出下面程序的输出结果:#include<iostream>usingnamespacestd;classA{ public: virtualvoidfunc(){ cout<<"A::func"<<endl; } virtualvoidfund(){ cout<<"A::fund"<<endl; } voidfun(){ cout<<"A::fun"<<endl; }};classB:publicA{ public: B(){ func(); } voidfun(){ func(); }};classC:publicB{ public: C(){ } voidfunc(){ cout<<"C::func"<<endl; } voidfund(){ cout<<"C::fund"<<endl; }};intmain(){ A*pa=newB(); pa->fun(); B*pb=newC(); pb->fun(); return0;}答案:A::funcA::funA::funcC::func5.下面程序的输出结果是#include<iostream>usingnamespacestd;classA{ private: intnVal; public: voidFun(){ cout<<"A::Fun"<<endl; } voidDo(){ cout<<"A::Do"<<endl; }};classB:publicA{ public: virtualvoidDo(){ cout<<"B::Do"<<endl; }};classC:publicB{ public: voidDo(){ cout<<"C::Do"<<endl; } voidFun(){ cout<<"C::Fun"<<endl; }};voidCall(B&p){ (); ();}intmain(){ Cc; Call(c); system("PAUSE"); return0;}答案:A::FunC::Do6.下面程序的输出结果是destructorBdestructorA请完整写出classA。限制条件:不能为classA编写构造函数。#include<iostream>usingnamespacestd;classA{______________________________};classB:publicA{ ~B(){ cout<<"destructorB"<<endl; }};intmain(){ A*pa; pa=newB; deletepa; return0;}答案: public: virtual~A(){ cout<<"destructorA"<<endl; }7.下面的程序输出结果是A::FunA::DoA::FunC::Do请填空:#include<iostream>usingnamespacestd;classA{ private: intnVal; public: voidFun(){ cout<<"A::Fun"<<endl; } virtualvoidDo(){ cout<<"A::Do"<<endl; }};classB:publicA{ public: virtualvoidDo(){ cout<<"B::Do"<<endl; }};classC:publicB{ public: voidDo(){ cout<<"C::Do"<<endl; } voidFun(){ cout<<"C::Fun"<<endl; }};voidCall(________){ p->Fun(); p->Do();}intmain(){ Call(newA()); Call(newC());}答案:A*p8.完成附录魔兽世界大作业中提到的终极版本作业。(省略)第16章C++标准类库中有哪几个流类,用途分别如何它们之问的关系如何答案:c++标准库中有istream,ostream,ifstream,ofstream,iostream,fstream等流类。istream是用于输入的流类:ostream是用于输出的流类:ifstream是用于从文件读取数据的类:ofstream是用于向文件写入数据的类:iostream是既能用千输入,又能输出的类:fstream是既能从文件读取数据,又能向文件写入数据的类。ios是个抽象基类,它派生出istream和ostream;istream派生出ifstream,ostream派生出ofstream,istream和ostream共同派生了iostream;iostream派生出fstream。2cin是哪个类的对象cout是哪个类的对象答案:cln是istream类的对象:cout是ostream类的对象。3编写程序,读取一行文字,然后将此行文字颠倒后输出输人样倒:Theseare100dogs输出样例:.sgod001eseht答案:#include<iostream>#include<>usingnamespacestd;voidswap(char*s){ intlen,i; chartmp; len=strlen(s)-1; for(i=0;i<=len/2;++i){ tmp=s[i]; s[i]=s[len-i]; s[len-i]=tmp; }}intmain(void){ chars[]="Thereare100dods."; cout<<s<<"\n"; swap(s); cout<<s<<endl; return0;}4.编写程序,输入若干个实数,对于每个实数,先以非科学计数法输出,小数点后面保留5位有效数字;再以科学计数法输出,小数点后面保留7位有效数字。输入以Ctrl+Z结束。输入样例:输出样例:+001+005+005答案:#include<iostream>usingnamespacestd;intmain(){doublenum; while(cin>>num){ cpp处理后的结果生成为result2.cpp文件。输入样例:#include<iostream>#include<iomanip>usingnamepsacestd;/*testsample*/voidfunc(intn){ if(n){ cout<<”infunc”<<endl; }}intmain()Pleasedoubleit,Thisisafile.Pleasedoubleid.答案:#include<fstream>#include<string>#include<iostream>usingnamespacestd;intmain(){ifstreamin("");ofstreamout("");stringline;stringcontent;if(in)dat.要求是二进制文件,文件中的每个记录和上述类的对象相对应。students.dat最初不存在。程序可以多次运行,如果第一敬运行程序后students.dat生成了,则以后再运行时,程序应基干已经存在的students.dat进行操作。程序运行时能接受以下几种命令:1)Add姓名学号成绩例如IAddTom1234567添加学生信息.姓名和学号都不会包含空格。姓名由最多9个字母组成-学号是整数。可能重名,但学号不会重复。如果发现相同学号的学生已经存在,则不添加学生信息,而是输出:“Aireadyentered”。2)Search姓名根据姓名查找学生信息,并输出。如果有重名的,把重名的学生信息全部输出。辅出格式为;每个学生信息输出为一行,查不到则输出“NotFoundH。3)Search学号根据学号查找学生信息,并输出。输出格式为:姓名学号成绩每个学生信息输出为一行。查不到则输出“NotFound'。4)Modify学号成绩根据学号修改学生的成绩并输出“Done”。如果找不到该学号的学生,则输出“NotFound”。假定学生记录非常多,所以不能采取用一个大数组把全部学生记录都读取到内存的做法。答案:#include<iostream>#include<fstream>#include<cstdio>usingnamespacestd;classStudent{charname[50];intstuID;doublegrades;public:voidAdd(){(name,50);cin>>stuID>>grades;}voidshowData(){ cout<<name<<stuID<<grades; } intretname(){return1;}voidsetdata(){ cout<<"Done"; }};/**functiontowriteinabinaryfile.*/voidwrite_record(){ofstreamoutFile;("",ios::binary|ios::app);Studentobj;();((char*)&obj,sizeof(obj));(); }/**functiontodisplayrecordsoffile*/voiddisplay(){ifstreaminFile;("",ios::binary);Studentobj;while((char*)&obj,sizeof(obj))){();}();}/**functiontosearchanddisplayfrombinaryfile*/voidsearch(intn){ifstreaminFile;("",ios::binary);Studentobj;while((char*)&obj,sizeof(obj))){if()){();}}();}/**functiontomodifyarecord*/voidmodify_record(intn){fstreamfile;("",ios::in|ios::out);Studentobj;while((char*)&obj,sizeof(obj))){if()){cout<<"\nEnterthenewdetailsofstudent";();intpos=-1*sizeof(obj);(pos,ios::cur);((char*)&obj,sizeof(obj));}}();}intmain(){下列函数模板中定义正确的是().A.template<classT1,classT2>T1fun(T1,T2){returnTl+T2;}B.template<classT>Tfun(Ta){returnT+a;}C.template<classT1,classT2>Tlfun(T1,T2){returnT1+T2;}D.template<classT>Tfun(Ta,Tb){returna+br;}答案:D2.下列类模板中定义正确的是().A.template<classT1,ciaasT2>classA:{T1b;intfun(inta){returnT1+T2;}B.template<classT1,classT2>classA{intT2;T1fun(T2a){returna+T2;}C.template<classT1,classT2>claasA{public:T2b,T1a; A<T1>(){}T1fun(){returna;}D.template<classT1,classT2>classA{T2b;T1fun(doublea){ b=(T2)a;return(T1)a; }}; 答案:D3.写出下面程序的输出结果。#include<iostream>usingnamespacestd;template<classT>TMax(Ta,Tb){ cout<<"TemplateMax"<<endl; return0;}doubleMax(doublea,doubleb){ cout<<"MyMax"<<endl; return0;}intmain(){ inti=4,j=5; Max,; Max(i,j); return0;}答案:MyMaxTemplateMax4.填空使得下面程序能编译通过,并写出输出结果。#include<iostream>usingnamespacestd;template<______>classmyclass{ Ti; public: myclass(Ta){ i=a; } voidshow(){ cout<<i<<endl; }};intmain(){ myclass<______>obj("This"); (); return0;}答案:classTstring结果:This5.下面的程序输出是TonHanks请填空。注意,不允许使用任何常量。#include<iostream>#include<string>usingnamespacestd;template<classT>classmyclass{ _______; intnSize;public: myclass(_______,intn){ p=newT[n]; for(inti=0;i<n;++i){ p[i]=a[i]; } nSize=n; } ~myclass(){ delete[]p; } voidShow(){ for(inti=0;i<nSize;++i){ cout<<p[i]; } }};intmain(){ char*szName="TomHanks"; myclass<char>obj(____________); (); return0;}答案:T*pT*aszName,sizeof(szName)+1第19章1.假设pl、p2是STL中的Iist缚器上的迭代器,那么以下语句不符合语法的是()。++;B.p1--;C.p1+=1;D.intn=(pl==p2);答案:C2.将一个对象放入STL中的容器中时以下说法正确的是()。A.实际上被放人的是该对象的一个复制(副本)B.实际上被放人的是该对象的指针C.实际上被放人的是该对象的引用D.实际上被放人的就是该对象自身答案:A3.以下关于函数对象的说法正确的是()。A.函数对象所属的类将()重载为成员函数B.函数对象所属的类将[]重载为成员函数C.函数对象生成时不需用构造函数进行初始化中元素的位置和其值是相关的答案:C4.以下关于STL中SC1类模板的正确说法是()。是顺序容器B.在set中查找元素的时间复杂度是O(n)的(n代表set中的元素个数)C.往set中添加一个元素的时间是O(1)的中元素的位置和其值是相关的答案:C5.写出下面程序的输出结果#include<vector>#include<iostream>usingnamespacestd;classA{ private: intnId; public: A(intn){ nId=n; cout<<nId<<"constructor"<<endl; } ~A(){ cout<<nId<<"destructor"<<endl; }};intmain(){ vector<A*>vp; (newA(1)); (newA(2)); (); Aa(4); return0;}答案:1constructor2constructor4constructor4destructor6.写出下面程序的输出结果。#include<iostream>#include<map>usingnamespacestd;classGt{ public: booloperator()(constint&n1,constint&n2)const{return(n1%10)>(n2%10);}};intmain(){ typedefmap<int,double,Gt>mmid; mmidMyMap; cout<<(15)<<endl; (mmid::value_type(15,); (mmid::value_type(15,); cout<<(15)<<endl; (mmid::value_type(30,); (mmid::value_type(11,); cout<<MyMap[16]<<endl; for(mmid::const_iteratori=();i!=();i++) cout<<"("<<i->first<<","<<i->second<<")"<<","; system("pause");}答案:010(16,0),(15,,(11,,(30,,7.下面程序的输出结果是:Tom,Jack,Mary,John,请填空:#include<iostream>#include<vector>#include<string>usingnamespacestd;template<classT>classMyClass{ vector<T>array; public:MyClass(T*begin,intn):array(n){ copy(begin,begin+n,()); } voidList(){ ________________________________; for(i=();i!=();i++) cout<<*i<<","; }};main(){ stringarray[4]={"Tom","Jack","Mary","John"}; _________________________________; ();}答案:typenamestd::vector<T>::const_iteratoriMyClass<string>obj(array,4)8.下面程序的输出结果是A::Print:1B::Print:2B::Print:3请填空#include<iostream>#include<vector>usingnamespacestd;template<classT>voidPrintAll(constT&c){ typenameT::const_iteratori; for(i=();i!=();++i){ _________________; }};classA{ protected: intnVal; public: A(inti):nVal(i){ } virtualvoidPrint(){ cout<<"A::Print:"<<nVal<<endl; }};classB:publicA{ public: B(inti):A(i){ } voidPrint(){ cout<<"B::Print:"<<nVal<<endl; }};intmain(){ ________________; (newA(1)); (newB(2)); (newB(3)); PrintAll(v); system("pause"); return0;}答案:(*i)->Print()vector<A*>v9.下面的程序输出结果是126789请填空#include<iostream>#include<set>#include<iterator>usingnamespacestd;intmain(){ inta[]={8,7,8,9,6,2,1}; _________; for(inti=0;i<7;i++){ __________; } ostream_iterator<int>o(cout,""); copy(),(),o); system("pause"); return0;}答案:set<int>v(a[i])第20章static_cast、reinterpret_cast、dynamic_cast、const_cast分别用于那些场合答案:static_cast用于进行无风险的强制类型转换,如整型和实数型、字符型之间相互转换;reinterpret_cast用于指针或是引用的不保证安全性的装换;const_cast用于除去const属性的转换,是这四种强制类型转换运算符中唯一一个能够去除const属性的运算符;dynamic_cast用于基类指针或是基类引用到派生类指针或派生类引用的安全转换。dynamic_cast在什么情况下会抛出异常抛出的异常是什么类型的用dynamic_cast进行基类指针到派生类指针的转换。如何判断安全性答案:使用dynamic_cast进行从多态基类对象(或引用)到派生类的引用的强制类型转换是,若转换是不安全的,则会抛出异常,抛出的异常是Baddynamic_cast的异常类;dynamic_cast在进行转换的时候,如果发现时转换不安全,就会抛出一个异常,通过处理异常来发现不安全的转换,判断转换的安全性。下面程序的输出结果是: 2constructed step1 2destructed 3constructed step2 3destructed beforereturn 请填空: #include<iostream> #include<memory> usingnamespacestd; classA { intv; public: A(intn):v(n){cout<<v<<”constructed”<<endl;} ~A(){cout<<v<<”destructed”<<endl;} }; intmain() { A*p=newA(2); _______________; p=NULL; cout<<”step1”<<endl; (NULL); p=newA(3): _________________; p=NULL; cout<<”step2”<<endl; p=; deletep; cout<<“beforereturn”<<endl; return0; } 答案: 1. auto_ptr<A>ptr(p) 2. (
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 穿越树林健康课件视频
- 2025版单方面更改合同可能涉及的法律问题与解决方案合同
- 二零二五年度茶馆吧台承包与经营管理服务合同
- 2025版航空航天材料采购及加工合同
- 二零二五年度冷链物流冷链运输保险代理合同
- 2025版石材与瓷砖综合采购合作协议书
- 二零二五年度土地承包租赁与农业产业融合发展合同
- 2025版酒店能源管理及节能减排服务合同
- 二零二五年度资源共享与智慧金融合同TFJEMIA10
- 2025版房地产销售认筹协议书及购房人隐私保护合同
- 肾科患者的护理及观察要点讲课件
- 2024年上海高中学业水平合格性考试历史试卷真题(含答案详解)
- 上市公司出差管理制度
- 2025-2030年精密合金材料市场市场现状供需分析及投资评估规划分析研究报告
- 电子商务视觉设计(PhotoshopCC+AIGC)-教案
- 防水施工劳务合同范本
- 个人车公司征用协议书
- 2024年贵州省金沙县事业单位公开招聘医疗卫生岗笔试题带答案
- 2024年江西省修水县事业单位公开招聘教师岗笔试题带答案
- 2025至2030牛肝菌行业发展态势风险及经营效益研究报告
- 2025年农业无人机的市场格局探讨
评论
0/150
提交评论