• 395.00 KB
  • 2022-04-22 11:51:19 发布

《C++程序设计语言》习题答案.doc

  • 63页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第一章练习题1.简述C++语言的特点。答:C++语言的主要特点如下:¨以C作为其子集,兼取了C语言简洁、相对低级的特性,但摒弃掉了C语言中若干不安全的特性,其语言表现力远远强于C语言;¨是一种强类型语言;¨具有较高的可移植性和可维护性;¨适合于大部分系统程序及应用程序的开发;¨是一种不限定应用领域的一种通用程序设计语言;¨是一种能支持面向过程、面向模块、面向对象和类属程序设计范型的混合型程序设计语言。2.C++语言支持哪几种程序设计范型?答:是一种能支持面向过程、面向模块、面向对象和类属程序设计范型的混合型程序设计语言。3.C++中有哪些重要的程序设计理念?答:C++中提供了以下这些重要的程序设计理念:类、派生类、继承、抽象类、接口与实现的分离及模板等重要的面向对象理念。63 第二章练习题:1.编写一个输出字符串“WelcometoC++!”的程序(参照2.1.3节程序)。解1:#include#includeusingnamespacestd;intmain(){stringss;ss=“WelcometoC++!”;cout<usingnamespacestd;intmain(){cout<<“WelcometoC++!”<usingnamespacestd;intmain(){char*cc;cc=“WelcometoC++!”;cout<usingnamespacestd;intmain(){inti=5;charc=‘A’;floatf=5.21f;doubled=8.23;boolbb=false;cout<<“i=“<usingnamespacestd;intmain(){intii=85;shortintsi=45;longintli=75;unsignedintui=65;unsignedshortus=41;unsignedlongul=456;cout<<"八进制ii="<>a;if(a<=0){cout<<"inputerror!!n";return0;}if(isleap(a))cout<<"year:"<usingnamespacestd;intmain(){floatsum=0,a=1,i=0;while(a>1e-5){sum+=a;i+=1;a=a/i;}cout<#includeusingnamespacestd;intmain(){stringstr;ints[3]={0,0,0};cout<<"输入一个字符串:";cin>>str;for(unsignedinti=0;i="A"&&str[i]<="z")s[0]++;elseif(str[i]>="0"&&str[i]<="9")s[1]++;elses[2]++;}cout<<"统计结果如下:n"<<"字符串中字母个数:"<#includeusingnamespacestd;constintMax=32767;boolissu(intn){if(n==1)returntrue;for(inti=2;i<=(int)sqrt(n);i++){if(n%i==0)returnfalse;}returntrue;}intmain(){inti=2,j=1;for(;iusingnamespacestd;constintMa=66;voidprint(inta[]){inti=0;for(;;i++){if(a[i]==0)break;cout<>n;intn,flg=0;intj,k;for(j=0;j#include#includeusingnamespacestd;constintMax=100;voidsort(strings[],int&n){//由小到大排序选择排序;intb,c,a;strings1;for(a=0;a<=n-2;a++){c=a;for(b=c;b>s1;if(s1==s0)break;for(j=0;j#includeusingnamespacestd;constintM=50;structstu{stringname;doubleid;intage;charc;};voidsort(stus[],int&n){//由小到大排序选择排序算法;intb,c,a;stus1;for(a=0;a<=n-2;a++){c=a;for(b=c;b>n;for(i=0;i>s[i].name;cout<<"输入学生的学号:";cin>>s[i].id;cout<<"输入学生的性别[F/M]:";cin>>s[i].c;cout<<"输入学生的年龄:";cin>>s[i].age;}cout<<"信息如下:"<#includeusingnamespacestd;constintMax=100;intmain(){strings;cout<<"inputastring:";cin>>s;charc[Max];unsignedinti;for(i=0;i#includeusingnamespacestd;voidswap(string&a,string&b){strings0;s0=a;a=b;b=s0;}intmain(){strings1="Iloveyou!",s2="metoo.";cout<#includeusingnamespacestd;constintMs=50;//输入字符串的个数的最大值voidsort(string*s[],intn){inti,j;for(i=0;i*(s[j+1])){strings1;s1=*(s[j]);*(s[j])=*(s[j+1]);*(s[j+1])=s1;}}for(intk=0;k>a;inti=0,k=0;for(;i>a;inti=0,k=0;for(;i>c;if(c=="y"||c=="Y"){cout<<"输入修改后的字符串:";cin>>*(s[k]);}63 elsecout<<"退出!"<>a;inti=0;for(;i>n;for(i=0;i>*p;c[i]=p;}cout<<"输入完毕!!nn";loop:cout<<"a.查找某个单词n"<<"b.修该某个单词n"<<"c.删除某个单词n"<<"q.退出!!n"<<"d.排序这些单词并打印输出n请选择!"<>c0;switch(c0){case"a":search(c,n);break;case"b":modify(c,n);break;case"c":delet(c,n);break;case"d":sort(c,n);break;case"q":exit(0);default:cout<<"输入有误!!!n";break;}gotoloop;system("pause");}63 第六章练习题:1.从键盘输入10个浮点数,编写计算求其和及平均值的函数。#includeusingnamespacestd;constintsize=10;floatsum(floata[]){floatsum=0;for(inti=0;i>num[i];cout<<"这十个数的和是"<#includeusingnamespacestd;voidff(stringss,inti){if(i!=0){cout<>ss;inti=ss.size();ff(ss,i);cout<#include#include#include#includeusingnamespacestd;intMy_printf(constchar*format,...){if(format==NULL)return-1;intn=0;va_listmarker;va_start(marker,format);for(inti=0;;i++){charc=format[i];if(c=="")gotoend;elseif(c=="%"){i++;c=format[i];intd,m;char*pc;switch(c){case"s":pc=va_arg(marker,char*);if(pc!=NULL){for(intj=0;;j++){c=pc[j];if(c=="")break;putch(c);n++;}}else{//如果对于%s的实参是空串,将打印输出(null)cout<<"(null)"<#includeusingnamespacestd;voidsum(stringss1,stringss2){stringss3=ss1+ss2;cout<<"字符串"<>ss1>>ss2;intii1,ii2;cout<<"输入两个整数:"<>ii1>>ii2;floatff1,ff2;cout<<"输入两个浮点数:"<>ff1>>ff2;sum(ss1,ss2);sum(ff1,ff2);sum(ii1,ii2);system("pause");return0;}1.采用函数参数缺省值机制,编写能分别打印输出十进制((默认)、八进制和十六进制数的函数。#includeusingnamespacestd;voidoutput(intvalue,intbase=10){switch(base){case10:cout<>ii;cout<<"您是否采用默认进制(10)?Y/N"<>j;intjz;if(j=="N"||j=="n"){cout<<"输入您的进制,10或者16:"<>jz;output(ii,jz);}else{output(ii);}system("pause");return0;}63 第七章练习题:1.简述Using声明与Using指令的区别。答:Using声明是将某一名字空间中的名字引入(Introduce)到一个局部范围内,使其名字在该范围内无需名字空间的约束便可见、可用。而Using指令是将特定名字空间中的所有名字引入到一作用域内。2.采用模块化及结构化异常处理机制进行小型桌面计算器的设计与实现。#include#include#include#includeusingnamespacestd;maptable;//符号表namespaceLexer{//词法分析模块enumToken_value{NAME,NUMBER,END,PLUS="+",MINUS="-",MUL="*",DIV="/",PRINT=";",ASSIGN="=",LP="(",RP=")"};//枚举类型,枚举语言中的终结符Token_valuecurr_tok=PRINT;doublenumber_value;stringstring_value;Token_valueget_token();}namespaceError{//错误处理模块structZero_divide{};structSyntax_error{constchar*p;Syntax_error(constchar*q){p=q;}};}namespaceParser{//语法分析模块doubleexpr(boolget);doubleterm(boolget);doubleprim(boolget);usingnamespaceLexer;usingnamespaceError;}namespaceDriver{//驱动模块intno_of_errors;std::istream*input;voidskip();}Lexer::Token_valueLexer::get_token(){//Lexer模块的get_token实现charch;cin>>ch;63 switch(ch){case"#":returncurr_tok=END;case";":case"*":case"/":case"+":case"-":case"(":case")":case"=":returncurr_tok=Token_value(ch);case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case".":cin.putback(ch);cin>>number_value;returncurr_tok=NUMBER;default:if(isalpha(ch)){cin.putback(ch);cin>>string_value;returncurr_tok=NAME;}throwError::Syntax_error("badtoken");returncurr_tok=PRINT;}}doubleParser::expr(boolget){//Parser模块的expr实现usingnamespaceLexer;doubleleft=term(get);for(;;)switch(curr_tok){casePLUS:left+=term(true);break;caseMINUS:left-=term(true);break;default:returnleft;}}doubleParser::term(boolget){//Parser模块的term实现usingnamespaceLexer;doubleleft=prim(get);for(;;)switch(curr_tok){63 caseMUL:left*=prim(true);break;caseDIV:if(doubled=prim(true)){left/=d;break;}throwError::Zero_divide();default:returnleft;}}doubleParser::prim(boolget){//Parser模块的prim实现usingnamespaceLexer;if(get)get_token();switch(curr_tok){caseNUMBER:{doublev=number_value;get_token();returnv;}caseNAME:{double&v=table[string_value];if(get_token()==ASSIGN)v=expr(true);returnv;}caseMINUS:return-prim(true);caseLP:{doublee=expr(true);if(curr_tok!=RP)throwError::Syntax_error(")expected");get_token();returne;}caseEND:return1;default:throwError::Syntax_error("primaryexpected");}}voidDriver::skip(){//Driver模块的skip实现no_of_errors++;while(*input){charch;input->get(ch);switch(ch){case"n":case";":return;}}}intmain(intargc,char*argv[]){cout<<"-------欢迎使用桌面计算器------"<#includeusingnamespacestd;namespacestack{classStack{public:enum{Max=10};Stack(){top=-1;};voidpush(intn);//压栈操作intpop();//弹栈操作boolisEmpty();//判断栈是否为空?boolisFull();//判断栈是否满?voiddump();//自栈顶向下读取堆栈中的元素~Stack(){};private:inttop;intarray[Max];63 };//Stack类的接口}voidstack::Stack::push(intn){if(isFull())cout<<"Error,theStackisfulln";else{top++;array[top]=n;}}intstack::Stack::pop(){if(isEmpty())cout<<"Error,theStackisempty!n";elsereturnarray[top--];}boolstack::Stack::isFull(){if(top==Max-1)returntrue;elsereturnfalse;}boolstack::Stack::isEmpty(){if(top==-1)returntrue;elsereturnfalse;}voidstack::Stack::dump(){for(inti=top;i>=0;i--)cout<>a[i];s1.push(a[i]);}cout<<"再压进一个数看看:"<>b;s1.push(b);cout<<"以下是你输入的十个数的展示:"<#includeusingnamespacestd;namespacequeue{classList{//List类的接口protected:enum{LEN=20};intelemnum;intelems[LEN];inthead,tial;public:List();voidaddhead(intx);voidaddtial(int&y);intdelhead();intdeltial();intget_num(){returnelemnum;}};List::List(){elemnum=0;head=0;tial=elemnum;}voidList::addhead(intx){inti;if(elemnum>=LEN){cout<<"isfull!!!n";}elsefor(i=elemnum-1;i>=0;i--)elems[i+1]=elems[i];elems[head]=x;elemnum++;tial=elemnum;}voidList::addtial(int&y){if(elemnum>=LEN){cout<<"isfull!!!n";}elems[tial]=y;tial++;elemnum++;}intList::delhead(){if(elemnum==0){63 cout<<"nomemeber"<#includeusingnamespacestd;intAtoi(constchar*str){intresult=0;intsize=0;for(inti=0;str[i]!="";i++)size++;for(inti=size-1;i>=0;i--)result+=(str[i]-"0")*static_cast(pow(10,static_cast(size-i-1)));cout<#include"atoi.h"intmain(){stringstr;inti=0;cin>>str;cout<usingnamespacestd;voidmain(){cout<<″Hello,welcomeyoustudyC++!n″);}在不修改main函数的前提下,修改上述程序使之产生如下输出:InitializeHello,welcomeyoustudyC++!Cleanup解:#includeusingnamespacestd;classC{public:C();~C();private:inta;};C::C(){cout<<"Initializen";}C::~C(){cout<<"Cleanup"<#includeusingnamespacestd;classStack{//类的接口public:enum{Max=10};Stack(){top=-1;};voidpush(intn);//压栈操作intpop();//弹栈操作boolisEmpty();//判断栈是否为空?boolisFull();//判断栈是否满?voiddump();//自栈顶向下读取堆栈中的元素~Stack(){};private:inttop;intarray[Max];};//类的实现voidStack::push(intn){if(isFull())cout<<"Error,theStackisfulln";else{top++;array[top]=n;}}intStack::pop(){if(isEmpty())cout<<"Error,theStackisempty!n";elsereturnarray[top--];}boolStack::isFull(){if(top==Max-1)returntrue;elsereturnfalse;}boolStack::isEmpty(){if(top==-1)returntrue;elsereturnfalse;}voidStack::dump(){for(inti=top;i>=0;i--)cout<>a[i];s1.push(a[i]);}cout<<"再压进一个数看看:"<>b;s1.push(b);cout<<"以下是你输入的是个数的展示:"<usingnamespacestd;constintMax=32767;constintMin=-32768;classMyInteger{public:MyInteger(intx){result=x;}MyIntegeradd(MyIntegerx);//加法操作MyIntegersub(MyIntegerx);//减法操作MyIntegermul(MyIntegerx);//乘法操作MyIntegerdiv(MyIntegerx);//除法操作MyIntegermod(MyIntegerx);//求余操作~MyInteger(){};private:intresult;};63 MyIntegerMyInteger::add(MyIntegerx){inti=result;result+=x.result;cout<Max||iMax||iMax||iMax||i#include#include#includeusingnamespacestd;classDate{//默认了一个copyconstructorpublic:Date(){Year=1970;Month=1;Day=1;}Date(int,int,int);Date(char*s);intconstgetYear();intconstgetMonth();intconstgetDay();voidsetYear(int);voidsetMonth(int);voidsetDay(int);private:intYear,Month,Day;};Date::Date(inty,intm,intd){Year=y;if(m<=12&&m>=1)Month=m;elsecout<<"Error!"<0)Day=d;elsecout<<"Error"<#includeusingnamespacestd;staticinti;structPerson{strings;//表示人名的字符串intage;//年龄};//名单类classTable{Person*p;//元素个数为的sz数组,空间是动态申请的intsz;public:Table(ints=3){sz=s;p=newPerson[sz];}//构造函数,取数组元素个数的缺省值为3~Table(){cout<<"Theclassisend!"<>((p+i)->age);63 cin>>((p+i)->s);if(i<=sz)returntrue;if(i>sz)returnfalse;}Person*Table::lookup(conststring&name){intj=0;for(;js)returnp+j;returnNULL;}Person*Table::lookup(constintage){intj=0;for(;jage)returnp+j;returnNULL;}intmain(){//测试函数intage,s;chara;//判断是否进行插入stringname;Tablet(s=3);for(i=0;i<=2;i++){cout<<"Ifyouwantinsert,pressY,orpressN"<>a;if(a=="Y")t.insert(t.reback(t));if(a=="N")break;}cout<<"Enterthenameyouwanttofind!"<>name;cout<<"Entertheageyouwanttofind!"<>age;if(t.lookup(name)!=NULL)cout<<"Theperson"snameis:"<s<<"theageis:"<age<s<<"theageis:"<age<+=-=*=/=%=^=&=|=<<>>>>=<<===!=<=>=&&||++--->*,->[]()newnew[]deletedelete[]不允许在用户自定义类型中过载定义的操作符是(共计6个):::..*?:sizeoftypeid2.进行C++操作符重载时有哪几种方式?这几种方式的主要差别是什么?答:在C++中可采用类内的非静态成员函数或普通函数进行操作符的重载。主要差别如下:当重载二元操作符时,一般而言,既可以用类的非静态成员函数进行重载(此时参数表中仅需给出第二操作数,第一操作数必须是类类型,且其值*this由系统自动传递);亦可用普通函数进行重载(参数表中需给出参加操作的两个操作数)。以下操作符:赋值操作符“=”,下标运算符“[]”,函数调用运算符“()”和指针运算符“->”仅能由类的非静态成员函数重载。3.设计并实现一个和基本类型int的功用及使用方式完全一致的类INT(提示:在类中定义一个operatorint()类型转换方法)。解:#include#includeusingnamespacestd;classINT{intx;public:INT(){};INT(int);operatorint();INToperator+(INT&);INToperator-(INT&);INToperator*(INT&);INToperator/(INT&);INToperator%(INT&);INToperator=(constINT&);INToperator++();INToperator++(int);INToperator--();INToperator--(int);friendistream&operator>>(istream&in,INT&a);//外部函数访问类的私有成员用友元函数friendostream&operator<<(ostream&out,INT&a);63 //外部函数访问类的私有成员用友元函数};INT::INT(inta){x=a;}INT::operatorint(){inti;i=x;returni;}INTINT::operator+(INT&a){returnINT(x+a.x);}INTINT::operator-(INT&a){returnINT(x-a.x);}INTINT::operator*(INT&a){returnINT(x*a.x);}INTINT::operator/(INT&a){if(a.x==0)throw("除数不能为零!");elsereturnINT(x/a.x);}INTINT::operator%(INT&a){if(a.x==0)throw("被模的数不能为零");elsereturnINT(x%a.x);}INTINT::operator=(constINT&a){x=a.x;return*this;}INTINT::operator++(){x++;return*this;}INTINT::operator++(intn){++x;return*this;}INTINT::operator--(){x--;return*this;}63 INTINT::operator--(intn){--x;return*this;}istream&operator>>(istream&in,INT&a){returnin>>a.x;}//只能top-levelfunctionostream&operator<<(ostream&out,INT&a){returnout<>a>>b;cout<<"n";c=a+b;cout<<"a+b="<s2.display();//此时显示出(<>之间是五个空格):<>s3.display();//此时显示出:<>s4.display();//此时显示出:<0123456789>s3=s1;s3.display();//此时显示出:<0123456789>s2=s1[2];s2.display();//此时显示出:<23456789>s1.display();//此时显示出:<0123456789>s3=s2++;s4=s2+s3;s2.display();//此时显示出:<3456789>63 s3.display();//此时显示出:<23456789>s4.display();//此时显示出:<345678923456789>}解:#include#includeusingnamespacestd;classMystring{strings;intsize;public:Mystring(string);Mystring(int);Mystring();Mystring(Mystring&);Mystring(string,int);voiddisplay();Mystringoperator+(Mystring&);Mystringoperator=(Mystring&);Mystringoperator++(int);Mystringoperator[](int);};Mystring::Mystring(strings1){s=s1;size=0;}Mystring::Mystring(inti){s="";size=i;}Mystring::Mystring(){s="";size=0;}Mystring::Mystring(Mystring&Ms){s=Ms.s;size=Ms.size;}Mystring::Mystring(strings1,inti){s=s1;size=i;}voidMystring::display(){if(s!="")cout<<"<"<";else{cout<<"<";for(inti=0;i";63 }cout<<"n";}MystringMystring::operator+(Mystring&s1){returnMystring(s+s1.s);}MystringMystring::operator=(Mystring&s1){s=s1.s;size=s1.size;returnMystring(s,size);}MystringMystring::operator++(intn){Mystringstr=*this;s=s.substr(1,s.length());returnstr;}MystringMystring::operator[](intn){strings1=s.substr(n,s.length());returnMystring(s1);}intmain(){Mystrings1="0123456789",s2(5),s3,s4(s1);s1.display();//此时显示出:<0123456789>s2.display();//此时显示出(<>之间是五个空格):<>s3.display();//此时显示出:<>s4.display();//此时显示出:<0123456789>s3=s1;s3.display();//此时显示出:<0123456789>s2=s1[2];s2.display();//此时显示出:<23456789>s1.display();//此时显示出:<0123456789>s3=s2++;s4=s2+s3;s2.display();//此时显示出:<3456789>s3.display();//此时显示出:<23456789>s4.display();//此时显示出:<345678923456789>system("pause");return0;}5.设计并实现一个指向int类型的聪明的指针类Ptr_to_int(即可判断指针是否发生越界错误,当错误发生时可对其进行处理。)。该类对外提供如下操作:*,->,=,++,和--。解:#includeusingnamespacestd;classout_of_bounds{};templateclassPtr_to_T{T*p;63 T*array;intsize;public:Ptr_to_T(T*p,T*v,ints);//bindtoarrayvofsizes,initialvaluepPtr_to_T(T*p);//bindtosingleobject,initialvaluepPtr_to_T&operator++();//prefix++Ptr_to_Toperator++(int);//postfix++Ptr_to_T&operator--();//prefix--Ptr_to_Toperator--(int);//postfix--T&operator*();//prefix*};templatePtr_to_T::Ptr_to_T(T*p,T*v,ints){this->p=p;this->array=v;this->size=s;}templatePtr_to_T::Ptr_to_T(T*p){this->p=p;this->array=p;this->size=1;}templatePtr_to_T&Ptr_to_T::operator++(){++p;return*this;}templatePtr_to_TPtr_to_T::operator++(int){p++;return*this;}templatePtr_to_T&Ptr_to_T::operator--(){--p;return*this;}templatePtr_to_TPtr_to_T::operator--(int){p--;return*this;}templateT&Ptr_to_T::operator*(){if(p=array+size)throwout_of_bounds();return*p;}intmain(){intv[200];Ptr_to_Tp(&v[0],v,200);p.operator--(0);try{p.operator*()=0;///run-timeerror:"p"outofrangecout<)=4*sizeof(char),字对齐规则为4*sizeof(char))char*strncpy(char*t,constchar*s,size_tn);//C标准库函数。功能:将字符数组s的前n个元素复制到字符数组t中。classA{char*cpA1;protected:intiA2;public:long*lpA3;A(char*p,inti,long*q):cpA1(p),iA2(i),lpA3(q){}//以下描述类A的内部能见度(例:cpA1:可见/不可见;…)……};classB:protectedA{intiB1;public:charcpB2[5];B(char*p,inti,long*q,intj,constchar*s):A(p,i,q),iB1(j){strncpy(cpB2,s,4);}//以下描述类B的内部能见度……};classC:privateA{intiC1;protected:charcpC2[6];C(char*p,inti,long*q,intj,constchar*s):A(p,i,q),iC1(j){strncpy(cpC2,s,5);}//以下描述类C的内部能见度……};classD:publicC{intiD1;public:charcpD2[16];D(char*p,inti,long*q,intj,constchar*s,intk,constchar*t):C(p,i,q,j,s,k,t),iD1(k){strncpy(cpD2,t,15);}//以下描述类D的内部能见度……63 };f(){chars1[]="Astring",s2[]="inaderivedclass",s3[]="inasubclass";longg1=1000,g2=2000;Aa(s1,1,&g2);Bb(s1,2,&g1,3,s2);Cc(s1,3,&g1,4,s2);Dd(s1,4,&g2,5,s2,6,s3);/*以下插入示范性语句。例如:a.cpA1;//public(或private或protected)*/}解:classA{//cpA1:可见;iA2:可见;lpA3:可见。};classB:protectedA{//cpA1:不可见;iA2:可见;lpA3:可见;iB1:可见;cpB2:可见。};classC:privateA{//cpA1:不可见;iA2:可见;lpA3:可见;iC1:可见;cpC2:可见。};classD:publicC{//cpA1:不可见;iA2:不可见;lpA3:不可见;iC1:不可见;cpC2:可见;//iD1:可见;cpD2:可见。};f(){23’i’’n’’’’a’’’456’i’’n’’’’a’’’’’’i’’n’’’’a’’’’s’’u’’b’’c’’l’’a’’s’’s’’’’A’’’’s’’t’’r’’i’’n’’g’’’10002000b:d:g1:g2:s1:/*示范性语句:a.cpA1;//privatea.iA2;//protecteda.lpA3;//publicb.cpA1;//privateb.iA2;//protectedb.lpA3;//protectedb.iB1;//privateb.cpB2;//publicc.cpA1;//privatec.iA2;//privatec.lpA3;//privatec.iC1;//privatec.cpC2;//protectedd.cpA1;//privated.iA2;//privated.lpA3;//privated.iC1;//privated.cpC2;//protectedd.iD1;//privated.cpD2;//public*/}63 6.已知类的定义如下:classBase{protected:intiBody;public:virtualvoidprintOn()=0;Base(inti=0):iBody(i){}};classSub1:publicBase{//…public://…Sub1(inti,char*s);};classSub2:publicBase{//…public://…Sub2(inti,shorts);};试完成类Sub1和Sub2的定义和操作的实现代码,使之能符合下面程序及在注释中描述的运行结果的要求:main(){Sub1s1(1000,"ThisisanobjectofSub1");Sub2s2(2000,10);s1.printOn();//此时显示出:<1000:ThisisanobjectofSub1>s2.printOn();//此时显示出:<10and2000>}解:#include#includeusingnamespacestd;classBase{protected:intiBody;public:virtualvoidprintOn()=0;Base(inti=0):iBody(i){}};classSub1:publicBase{char*ibody;public:virtualvoidprintOn();Sub1(inti,char*s);};voidSub1::printOn(){cout<<"<"<"<"<s2.printOn();//此时显示出:<10and2000>return0;}6.采用面向对象的理念设计并实现如下类:Number(表示一个整型数)、CyclerNumber(表示以某一整数常数N取模的整型数)和JumpNumber(表示一个只取M*n(M为一整型常量,n为某一整数)的整型数)。这三个类都有一个next()方法,其中:Number类和CyclerNumber类的next()方法是使其数据成员值自增1,而JumpNumber类的next()方法是使其数据成员的值增加M。这三个类都有若干存取和修改其数据成员值的方法。此外,CyclerNumber类和JumpNumber类有设置其N和M的方法。解:#include#includeusingnamespacestd;classNumber{protected:intNum;//数据成员public:Number(){cout<<"输入你想要输入的数据成员:";cin>>Num;}virtualvoidnext(){Num++;}virtualvoidprint(){cout<<"Number类的数据成员是:"<>N;Num=Num%N;63 }voidsetN(){intjudge;cout<<"你想改变N的值吗?(=是0=否)";cin>>judge;if(judge==1){cout<<"输入你想改变成的值:";cin>>N;Num=storNum%N;}if(judge==0)cout<<"原数照用!n";}virtualvoidnext(){Num++;}virtualvoidprint(){cout<<"CyclerNumber的数据成员是:"<>M;Num=Num*M;}voidsetM(){intjudge;cout<<"你想改变M的值吗?(=是0=否)";cin>>judge;if(judge==1){cout<<"输入你想改变成的值:";cin>>M;Num=storNum%M;}if(judge==0)cout<<"原数照用!n";}virtualvoidnext(){Num+=M;}virtualvoidprint(){cout<<"JumpNumber的数据成员是:"<next();p->print();cout<<"测试CyclerNumber类:"<next();p->print();cout<<"测试JumpNumber类:"<next();p->print();cout<<"测试结束!"<usingnamespacestd;templateclassStack{public:explicitStack(int);//gettingthemaxsizeofastack~Stack();boolisEmpty()const;boolisFull()const;voidpush(constElem&);Elempop();structout_of_range{};//forexceptionprivate:Elem*data;//pointertothespaceallocatedinttop;//thepositonofthetopelementconstintmaxsize;//themaxsizeofastack};templateStack::Stack(constintsize=100):top(-1),maxsize(size){data=newElem[size];}templateStack::~Stack(){delete[]data;}templateboolStack::isEmpty()const{return(top<=-1);}templateboolStack::isFull()const{return(top>=maxsize-1);}templatevoidStack::push(constElem&e){if(isFull()){throwout_of_range();return;}top++;data[top]=e;}templateElemStack::pop(){if(isEmpty())throwout_of_range();top--;returndata[top+1];}63 //测试函数intmain(){Stackstk(5);//declareastackofsize5withtheelementsofdoubletypecout<<"isFull:"<","<<",">>"#includeusingnamespacestd;templateclassString{private:intsize;T*ss;public:String();//创建一个空串String(inti);//创建一个尺寸为i-1的串~String();Tat(inti);intSize();Toperator[](inti);voidinput();voidoutput();friendbooloperator==(Strings1,Strings2);friendbooloperator>(Strings1,Strings2);friendbooloperator<(Strings1,Strings2);friendbooloperator!=(Strings1,Strings2);};templateString::String(){size=1;ss=newT;*ss="";}//默认尺度为0templateString::String(intn){size=n;63 ss=newT[n+1];for(inti=0;iString::~String(){if(size>0)delete[]ss;if(size==0)deletess;}templateTString::at(inti){if(i>=this->Size())cout<<"越界!"<ss+i);}//具有越界功能判断的调用函数templateintString::Size(){returnthis->size;}templateTString::operator[](inti){return*(this->ss+i);}templatevoidString::input(){for(inti=0;i>*(ss+i);cout<voidString::output(){cout<<"此String是:"<booloperator==(Strings1,Strings2){if(s1.Size()==s2.Size())for(inti=0;ibooloperator>(Strings1,Strings2){inti=0;intj=0;for(;is2.size)returntrue;elsereturnfalse;returntrue;}templatebooloperator<(Strings1,Strings2){inti=0;intj=0;for(;i*(s2.ss+i))returnfalse;if(*(s1.ss+i)==*(s2.ss+i))j++;}if(j==s1.size)if(s1.sizebooloperator!=(Strings1,Strings2){if(s1.Size()!=s2.Size())for(inti=0;iss(10);cout<<"请输入一个字符串ss:";ss.input();ss.output();cout<<"ss的尺度是"<usingnamespacestd;templateclassArray{private:intsize;T*ss;public:Array(inti);//数组在创建时一定有尺度大小!~Array();intSize();Toperator[](inti);voidinput();//输入一个数组中的元素voidoutput();//输出数组中的所有元素};templateArray::Array(intn){size=n;ss=newT[n];for(inti=0;iArray::~Array(){if(size>0)delete[]ss;}templateintArray::Size(){returnthis->size;}templateTArray::operator[](inti){if(i63 voidArray::input(){for(inti=0;i>*(ss+i);}templatevoidArray::output(){cout<<"此Array中的元素是:"<ss(10);ss.input();ss.output();cout<<"ss数组的尺度是"<a!4.若没有上面所说的这些,此程序有许多错误!!!*/#includeusingnamespacestd;template//冒泡排序函数模板voidbubbleSort(Array&aa){for(inti=0;iss(10);ss.input();//是一个输入数组中元素的函数或重载的操作bubbleSort(ss);ss.output();//是一个输出数组中元素的函数或重载的操作return0;}63 1.设计并实现一个可打印输出任意元素类型的数组元素的printArray函数模板。解://声明:本例需要一个Array模板和一个自定义类型或是基本类型T,//此类型需要过载"<","<","==","[]"等操作!//当然这也不是必然的,也可以用一个基本类型的数组代替Arraya!#includeusingnamespacestd;templatevoidprintArray(Array&ss,intn){//参数用引用比较好!n是数组的大小for(inti=0;i#include#include#include#includeusingnamespacestd;classException{strings;public:Exception();Exception(conststring&s1):s(s1){}voidprint_E(){cout<32767||c<-32767)throwException("a,b两个数的和超出整数的范围!!!");elsecout<<"a,b两个数的和:c="<32767||c1<-32767)throwException("a,b两个数的差超出整数的范围!!!");elsecout<<"a,b两个数的差:c1="<32767||c2<-32767)throwException("a,b两个数的积超出整数的范围!!!");elsecout<<"a,b两个数的积:c2="<32767||c3<-32767)throwException("a,b两个数的商超出整数的范围!!!");elsecout<<"a,b两个数的商:c3="<#include#includeusingnamespacestd;char*c_str(strings0){char*c;c=newchar[s0.size()+1];strcpy(c,s0.c_str());returnc;}intmain(){stringstr1="Animal";char*c=c_str(str1);cout<#include#includeusingnamespacestd;intmain(){strings,s0;cout<<"输入一个字符串:";cin>>s;unsignedinti=0;s0=s;for(unsignedintk=0,n=s.size();k#includeusingnamespacestd;intmain(){strings;cout<<"请输入一行字符串:n";getline(cin,s);inta[5]={0};//代表aeiou出现的次数afor(unsignedinti=0;i#include#includeusingnamespacestd;intmain(){strings0="abcdefghijk";intj=1;for(inti=0,b=5;i<6;i++,b--){63 strings,s1,s2;s=s0.substr(i,j);s1=s.substr(0,s.size()-1);intn=s.size()-1;for(intk=0;k#include#includeusingnamespacestd;intmain(){intnumber=2000;cout<usingnamespacestd;intmain(){chara[32];intdata;63 cout<<"请输入一个整数:";cin>>data;for(intB=2;B<17;B++){intn=0;intnumber=data;for(;;n++){if(number%B+"0"<="9")a[n]=number%B+"0";elsea[n]=number%B+"A"-10;number/=B;if(number==0)break;}//将所要的数转换成要求的进制,并将其存在一个char型的数组中cout<=0;i--)cout<#include#includeusingnamespacestd;intmain(){stringss;cin>>ss;cout<<"这个字符串的长度是"<usingnamespacestd;classComplex{doublereal;doubleimag;63 public:Complex();Complex(double);Complex(doubled1,doubled2);friendistream&operator>>(istream&is,Complex&c1);friendostream&operator<<(ostream&os,constComplex&c2);friendComplexoperator+(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c1,constComplex&c2);};Complex::Complex(){real=imag=0;}Complex::Complex(doubled){real=d;}Complex::Complex(doubled1,doubled2){real=d1;imag=d2;}istream&operator>>(istream&is,Complex&c1){is>>c1.real>>c1.imag;returnis;}ostream&operator<<(ostream&os,constComplex&c2){os<>c1;cout<<"c1="<