面向对象程序设计课外实践报告
项目名称:水电气管理系统
所在班级:计算机科技与技术
小组成员:王耀权、董金明
指导教师:葛文英
起止时间: 2014.11.25——2015.12.20
项目基本信息
一、问题描述及分析:
设计一个水电管理信息系统,能够对高校的水电费用进行管理,包括登记费用、查询费用和住户信息管理等。在设计时要考虑到学生和教工在用水电时的不同,学生可以免费使用一定额度的水电,超过这个额度的水电以后必须自费使用,且自费部分水电费的价格标准要高于教工的收费标准(主要是节约资源)。
二、功能模块及结构描述:
功能模块: 1.在主函数中通过分支选择可以跳转不同的功能选项进而实现
2.在显示主菜单函数中,我们通过设计友好界面来与用户进行交互。在“请选择
相应功能(1-3):”中使用者输入非1-3数字或其他字符时,系统提示结束然后从新
开始。
3.进入学生管理系统菜单或者老师管理系统菜单会出现相应功能(1-6):分别对
应的有交费功能、查询一个功能、、查询全部功能、增加功能、删除功能。
学生的查询功能分别为学号和姓名,老师的查询功能为编号和姓名,也可以查询到是否缴费,如未交费就会分别显示水费、电费、煤气费、费用并显示总费用。
4.交费时它会显示费用多少,实际交了多少钱,如果钱交多了显示应找零多少。
结构描述:
1.首先建立了Feebz类,用于初始化身份证号码、姓名、用水电、煤气量,又定
义了缴费函数Get(),用在有人缴费的函数体中,从键盘输入缴的费用,一开始
我们在Get(),中没有对缴的费用进行累加,在查询信息时现实的应缴费用不正
确,经过我们的努力,检查出错误并加以改正,让程序更加完善。
2.用Feebz类派生出StuMan和|TeaMan类,其中有计算应该缴的费用,StuMan类
比TeaMan类多了免费。
3.在保存文件的处理中,需考虑到“查询失败”和“重新输入”等诸多内容
三、主要流程描述:
流程图:
选择操作对象
四、使用说明:
程序运行后,进入界面:
在如上所示的界面下,根据提示进行基本的操作。
五、问题及解决方法
问题 1.觉得该系统的不足就是不能够实现查看某个人的用水量、用电量或者用气量中的一种和应该支付的钱。
问题2还有一个不足就是程序感觉不够简练,有点罗嗦。
解决方法:对于解决这些问题,觉得应该定义子函数来提取每个人的信息这样就可以实现查看某人的用水量、用电量、或者用气量的一种和应该支付的钱。对于问题2这需要有扎实的基本功,能都用最简短的源程序代码去解决一个相同的问题。
六、实践总结:
课程设汁的过程中遇到了很多麻烦,虽然我早有心理准备,但还是令我伤透了脑筋,只怪自己平时看书太少,其实有很多东匹在书上都可以找到答案的,可是还是有一些问
題我实在没有办法解决,最终通过老师和同学们的努力解决了一个又一个的问题。
通过这次课程设计,我学习到了很多知识,并且给了我一个星月的时间去重新认真
的有目的性的C++语言进行复习,查找补漏,为后续课程做充足的准备。设计的过程是困难的,因为以前没有类似的经验刚开始的几天没有太多进展,不过我们没有灰心,经过
认真思考以及老师帮助,最我们有了很好的设设计方法。
程序的完成使我们很高兴,所有的疲惫己经不算什么了,现在觉得要想编写一个好
的程序真的很累,它需要牢固的基础知识作为铺垫,所有源代码的编写输入以及每一步
的调试都容不得一点马虎,整个牢固的基础是编程的最基本需要,要想好每一步的算法,要想到每一个相应的函数。
我觉得一月的课程设计远远比我自己看一学期书的收获多,实践是检验知识的最隹
手段。
七、源代码:
#include
#include
#include
#include
#include
using namespace std;
int ns,nt;
class Feebz // 学生的信息类
{
public:
Feebz(string Num="140901019",string Name="董金明",
double water=1,double power=0,double gas=10);
// 构造函数
friend ostream &operator <<(ostream &out,Feebz &r)
//运算符重载
{out< out< out< out< out< out< out< out< out< if(r.flag) out<<"已交"; else out<<"未交"; return out; } void operator =(Feebz r); // 运算符重载 double GetW(); // 计算学生水费 double GetP(); // 计算学生电费 double GetG(); // 计算学生气费 double GetTotal() {return GetW()+GetP()+GetG();} // 计算学生总费用 string number,name; int flag; double water,power,gas,Waterprice,Powerprice,Gasprice; }; Feebz::Feebz(string Num,string Name, double Water, double Power, double Gas) // 构造函数 {number=Num; name=Name; water=Water; power=Power; gas=Gas; flag=0; } void Feebz::operator =(Feebz r) // 赋值运算符重载{name=https://www.doczj.com/doc/5a6410508.html,; number=r.number; water=r.water; power=r.power; gas=r.gas; } double Feebz::GetW() // 计算学生水费 { if(water<=6) Waterprice=0; else Waterprice=0.6*(water-6); return Waterprice; } double Feebz::GetP() // 计算学生电费{if(power<=6) Powerprice=0; else Powerprice=0.6*(power-6); return Powerprice; } double Feebz::GetG() // 计算学生气费{if(gas<=6) Powerprice=0; else Powerprice=0.6*(gas-6); return Powerprice; } class StuMan // 学生管理类 {public: StuMan(int sz=50) { size=sz; St=new Feebz[size];} //构造函数 ~StuMan() {delete [] St;} // 析构函数 void MainMenu(); // 主菜单 void FeeMenu(); // 学生交费菜单 void NumFee(); // 输入学号交费 void NameFee(); // 输入姓名交费 void CheckMenu(); // 学生查询菜单 void NumCheck(); // 输入学号查询 void NameCheck(); // 输入姓名查询 void Add(); // 增加学生功能 void DeleteMenu(); // 学生删除菜单 void NumDelete(); // 输入学号删除 void NameDelete(); // 输入姓名删除 void Regist(); void Chakan(); // 学生查看作用 private: int size; Feebz *St; }; void StuMan::MainMenu() // 主菜单 {system("cls"); int choice; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"< cout<<" ☆☆"< cout<<" ☆水电煤气管理系统☆"< cout<<" ☆☆"< cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"< cout<<" 欢迎使用教师水电气费管理系统"< cout<<" 2.查询一个同学水电气费用量"< cout<<" 3.查看所有同学的缴费情况"< cout<<" 4.增加学生信息"< cout<<" 5.删除学生信息"< cout<<" 6.退出系统"< while(1) { cout<<"请选择:"; cin>>choice; switch(choice) { case 1:FeeMenu(); break; case 2:CheckMenu(); break; case 3:Chakan(); break; case 4:Add(); break; case 5:DeleteMenu(); break; default: break; }if(choice==6) break; } } void StuMan::Regist() { int i=0; ifstream tfile("student.txt"); while(tfile.good()) { tfile>>St[i].number; tfile>>St[i].name; tfile>>St[i].water; tfile>>St[i].power; tfile>>St[i].gas; i++; } tfile.close(); ns=i; } void StuMan::FeeMenu() //学生交费菜单 { system("cls"); int choice; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"< cout<<" ☆☆"< cout<<" ☆水电煤气管理系统☆"< cout<<" ☆☆"< cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"< cout<<" 学生交费菜单"< cout<<" 1.按照学号交费"< cout<<" 2.按照姓名交费"< cout<<" 3.返回主菜单"< cout<<" 4.退出系统"< while(1) { cout<<"请选择:"; cin>>choice; switch(choice) { case 1:NumFee(); break; case 2:NameFee(); break; case 3:system("cls"); MainMenu(); break; default:exit(1); } if(choice==3) break; } } void StuMan::NumFee() // 输入学号交费 { string number; float money; int flag=0,flag1=0; cout<<"欢迎使用交费功能"< cout<<"请输入学生学号:"; cin>>number; for(int i=0;i if(number==St[i].number) { flag1=1; cout<<"该同学应该交费共"< cout<<"该同学实际交钱:"; cin>>money; if(money { cout<<"该同学需再补交"< St[i].flag=0; MainMenu(); } else { cout<<"该同学交费成功,且找零钱为"< St[i].flag=1; MainMenu(); } break; } if(!flag1) { system("cls"); cout<<"该学生的学号输入错误,请重新使用该功能!"< NumFee(); } } void StuMan::NameFee() // 输入姓名交费 { string name; float money; int flag=0,flag1=0; cout<<" 欢迎使用交费功能"< cout<<"请输入学生姓名:"; cin>>name; for(int i=0;i if(name==St[i].name) { flag1=1; cout<<"该同学应该交费共"< cout<<"该同学实际交钱:"; cin>>money; if(money { cout<<"该同学需再补交"< St[i].flag=0; MainMenu(); } else { cout<<"该同学交费成功,且找零钱为"< St[i].flag=1; MainMenu(); } break; } if(!flag1) { system("cls"); cout<<"该学生的姓名输入错误,请重新使用该功能!"< NameFee(); } } void StuMan::CheckMenu() // 学生查询菜单 { system("cls"); int choice; cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"< cout<<" 1.按照学号查询"< cout<<" 2.按照姓名查询"< cout<<" 3.返回主菜单"< cout<<" 4.退出系统"< while(1) { cout<<"请选择:"< cin>>choice; switch(choice) { case 1:NumCheck(); break; case 2:NameCheck(); break; case 3:system("cls"); MainMenu(); break; default:exit(1); } if(choice==3) break; } } void StuMan::NumCheck() // 输入学号查询 { string number; int flag1=0,i,item;