电气工程学院面向对象设序设计上机练习_第1页
电气工程学院面向对象设序设计上机练习_第2页
电气工程学院面向对象设序设计上机练习_第3页
电气工程学院面向对象设序设计上机练习_第4页
电气工程学院面向对象设序设计上机练习_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

电气工程学院面向对象设序设计上机练习PAGEPAGE1一、上机步骤1.启动MicrosoftVisualC++编译系统2.从菜单上选择File->New,或按Ctrl+N打开New对话框3.选取或激活New对话框的Projects工程项目,以便生成.dsw(DeveloperStudioworkspace)文件。4.进一步鼠标点击程序类型Win32ConsoleApplication,在Projectname下键入工程名如:dosApp1,将该工程文件置于一合适的磁盘路径Location下,如:c:\mydoc\dosApp,最后单击New对话框的OK按钮。此时弹出一个对话框。5.在四个选项中单选Anemptyproject,然后点取Finish按钮,在弹出的信息对话框中,鼠标点击OK按钮。到此系统生成并打开一个新项目工作区。6.从菜单上选择File->New,或按Ctrl+N打开New对话框。7.激活New对话框的Files标签,选择C++SourceFile,在Filename下的空白处键入源文件名如:example1,鼠标点击OK按钮。此时进入全屏幕编辑环境,用户可输入源程序(如下)并保存。#include<iostream>usingnamespacestd;classperson{public: charname[16]; intage;};//类person结束voidmain(){ personmyself; cout<<"\n请输入您的姓名:"; cin>>; cout<<"\n您的姓名是:"<<; cout<<"\n请输入你的年龄:"; cin>>myself.age; cout<<"\n你的年龄是"<<myself.age<<"岁\n"; if(myself.age<50) { cout<<"\n你非常年轻!\n"; } if(myself.age==100) { cout<<"\n你很老了\n"; } if(myself.age>100) { cout<<"\n你真的很老了\n"; }}8.从菜单上选择Build->compile即可编译源程序,或Build->Build直接生成执行程序。9.调试程序直到没有编译或连接错误。10.直接在集成环境按Ctrl+F5执行该程序且按任意键通常方便的是空格键结束程序。二、练习 下面程序使用成员函数来读取类的数据变量,并显示类的对象内容。此处将使用一个接受对象作为参数的成员函数。#include<iostream>usingnamespacestd;classTime{private: inthours,minutes,seconds;public: voidgetinfo() {cin>>hours>>minutes>>seconds; } voiddisplay() {cout<<hours<<':'<<minutes<<':'<<seconds<<endl; } voidaddit(constTime&aa,constTime&bb) { hours=aa.hours+bb.hours; minutes=aa.minutes+bb.minutes; seconds=aa.seconds+bb.seconds; //检查秒数是否小于60 if(seconds>=60) { seconds-=60; minutes++; } //检查分钟是否小于60 if(minutes>=60) { minutes-=60; hours++; } }};voidmain(){Timeone,two,three;cout<<"\n输入第一个时间(小时分钟秒):";one.getinfo();cout<<"\n输入第二个时间(小时分钟秒):";two.getinfo();three.addit(one,two);cout<<"结果是:";three.display();}验证:输入第一个时间:144515输入第二个时间:31914结果为:18:4:29三、编程寻找并输出11~999之间的数m,它满足m、m2和m3均为回文数。(回文:各位数字左右对称的整数。)例如:11满足上述条件112=121,113=1331。10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。回文函数可参考下面语句。boolsymm(longn){longi,m;i=n;m=0;while(i){m=m*10+i%10;i=i/10;}return(m==n);}四、编写三个名为add的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。五、练习下面有关类及成员的例子。#include<iostream>usingnamespacestd;classClock //时钟类的声明{public: //外部接口,公有成员函数 voidSetTime(intNewH=0,intNewM=0,intNewS=0); voidShowTime();private: //私有数据成员 intHour,Minute,Second;};//时钟类成员函数的具体实现voidClock::SetTime(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}inlinevoidClock::ShowTime(){ cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}//主函数intmain(){ ClockmyClock; //定义对象myClock cout<<"Firsttimesetandoutput:"<<endl; myClock.SetTime(); //设置时间为默认值 myClock.ShowTime(); //显示时间 cout<<"Secondtimesetandoutput:"<<endl; myClock.SetTime(8,30,30); //设置时间为8:30:30 myClock.ShowTime(); //显示时间}游泳池过道六、一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米游泳池过道七、练习,具有静态、动态生存期对象的时钟程序。#include<iostream>usingnamespacestd;classClock //时钟类定义{public: //外部接口 Clock(); voidSetTime(intNewH,intNewM,intNewS);//三个形参均具有函数原型作用域 voidShowTime(); ~Clock(){}private: //私有数据成员 intHour,Minute,Second;};//时钟类成员函数实现Clock::Clock() //构造函数{ Hour=0; Minute=0; Second=0;}voidClock::SetTime(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}voidClock::ShowTime(){ cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}ClockglobClock;//声明对象globClock,具有静态生存期,文件作用域//由缺省构造函数初始化为0:0:0intmain() //主函数{ cout<<"Firsttimeoutput:"<<endl; //引用具有文件作用域的对象globClock: globClock.ShowTime(); //对象的成员函数具有类作用域 //显示0:0:0 globClock.SetTime(8,30,30); //将时间设置为8:30:30 ClockmyClock(globClock); //声明具有块作用域的对象myClock //调用拷贝构造函数,以globClock为初始值 cout<<"Secondtimeoutput:"<<endl; myClock.ShowTime(); //引用具有块作用域的对象myClock //输出8:30:30}八、练习静态成员函数#include<iostream>usingnamespacestd;classalpha{private: staticintcount;//静态数据成员public: alpha() { count++; } staticvoiddisplay_count()//静态成员函数 { cout<<count<<endl; }};intalpha::count=0;voidmain(){ alpha::display_count(); alphaobj1,obj2,obj3; alpha::display_count();//创建三个对象之后}九、练习动态创建对象#include<iostream>usingnamespacestd;classPoint{public:Point(){X=Y=0;cout<<"DefaultConstructorcalled."<<endl;}Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled."<<endl;}~Point(){cout<<"Destructorcalled."<<endl;}intGetX(){returnX;}intGetY(){returnY;} voidMove(intx,inty) {X=x;Y=y;}private:intX,Y;};intmain(){cout<<"StepOne:"<<endl;Point*Ptr1=newPoint;//动态创建对象,没有给出初值,因此调用缺省构造函数deletePtr1;//删除对象,自动调用析构函数cout<<"StepTwo:"<<endl;Point*Ptr2=newPoint(1,2);//动态创建对象,并给出初值,因此调用有形参的构造函数deletePtr2;//删除对象,自动调用析购函数}十、练习指向类的非静态成员的指针#include<iostream>usingnamespacestd;classPoint //类的声明{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;} //构造函数 intGetX(){returnX;} //内联函数,返回X intGetY(){returnY;} //内联函数,返回Y intc;private: //私有数据 intX,Y;};voidmain() //主函数{ PointA(4,5); //声明对象A Point*p1=&A; //声明对象指针并初始化 intPoint::*pc=&Point::c;//定义一个指向数据成员的指针并初始化 /*intPoint::*pc; pc=&Point::c; A.*pc=3;//用指针方式给类成员c赋值3*/ cout<<A.c<<endl; int(Point::*p_GetX)()=Point::GetX; //声明成员函数指针并初始化; /*int(Point::*p_GetX)(); p_GetX=Point::GetX;*/ cout<<(A.*p_GetX)()<<endl; //(1)使用成员函数指针访问成员函数 cout<<(p1->GetX)()<<endl; //(2)使用对象指针访问成员函数 cout<<A.GetX()<<endl; //(3)使用对象名访问成员函数}学习方法:学习过程很辛苦。不要问我学习C++有什么捷径,因为我也不知道。不过现在开设C++课程,那你很幸运,送你八个字:"课前预习,课后复习",按时完成作业之类是作为学生的基本要求,我就不在这里重复了。接下来介绍一下大家下课后的自学方法:1、不要死抠语法:初学者最容易犯的错误就是抱着一本大书死抠语法,结果语法倒是很熟,程序还是一行都不会写,学习的积极性也受到很大打击。学习编程,语法是最不重要的,最重要的是思路。语法可以从任何一本书上查出来。2、建立面向对象的概念,面向对象概念开始建立的时候确实比较难,但这一关早晚得过,不过这一关就永远写不出真正的C++程序,因此从开始就要培养这一思维方式,不必一蹴而就,要慢慢来,一点一点把思想方法转变过去。只要面向对象的概念建立起来,以后无论学习Java还是C#,都不过是小菜一碟,新东西很少了。3、尽早接触标准库:这也就是我把TheC++StandardLibrary:ATutorialandReference归入入门类的出发点,标准库的概念接触越早越好,要把使用标准库作为天经地义的事情,作为自己的编程习惯,能用的地方一定要用。4、认真分析例题:从别人的源代码中学习是最简单的学习方法。书上的例题大部分都是作者精心挑选的,最能体现某种语法特点或思想观念的程序,认真体会这些例题,理解程序的逻辑和结构,多问自己几个为什么?5、培养良好的编程风格,积累编程技巧:只要你对C++有了一个初步的概念,就可以开始看我在上一部分列出的应用技巧类书籍了。并不是每一个条款都那么高难,你也不是一定要按顺序读,一边学一边就可以挑选自己能看懂的条款研究一番。6、擅于利用身边的工具与环境:大多数编程环境都提供丰富的工具供用户使用,比如调试器等,参照用户手册,利用这些工具对自己写的程序进行分析、监视和跟踪,可以在很大程度上提搞学习和工作效率。互联网更是一个丰富的资源,特别是google和MSDN,利用这些可以解决你的大多数问题,即使没有找到答案,还可以上论坛去问。7、学无止境:C++语言还在不断发展,C++语言的国际标准也正在修订,早一天了解就能早一天受益。推开这扇门吧,有一片奇异的风景在等着你。十一、练习指向类的静态成员的指针(静态数据成员)#include<iostream>usingnamespacestd;classPoint //Point类声明{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;} //构造函数 Point(Point&p); //拷贝构造函数 intGetX(){returnX;} intGetY(){returnY;} staticintcountP; //静态数据成员引用性说明private: //私有数据成员 intX,Y;};Point::Point(Point&p){ X=p.X; Y=p.Y; countP++;}intPoint::countP=0; //静态数据成员定义性说明intmain() //主函数实现{ int*count=&Point::countP;//声明一个int型指针,指向类的静态成员 PointA(4,5); //声明对象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); cout<<"Objectid="<<*count<<endl; //直接通过指针访问静态数据成员 PointB(A); //声明对象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY(); cout<<"Objectid="<<*count<<endl; //直接通过指针访问静态数据成员}十二、练习指向类的静态成员的指针(静态函数成员)#include<iostream.h>classPoint //Point类声明{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;} //构造函数 Point(Point&p); //拷贝构造函数 intGetX(){returnX;} intGetY(){returnY;} staticvoidGetC(){cout<<"Objectid="<<countP<<endl;} //静态函数成员private: //私有数据成员 intX,Y; staticintcountP; //静态数据成员引用性说明};Point::Point(Point&p){ X=p.X; Y=p.Y; countP++;}intPoint::countP=0; //静态数据成员定义性说明//初始化,使用类名限定intmain() //主函数实现{ void(*gc)()=Point::GetC; //声明一个指向函数的指针,指向类的静态成员函数 PointA(4,5); //声明对象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); gc(); //输出对象序号,直接通过指针访问静态数据成员 PointB(A); //声明对象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY(); gc(); //输出对象序号,直接通过指针访问静态数据成员}十三、用友元函数计算两点间的距离。classPoint //Point类定义{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;} intGetX(){returnX;} intGetY(){returnY;} friendfloatfDist(Point&a,Point&b); //友元函数声明private: //私有数据成员 intX,Y;};floatfDist(Point&p1,Point&p2) //友元函数实现,前面没有friend{ doublex=double(p1.X-p2.X); //通过对象访问私有数据成员 doubley=double(p1.Y-p2.Y); returnfloat(sqrt(x*x+y*y));}intmain() //主函数{ Pointmyp1(1,1),myp2(4,5); //定义Point类的对象 cout<<"Thedistanceis:"; cout<<fDist(myp1,myp2)<<endl; //计算两点间的距离}十四、声明两个类boy和girl,类boy声明为类girl的友元,因此boy类的成员函数都成为类girl的友元函数,它们都可以访问类girl的私有成员。也就是一个类作为另一个类的友元。#include<iostream>#include<string>usingnamespacestd;classgirl;classboy{public:boy(char*n,intd) {name=newchar[strlen(n)+1]; strcpy(name,n); age=d; } voiddisp(girl&);//声明disp()为类boy的成员函数 ~boy() {deletename;}private: char*name; intage;};classgirl{public:girl(char*n,intd) {name=newchar[strlen(n)+1]; strcpy(name,n); age=d; } ~girl() {deletename;}private: char*name; intage; friendboy;//声明类boy是类girl的友元};voidboy::disp(girl&x)//定义函数disp()为类boy的成员函数,也是类girl的友元函数{cout<<"boy\'snameis"<<name<<",age:"<<age<<"\n";cout<<"girl\'snameis"<<<<",age:"<<x.age<<"\n";}voidmain(){boyb("chenhao",25);girle("zhangwei",18);b.disp(e);}十五、运算符前置++和后置++重载为时钟类的成员函数。#include<iostream>usingnamespacestd;classClock //时钟类声明{public: //外部接口 Clock(intNewH=0,intNewM=0,intNewS=0); voidShowTime(); voidoperator++(); //前置单目运算符重载 voidoperator++(int); //后置单目运算符重载private: //私有数据成员 intHour,Minute,Second;};Clock::Clock(intNewH,intNewM,intNewS) //构造函数{ if(0<=NewH&&NewH<24&&0<=NewM&&NewM<60&&0<=NewS&&NewS<60) {Hour=NewH; Minute=NewM; Second=NewS; } else cout<<"Timeerror!"<<endl;}voidClock::ShowTime() //显示时间函数{ cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}voidClock::operator++() //前置单目运算符重载函数{ Second++; if(Second>=60) { Second=Second-60; Minute++; if(Minute>=60) { Minute=Minute-60; Hour++; Hour=Hour%24; } } cout<<"++Clock:";}voidClock::operator++(int) //后置单目运算符重载{ //注意形参表中的整型参数 Second++; if(Second>=60) { Second=Second-60; Minute++; if(Minute>=60) { Minute=Minute-60; Hour++; Hour=Hour%24; } } cout<<"Clock++:";}intmain(){ ClockmyClock(23,59,59); cout<<"Firsttimeoutput:"; myClock.ShowTime(); myClock++; myClock.ShowTime(); ++myClock; myClock.ShowTime();}十六、公有继承classbase//声明一个基类{public:voidsetxy(intm,intn) {x=m; y=n; } voidshowxy() {cout<<"x="<<x<<endl; cout<<"y="<<y<<endl; }private: intx;protected: inty;};classderived:publicbase//声明一个公有派生类{public:voidsetxyz(intm,intn,intl) {setxy(m,n);//setxy()在派生类中是public成员,可以访问 z=l;//此处是字符l } voidshowxyz() {//cout<<"x="<<x<<endl;//非法,x在类derived中为不可直接访问成员 showxy();//改成这样就行了。 // cout<<"y="<<y<<endl;//合法,y在类derived中为protected成员 cout<<"z="<<z<<endl; }private: intz;};main(){derivedobj;obj.setxyz(30,40,50);obj.showxy();//合法,showxy()在类derived中为public成员obj.showxyz();return0;}十七、保护继承的访问规则classbase{public:intz; voidsetx(inti) {x=i;} intgetx() {returnx;}private: intx;protected: inty;};classderived:protectedbase{public:intp; voidsetall(inta,intb,intc,intd,inte,intf); voidshow();private: intm;protected: intn;};voidderived::setall(inta,intb,intc,intd,inte,intf){//x=a;//非法,在类derived中,x为不可直接访问成员,可修改为setx(a);setx(a);//这样修改,用public的setx函数将a的值赋给xy=b;//合法,y在类derived中为protected成员z=c;//合法,z在类derived中为protected成员m=d;//可以访问自己的private的m成员n=e;//自己的protected的n成员p=f;//自己的public的p成员}voidderived::show(){//cout<<"x="<<x<<endl;//非法,在类derived中,x为不可直接访问成员 cout<<"x="<<getx()<<endl;//合法,getx()在类derived中为protected成员 cout<<"y="<<y<<endl;//合法,y在类derived中为protected成员 cout<<"z="<<z<<endl;//合法,z在类derived中为protected成员 cout<<"m="<<m<<endl; cout<<"n="<<n<<endl;}voidmain(){derivedobj;obj.setall(1,2,3,4,5,6);obj.show();cout<<"p="<<obj.p<<endl;//合法,p在类derived中为public成员}十八、单一继承时的构造函数classB{public: B(); B(inti); ~B(); voidPrint()const;private: intb;};B::B(){ b=0; cout<<"B'sdefaultconstructorcalled."<<endl;}B::B(inti){ b=i;cout<<"B'sconstructorcalled."<<endl;}B::~B(){ cout<<"B'sdestructorcalled."<<endl;}voidB::Print()const{ cout<<b<<endl;}classC:publicB{public:C(); C(inti,intj); ~C(); voidPrint()const; private: intc;};C::C(){ c=0; cout<<"C'sdefaultconstructorcalled."<<endl;}C::C(inti,intj):B(i){ c=j; cout<<"C'sconstructorcalled."<<endl;}C::~C(){ cout<<"C'sdestructorcalled."<<endl;}voidC::Print()const{ B::Print(); cout<<c<<endl;}intmain(){ Cobj(5,6); obj.Print();}十九、多继承时的构造函数#include<iostream>usingnamespacestd;classB1 //基类B1,构造函数有参数{public: B1(inti){ cout<<"constructingB1"<<i<<endl;}};classB2 //基类B2,构造函数有参数{public: B2(intj){ cout<<"constructingB2"<<j<<endl;}};classB3 //基类B3,构造函数无参数{public: B3(){ cout<<"constructingB3*"<<endl;}};classC:publicB2,publicB1,publicB3 //派生新类C//调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。//注意基类名的顺序{public: //派生类的公有成员 C(inta,intb,intc,intd):B1(a),B2(b),memberB2(d),memberB1(c)//缀上基类构造函数和对象成员构造函数//也可写全//C(inta,intb,intc,intd):B1(a),B2(b),B3(),memberB2(d),memberB1(c),memberB3(){ cout<<"Cconstructing"<<endl;} //注意基类名的个数与顺序 //注意成员对象名的个数与顺序private: //派生类的私有对象成员 B1memberB1;//调用成员对象的构造函数,调用顺序按照它们在类中声明的顺序。 B2memberB2; B3memberB3;};intmain(){ Cobj(1,2,3,4);}二十、虚基类示例#include<iostream>usingnamespacestd;classA{public: inti; voidshowa() { cout<<"i="<<i<<endl; }};classB:virtualpublicA{//对类A进行了虚拟继承public: intj;};classC:virtualpublicA{//对类A进行了虚拟继承public: intk;};classD:publicB,publicC{//派生类D的二基类B,C具有共同的基类A,但采用了虚拟继承 //从而使类D的对象中只包含着类A的1个实例public: intn; voidshowall() { cout<<"i,j,k,n="<<i<<","<<j<<","<<k<<","<<n<<endl; //若非虚拟继承时会出错!因为“D::i具有二义性” }};voidmain(){ DDobj;//说明D类对象 Dobj.i=11;//若非虚拟继承时会出错!因为“D::i具有二义性” Dobj.j=22; Dobj.k=33; Dobj.n=44; Dobj.showa();//若非虚拟继承时会出错!因为“D::showa具有二义性” Dobj.showall();}二十一、虚函数#include<iostream>usingnamespacestd;classB0 //基类B0声明{public: //外部接口 virtualvoiddisplay(){cout<<"B0::display()"<<endl;} //虚成员函数};classB1:publicB0 //公有派生{public: voiddisplay(){cout<<"B1::display()"<<endl;} //虚成员函数};classD1:publicB1 //公有派生{public: voiddisplay(){cout<<"D1::display()"<<endl;} //虚成员函数};voidfun(B0*ptr) //普通函数{ ptr->display();}intmain() //主函数{ B0b0,*p; //声明基类对象和指针 B1b1; //声明派生类对象 D1d1; //声明派生类对象 p=&b0; fun(p); //调用基类B0函数成员 p=&b1; fun(p); //调用派生类B1函数成员 p=&d1; fun(p); //调用派生类D1函数成员}二十二、虚函数,应用C++的多态性,计算三角形、矩形和圆的面积。classfigure//定义一个公共基类{public:figure(doublea,doubleb) {x=a;y=b;} virtualvoidshow_area()//定义一个虚函数,作为界面接口 {cout<<"noareacomputationdefined"; cout<<"forthisclass.\n"; }protected: doublex,y;};classtriangle:publicfigure//定义三角形派生类{public:triangle(doublea,doubleb):figure(a,b){};voidshow_area()//虚函数重定义,用作求三角形的面积{cout<<"trianglewithheight"<<x;cout<<"andbase"<<y<<"hasanareaof"; cout<<x*y*0.5<<endl;}};classsquare:publicfigure//定义矩形派生类{public:square(doublea,doubleb):figure(a,b){};voidshow_area()//虚函数重定义,用作求矩形的面积{cout<<"squarewithdimension"<<x;cout<<"*"<<y<<"hasanareaof"; cout<<x*y<<endl;}};classcircle:publicfigure//定义圆派生类{public:circle(doublea):figure(a,a){};voidshow_area()//虚函数重定义,用作求圆的面积{cout<<"circlewithradius"<<x;cout<<"hasanareaof"; cout<<x*x*3.1416<<endl;}};main(){figure*p;//定义基类指针trianglet(10.0,6.0);//定义三角形类对象squares(10.0,6.0);//定义矩形类对象scirclec(10.0);//定义圆类对象cp=&t;p->show_area();//计算三角形面积p=&s;p->show_area();//计算矩形面积p=&c;p->show_area();//计算圆面积return0;}二十三、应用抽象类,求圆、圆外切正方形的面积和周长#include<iostream>usingnamespacestd;classShape{protected:doubler;public: Shape(doublex) {r=x;} virtualvoidarea()=0;//纯虚函数 virtualvoidperimeter()=0;//纯虚函数};classcircle:publicShape//派生圆类{public:circle(doublex):Shape(x) {}voidarea()//重定义虚函数area()在类circle中的版本{ cout<<"thecircle'sareais"; cout<<3.14*r*r<<endl; }voidperimeter()//重定义虚函数perimeter()在类circle中的版本 {cout<<"thecircle'sperimeteris"; cout<<2*3.14*r<<endl; }};classex_square:publicShape//圆外接正方形{public:ex_square(doublex):Shape(x) {} voidarea();//重定义虚函数area()在类ex_square中的版本 voidperimeter();//重定义虚函数perimeter()在类ex_square中的版本};voidex_square::area()//重定义虚函数area()在类ex_square中的版本{cout<<"theexternalsquare'sareais";//圆外接正方形面积cout<<4*r*r<<endl;}voidex_square::perimeter()//重定义虚函数perimeter()在类ex_square中的版本{cout<<"theexternalsquare'sperimeteris";//圆外接正方形周长cout<<8*r<<endl;}main(){Shape*ptr;//定义抽象类shape的指针ptrcircleob1(6);ex_squareob2(6);ptr=&ob1;//指针ptr指向圆类circle的对象ob1ptr->area();//求圆的面积ptr->perimeter();//求圆的周长ptr=&ob2;//指针ptr指向圆外接正方形类ex_square的对象ob2ptr->area();//求圆外接正方形的面积ptr->perimeter();//求圆外接正方形的周长return0;}二十四、精度控制#include<iostreamh>#include<iomanip>//操纵符声明的头文件usingnamespacestd;intmain(){doubleamount=220.0/7; cout<<amount<<endl; cout<<setprecision(0)<<amount<<endl <<setprecision(1)<<amount<<endl <<setprecision(2)<<amount<<endl <<setprecision(3)<<amount<<endl <<setprecision(4)<<amount<<endl; cout<<setiosflags(ios::fixed); cout<<setprecision(8)<<amount<<resetiosflags(ios::fixed)<<endl; cout<<setiosflags(ios::scientific) <<amount<<resetiosflags(ios::scientific)<<endl; cout<<setprecision(6);//重新设置成原默认设置}二十五、先建立一个输出文件,向它写入数据,然后关闭文件,再按输入模式打开它并读取信息。#include<fstream>usingnamespacestd;intmain(){ofstreamfout("test2.txt");//建立一个输出文件test2if(!fout){cout<<"cannotopenoutputfile.\n";return1;}fout<<"hello!\n";//向test2写入字符串hell!fout<<100<<''<<hex<<100<<endl;//再写入10064fout.close();//关闭test2ifstreamfin("test2.txt");//打开test2if(!fin){cout<<"cannotopeninputfile.\n";return1;}charstr[80];inti,j;fin>>str>>i>>j;//将字符串hello赋给字符数组str将100赋给i将64赋给jcout<<str<<""<<i<<""<<j<<endl;//输出字符数组str为hello!和i为100j为64fin.close();//用完关闭return0;}二十六、从文件读二进制记录#include<fstream>#include<string>usingnamespacestd;intmain(){struct{doublesalary;charname[23];}employee1,employee2; employee1.salary=8000; strcpy(,"LZheng"); ofstreamoutfile("payroll",ios::binary); outfile.write((char*)&employee1,sizeof(employee1));//该函数可以从buf所指的缓冲区把num个字节写到相应的流上 outfile.close();ifstreamis("payroll",ios::binary);if(is){is.read((char*)&employee2,sizeof(employee2));//read(缓冲区首址,读入的字节数),从相应的流中读取num个字节(字符),并把它们放入指针buf所指的缓冲区中cout<<<<''<<employee2.salary<<endl;}else{cout<<"ERROR:Cannotopenfile'payroll'."<<endl;} is.close();}二十七、将文件test中第5个字符修改成X#include<iostream.h>#include<fstream.h>#include<string.h>main(void){ofstreamout("test");if(!out){cout<<"Cannotopenoutputfile.\n";return1;}chari[]={'a','b','c','d','e','f','g','h','f','i','j','\0'};//doublenum=100.45;out.write((char*)&i,sizeof(i));//out.write((char*)&num,sizeof(double));cout<<"test文件是:"<<i<<endl;out.close();fstreamfs;fs.open("test",ios::in|ios::out);//以读写方式打开文件if(fs.fail()) cout<<"openfileerrer!";else{fs.seekp(4,ios::beg);//设置写指针,距离文件开头4个字节的位置fs.put('X'); charcontents[12]; fs.seekg(0,ios::beg);//设置读指针 fs.get(contents,12); cout<<contents;}cout<<endl;return0;}二十八、异常处理#include<iostream>usingnamespacestd;intDiv(intx,inty);intmain(){ try { cout<<"5/2="<<Div(5,2)<<endl; cout<<"8/0="<<Div(8,0)<<endl; cout<<"7/1="<<Div(7,1)<<endl; } catch(int) { cout<<"exceptofdevidingzero.\n"; } cout<<"thatisok.\n";}intDiv(intx,inty){ if(y==0) throwy; returnx/y;}二十九、有关指针的函数模板#include<iostream>usingnamespacestd;template<classAT>ATsum(AT*array,intsize=0){ATtotal=0;for(inti=0;i<size;i++) total+=array[i];returntotal;};intint_array[]={1,2,3,4,5,6,7,8,9,10};doubledouble_array[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10};voidmain(){intitotal=sum(int_array,10);//模板函数。其中sum(int_array,10)用模板实参int_array将类型参数AT进行了实例化doubledtotal=sum(double_array,10);//Sum(double_array,10)用模板实参double_array将AT进行了实例化。cout<<"thesummaryofintegerarrayare:"<<itotal<<endl;cout<<"thesummaryofdoublearrayare:"<<dtotal<<endl;}三十、用户定义的参数类型函数模板#include<iostream>usingnamespacestd;classnumber{public:number(intx1,inty1) {x=x1;y=y1;} intgetx() {returnx;} intgety() {returny;} intoperator>(number&c);private: intx,y;};intnumber::operator>(number&c){if(x+y>c.x+c.y)return1;return0;}template<classobj>obj&max(obj&o1,obj&o2){if(o1>o2)returno1;returno2;}voidmain(){inti1=5,i2=55;cout<<"较大的数:"<<max(i1,i2)<<endl;numberc1(25,11);numberc2(6,23);numberc3=max(c1,c2);cout<<"较大的和:"<<c3.getx()+c3.gety()<<endl;}三十一、建堆栈的类模板#include<iostream>usingnamespacestd;//以下建立一个用来实现堆栈的类模板constintsize=10;//堆栈长度template<classType>//声明一个类模板,Type是一个任意类型的参数,可以是用户定义的类,也可是int等classstack{public:voidinit() {tos=0;} voidpush(Typech);//参数取Type类型 Typepop();//返回类型取Type类型private: Typestck[size];//数组的类型为类型参数Type,即可取任意类型 inttos;};//以上建立一个用来实现堆栈的类模板//在类定义体外定义成员函数时,若此成员函数中有模板形参存在,则需要在函数体外进行模板声明,并且在函数名前的类名后缀上"<Type>"。例如:下面的成员函数push()和pop()在类定义体外定义为:template<classType>voidstack<Type>::push(Typeob){ if(tos==size) {cout<<"stackisfull\n";//堆栈满了 return;} stck[tos]=ob;//Type类型数据送入堆栈,tos是数组的下标号,最初是0 tos++;}template<classType>Typestack<Type>::pop(){ if(tos==0) {cout<<"stackisempty\n";//堆栈已经空了 return0; } tos--;//没空,弹出一个数据,堆栈里的数据个数减1(数组下标减1) returnstck[tos];}main(){//类模板不是代表一个具体的、实际的类,而是代表着一类类。实际上,类模板的使用就是将类模板实例化成一个具体的类,它的格式为:类名〈实际的类型〉s1,s2;如:定义字符堆栈stack<char>s1,s2;//创建2个模板参数为char型的对象inti;s1.init();s2.init();s1.push('a');s2.push('x');s1.push('b');s2.push('y');s1.push('c');s2.push('z');for(i=0;i<3;i++) cout<<"pops1:"<<s1.pop()<<endl;for(i=0;i<3;i++) cout<<"pops2:"<<s2.pop()<<endl;//定义整型堆栈stack<int>is1,is2;//创建2个模板参数为int型的对象is1.init();is2.init();is1.push(1);is2.push(2);is1.push(3);is2.push(4);is1.push(5);is2.push(6);for(i=0;i<3;i++) cout<<"popis1:"<<is1.pop()<<endl;for(i=0;i<3;i++) cout<<"popis2:"<<is2.pop()<<endl;return0;}三十二、求范围2--N中的质数,N在程序运行时由键盘输入。#include<iostream>#include<iomanip>#include<vector> //包含向量容器头文件usingnamespacestd;intmain(){vector<int>A(10); //用来存放质数的向量,初始状态有10个元素。intn; //质数范围的上限,运行时输入intprimecount=0,i,j;cout<<"Enteravalue>=2asupperlimitforprimenumbers:";cin>>n;A[primecount++]=2; //2是一个质数for(i=3;i<n;i++){if(primecount==A.size()) //如果质数表已满,则再申请10个元素的空间A.resize(primecount+10);if(i%2==0) //大于2的偶数不是质数,因此略过本次循环的后继部分continue;//检查3,5,7,...,i/2是否i的因子j=3;while(j<=i/

温馨提示

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

评论

0/150

提交评论