来源:www.cncfan.com | 2006-1-13 | (有2175人读过)
职员档案管理程序 是这一个简化了的雇员档案管理程序。其中把雇员的档案数据和对这些数据的设置、修改、删除等操作组成一个程序模块。程序通过这个模块----类的公有部分对档案数据进行处理,实现了面向对象程序设计的“封装”功能。 // program 6_2.cpp #include<iostream.h> #include<string.h> class employee{ char *name; // 雇员姓名 short age; // 年龄 float salary; // 工资 public: employee(); void set_name(char *); void set_age(short a){age=a;} void set_salary(float s){salary=s;} void print(); ~employee(){delete[]name;} }; employee::employee() { name=0; age=0; salary=0.0; } void employee::set_name(char *n) { name=new char[strlen(n)+1]; strcpy(name,n); } void employee::print() { cout<<"Name: "<<name; cout<<"Age: "<<age; cout<<"Salary: "<<salary<<endl; } void main() { char *na=0; short ag=0; float sa=0; na=new char[10]; employee emp[5]; for(int i=0;i<5;i++) { cin>>na; cin>>ag; cin>>sa; emp[i].set_name(na); emp[i].set_age(ag); emp[i].set_salary(sa); emp[i].print(); } emp[3].set_salary(5100.0); emp[3].print(); emp[1].~employee(); cin>>na; emp[1].set_name(na); emp[1].set_age(23); emp[1].set_salary(2000.0); emp[1].print(); }
说明: 这是一个简化的雇员档案管理程序,其中5~33行定义了一个employee类,它包含了一个雇员的档案数据,及对这些数据的若干处理函数。 构造函数employee,它在进行结象说明时被自动调用。这时创建的是一个雇员的空档案。 第39行说明的是一个对象数组,一次建立了五个雇员的空档案。 set_name(),set_age(),set_salary()三个函数可用来为雇员档案填 入姓名、年龄、工资。其中填 入姓名时要创建一个长度为该姓名字符串长度+1的字符数组,以便以字符串形式存放该雇员的姓名。 print()函数的功能是输出该雇员的档案内容。 析构函数~employee()的功能是当某雇员档案撤消或改成另一姓名时,把原占用的字符串空间释放掉。
--------------------------------------------------------------------
9.3 在平面上用直线和圆画图 编一个程序,以直线段、矩形和圆为基本图元组成一图形。 我们采用面向对象的编程方法,把直线line,矩形rectangle和圆circle设计为三个类,它们各有自己的数据和函数成员。用线、矩形和圆组合成图形,就是对这三个类的对象进行操作。 程序代码如下: // program 6_3.cpp #include<iostream.h> #include<process.h> #include<graph.h> #include<conio.h> class Line{ int startx,starty,endx,endy; public: Line(int sx,int sy,int ex,int ey) { startx=sx; starty=sy; endx=ex; endy=ey; } void draw(); }; class Rectangle { int uplx,uply,lowrx,lowry; public: Rectangle(int ulx,int uly,int lrx,int lry) { uplx=ulx; uply=uly; lowrx=lrx; lowry=lry; } void draw(); }; class Circle { int centx,int centy,radius; public: Circle(int cx,int cy,int r) { centx=cx; centy=cy; radius=r; } void draw(); }; void Line::draw() { _moveto(startx,starty); _lineto(endx,endy); } // 画一条直线 void Rectangle::draw() { _rectangle(_GBORDER,uolx,uply,lowrx,lowry); } // 画一个空心矩形 void Circle::draw() { _ellipse(_GBORDER,centx-radius,centy-radius,centx+radius,centy+radius); } // 画一个圆 void main() { short centx,centy; cin>>centx>>centy; Rectangle fram1(centx-60,centy-60,centx+60,centy+60), fram2(centx-62,centy-62,centx+62,centy+62); Circle disk(centx,centy,55); Line poin1(centx,centy,centx+25,centy+25), poin2(centx,centy,centx+12,centy+40), bar1(centx,centy+50,centx,centy+42), bar2(centx,centy-42,centx,centy-50), bar3(centx-50,centy,centx-42,centy), bar4(centx+42,centy,centx+50,centy); if(!_setvideomode(_MAXRESMODE)) exit(1); fam1.draw(); fram2.draw(); disk.draw(); bar1.draw(); bar2.draw(); bar3.draw(); bar4.draw(); poin1.draw(); poin2.draw(); getch(); _setvideomode(_DEFAULTMODE); } 程序说明: 1) 这是一个利用基本图形对象直线段、矩形和圆来组成一个简单的表形的程序。从这个程序的设计过程(虽然它比实际程序简化了许多)可以了解面向对象程序设计的基本方式和特征。在55~79行的main函数中首先根据需要说明若干个图元对象:两个矩形,一个圆,六个直线段,它们正是组成显示的图形的各基本图元。最后分别调用各自的draw函数,完成了显示任务。 2) 程序中采用了在图形模式下进行屏幕显示的操作方式。系统的屏幕显示可有两种基本模式:文本模式:这是系统平时工作的模式。 图形模式:当程序需要输出图形时,应把系统设为图形模式。 用setvideomode()函数把系统由文本模式转为图形模式。 在各个类的draw()函数中,利用图形库函数完成基本图元的生成显示。 在6~16和41~44行,定义了一个Line类,它由四个私有成员和两个公有成员的函数成员组成,这完全是为了简化程序。例如,还可以为该直线段设置颜色。查阅坐标。修改数据等等操作。 在18~28行和46~48行,定义了Rectangle类。 在30~39行和50~51行,定义了Circle类。 三种类的定义,只是说明了类。在58~66行的对象说明中才有了类的具体内容,同时按照 给出的不同参数,决定了这些实际的图元的位置和尺寸。对于Line,Rectangle,Circle这三个类,用户可以对其进行的操作只有两种: 1) 通过构造函数 创建具有指定参数的对象; 2) 调用公有成员函数,显示这一图元。 从这里可以感受到类和对象对于其数据封装的含义。 从这个例子中,我们指出了把程序以类的形式组织起来的方法才优越性,但也应从中发现一些问题和不足的地方。例如: 三个类是互不相关的,但仔细观察会发现类Line和类Rectangle之间本来是有内在联系的,一个矩形实际上是由两条横线和两条纵线组成的,类Rectangle的对象的创建是否可以借助于类Line的几个对象的创建来实现呢? 另外三个类中都包含了象draw()这样的公有函数,也许可以具有象着色color()等等这样的共同的函数成员。 如何在程序设计中表现不同的类之间的层次关篛,相互间的相关性,这要用到其它的一些知识,如派生类、虚函数等概念和手段,使程序的组织更加合理和严密。
|