饭卡管理系统(共21页).docx
精选优质文档-倾情为你奉上宁波大学饭卡管理系统指导教师 班 级 姓 名 学 号 完成日期 系统需求:随着宁波大学的发展,学生,教师及外来人员的不断增加,对于食堂来讲,普通意义上的现金交易严重影响了工作效率,使消费者等待时间加长,食堂交易方式数字化已经刻不容缓,宁波大学饭卡管理系统就是基于以上问题开发,基本上能实现普通交易的功能,同时又能提高工作效率。功能分析:宁大高校饭卡信息包括:饭卡号码、饭卡所有者信息、初次办卡时间、余额。其中,饭卡的所有者分为学生、教师、临时人员,学生有各自的班级号,教师有所属学院等信息。实现功能:(1) 学生入学或老师新调入,需要新建一张饭卡。(2) 学生毕业或老师调离,撤销当前对象的饭卡。(3) 饭卡的充值和消费。(4) 查询和排序功能A:按饭卡所有人姓名查询,输出此饭卡的所有信息。B:按饭卡号码查询,输出此饭卡的所有信息。C:按饭卡号码大小排序,输出所有饭卡的信息。程序设计:Ccard类:基类,设置初始信息,设置充值,消费,余额,信息查询对象函数,初始信息中包括人的公有特征,如姓名,性别,身份证号码。声明代码:Cstudent类: 从Ccard类公有继承初始信息函数、查询函数,自己再设置独立的关于学生的对象,譬如班级号和类别,并要求对卡号保存。声明代码: Cteacher类:从Ccard类公有继承初始信息函数、查询函数,自己再设置独立的关于教师的对象,譬如所属学院、职称,并要求对卡号保存。声明代码: Ctemp类:从Ccard类公有继承初始信息函数、查询函数,由于是临时卡,不保存卡号。声明代码:遇到问题:(1) 当查询充值余额和消费余额时,程序正常是调用double result();/充值函数、double consume();/消费函数、double balance();/余额函数,但是当运行余额函数时,总会2次调用充值和消费函数,这样就直接导致充值的金额和消费的余额扩大一倍,最后发现原来是返回函数写错了,因为money是余额,money1是充值金额,money2是消费金额,我在而我都返回了money值给充值函数、消费函数和余额函数。(2) 按照卡号查询饭卡所有者信息时,除了初始信息,姓名,性别,身份证号码外,最主要的还是查询出这个号码的所剩余额,刚开始时我使用的是调用充值,消费函数,这样一来,当输出余额是会弹出对话框,问你充了多少钱,消费了多少钱,一般情况下查询时肯定不会充值和消费,所以应该输入充值0消费0,但是这样对于操作会很繁琐,虽然结果一样会输出,最后我直接调用money对象,直接输出,这样就不用再手动输入了,结果直接会显示在显示屏上。(3) 删除信息函数,最后由于查的可以用指针的方法用new和delet函数彻底释放内存中的信息,但是由于对C+的认识不够深,不会用指针的方法处理这个删除任务,所以简而求其次,把各个初值都赋0值,这样的话信息就会以0初值的方式显示,也可以说基本完成删除信息的任务(4) 用姓名查找,首先想到怎么去掉用姓名函数,然后通过再把和姓名相关的信息输出,但是写好程序后,不管输入怎么的姓名,程序就是无动于衷,什么都输不出,最后和老师一讨论,决定用匹配的方式,就是输入的姓名和原始建卡时所存在的姓名匹配,成功的话sflag设1,输出建卡时的内容,简单易懂改进:这个程序只能说够用,挺基本的,很多功能还需要修改完善,譬如可以实现个人历史充值记录和消费记录,然后可以知道他的日平均消费或者月平均消费,对于数字的输入也没有比较好的识别,譬如金额可以输入负数可以输入字母,虽然程序中写明用数字,但是实用中难免会出现误输入,系统就不会报错。感想:最最有体会的地方就是我对C+程序员致以最高的尊敬,写程序真的是太痛苦了,对于初学C+语言的我来说,亲自写个程序对我是莫大的考验,整个程序涉及到了C+的各个方面,如书中的继承,结构,类,运算符操作,数值定义方法等等,一旦程序写完觉得自己整个人都轻松了很多,其中我要感谢帮助过我的人,我的指导老师,我的同窗,我想要真正写个能在实际生活中使用的程序,凭现在的我是万万不可能的,这得积累几年的经验,几年的锻炼才可以啊,虽然这是个基础程序,但也凝结了我几天的辛勤劳作,万事开头难,有了这次实践,我想我以后会做的更好。功能框图:主界面公有继承基类Ccard,初始信息,初始设置对象,消费,充值,余额,构造函数调用学生类里的对象函数新建调用信息对象充值消费调用充值消费函数查询调用查询函数调用临时类里的对象函数新建调用信息对象充值消费调用充值消费函数查询调用查询函数调用教师类里的对象函数新建调用信息对象充值消费调用充值消费函数查询调用查询函数有效代码无效代码退出系统饭卡查询饭卡消费饭卡充值撤销饭卡新建饭卡帮助程序系统总程序:#include<iostream>#include<string>#include<cstdlib>using namespace std;class CCard/卡类protected:char sex;/拥卡者性别string idnum;/拥卡者IDint cardnum1;/拥卡者卡号string name;/拥卡者姓名string chucitime;/初次办卡的时间double balance;/卡内余额static int cardnum;/卡号设为静态,可以使卡号连续增加public:CCard();void setsex(char);/设置拥卡者性别char getsex();/获得拥卡者性别void setidnum(string);/设置拥卡者IDstring getidnum();/获得拥卡者的IDvoid setname(string);/设置拥卡者名字string getname();/获取拥卡者名字void setchuci(string);/设置办卡时间string getchuci();/获取办卡时间void chongzhi(double);/充值void consume(double);/消费double getbalance();/获取卡内余额 int getcardnum();/获取饭卡编号void del();/消除饭卡void add();/新建饭卡; class CStudent:public CCard/学生类,派生自卡类protected:string class1;/班级char lei;/学生属性(本科、研究生)public:void check();/核查身份void display();/现实信息void setclass(string);/设置班级string getclass();/获得班级void setlei(char); /设置学生属性char getlei();/获得学生属性addcstudent();/添加学生;class CTeacher:public CCard/教师类,派生自卡类protected:string xueyuan;/教师所属学院char zhicheng;/教师职称public:void setxueyuan(string);/设置教师所属学院string getxueyuan();/获得教师所属学院void setzhicheng(char);/设置教师职称char getzhicheng();/获得教师职称void check();/查询信息void display();/显示信息;class CTemp:public CCard/临时人员类,派生自卡类public:void check(); /核查信息void display(); /显示信息;int CCard:cardnum=1; /初始化卡号为1CCard:CCard() /卡类构造函数cardnum1=cardnum+; /拥卡者卡号为初始卡号加1,当创建对象时,会自动加1name="0" balance=0; /余额 sex='0' idnum="0" /拥卡者IDchucitime="0" /初次办卡的时间 0CCard:CCard(); /卡类析构函数void CCard:setname(string na)/卡类对象函数,设置拥卡者姓名,na为写的名字name=na;string CCard:getname() /获得拥卡者姓名return name;void CCard:setchuci(string time) /设置办卡时间chucitime=time;string CCard:getchuci() /获得办卡时间return chucitime;void CCard:chongzhi(double m) /卡类对象函数,给卡充值,m充值金额 balance+=m;cout<<"你的充值数额:"<<m<<" 当前余额:"<<balance<<endl;void CCard:consume(double e) /卡类对象函数,消费金额,e消费金额if (balance>=e)balance-=e;cout<<"您已消费"<<e<<"元,余额:"<<balance<<endl;else /余额少于消费金额,余额不足cout<<"你的余额不足,请充值"<<endl;double CCard:getbalance() /获得饭卡余额return balance;int CCard:getcardnum() /获得卡号。1加上去return cardnum1;void CCard:setsex(char sex1) /设置拥卡者性别sex=sex1; char CCard:getsex() /获得拥卡者性别 return sex;void CCard:setidnum(string id) /设置拥卡者身份证号,id为输入账号idnum=id;string CCard:getidnum() /获得拥卡者身份证号return idnum;void CStudent:setclass(string class2)/设置拥卡者班级class1=class2;string CStudent:getclass() /获得拥卡者班级return class1;void CStudent:setlei(char lei1) /设置拥卡者属性(本科、研究生)lei=lei1;char CStudent:getlei() /获得拥卡者属性(本科、研究生)return lei;void CTeacher:setxueyuan(string xueyuan1) /Teacher类中,设置教师所属学院xueyuan=xueyuan1;string CTeacher:getxueyuan() /Teacher类中,获得教师所属学院return xueyuan;void CTeacher:setzhicheng(char zhicheng1) /Teacher类中,设置教师职称zhicheng=zhicheng1;char CTeacher:getzhicheng() /Teacher类中,获得教师职称return zhicheng;void main()int choice;/选项变量int m,i; /switch语句中的选择数据int num1,num2,num3; /消费充值,匹配姓名卡号时用char tt; /定义性别时用CStudent s100;/CStudent类对象 10个CTeacher t100;/CTeacher类对象 10个CTemp c100;/CTemp类对象 10个int ssign=0,tsign=0,csign=0,temp1;string temp,na1;string num4,num5,num6; /撤销卡,匹配姓名卡号的时候用int n0,n1,n2,na2;int flagx = 0;int flag = 0; int sflag = 0;while(choice!=0) cout<<"*n"cout<<" 宁波大学饭卡管理系统 n"cout<<"*n"cout<<"*n"cout<<"* 1-帮助信息 *n"cout<<"* 2-新建饭卡 *n"cout<<"* 3-撤销饭卡 *n"cout<<"* 4-饭卡充值 *n"cout<<"* 5-饭卡消费 *n"cout<<"* 6-饭卡查询和排序 *n"cout<<"* 0-退出系统 *n" cout<<"*n"cout<<"请选择操作选择(06):"<<endl;cin>>choice;switch (choice) case 1: cout<<"nn宁大饭卡分为三类,教师卡、学生卡、临时卡。n"<<"您可以根据您的需要按照服务代码建立饭卡,用于就餐、借阅、医疗等方面消费。nnn"break;case 2:cout<<" n" cout<<" * 请选择您所需的操作 * n" cout<<" 学生1; 老师2; 临时人员3.(选择后按回车键确认)n" cin>>m; while(m!=0) switch(m) case 1:/学生建卡if(100=ssign) /最多100个cout<<"学生帐户已满,不能添加!"<<endl;cout<<"输入学生姓名:"cin>>temp;sssign.setname(temp); /调用卡基类的设置姓名cout<<"输入初次办卡时间(如:2010-1-1):"cin>>temp;sssign.setchuci(temp); /调用卡基类的设置初次建卡时间cout<<"输入性别:(女f; 男m)"cin>>tt;if(tt)!='f'&&(tt)!='m') /如果不输入f和m cout<<"指令错误!请重新输入!"<<endl;cout<<"请输入您的性别(女f; 男m):"cin>>tt; sssign.setsex(tt); /调用卡基类的设置性别cout<<"输入身份证号码:"cin>>temp;sssign.setidnum(temp);cout<<"所在班级号:"cin>>temp;sssign.setclass(temp); /调用派生类学生类的设置班级函数cout<<"所属类别(本科生b; 研究生y):"cin>>tt;if(tt)!='y'&&(tt)!='b') cout<<"指令错误!请重新输入!"<<endl;cout<<"所属类别(本科生b; 研究生y):"cin>>tt; sssign.setlei(tt); /调用派生类学生类的设置类型函数 cout<<"添加学生帐户成功!"<<endl;ssign+; /继续下一个break; case 2: /老师建卡if(100=tsign)cout<<"教师帐户已满,不能添加!"<<endl;cout<<"输入老师姓名:"cin>>temp;ttsign.setname(temp);cout<<"输入初次办卡时间(如:2010-1-1):"cin>>temp;ttsign.setchuci(temp);cout<<"输入性别(女f; 男m):"cin>>tt;if(tt)!='f'&&(tt)!='m') cout<<"指令错误!请重新输入!"<<endl;cout<<"请输入您的性别(女f; 男m):"cin>>tt; ttsign.setsex(tt);/设置性别cout<<"输入身份证号码:"cin>>temp;ttsign.setidnum(temp);cout<<"所属学院:"cin>>temp;ttsign.setxueyuan(temp);cout<<"职称(讲师j; 副教授fp; 教授p):"cin>>tt;if(tt)!='j'&&(tt)!='fp'&&(tt)!='p') cout<<"指令错误!请重新输入!"<<endl;cout<<"所属类别(讲师j; 副教授fp; 教授p):"cin>>tt; ttsign.setzhicheng(tt); /设置职称cout<<"添加教师帐户成功!"<<endl;tsign+; /继续下一个break;case 3: /临时建卡if(100=csign)cout<<"临时帐户已满,不能添加!"<<endl;cout<<"输入临时人员姓名:"cin>>temp;ccsign.setname(temp);cout<<"输入初次办卡时间(如:2010-6-1):"cin>>temp;ccsign.setchuci(temp);cout<<"输入性别(女f; 男m):"cin>>tt;if(tt)!='f'&&(tt)!='m') cout<<"指令错误!请重新输入!"<<endl;cout<<"请输入您的性别(女f; 男m):"cin>>tt; ccsign.setsex(tt);/设置性别cout<<"输入身份证号码:"cin>>temp;ccsign.setidnum(temp); cout<<"添加临时帐户成功!"csign+;break;break;break;case 3:cout<<"请输入待撤销饭卡用户姓名n"cin>>na1;cout<<"请输入待撤销饭卡用户卡号n"cin>>na2;for(i=0;i<100;i+)num4=si.getname(); num5=ti.getname(); num6=ci.getname();n0=si.getcardnum();n1=ti.getcardnum();n2=ci.getcardnum();if (na1=num4) /输入姓名和学生卡读取姓名一样 if(na2=n0) /输入卡号和学生卡读取卡号一样 si.setname("0"); /赋0值 si.setchuci("0"); si.setsex('0'); si.setidnum("0");si.setclass("0"); si.setlei('0');cout<<"卡号:"<<si.getcardnum()<<" 姓名:"<<si.getname()<<" 办卡时间:"<<si.getchuci()<<" 余额:"<<si.getbalance();cout<<" 性别:"<<si.getsex()<<" 身份证号:"<<si.getidnum()<<" 所在班级:"<<si.getclass()<<" 类别:"<<si.getlei()<<"n" sflag = 1;break; if(na1=num5) /输入姓名和教师卡读取姓名一样 if(na2=n1) /输入卡号和教师卡读取卡号一样ti.setname("0"); /赋0值 ti.setchuci("0"); ti.setsex('0'); ti.setidnum("0");ti.setxueyuan("0"); ti.setzhicheng('0');cout<<"卡号:"<<ti.getcardnum()<<" 姓名:"<<ti.getname()<<" 办卡时间:"<<ti.getchuci()<<" 余额:"<<ti.getbalance();cout<<"性别:"<<ti.getsex()<<" 身份证号:"<<ti.getidnum()<<所属学院:"<<ti.getxueyuan()<职称:"<<ti.getzhicheng()<<"n"sflag = 1;break; if(na1=num6) /输入卡号和临时卡读取卡号一样 if(na2=n2) /输入卡号和临时卡读取卡号一样ci.setname("0"); /赋0值 ci.setchuci("0"); ci.setsex('0'); ci.setidnum("0");cout<<"卡号:"<<ci.getcardnum()<<" 姓名:"<<ci.getname()<<" 初次办卡:"<<ci.getchuci()<<" 余额:"<<ci.getbalance();cout<<"性别:"<<ci.getsex()<<" 身份证号:"<<ci.getidnum()<<"n"sflag = 1;break; if(1=sflag)cout<<"该账户已成功删除!"<<endl;if(0=sflag) /姓名不匹配cout<<"nn查无此人!nn"<<endl;elsesflag = 0;break;case 4: /饭卡充值double m1;cout<<"请输入待充值的卡号n"cin>>temp1;for(i=0;i<100;i+)num1=si.getcardnum(); /学生卡号num2=ti.getcardnum(); /教师卡号num3=ci.getcardnum(); /临时卡卡号if(temp1=num1)if(si.getname()!="str")cout<<"请输入充值数额n"cin>>m1;si.chongzhi(m1); /调用卡基类充值函数flagx = 1;break;if(temp1=num2)if(ti.getname()!="str")cout<<"请输入充值数额n"cin>>m1;ti.chongzhi(m1);flagx = 1;break;if (temp1=num3)if(ci.getname()!="str")cout<<"请输入充值数额n"cin>>m1;ci.chongzhi(m1);flagx = 1; break;if(0=flagx)/查无此人cout<<"nn查无此人!nn"elseflagx = 0;break;break;case 5:cout<<"请输入待消费的卡号n"cin>>temp1;for(i=0;i<100;i+)if(temp1=si.getcardnum() /学生消费cout<<"请输入消费金额n"cin>>m1;si.consume(m1);flag = 1;break;else if(temp1=ti.getcardnum() /老师消费cout<<"请输入消费金额n"cin>>m1;ti.consume(m1);flag = 1;break;else if(temp1=ci.getcardnum() /临时卡消费cout<<"请输入消费金额n"cin>>m1;ci.consume(m1);flag = 1;break;if(0=flag)/姓名卡号不匹配cout<<"nn查无此人!nn"elseflag = 0;break;case 6:cout<<"请选择排序1; 查询2n"cin>>m; switch (m) case 1:cout<<"现有用户按卡号从大到小排列为:"<<endl;for(i=99;i>=0;i-)if(ci.getname()!="0") /临时卡信息 cout<<"卡号:"<<ci.getcardnum()<<" 姓名:"<<ci.getname()<<" 办卡时间:"<<ci.getchuci()<<" 余额:"<<ci.getbalance(); cout<<" 性别(女f; 男m):"<<ci.getsex()<<" 身份证号:"<<ci.getidnum() <<"n" for(i=99;i>=0;i-)if(ti.getname()!="0") /教师信息 cout<<"卡号:"<<ti.getcardnum()<<" 姓名:"<<ti.getname()<<" 办卡时间:"<<ti.getchuci()<<" 余额:"<<ti.getbalance(); cout<<" 性别(女f; 男m):"<<ti.getsex()<<" 身份证号:"<<ti.getidnum()<<" 所属学院:"<<ti.getxueyuan()<<" 职称(讲师j; 副教授fp; 教授p):"<<ti.getzhicheng()<<"n"for(i=99;i>=0;i-) /学生信息if(si.getname()!="0")