标签:
设计题目:手机资费系统
班级: 15级信息一班 学号: 20153873
报告人姓名: 辛靓
指导教师: 费玉奎
实验地点: 山东农业大学南校区计算机实验室
完成起止日期: 2015.6.27—2016.7.1
一般设计一个系统都包含数据类和操作类,手机资费系统是面向用户手机资费添加和查询的系统,所以数据类中一定要包含一个用户基本信息类和一个套餐基本信息类,除此之外还添加了用户账号密码密码管理功能,所以又添加了一个账号、密码类;而相应的包含了两个操作类——用户操作类和管理员操作类。
对于手机资费的使用用户基本信息类所包含的数据成员有:
1、用户最基本信息:用户姓名、手机号;
2、套餐代码——进行套餐的添加、选择、查询、更改操作;
3、话费余额——进行话费余额查询、业务模拟操作;
4、剩余通话、剩余流量——进行业务查询、业务模拟操作。
对于套餐类数据成员有:
1、套餐最基本信息:套餐代码、套餐名称(本套餐主要根据移动和联通的相应业务添加内容);
2、月租、套餐内通话、套餐内流量——管理员添加套餐项目;
3、套餐外通话计费、套餐外流量计费——套餐外计费标准、进行业务模拟。
账号和密码主要用于用户模拟业务;
管理员操作类实现的主要功能分两大类:
1、用户信息操作:
A)添加用户;
B)修改用户信息;
C)删除用户信息;
D)查询用户基本信息;
··············
2、套餐信息操作:
A)添加套餐;
B)删除套餐;
C)修改套餐;
D)查询套餐;
···············
客户端操作类的主要功能:对套餐的增、删、查、改和业务模拟话费查询等····主要如下:
A)查看话费余额;
B) 业务办理、查询;
C)业务模拟;
D)使用情况;
在操作类内的构造和析构函数内编写文件的读取和储存。实现了程序一运行就将所有内容存入向量组中,在操作完之后再将全部内容重新导出,储存于文件。
class user
{
private:
string name;//姓名
string number;// 手机号码
int taocan_id;//套餐代码
double yue;//余额
int tonghua;//通话
double liuliang;//流量
public:
user(string na,string nu,int i,double y,int t,double l):name(na),number(nu),taocan_id(i),yue(y),tonghua(t),liuliang(l){}
user(){}
string getname(){return name;}
void setname(string na){name=na;}
string getnumber(){return number;}
void setnumber(string nu){number=nu;}
int gettaocan_id(){return taocan_id;}
void settaocan_id(int i){taocan_id=i;}
double getyue(){return yue;}
void setyue(double y){yue=y;}
int gettonghua(){return tonghua;}
void settonghua(int t){tonghua=t;}
double getliuliang(){return liuliang;}
void setliuliang(double l){liuliang =l;}
friend istream& operator>>(istream&is,user&c);
friend ostream& operator<<(ostream&os,const user&c);
};
istream& operator>>(istream&is,user&c)
{
is>>c.name>>c.number>>c.taocan_id>>c.yue>>c.tonghua>>c.liuliang;
return is;
}
ostream&operator<<(ostream&os,const user&c)
{
os<<"姓名:"<<c.name<<" ";
os<<"号码:"<<c.number<<":"<<endl;
os<<"套餐代码:"<<c.taocan_id<<" ";
os<<"余额:"<<c.yue<<" ";
os<<"已通话时间:"<<c.tonghua<<" ";
os<<"已使用流量:"<<c.liuliang<<endl;
return os;
}
class taocan
{
private:
int id;
string name;
double cost;//每月花费
int time;//套餐每月包含的通话时间
double liu;
double cost_time;
double cost_liu;
public:
taocan(){}
taocan(int i,string na,double c,int t,double l,double ct,double cl):id(i),name(na),cost(c),time(t),liu(l),cost_time(ct),cost_liu(cl){}
int getid(){return id;}
void setid(int i){id=i;}
string getname(){return name;}
void setname(string na){name=na;}
double getcost(){return cost;}
void setcost(double c){cost=c;}
int gettime(){return time;}
void settime(int t){time=t;}
double getliu(){return liu;}
void setliu(double l){liu=l;}
double getcost_time(){return cost_time;}
void setcost_time(double ct){cost_time=ct;}
double getcost_liu(){return cost_liu;}
void setcost_liu(double cl){cost_liu=cl;}
friend istream& operator>>(istream&is,taocan&c);
friend ostream& operator<<(ostream &os,const taocan&c);
}t;
istream& operator>>(istream&is,taocan&c)
{
is>>c.id>>c.name>>c.cost>>c.time>>c.liu>>c.cost_time>>c.cost_liu;
return is;
}
ostream& operator<<(ostream&os,const taocan&c)
{
os<<"套餐代码:"<<c.id<<" ";
os<<"套餐名称:"<<c.name<<":"<<endl;
os<<"该套餐月租费:"<<c.cost<<" ";
os<<"套餐内通话时间:"<<c.time<<" ";
os<<"套餐内流量:"<<c.liu<<" ";
os<<"套餐外通话记费标准:(分钟)"<<c.cost_time<<" ";
os<<"套餐外流量计费标准:(M)"<<c.cost_liu<<endl;
return os;
}
void denglu::user_list()
{
cout<<"~~~~~~~~~~~~~~~~欢迎进入用户界面~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<"+ 请输入相应序号进行相应操作: +"<<endl;
cout<<"+ 1、查询话费余额 +"<<endl;
cout<<"+ 2、添加账户密码 +"<<endl;
cout<<"+ 3、修改密码 +"<<endl;
cout<<"+ 4、查看个人订阅套餐基本信息 +"<<endl;
cout<<"+ 5、查看套餐使用情况 +"<<endl;
cout<<"+ 6、业务模拟 +"<<endl;
cout<<"+ 7、费用详单 +"<<endl;
cout<<"+ 8、删除密码 +"<<endl;
cout<<"+ 0、退出系统 +"<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
void denglu::user_menu()
{
while(1)
{
system("cls");
user_list();
int choice;
cin>>choice;
switch(choice)
{
case 1:{string id;
cout<<"请输入所查询用户的手机号码:"<<endl;
cin>>id;
e.exhi_selfs(id);system("pause");break;}
case 2:{f.add_account();system("pause");break;}
case 3:{
string id,pass;
cout<<"请输入用户手机号码,按提示进行密码修改:"<<endl;
cin>>id;
f.change_user_account(id);system("pause");break;}
case 4:{string id;
cout<<"请输入所查询用户的手机号码:"<<endl;
cin>>id;
e.taocan_info(id);system("pause");break;}
case 5:{string id;
cout<<"请输入所查询用户的手机号码:"<<endl;
cin>>id;
e.extra_tp(id);system("pause");break;}
case 6:{string id;
cout<<"请输入所查询用户的手机号码:"<<endl;
cin>>id;
e.servise_imitate(id);system("pause");break;}
case 7:{system("pause");break;}
case 8:{f.delete_account();system("pause");break;}
case 0:{return;}
}
}
}
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~欢迎进入管理员窗口~~~~~~~~~~~~~~~~~"<<endl;
cout<<"~ 请输入相应序号进行相应操作: ~"<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
case 1:{e.add_user_info();system("pause");break;}
case 5:{e.delete_user_info();system("pause");break;}
cout<<e.exhi_info();system("pause");break;}
case 4:{e.chan_user_info();system("pause");break;}
case 2:{x.add_taocan();system("pause");break;}
case 6:{x.delete_taocan();system("pause");break;}
case 8:{x.chan_taocan();system("pause");break;}
case 9:{system("pause");break;}
构造函数析构函数实现文件读取存储
taocan_manage::taocan_manage()
ifstream infile("d:\\套餐信息.txt",ios::in);
taocan_manage::~taocan_manage()
ofstream outfile("d:\\套餐信息.txt",ios::out);
for(tpi=tp.begin();tpi!=tp.end();++tpi)
outfile<<tpi->getid()<<‘ ‘<<tpi->getname()<<‘ ‘<<tpi->getcost()<<‘ ‘<<tpi->gettime()<<‘ ‘<<tpi->getliu()<<‘ ‘<<tpi->getcost_time()<<‘ ‘<<tpi->getcost_liu()<<endl;
套餐修改 void taocan_manage:: taocan_chan_list() { cout<<"********套餐列表************************"<<endl;
cout<<"* 3、套餐内每月包含通话 *"<<endl;
cout<<"* 4、套餐内每月包含流量 *"<<endl;
cout<<"* 5、超出套餐内通话时间的计费(分钟)*"<<endl;
cout<<"* 6、超出套餐内流量的计费(M) *"<<endl;
cout<<"****************************************"<<endl;
void taocan_manage::add_taocan()
cout<<"请依次输入套餐代码、套餐名、每月花费、每月套餐内通话时间、每月套餐内流量、超出套餐外通话价格(分钟)、超出套餐外流量价格(M),并将它们用空格分开"<<endl;
void taocan_manage::delete_taocan()
for(x.tpi=tp.begin();x.tpi!=tp.end();++tpi)
if(j)cout<<"输入有误,请重输!!"<<endl;
taocan taocan_manage::exhi_taocan(int id)
for(x.tpi=tp.begin();x.tpi!=tp.end();++tpi)
void taocan_manage::chan_taocan()
for(x.tpi=tp.begin();x.tpi!=tp.end();++tpi)
if(i){cout<<"该套餐不存在!!"<<endl;}
cout<<"请输入要修改的项目:(输入0退出修改)"<<endl;
case 1:{cout<<tpi->getname()<<endl;
cout<<"请输入修改后的套餐内通话时间:"<<endl;
x.tpi->settime(tonghua);break;
cout<<x.tpi->getcost_time()<<endl;
cout<<"请输入修改后套餐外通话收费标准:(分钟)"<<endl;
double cost_time;cin>>cost_time;
x.tpi->setcost_time(cost_time);break;
cout<<x.tpi->getcost_liu()<<endl;
cout<<"请输入修改后套餐外流量收费标准:(M)"<<endl;
double cost_liu;cin>>cost_liu;
x.tpi->setcost_liu(cost_liu);break;
void servise_imitate(string id);
ifstream infile("d:\\用户信息.txt",ios::in);
ofstream outfile("d:\\用户信息.txt",ios::out);
for(uifoi=uifo.begin();uifoi!=uifo.end();++uifoi)
outfile<<uifoi->getname()<<‘ ‘<<uifoi->getnumber()<<‘ ‘<<uifoi->gettaocan_id()<<‘ ‘<<uifoi->getyue()<<‘ ‘<<uifoi->gettonghua()<<‘ ‘<<uifoi->getliuliang()<<endl;
void user_manage::chan_user_info()
cout<<"请重新依次输入用户基本信息依次输入姓名、手机号、套餐代码、初始余额,通话时间、流量用量,并将它们用空格分开:"<<endl;
for(e.uifoi=uifo.begin();e.uifoi!=uifo.end();++e.uifoi)
e.uifoi->setname(temp.getname());
e.uifoi->settaocan_id(temp.gettaocan_id());
e.uifoi->setyue(temp.getyue());
e.uifoi->settonghua(temp.gettonghua());
e.uifoi->setliuliang(temp.getliuliang());
cout<<"用户信息修改成功!!"<<endl;break;
if(e.uifoi>uifo.end())cout<<"该号码为空号!!"<<endl;
void user_manage::exhi_selfs(string id)
for(e.uifoi=uifo.begin();e.uifoi!=uifo.end();++e.uifoi)
cout<<e.uifoi->getyue()<<endl;break;
if(e.uifoi==uifo.end())cout<<"该手机号码为空号!!"<<endl;
void user_manage::taocan_info(string id)
for(e.uifoi=uifo.begin();e.uifoi!=uifo.end();++e.uifoi)
if(e.uifoi>uifo.end())cout<<"该手机号码为空号!!"<<endl;
int user_manage::get_tp_id(string id)
for(e.uifoi=uifo.begin();e.uifoi!=uifo.end();++e.uifoi)
cout<<"套餐序号为:"<<e.uifoi->gettaocan_id()<<endl;
return e.uifoi->gettaocan_id();break;
if(e.uifoi==uifo.end())cout<<"该手机号码为空号!!"<<endl;
void user_manage::delete_user_info()
for(e.uifoi=uifo.begin();e.uifoi!=uifo.end();++e.uifoi)
if(i)cout<<"该号码用户不存在!!"<<endl;
增加用户
void user_manage::add_user_info()
cout<<"请依次输入姓名、手机号、套餐代码、初始余额、通话时间、流量使用情况,并将它们用空格分开"<<endl;
cout<<"请依次输入姓名、手机号码、套餐代码、初始余额、通话时间、流量使用情况,输入6个0结束操作,并将它们用空格分开,全部输入0时结束输入"<<endl;
void user_manage::extra_tp(string id)//套餐剩余
int costtime,alltime,extratime;
double costdata,alldata,extradata;
temp=e.get_tp_id(id);cout<<"shu"<<temp;
for(e.uifoi=e.uifo.begin();e.uifoi!=e.uifo.end();++e.uifoi)
costtime=e.uifoi->gettonghua();
costdata=e.uifoi->getliuliang();
for(x.tpi=x.tp.begin();x.tpi!=x.tp.end();++x.tpi)
cout<<"套餐内剩余通话时间(分钟):"<<extratime<<endl;
cout<<"套餐内剩余上网流量(M):"<<extradata<<endl;break;
业务模拟
void user_manage::servise_imitate(string id)
cout<<"*********************"<<endl;
double outmoney,deletemoney=0;
for(e.uifoi=e.uifo.begin();e.uifoi!=e.uifo.end();++e.uifoi)
oldtime=e.uifoi->gettonghua();
e.uifoi->settonghua(oldtime+temptime);
newtime=e.uifoi->gettonghua();
for(x.tpi=x.tp.begin();x.tpi!=x.tp.end();++x.tpi)
outmoney=x.tpi->getcost_time();
deletemoney=outmoney*temptime;
else deletemoney=(newtime-alltime)*outmoney;
e.uifoi->setyue(e.uifoi->getyue()-deletemoney);
cout<<"通话"<<temptime<<"分钟的花费为:(若话费为0则为套餐内通话不额外扣费)"<<deletemoney<<endl;
cout<<"话费余额:"<<e.uifoi->getyue()<<endl;
double alldata,olddata,newdata;
double outmoney,deletemoney=0;
for(e.uifoi=e.uifo.begin();e.uifoi!=e.uifo.end();++e.uifoi)
olddata=e.uifoi->getliuliang();
e.uifoi->setliuliang(olddata+tempdata);
newdata=e.uifoi->getliuliang();
for(x.tpi=x.tp.begin();x.tpi!=x.tp.end();++x.tpi)
outmoney=x.tpi->getcost_liu();
deletemoney=outmoney*tempdata;
else deletemoney=(newdata-alldata)*outmoney;
e.uifoi->setyue(e.uifoi->getyue()-deletemoney);
cout<<"套餐外流量花费为:(若花费为0,则未超出套餐流量)"<<e.uifoi->getyue();
}
添加用户是另写了添加多个用户,方便管理员操作,使系统更加人性化。
输入号码用vector 数组和for 函数找到该号码用户,若找到输出用户信息;否则该用户不存在。
这个修改写的有些粗,其实也可以像套餐的修改一样逐项修改,但这样也有利于用户确认信息,结果还是改了信息的。
主要是通过号码找到用户,用erase 删除vector 数组里的该元素;
套餐若不存在返回随机数,但用好几种方法改后发现这是最好的情况。
修改密码里用了好几个循环函数,在密码输入有误时可输三次,但输入正确也循环,而且在这个循环里边还有一个查找用户的循环,解决方法:1、用break;2、在结构体外定义i=1;操作成功后将i 变成0;进行判断。
因为套餐查询的这个返回值是套餐结构体,而对于结构体的内容已用重载<<、>>运算符直接输入输出,而且在很多函数里都用到了套餐能容查询,所以不能单个输出,但套餐不存在时输出的不是空,而是随机数,暂时没找到解决办法。
在业务模拟时用到了套餐序号查找函数,该函数有返回值用int类型,找到套餐后它的返回值为套餐结构体,取内容时用get()函数;
先把用户余额取出,通话分钟与套餐内通话时间相比较,若小于则本次通话花费为0;否则取出套餐的资费标准,对超出的通话时间进行计算得出话费,用余额减去话费得到现在用户的余额;流量函数同通话。
总体来说的输出问题有:操作结束时总是出现很多的请按任意键继续,该问题的所在是在类里的函数里加了system(“pause”)结果在菜单函数里又加了,有的则直接加在了循环函数里;
经过一学期的学习我觉得自己对类有了一定的了解,特别是这几天写手机资费系统,很多之前没注意的问题都暴露出来,感觉学到了很多知识;
一开始为了操作方便,把类里的数据成员都写成公有的后来改成私有的,回过头来想想泪最大的特点是什么——封装性,所以私有成员必须私有化,后来成员都改成私有的,并用get(),set()函数实现功能进行弥补。
之前写程序老是不会文件的存储和读取,经过老师最后几节课的讲解和同学的帮助,终于弄清了如何进行正确的文件操作,如何正确的读取、修改、保存文件。
再设计程序之处一定要有一个清晰地思路,写起来会比较顺手,我一开始没有细想,写起来还是非常吃力的,后来通过一边调程序,一边写,才慢慢找到感觉,写代码是最好写完一个函数就运行一下,后来会比较通畅。
再调程序时遇到不会的问题,可以上网搜下,会有不小的收获,模拟功能时可能会遇到一些问题,要冷静下来,仔细查看该功能所涉及的函数,先单个运行,在整合起来,不要着急,通过不同的试探,或许还会摸索出新的方法。
总之,在这次苦乐参半的编程之旅中,我不仅收获了知识锻炼了能力,还体会到了编程的乐趣——调通程序的方法永远不止一种,细心回想知识点,调通就在不经意间,有时候一个分号就可以改变一串bug,所以永远不要说放弃,因为你永远不知道自己离成功有多近,那距离或许只差一个符号。
标签:
原文地址:http://blog.csdn.net/elvira5201/article/details/51794136