第一篇:c++作业
P179 5.9.2(11)
1.意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.动机
对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机(printer spooler),只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A / D转换器。一个会计系统只能专用于一个公司。
我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。
3.适用性
在下面的情况下可以使用Singleton模式.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
4.结构
5.参与者
Singleton
定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个类操作(即Smalltalk中的一个类方法和C++中的一个静态成员函数)。可能负责创建它自己的唯一实例。
6.协作
客户只能通过Singleton的GetInstance操作访问一个Singleton的实例。
7.效果
Singleton模式有许多优点:
1)对唯一实例的受控访问因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
2)缩小名空间Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
3)允许对操作和表示的精化Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4)允许可变数目的实例这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。
5)比类操作更灵活另一种封装单件功能的方式是使用类操作(即C++中的静态成员函数或者是Smalltalk中的类方法)。但这两种语言技术都难以改变设计以允许一个类有多个实例。
此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。
8.实现
class Singleton
{
static std::auto_ptr
protected:
//prevent user making our any instance by manually
//构造函数是保护类型的。
Singleton(){}
public:
~Singleton(){}
//Return this singleton class' instance pointer
static Singleton* Instance()
{
if(!m_pInstance.get())
{
m_pInstance = std::auto_ptr
}
return m_pInstance.get();
}
};
怎样来使用它呢?不要试图从这个类派生你的单件子类,那样的结果是不妥当的,如果你需要多个单件子类,还是使用下面的宏定义更为妥当:
#define DEFINE_SINGLETON(cls)
private:
static std::auto_ptr
protected:
cls(){}
public:
~cls(){}
static cls* Instance(){
if(!m_pInstance.get()){
m_pInstance = std::auto_ptr
}
return m_pInstance.get();
}
#define IMPLEMENT_SINGLETON(cls)
std::auto_ptr
假定你需要实现一个单件类YY,这样书写:
class YY
{
DEFINE_SINGLETON(YY);
public:
//your interfaces here...};
在cpp文件中,书写:
IMPLEMENT_SINGLETON(YY);
需要引入这个类的实例的时候,使用这样的语句:
YY* pYY = YY::Instance();
这,就是全部。
如果需要定义其他的单件类,重复上面的定义,就可以了。
当想集中管理一个应用程序所需的所有配置时,可以声明一个CToolsOptions的类,其中包含配置属性集合。对于这个类的实例,显然是一个实例就够了;当编写绘图程序时,考虑绘制矩形,圆形等分别使用CGraphTool派生的工具类,每个派生类负责处理具体的绘制动作和相关的UI相应逻辑。这些工具类典型的在被用户选择工具栏的图元按钮时被选中。依照这种模式,你应该对所有的图元工具从事注册工作,使得绘图程序了解运行时刻可以使用那些图元工具。同样的,负责管理注册信息的这个管理器也只需
P2467.6.2(1)
必须把它作为类成员函数的运算符有:
(),[],->和任何赋值运算符,重载这些运算符时必须把操作符函数声明为类的成员函数
什么时候定义类成员操作符重载,什么时候定义非类成员操作符重载?
答:(1)如果一个重载操作符是类成员,那么只有当跟它一起使用的左操作数是该类对象时,它才会被调用,如果该操作符的左操作数必须是其他类型,那么重载操作符必须是非类成员操作符重载。
(2)C++要求,赋值(=),下标([ ]),调用(())和成员访问箭头(->)操作符必须被指定为类成员操作符,否则错误。
第二篇:C++数据结构 大作业课程设计
C++/数据结构 大作业/课程设计——【校园导游咨询】【停车场管理】娃娃们可以收着以后用 绝对纯手工打造 内含类模块/一维指针数组(谨以此程序供大家参考。运行结果后面有贴图)
目录
【1】校园导游咨询 程序设计源代码 及 截图 【2】停车场管理——方案一 程序设计源代码 及 截图 【3】停车场管理——方案二 程序设计源代码 及 截图
【1】【【校园导游咨询】】
######
(ps:该校园导游咨询系统没有输入值,所有信息是都在class MGraph的构造函数中传输的,且校园景点信息皆为【【上海电力学院】】景点信息。请大家注意,直接从文章copy到visual stutio中会出现中文字符,注意删除,推荐大家在一行语句的分号后面,点出光标,按一下delete键,然后按一下enter键,完成visual stutio的自动对齐,这样程序看起来一目了然,更易于操作和更改)【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。【基本要求】
(1)设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。【选作内容】
(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。**************************【以下为类的定义】******************************** #include
class direction;template
{ friend class MGraph
direction dir;//存放顶点方位信息的direction类的dir。};
class direction { public: int ln;//存放在方向图中的横坐标,表示东西 int col;//存放在方向图中的纵坐标,表示南北 };template
{ public: MGraph();
//构造函数,初始化具有n个顶点的图
void printvexname();//显示所有景点及景点代号
void printvexinf(int i);//显示代号为i景点的名称及信息
void printroad(int i,int j);//显示景点i~j的最短路径方案信息
void printdir(int i,int j);//显示景点i到j的方向信息,如“向东100m,向南200m” VertexNode
void Root(int p,int q);//递归寻找pq间的最短路径
int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//创建Path和Dist分别存放两点间最短路径的前驱节点,两点间最短路径长度
int Line[MaxSize];//Line存放路径 int kkk;//Line[]数组的标记
private: T vertex[MaxSize];//存放图中顶点的数组
int arc[MaxSize][MaxSize];//存放图中边的数组 };*************************【以下为类的实现 即类函数的定义】*********************************** template
//s[]为存放景点邻接矩阵信息的一维数组,根据其对称性可以用公式赋值给二维数组arc[][] { int s[]={0, 1,0, 0,2,0, 0,0,2,0, 0,0,2,3,0, 0,0,0,4,2,0, 0,0,0,0,2,3,0, 0,0,0,0,2,3,1,0, 0,0,2,0,2,0,0,2,0, 4,0,2,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,2,0, 1,0,0,0,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,3,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,2,0};int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};char* b[]={“南门”,“实验楼”,“南图”,“大活”,“睿思楼”,“大礼堂”, “南4教”,“知行楼”,“国交楼”,“南3教”,“南2教”,“南1教”, “北图”,“北3教”,“北4教”,“北2教”,“北1教”,“北门”};char* c[]={“南校区正门”,“物理实验楼”,“南校区图书馆”,“大学生活动中心”, “教师办公楼、医务室及留学生公寓”,“大礼堂,用于举办各种文艺演出”,“南校区第4教学楼”,“实习基地,计算机房等”, “国际交流中心,教职工餐厅”,“南校区第3教学楼”,“南校区第2教学楼”,“南校区第1教学楼”, “北校区图书馆”,“北校区第3教学楼”,“北校区第4教学楼”,“北校区第2教学楼”, “北校区第1教学楼”,“北校区正门”};int d[]={8,6,4,4,1,0,0,1,3,4,6,8,4,3,2,3,5,8};int e[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2};int i,j;vertexNum=18;arcNum=30;
for(i=0;i for(j=0;j template cout<<“向东”< cout<<“向南”< if(Path[p][q]>0){ Root(p,Path[p][q]);Root(Path[p][q],q);} else { Line[kkk]=q;kkk++;} } template for(q=0;q Dist[p][q]=Dist[p][k]+Dist[k][q];Path[p][q]=k;} cout<<“n=======n”;cout<<“从”< { int choice;cout<<“================”< 【2】【停车场管理系统【方案一 程序】】 ###### (ps:该程序有漏洞,若将要离开的车辆是停于便道上的,则对该车进行驶离操作时程序内部有错误数据,虽然做了函数完成这一功能,但因时间有限,没能及时查找更正,现在懒得改了。。大家将就看吧。不过运行是可以的)【问题描述】 设停车场是一个可停放n辆汽车的 长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。【测试数据】 设n=2,输入数据为:(A,1,5),(A,2,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。**************************【以下为类的定义】************************************* #include const double price=30;//每小时的费用 //思想:(报告第四页) //我的系统界面,输入信息为:(到达/离开/退出);车牌号;时刻 //因此,我的停车场类分成车辆到达和车辆离开两个主要的函数实现。//车辆到达,有入栈和入队。车辆离开有出栈,出队和入栈操作。 //因此我又编写入栈的类,队的类。与parkingmanagement进行友元。 //**************************************类定义*********************************************** class car//车的信息类 { public: double time;//计费时间 int number;//车牌号 car *next;//存放car类型元素的数组初始地址 };class carstack//栈(停车场)的类 { friend class parkingmanagement;//parkingmanagement能访问carstack类中所有成员 public: carstack();//构造函数,栈的初始化 int empty();//判断栈是否为空 int full();//判断栈是否为满 car *s;//存放car类型栈元素的数组初始地址 int top;//栈顶指针 };class carqueue//队列(便道)的类 { friend class parkingmanagement;//parkingmanagement能访问carstack类中所有成员 public: carqueue();//构造函数,队列的初始化 int full();//判断队列是否为满 car *front,*rear;//存放car类型队列元素的数组初始地址 };class parkingmanagement { public: int pushstack(carstack &cs,int cnum,double ctime);//入栈,cs栈内进行调整,返回栈内位置 void popstack(carstack &cs,int cnum);//出栈,cs栈内进行调整,//根据车牌号把车弹出栈,将出栈car的number赋值给int popstacknumber()//将出栈car的time赋值给double popstacktime(),无返回值! int pushqueue(carqueue &cq,int cnum,double ctime);//入队,队内进行调整,返回队内位置 int popqueue(carqueue &cq);//出队,队内进行调整,返回汽车车牌号 void arrival(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆到达,//根据输入的车牌号、到达时间,变更函数参数;并cout车位信息 void leave(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆离开,//根据输入的车牌号找到汽车,并进行出栈操作、出队操作和入栈操作; //并cout停留时间和收费情况 void deletequeue(carqueue &cq,int i);//删除cq过道中第i辆车 int popstacknumber;//专门存放出栈的时候返回的车牌号 double popstacktime;//专门存放出栈的时候返回的时刻 };**********************************【以下为类的实现】************************************ carstack::carstack()//构造函数,栈的初始化 { top=-1;s=new car[Max];//创建car类型栈元素的数组 if(s==NULL){ cout<<“栈空间分配不成功!”< cs.top++;(cs.s[cs.top]).number=cnum;//将cnum赋给栈顶位置的车的车牌号,s是car类型栈元素的数组(cs.s[cs.top]).time=ctime;//将ctime赋给栈顶位置的车的入栈时间,s是car类型栈元素的数组 return(cs.top+1);//返回栈内位置加1,即停车场内车位从1号开始 } } void parkingmanagement::popstack(carstack &cs,int cnum)//出栈,cs栈内进行调整,//根据车牌号把车弹出栈,将出栈car的number赋值给int popstacknumber //将出栈car的time赋值给double popstacktime,无返回值!{ int i;car p;carstack stemp;//定义一个carstack类型的临时存放出栈元素的栈 for(i=0;i<=cs.top;i++)if((cs.s[i]).number==cnum)break;//当要出栈的车的车牌号=栈内的车牌号元素时,跳出循环 p=cs.s[i];//将要出栈的元素赋给car类型的p存放 while(cs.top>i)stemp.s[++(stemp.top)]=cs.s[(cs.top)--];//出栈的元素数组逐个赋给临时栈 popstacknumber=p.number;//将这个车牌号信息传给int popstacknumber()popstacktime=p.time;//将该车的时间信息传给double popstacktime()cs.top--;//栈顶指针回到原来位置 while(stemp.top>=0)cs.s[++(cs.top)]=stemp.s[(stemp.top)--];//临时栈出栈的元素逐个赋给原栈,完成先退再进的工作 } int parkingmanagement::pushqueue(carqueue &cq,int cnum,double ctime)//入队,队内进行调整,返回队内位置 { car *p,*countp;int count(1);//count用于记录车在过道上的位置信息,因队列为链式的,所以进行循环累加 p=new car;//创建一个car类型的指针 p->number=cnum;p->time=ctime;p->next=NULL;//首先将指向存放car类型元素的数组初始地址置空 if(cq.front==NULL)//第一次入队要判断头结点是否为空 { cq.front=cq.rear=p;} else {//尾插法插入元素 p->next=(cq.rear)->next;(cq.rear)->next=p;cq.rear=(cq.rear)->next;} countp=(cq.front)->next;while(countp!=NULL){ count++;countp=countp->next;}//count即车在过道上的位置,【从1开始计!!】 return count;} int parkingmanagement::popqueue(carqueue &cq)//出队,队内进行调整,返回汽车车牌号 { car p;p.number=((cq.front)->next)->number;//cq队里,从cq.front开始指向下一个元素的车牌号赋给car类型的车信息 p.time=((cq.front)->next)->time;//cq队里,从cq.front开始指向下一个元素的时刻 //赋给car类型的车信息 p.next=((cq.front)->next)->next;//cq队里,从cq.front开始指向下一个元素的指针 //赋给car类型的车信息的下一个元素的指针 return p.number;cq.front=(cq.front)->next;} void parkingmanagement::arrival(carstack &cs,carqueue &cq,int cnum,double ctime)//车辆到达,根据输入的车牌号、到达时间,变更函数参数;并cout车位信息 { int pos;if(!(cs.full()))//如果栈未满,车辆停入停车场 { int fl(0),i;//定义一个从0开始的标记fl for(i=0;i<=cs.top;i++){ if(cs.s[i].number==cnum)//如果到达的车的车牌号=栈内已有车辆的车牌号 { fl=1;//fl记1 break;} } if(fl==1)//如果到达的车的车牌号!=栈内已有车辆的车牌号 cout<<“输入错误!请重新输入!”< cout<<“该停车场还有空位,请到”< { pos=pushqueue(cq,cnum,ctime);//入队,返回车位信息 cout<<“该停车场已满,请将车停到便道”< { popstack(cs,cnum);//出栈操作 hour=ctime-popstacktime;//时间计算 outcarnum=popqueue(cq);//将便道上的第一辆车出队,入栈。并将其车牌号赋给outcarnum pstack=pushstack(cs,outcarnum,ctime);//将便道上的第一辆车,入栈 cout<<“该车在本停车场内停留时间为”< { p=cq.front;while(p!=NULL){ count++;//如果在过道中找到该车,则该车的位置为过道中的第count位置(count从1开始)p=p->next;if(p->number==cnum)//在过道中找到要出去的车,则在队列中删除该car。//后面的车辆依然顺序排列,补足空位 { deletequeue(cq,count);if(count>Max){ cout<<“您的车在便道上的位置为”< car *p,*q;int j(0);p=cq.front;while(p && j ######【3】【停车场管理系统【方案二 程序】】 (ps:本方案与方案一有同样的问题,就是在对 便道上的车 进行驶离操作时,数据错误,同样的理由,没有改正。如果有细心娃娃帮忙指点改正,在此感激啦~) *************************【以下为类定义】************************************ #include struct Node//过道停车的队列所需链式结点 { T carnum;//定义车牌号类型 Node friend class carStack;public: T carnum;//车号 int cartime;//停车时间 }; template int EnQueue(T cnum);//将元素x入队,并返回其在队内的位置(从1开始)T DeQueue();//将队头链式结点出队,并返回汽车车牌号 void deletequeue(int i);//将队内低i个元素删除,即便道上i位置的汽车驶离 bool Empty();//判断链队列是否为空 Node int Popcar(T outcnum,int outctime);//将第cnum辆车出栈,并返回其停车时间(hour)bool full();//判断栈是否为满?满则返回1 carinfo s=new Node front=rear=s;} else { rear->next=s;//将结点s插入到队尾 rear=s;} p=front;while(p!=NULL){ i++;p=p->next;}//i即车在过道上的位置,【从1开始计!!】 return i;} template front=front->next;//将队头元素所在结点摘链 } return p->carnum;delete p;//将出队进栈的车从队列里删除 } template template :top(-1){//建立一个最大尺寸为size的空栈 S=new carinfo { cerr<<“动态存储失败!”< template template void outputpark()//系统功能选择页面,输入泊车信息 { cout<<“========================”< { cs.Pushcar(carnum,cartime);cout<<“请驶入停车场的”< Node #include const N=5000;// 定义系统可录入的职工最大数值 string Ename[N];long Enum[N];char Esex[N];int Eage[N]; char Emarriage[N];int Edepart[N];int Eposition[N];int Edegree[N];int Eworktime[N];float Epay[N]; class Employee { public: string Employeename; long Employeenum; char Employeesex; int Employeeage; char Employeemarriage; int Employeedepart; int Employeeposition; int Employeedegree; int Employeeworktime; float Employeepay; static long EmployeeMaxNum; static float EmployeeBasePay; void NewInfo(); void ShowInfo(); void showall(); void showdepart(int depart); void showdegree(int degree); void showage(int min,int max); void shownum(long number); void RefreshInfo(); void DeleteInfo(); float Pay(int Employeegrade); static int MaxNum();}; class DBOperate { public: string Employeename; long Employeenum; char Employeesex; int Employeeage; char Employeemarriage; int Employeedepart; int Employeeposition; int Employeedegree; int Employeeworktime; float Employeepay; static long EmployeeMaxNum; static float EmployeeBasePay; void WriteIn(int iflag); void ReadOut(); void RefreshMaxNum(int iflag);//iflg=1 or-1 or 0 }; long Employee::EmployeeMaxNum = 1000;float Employee::EmployeeBasePay = 1500; int Employee::MaxNum()//返回系统已经存储的人数 { int MN = 0; ifstream myf; myf.open(“EmployeeMaxNum.txt”); myf>>MN; cout< myf.close(); return MN;} void Employee::NewInfo()//添加新职工函数 { cout<<“新职工姓名: ”; cin>>Employee::Employeename; Employee::Employeenum = EmployeeMaxNum + Employee::MaxNum()+1; cout<<“新职工性别(F为女性,M为男性): ”; cin>>Employee::Employeesex; cout<<“新职工年龄: ”; cin>>Employee::Employeeage; cout<<“新职工婚姻状况(Y为已婚,N为未婚): ”; cin>>Employee::Employeemarriage; cout<<“新职工学历,请输入相应学历的序号: ”< cout<<“ [1:小学 2:初中 3:高中 4:本科 5:硕士 6:博士] ”; cin>>Employee::Employeedegree; while(Employee::Employeedegree!=1&&Employee::Employeedegree!=2&&Employee::Employeedegree!=3&&Employee::Employeedegree!=4&&Employee::Employeedegree!=5&&Employee::Employeedegree!=6) { cout<<“输入有误,请重新输入:”< cout<<“ [1:小学 2:初中 3:高中 4:本科 5:硕士 6:博士] ”; cin>>Employee::Employeedegree; } cout<<“新职工所在部门,请输入相应部门的序号:”< cout<<“ [1:董事会 2:销售部 3:人事部 4:客服中心 5:财务部 6:技术研发部 7:安全监察部] ”; cin>>Employee::Employeedepart; while(Employee::Employeedepart!=1&&Employee::Employeedepart!=2&&Employee::Employeedepart!=3&&Employee::Employeedepart!=4&&Employee::Employeedepart!=5&&Employee::Employeedepart!=6&&Employee::Employeedepart!=7) { cout<<“输入有误,请重新输入:”< cout<<“ [1:董事会 2:销售部 3:人事部 4:客服中心 5:财务部 6:技术研发部 7:安全监察部] ”; cin>>Employee::Employeedepart; } cout<<“新职工职位, 请输入相应职位的序号: ”< cout<<“ [1:临时职工 2: 正式职工 3:部门经理 4:主任 5:董事长] ”; cin>>Employee::Employeeposition; while(Employee::Employeeposition!=1&&Employee::Employeeposition!=2&&Employee::Employeeposition!=3&&Employee::Employeeposition!=4&&Employee::Employeeposition!=5) { cout<<“输入有误,请重新输入:”< cout<<“ [1:临时职员 2: 正式职员 3:部门经理 4:主任 5:董事长] ”; cin>>Employee::Employeeposition; } cout<<“新职工的工作时长(不需要输入单位): ”; cin>>Employee::Employeeworktime; Employee::Employeepay = Employee::Pay(Employee::Employeeposition); DBOperate dbo; dbo.ReadOut(); int MaxNum = Employee::MaxNum(); Enum[MaxNum] = Employee::Employeenum; Ename[MaxNum] = Employee::Employeename; Esex[MaxNum] = Employee::Employeesex; Eage[MaxNum] = Employee::Employeeage; Emarriage[MaxNum] = Employee::Employeemarriage; Edegree[MaxNum] = Employee::Employeedegree; Edepart[MaxNum] = Employee::Employeedepart; Eposition[MaxNum] = Employee::Employeeposition; Eworktime[MaxNum] = Employee::Employeeworktime; Epay[MaxNum] = Employee::Employeepay; dbo.WriteIn(1); cout<<“ 添加新成员成功!”< void Employee::ShowInfo()//程序主体 数据输出函数 { int choice1,choice2,min,max; long searchnum; Employee e; cout<<“*******************************************”< cout<<“-----------1.输出全体职工信息--------------”< cout<<“-----------2.按职工部门输出----------------”< cout<<“-----------3.按职工学历输出----------------”< cout<<“-----------4.按职工年龄输出----------------”< cout<<“-----------5.按职工编号输出----------------”< cout<<“*******************************************”< cout<<“ 请选择查询方式:”; cin>>choice1; switch(choice1) { case 1: showall();break; case 2: cout<<“请输入要查询职工的部门编号[1:董事会 2:销售部 3:人事部 4:客服中心 5:财务部 6:技术研发部 7:安全监察部] ”; cin>>choice2; e.showdepart(choice2);break; case 3: cout<<“请输入要查询职工的学历编号: [1:小学 2:初中 3:高中 4:本科 5:硕士 6:博士] ”; cin>>choice2; e.showdegree(choice2);break; case 4: cout<<“请输入要查询的年龄范围: ”; cout<<“最小值: ”; cin>>min; cout<<“最大值: ”; cin>>max; e.showage(min,max);break; case 5: cout<<“请输入要查询的职工编号: ”; cin>>searchnum; e.shownum(searchnum);break; default: cout<<“出错啦!”< } } void Employee::showall()//全体职工输出函数 { int i; long number; for(i=0;i { number = Enum[i]; shownum(number); } } void Employee::showdepart(int depart)//按职工所在部门输出函数 { int i; switch(depart) { case 1: cout<<“董事会的成员有: ”< case 2: cout<<“销售部的成员有: ”< case 3: cout<<“人事部的成员有: ”< case 4: cout<<“客服中心的成员有: ”< case 5: cout<<“财务部的成员有: ”< case 6: cout<<“技术研发部的成员有: ”< case 7: cout<<“安全监察部的成员有: ”< default: cout<<“输入错误!>”< } for(i=0;i { if(Edepart[i] == depart) { long number = Enum[i]; shownum(number); } else continue; } } void Employee::showdegree(int degree)//按职工学历输出函数 { int i; switch(degree) { case 1:cout<<“初中学历的员工有:”< case 2:cout<<“初中学历的员工有:”< case 3:cout<<“高中学历的员工有:”< case 4:cout<<“本科学历的员工有:”< case 5:cout<<“硕士学位的员工有:”< case 6:cout<<“博士学位的员工有:”< } for(i=0;i { if(Edegree[i] == degree) { long number = Enum[i]; shownum(number); } else continue; } } void Employee::showage(int min,int max)//按职工年龄段输出函数 { int i; for(i=0;i { if(Eage[i]>=min&&Eage[i]<=max) { long number = Enum[i]; shownum(number); } else continue; } } void Employee::shownum(long number)//按职工编号输出函数 { int i; for(i=0;i { if(Enum[i] == number) { cout<<“**********************************”< cout<<“职工编号:”< cout<<“姓 名:”< cout<<“性 别:”; if(Esex[i]=='F')cout<<“女 ”< else if(Esex[i]=='M')cout<<“男 ”< cout<<“年 龄:”< cout<<“婚姻情况:”; if(Emarriage[i]=='Y')cout<<“已婚 ”< else if(Emarriage[i]=='N')cout<<“未婚 ”< cout<<“学 历:”; switch(Edegree[i]) { case 1:cout<<“小 学 ”< case 2:cout<<“初 中 ”< case 3:cout<<“高 中 ”< case 4:cout<<“本 科 ”< case 5:cout<<“硕 士 ”< case 6:cout<<“博 士 ”< } cout<<“所在部门:”; switch(Edepart[i]) { case 1:cout<<“董事会 ”< case 2:cout<<“销售部 ”< case 3:cout<<“人事部 ”< case 4:cout<<“客服中心 ”< case 5:cout<<“财务部 ”< case 6:cout<<“技术研发部 ”< case 7:cout<<“安全监察部 ”< } cout<<“所任职务:”; switch(Eposition[i]) { case 1:cout<<“临时成员 ”< case 2:cout<<“正式员工 ”< case 3:cout<<“部门经理 ”< case 4:cout<<“主任 ”< case 5:cout<<“董事长 ”< } cout<<“工作时长:”< cout<<“工资:”< cout<<“**********************************”< } else continue; } } void Employee::RefreshInfo()//修改职工信息的函数 { int cNum = 1000; DBOperate dbo; dbo.ReadOut(); void Employee::shownum(long number); cout<<“请输入您要修改的职工编号:”; cin>>cNum; int MN; MN = Employee::MaxNum(); for(int i=0;i { if(Enum[i] == cNum) { Employee::shownum(cNum); cout<<“请输入该职工的新信息: ”< cout<<“职工姓名: ”;//录入职工的新的数据,职工编号保持不变 cin>>Employee::Employeename; Ename[i] = Employee::Employeename; cout<<“职工性别(F为女性,M为男性): ”; cin>>Employee::Employeesex; Esex[i] = Employee::Employeesex; cout<<“职工年龄: ”; cin>>Employee::Employeeage; Eage[i] = Employee::Employeeage; cout<<“职工婚姻状况(Y为已婚,N为未婚): ”; cin>>Employee::Employeemarriage; Emarriage[i] = Employee::Employeemarriage; cout<<“职工学历,请输入相应学历的序号:”< cout<<“ [1:小学 2:初中 3:高中 4:本科 5:硕士 6:博士] ”; cin>>Employee::Employeedegree; while(Employee::Employeedegree!=1&&Employee::Employeedegree!=2&&Employee::Employeedegree!=3&&Employee::Employeedegree!=4&&Employee::Employeedegree!=5&&Employee::Employeedegree!=6) { cout<<“输入有误,请重新输入:”< cout<<“ [1:小学 2:初中 3:高中 4:本科 5:硕士 6:博士] ”; cin>>Employee::Employeedegree; } Edegree[i] = Employee::Employeedegree; cout<<“职工所在部门,请输入相应部门的序号: ”< cout<<“ [1:董事会 2:销售部 3:人事部 4:客服中心 5:财务部 6:技术研发部 7:安全监察部] ”; cin>>Employee::Employeedepart; while(Employee::Employeedepart!=1&&Employee::Employeedepart!=2&&Employee::Employeedepart!=3&&Employee::Employeedepart!=4&&Employee::Employeedepart!=5&&Employee::Employeedepart!=6&&Employee::Employeedepart!=7) { cout<<“输入有误,请重新输入:”< cout<<“ [1:董事会 2:销售部 3:人事部 4:客服中心 5:财务部 6:技术研发部 7:安全监察部] ”; cin>>Employee::Employeedepart; } Edepart[i] = Employee::Employeedepart; cout<<“职工职位,请输入相应职位的序号:”< cout<<“ [1:临时职员 2: 正式职员 3:部门经理 4:主任 5:董事长] ”; cin>>Employee::Employeeposition; while(Employee::Employeeposition!=1&&Employee::Employeeposition!=2&&Employee::Employeeposition!=3&&Employee::Employeeposition!=4&&Employee::Employeeposition!=5) { cout<<“输入有误,请重新输入:”< cout<<“ [1:临时职员 2: 正式职员 3:部门经理 4:主任 5:董事长] ”; cin>>Employee::Employeeposition; } Eposition[i] = Employee::Employeeposition; cout<<“员工的工作时(不需要输入单位): ”; cin>>Employee::Employeeworktime; Eworktime[i] = Employee::Employeeworktime; Epay[i] = Employee::Pay(Employee::Employeeposition); break; } } dbo.WriteIn(0);} void Employee::DeleteInfo()//删除职工数据的函数 { char tmp; int cNum = 1000; DBOperate dbo; dbo.ReadOut(); void Employee::shownum(long number); cout<<“请输入您要删除的职工编号>: ”; cin>>cNum; int MN; MN = Employee::MaxNum(); for(int i=0;i { if(Enum[i] == cNum) Employee::shownum(cNum); } cout<<“确认要删除该职工信息?(Y为确认,N为放弃): ”; cin>>tmp; if(tmp=='Y') { if(i==MN-1) dbo.WriteIn(-1); else { for(int j=i;j { Enum[j] = Enum[j+1];} dbo.WriteIn(-1); } cout<<“ 删除操作成功!”< } } float Employee::Pay(int Employeeposition)//根据职工职位计算工资的函数 { float tmpPay; tmpPay = Employee::EmployeeBasePay + Employee::Employeeposition Employee::EmployeeBasePay; * return tmpPay;} void DBOperate::WriteIn(int iflag)//数据操作函数—写入 { DBOperate::RefreshMaxNum(iflag); ofstream myf(“Employee.txt”); Employee e; int MN; MN = e.MaxNum(); for(int i=0;i { myf< } myf.close(); return;} void DBOperate::ReadOut()//数据操作函数—读出 { ifstream myf(“Employee.txt”); Employee e; int MN; MN = e.MaxNum(); for(int i=0;i { myf>>DBOperate::Employeenum>>DBOperate::Employeename>>DBOperate::Employeesex>>DBOperate::Employeeage>>DBOperate::Employeemarriage >>DBOperate::Employeedegree>>DBOperate::Employeedepart>>DBOperate::Employeeposition>>DBOperate::Employeeworktime>>DBOperate::Employeepay; Enum[i] = DBOperate::Employeenum; Ename[i] = DBOperate::Employeename; Esex[i] = DBOperate::Employeesex; Eage[i] = DBOperate::Employeeage; Emarriage[i] = DBOperate::Employeemarriage; Edegree[i] = DBOperate::Employeedegree; Edepart[i] = DBOperate::Employeedepart; Eposition[i] = DBOperate::Employeeposition; Eworktime[i] = DBOperate::Employeeworktime; Epay[i] = DBOperate::Employeepay; } myf.close();} void DBOperate::RefreshMaxNum(int iflag)//更新系统中员工计数文件的函数 { int MaxNum = 0; ifstream myif(“EmployeeMaxNum.txt”); myif>>MaxNum; myif.close(); MaxNum = MaxNum+iflag; ofstream myof(“EmployeeMaxNum.txt”); myof< myof.close();} int main()//主函数 { system(“color B0”);//设置当前窗口的背景色和前景色 // 0 = 黑色 = 灰色 // 1 = 蓝色 = 淡蓝色 // 2 = 绿色 A = 淡绿色 // 3 = 浅绿色 B = 淡浅绿色 // 4 = 红色 C = 淡红色 // 5 = 紫色 D = 淡紫色 // 6 = 黄色 E = 淡黄色 // 7 = 白色 F = 亮白色 int select = 0; while(select!=5) { cout<<“ ╭————————————————————————————╮”< cout<<“ ∣ 《主菜单》 ∣”< cout<<“ ├————————————————————————————┤”< cout<<“ ∣ 1.新建并录入职工信息 ∣”< cout<<“ ∣ 2.按条件输出职工信息 ∣”< cout<<“ ∣ 3.修改指定职工的信息 ∣”< cout<<“ ∣ 4.删除职工信息 ∣”< cout<<“ ∣ 5.退出系统 ∣”< cout<<“ ╰————————————————————————————╯”< cout<<“ ——————————————————————————————”< cout<<“ 请选择您需要功能的代号: ”; cin>>select; Employee e; DBOperate dbo; switch(select) { case 1: e.NewInfo();break; case 2: dbo.ReadOut(); e.ShowInfo();break; case 3: e.RefreshInfo();break; case 4: e.DeleteInfo();break; case 5: cout<<“ 退出成功”< default: cout<<“命令错误!”< } if(select == 5) break; } exit(1); return 0;} 程序设计所涉及二叉树解释 任意一棵树或一个森林都能唯一地对应一棵二叉树,由此而编写本程序。本程序采用类二叉树为整体结构,二叉树类下定义节点类,每一条支路均为树的一个节点,支路所有的参数均作为节点的属性,并给节点加入属性“支路编号”,并以支路编号为依据构建二叉树,这就要求提前根据二叉树结构给每一个支路编号。 支路编号原则:左子树上所有编号均小于其双亲的编号,右子树上所有编号均大于其双亲的编号,为了便于查看,本程序在节点较少时编号从1开始,逐个递加至支路数;当支路较多时,可不必拘泥于逐个递加,只要满足支路编号原则即可。 例如习题3-4: 123118kV113kV8.5+j20.5Wj2.82×10-4S1.22+j20.2Wj2.82×10-4SDST=0.17+j1.7MVA40+j30MVA20+j15MVA 程序二叉树结构示意图: 本二叉树中节点1即支路1为题目中节点1与节点2之间的部分; 本二叉树中节点2即支路2为题目中节点2与节点3之间的部分; 对于习题3-3: 程序二叉树结构示意图: 本二叉树中节点2即支路2为题目中节点1与节点2之间的部分; 本二叉树中节点1即支路1为题目中节点2与节点3之间的部分; 本二叉树中节点3即支路3为题目中节点2与节点4之间的部分.拓展: 如下多支路网络: 对于三节点网络需先进行以下网络处理转化为标准二叉树,而后进行计算; 图中三角形表明该项阻抗为零,为纯导线,并进行相应参数补充进行计算。 程序说明文档 ******************************************************************************************************************************************************* 本程序测试使用方法:在E盘根目录下建立输入文件: 输入文件名:input.txt; 将所附算例对应输入文件内容复制粘贴至上述文件中,在VC++6.0环境下运行cpp文件得出结果。 输出文件在E盘根目录下 输出文件名为:data.txt;******************************************************************************************************************************************************* 程序功能说明:本程序可以计算任意长度线型开始网络潮流; 支持多电压等级下的计算; 可在除供电节点外任意节点引出负载; ******************************************************************************************************************************************************* 输入格式说明:以支路为基本单位,按潮流方向输入数据: 以下例示意: //支路个数 1,110,118,8.5,20.5,0.000564,0,0,1,0,0 //线路等效的支路 2,11,110,1.22,20.2,0,40,30,10,0.17,1.7 //变压器等效的支路 .//按此方式知道输入所有的支路 .//输入从上到下的顺序为潮流在 .//线型开式网络中的流动方向 /* 第一行输入支路个数,回车 第二行至后输入各个支路参数,回车分隔不同支路; 各行输入的支路参数顺序是: 支路编号,末端电压,始端电压,线路等效电阻,线路等效感抗,线路等效容纳,末端输入有功,末端输入无功,变比,变压器有功励磁损耗,变压器无功励磁损耗 对于线路等效电路:变压器有功/无功损耗输入零,变比输入1; 对于变压器等效电路:所有的参数均归算至高压侧,Rt,Xt对应输入线路等效电阻/感抗的位置,线路等效容抗为零; 对于个节点的引出负荷:输入至以此节点为末节点的支路的末端输入有功/无功部分; */ ******************************************************************************************************************************************************** 输出文件格式说明:输出的内容包括 (1)支路信息:每个支路元件的始端有功、无功和末端有功、无功;有功损耗无功损耗;电压损耗; (2)全网信息:全网的总电源有功、总负荷有功、有功损耗、网损率; (3)迭代信息:每次完整迭代后的所有内容; 具体在输出文件中都明确标出。 ********************************************************************************************************************************************************* 程序中变量定义说明: 类中定义的变量 class line_part{ //定义支路类 double U[2]; //支路电压降落:U[0]电压降落横分量,U[1]电压降落纵分量 double k; //变压器变比 double val; //支路排序 double U_end; //支路末端电压 double U_begin; //支路首段电压 double X[3]; //支路等效阻抗: X[0]电阻,X[1]感抗,X[2]容纳 double S_end[2]; //支路末端功率:S_end[0]有功,S_end[1]无功 double S_begin[2]; //支路首段功率:S_begin[0]有功,S_begin[1]无功 double S0[2]; //变压器励磁损耗:S0[0]有功,S0[1]无功 double S_org[2]; //支路末端负载:S_org[0]有功,S_org[1]无功 line_part *lchild,*rchild; //支路的后继两个支路 } class BinTree{ //定义树类 void PreOrder(){PreOrder(root);}; //树的先序遍历修改电压 void PostOrder(){PostOrder(root);}; //树的后序遍历修改潮流 void display(){display(root);}; //树的先序遍历显示数据 line_part *root; //树的根,是一个支路类 };主函数中定义的数据 ofstream outfile; //输出数据流定 ifstream infile; //输入数据流定 const int M(a); //支路个数常量 主程序(复制粘贴到C++就能用) ************************************************************************************************************************************************************** #include double p_cost_all=0; double sqr(double x){ //平方计算函数 return x*x;}; class line_part{ //定义支路类 private: double val; //支路排序 double U_end; //支路末端电压 double U_begin; //支路首段电压 double X[3]; //支路等效阻抗: X[0]电阻,X[1]感抗,X[2]容纳 double S_end[2]; //支路末端功率:S_end[0]有功,S_end[1]无功 double S_begin[2]; //支路首段功率:S_begin[0]有功,S_begin[1]无功 double S0[2]; //变压器励磁损耗:S0[0]有功,S0[1]无功 double S_org[2]; //支路末端负载:S_org[0]有功,S_org[1]无功 line_part *lchild,*rchild;public: double U[2]; //支路电压降落:U[0]电压降落横分量,U[1]电压降落纵分量 double k; //变压器变比 public: line_part(){ val=0;U_end=0;U_begin=0;X[0]=0;X[1]=0; X[2]=0;S_end[0]=S_org[0]=0;S_end[1]=S_org[1]=0; S_begin[0]=0;S_begin[1]=0;k=1; S0[0]=0;S0[1]=0;U[0]=0;U[1]=0; lchild = rchild= NULL;} line_part(double vall,double u_end=0,double u_begin=0,double r=0,double x=0,double b=0,double Pe=0,double Xe=0,double K=0,double P0=0,double Q0=0){ val=vall; U_end=u_end; U_begin=u_begin; X[0]=r; X[1]=x; X[2]=b; S_end[0]=S_org[0]=Pe; S_end[1]=S_org[1]=Xe; S_begin[0]=0; S_begin[1]=0; k=K; S0[0]=P0; S0[1]=Q0; U[0]=0; U[1]=0; lchild = rchild= NULL; };friend class BinTree; friend void pass_U(line_part*a,line_part*b,line_part*c); //电压传递函数 friend void pass_w(line_part*a,line_part*b,line_part*c); //功率传递函数 friend void pass_U2(line_part*a,line_part*b); //电压传递函数 friend void pass_w2(line_part*a,line_part*b); //功率传递函数 void Sbegin(){ (U_end)*X[2]/2))/sqr(Uend);;-sqr(U_begin)*X[2]/2-sqr(U_end)*X[2]/2;};void Uend(){ double U_heng(0),U_zong(0); X[2]/2-S0[1];1])/U_begin; //U_heng即是△u2 0])/U_begin; //U_zong即是δu2 sqr(U_zong))/k; double get_val(){ }; //支路首段功率计算函数 double Uend,I2;Uend=k*U_end;I2=(sqr(S_end[0])+sqr(S_end[1]-sqrS_begin[0]=S_end[0]+I2*X[0]+S0[0]S_begin[1]=S_end[1]+I2*X[1]+S0[1] //支路末端电压计算函数 double p_begin,q_begin;p_begin=S_begin[0]-S0[0];q_begin=S_begin[1]+sqr(U_begin)*U_heng=(p_begin*X[0]+q_begin*X[U_zong=(p_begin*X[1]-q_begin*X[U_end=sqrt(sqr(U_begin-U_heng)+U[0]=U_heng;U[1]=U_zong;}; //返回支路编号 if(this==0){return-1;}else{ if(val>0&&val<100){return val;} else return-1;} double get_Uend(){ //返回支路末端电压 return U_end;}; double get_Ubegin(){ //返回支路首段电压 return U_begin;}; double get_Pbegin(){ //返回支路首段有功 return S_begin[0];}; double get_Pend(){ //返回支路末端有功 return S_end[0];}; double get_Qbegin(){ //返回支路首段无功 return S_begin[1];}; double get_Qend(){ //返回支路末端无功 return S_end[1];}; double get_Pcost(){ //返回支路有功损耗 return S_begin[0]-S_end[0];}; double get_Qcost(){ //返回支路无功损耗 return S_begin[1]-S_end[1];};line_part *get_lchild(){ //返回支路无功损耗 return lchild;};line_part *get_rchild(){ //返回支路无功损耗 return rchild;};}; void pass_U(line_part *a,line_part *b,line_part *c){(*c).U_begin=(*a).U_end;(*b).U_begin=(*a).U_end;};void pass_w(line_part *a,line_part *b,line_part *c){(*a).S_end[0]=(*b).S_begin[0]+(*c).S_begin[0]+(*a).S_org[0];(*a).S_end[1]=(*b).S_begin[1]+(*c).S_begin[1]+(*a).S_org[1];};void pass_U2(line_part *a,line_part *b){(*b).U_begin=(*a).U_end;};void pass_w2(line_part *a,line_part *b){(*a).S_end[0]=(*b).S_begin[0]+(*a).S_org[0];(*a).S_end[1]=(*b).S_begin[1]+(*a).S_org[1];}; class BinTree{ public: friend void pass_U(line_part*,line_part*,line_part*); //电压传递函数 pass_w(line_part*,line_part*,line_part*); line_part(0,0,0,0,0,0,0,0,0,0,0);root = aa;} vall,double u_end=0,double u_begin=0,double r=0, Pe=0,double Xe=0, P0=0,double Q0=0){ egin,r,x,b,Pe,Xe,K,P0,Q0); private: *&t,double vall,double u_end,double u_begin,double r, Pe,double Xe, Q0); }; friend void //功率传递函数 BinTree(){line_part *aa=new line_part *Getroot(){return root;} void insertline_part(double double x=0,double b=0,double double K=0,double insertline_part(root,vall,u_end,u_b} void PreOrder(){PreOrder(root);};void PostOrder(){PostOrder(root);};void display(){display(root);};line_part *root;void insertline_part(line_part double x,double b,double double K,double P0,double void PreOrder(line_part *&t);void PostOrder(line_part *t);void display(line_part *&t); void BinTree::insertline_part(line_part *&t, double vall,double u_end=0,double u_begin=0,double r=0,double x=0,double b=0,double Pe=0,double Xe=0,double K=0,double P0=0,double Q0=0){ //插入节点 double ass=t->get_val();if(t==0||t->get_val()<=0){ t=new line_part(vall,u_end,u_begin,r,x,b,Pe,Xe,K,P0,Q0);} else if(vall insertline_part(t->lchild, vall,u_end,u_begin,r,x,b,Pe,Xe,K,P0,Q0);} else { insertline_part(t->rchild, vall,u_end,u_begin,r,x,b,Pe,Xe,K,P0,Q0);} };/////////////////////////////////////////////////////////////////////////////////////////////////////////////// void BinTree::display(line_part *&t){ if(t->get_val()>0&&t->get_val()<100){ display(t->lchild); display(t->rchild); ofstream outfile1; outfile1.open(“e:data.txt”,ios::ate); p_cost_all +=t->get_Pcost(); double U; // 计算并存放各个节点的电压相角(始端为零) U=atan2(t->U[1],(t->get_Ubegin()-t->U[0]))/3.1415926*180; outfile1<<“支路”< ”< outfile1<<“ ”<<“首端电压”<<“ ”< outfile1<<“ ”<<“末端电压”<<“ ”< //计算并存放各个支double U_cost; //计算并存放各个支路的电压损耗 U_cost=t->get_Ubegin()-t->get_Uend(); outfile1<<“ ”<<“电压损耗”<<“ outfile1<<” “<<”始端有功“<<” 首端电压 outfile1<<“ ”<<“始端无功”<<“ 路的末端电压 outfile1<<” “<<”末端有功“<<” 首端电压 outfile1<<“ ”<<“末端无功”<<“ 路的末端电压 double P_cost; 的有功损耗 P_cost=t->get_Pcost(); outfile1<<” “<<”有功损耗“<<” double Q_cost; 的无功损耗 Q_cost=t->get_Qcost(); outfile1<<“ ”<<“无功损耗”<<“ outfile1.close(); ”< //计算并存放各个支“< //计算并存放各个支 //计算并存放各个支路 “< //计算并存放各个支路 ”< };///////////////////////////////////////////////////////////////////////////////////////////////////////////////// void BinTree::PreOrder(line_part *&t){ //先序遍历二叉树修改电压 0) get_lchild()->get_val()<100) get_rchild()->get_val()<100) get_rchild()->get_val()<100) if(t->get_val()>0&&t->get_val()<10{ if(t->get_lchild()->get_val()>0&&t-> { if(t->get_rchild()->get_val()>0&&t-> { t->Uend(); pass_U(t,t->lchild,t->rchild); t->lchild->Uend(); t->rchild->Uend(); } else{ t->Uend(); pass_U2(t,t->lchild); t->lchild->Uend();} } else { if(t->get_rchild()->get_val()>0&&t-> { t->Uend(); pass_U2(t,t->rchild); t->rchild->Uend(); } else{} } PreOrder(t->lchild);PreOrder(t->rchild); } };void BinTree::PostOrder(line_part *t){ //后序遍历二叉树修改潮流 if(t->get_val()>0&&t->get_val()<100) get_lchild()->get_val()<100) get_rchild()->get_val()<100) get_rchild()->get_val()<100) { PostOrder(t->lchild);PostOrder(t->rchild);if(t->get_lchild()->get_val()>0&&t-> { if(t->get_rchild()->get_val()>0&&t-> { t->lchild->Sbegin(); t->rchild->Sbegin(); pass_w(t,t->lchild,t->rchild); t->Sbegin(); } else{ t->lchild->Sbegin(); pass_w2(t,t->lchild); t->Sbegin();} } else { if(t->get_rchild()->get_val()>0&&t-> { t->rchild->Sbegin(); pass_w2(t,t->rchild); t->Sbegin(); } else{} }; void main(){ ofstream outfile; //输入数据流定义 infile>>a; cout<<“节点个数第三篇:C++大作业_职工信息管理系统源代码
第四篇:潮流计算--电力系统大作业(C++编写)