合肥学院计算机科学与技术系课程设计报告2007~2008学年第二期课程程序设计语言Ⅱ课程设计名称电煤气管理系统学生姓名林贻训学号0804011011专业班级计本(1)班指导教师项响琴2009年6月(一)需求和规格说明高校水电信息的管理系统,能对高校的主要成员(教师和学生)的水电费进行管理。主要功能包括登记老师和学生的主要信息(包括学号、姓名等),登记每月老师和学生所用的水电量并同时计算出其该付的费用,登记其是否缴纳费用。由于老师和学生在缴纳水电费时的计算方法不同,主要表现在学生可以免费使用一定额度的水电,超过这个额度的水电以后必须自费使用,本着节约资源的原则,自费部分的水电费用价格要高于老师的收费标准,以便控制学生的水电用量。所以设计时必须针对这两种人群分开使用两种不同的计费方式。该管理系统的主要要求为:1)实现对用户信息的录入2)实现水电税局的录入3)计算并查询用户应缴纳的费用4)查询未缴纳的名单(二)设计根据上述需求,设计一个基类person,然后派生出teacher(老师)类和student(学生)类。在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息都应有的操作,这样可以规范各派生类的基本行为。但是各类人员的水电计算方法不同,不能在基类person中统一定义计算方法。各类人员信息的显示内容也不同,同样不能在基类中统一定义显示方法。因此,在teacher类和student类中用纯虚函数的方式定义了计算水电费函数mIncoming()和cIncoming(),显示信息函数Output(),录入函数Input然后再根据各自的同名函数实现具体的功能。系统类图PersonintNo;/charName[20];intDuty;Person*next;virtualvoidInput()=0;virtualvoidInput(ifstream&ifs)=0;virtualvoidOutput()=0;virtualvoidOutput(ifstream&ifs)=0;virtualdoublemIncoming()=0;virtualdoublecIncoming()=0;teacherprotected:doublem;doublec;charflagDuty=0Studentprotected:doublem;doublec;charflagDuty=1基类的数据成员和函数成员描述属性和方法定义类名成员类别类型成员名描述person属性charName[20]姓名intNo编号intDuty类别标志Person*next指针域方法virtualvoidInput()从键盘输入数据virtualvoidInput(ifstream&ifs)从文件输入数据virtualvoidOutput()向屏幕输出数据virtualvoidOutput(ofstream&ofs)向文件输出数据virtualdoublemIncoming()计算水费virtualdoublecIncoming()计算电费类名成员类别类型成员名描述teacher属性doublem用水量doublec用电量方法voidInput()键盘补充输入数据voidInput(ifstream&ifs)录入文件中数据voidOutput()显示屏输出数据voidOutput(ofstream&ofs)向文件输出数据doublemIncoming()计算教师水费doublecIncoming()计算老师电费student属性doublem用水量doublec用电量方法voidInput()键盘补充输入数据voidInput(ifstream&ifs)录入文件中数据voidOutput()显示屏输出数据voidOutput(ofstream&ofs)向文件输出数据doublemIncoming()计算学生水费doubleIncoming()计算学生电费类名成员类别类型成员名描述College属性Person*PL指针复制首地址voidClear清屏intCollege::Find(intID,Person**p1,Person**p2)查找节点方法voidAdd()增加师生voidDelete()删除师生voidModify()修改师生voidPrint()输出师生信息voidSave()师生信息存盘voidLoad()师生信息装入(三)用户手册本程序分为point.h文件和point.cpp文件组成在point.h文件中首先建立人员类Person,其属性包括编号No,姓名Name[20],人员类别标志Duty(0代表教师,1代表学生),建立指针域Person*next。然后在基类构造Person()中设置指针域为空next=0。接着基类虚析构virtual~Person(),包含析构函数virtualvoidInput()=0;//从键盘输入数据,virtualvoidInput(ifstream&ifs)=0;//从文件输入数据,virtualvoidOutput()=0;//向屏幕输出数据,virtualvoidOutput(ofstream&ofs)=0;//向文件输出数据,virtualdoublemIncoming()=0;//计算水费,virtualdoublecIncoming()=0;//计算电费。然后建立友源函数friendclassCollege。在point.cpp文件中首先派生出教师类classTeacher:virtualpublicPerson,包括属性有doublem;//用水量,doublec;//用电量,charflag;//是否缴费情况。初始化部分数据Duty=0.再构造函数:voidInput()//键盘补充输入其它数据。该函数是从键盘补充输入数据(编号No,姓名Name,教师用水量m,教师用电量c,是否已经缴费情况flag)。voidInput(ifstream&ifs)//从文件中读取数据。该函数能从文件中读取数据(编号No,姓名Name,教师用水量m,教师用电量c,是否已经缴费情况flag)。voidOutput()//显示屏输出数据。输出格式为(如1001lin020立方米20元10°C4元y)。doublemIncoming()//计算教师用水量。每立方米为一元钱。计算式m*1。并返回值为m*1。doublecIncoming()//计算教师用电量。每度电为0.4元。计算式为c*0.4。并返回值为c*0.4。point.cpp文件中首先派生出学生类classStudent:virtualpublicPerson,包括属性有doublem;//用水量,doublec;//用电量,charflag;//是否缴费情况。初始化部分数据Duty=1.再构造函数:voidInput()//键盘补充输入其它数据。该函数是从键盘补充输入数据(编号No,姓名Name,学生用水量m,学生用电量c,是否已经缴费情况flag)。voidInput(ifstream&ifs)//从文件中读取数据。该函数能从文件中读取数据(编号No,姓名Name,学生用水量m,学生用电量c,是否已经缴费情况flag)。voidOutput()//显示屏输出数据。输出格式为(如1002lam120立方米0元10°C0元n)。doublemIncoming()//计算学生用水量。每立方米为一元钱。计算式m*1。并返回值为m*1。doublecIncoming()//计算学生用电量。每度电为0.5元。计算式为c*0.5。并返回值为c*0.5。建立类College。指针PL指向person首地址,建立清屏voidClear(),寻找节点intCollege::Find(intID,Person**p1,Person**p2)。再构造College()和析构~College()。建立函数:voidAdd();//增加师生voidDelete();//删除师生voidModify();//修改师生voidPrint();//输出师生信息voidSave();//师生信息存盘voidLoad();//师生信息装入。构造函数College::College()创建1个头结点的链表,装入数据。析构函数College::~College()仅保留一个头结点,然后举个删除结点,包括头结点while(p){PL=p-next;deletep;p=PL;。接下来实现函数:增加师生信息函数的实现voidCollege::Add():首先查找尾结点Person*p=PL;while(p-next)p=p-next;再输入师生分类码(0-教师,1-学生),创建新结点,录入数据,连接到链表。Teacher*pt;Student*pa;switch(ch){case0:pt=newTeacher;pt-Input();p-next=pt;break;case1:pa=newStudent;pa-Input();p-next=pa;break;default:return;}再清除所有师生结点(仅保留头结点):voidCollege::Clear(){Person*p=PL-next;while(p){PL-next=p-next;deletep;p=PL-next;}查找师生结点(返回1-找到。0-未找到。结点指针由p返回,片为前看指针):intCollege::Find(intID,Person**p1,Person**p2){*p1=PL-next;*p2=PL;while(*p1){if((*p1)-No==ID)break;//找到else{*p2=*p1;//继续查找*p1=(*p1)-next;}}return*p1?1:0;}删除师生信息函数的实现voidCollege::Delete():用指针记住类的首地址Person*p1,*p2,输入编号。如果没找到对应首地址则输出“指定的人员没有找到!”。否则找到,先连接p2-next=p1-next,再删除deletep1,并输出“正确删除!”。修改师生信息函数的实现voidCollege::Modify():同上Person*p1,*p2,输入编号。如果没有找到对应首地址则输出“指定人员没有找到!”。否则作为提示和确认先输出原来的师生信息,p1-Output(),即要求修改的师生信息。再由键盘按提示输入新的师生信息以更新,p1-Input()。晚上上述操作即会输出“修改完成!”的提示语。师生信息输出函数的实现voidCollege::Print():首先定义指针指向链表Person*p=PL-next;如果文件没有数据信息if(!p),则输出“无该师生信息!”的提示语。否则遍历链表,输出师生信息while(p){p-Output();p=p-next;}师生信息存入文件函数的实现voidCollege::Save():首先打开文件ofstreamf(Person.txt,ios::out);然后遍历链表输出所有师生信息至文件Person.txt中Person*p=PL-next;while(p){p-Output(f);p=p-next;}最后关闭文件f.close();并输出“师生信息已经保存在Person.txt”的提示语。师生信息装入函数的实现voidCollege::Load():先建立临时空间charbuf[81];定义人员类型intDuty,新建结点的指针Person*p2;和设置读写的位置longt。再利用Clear();清楚所有结点(仅保留头结点)。之后打开文件Person.txt:ifstreamf(Person.txt,ios::in);建立结点,读出数据。定义尾结点指针Person*p=PL。读取人员类型t=f.tellg();fbufbufDuty;在根据人员类型创建新结点switch(Duty){case0:p2=newTea