公交一卡通系统.docx
《公交一卡通系统.docx》由会员分享,可在线阅读,更多相关《公交一卡通系统.docx(51页珍藏版)》请在冰豆网上搜索。
公交一卡通系统
公交一卡通系统
学生姓名:
邹世祥
专业:
计算机网络
班级:
10网络智能化应用
学期:
2010-2011学年第二学期
任课教师:
顾亚丽
漳州职业技术学院计算机工程系
目录
目录1
一.项目背景及需求分析3
二.项目概述3
三.项目总设计4
3.1用户类设计
3.2用户管理类设计5
四.项目实施方案5
4.1工作任务一系统框架和主菜单5
4.1.1解决方案6
4.1.2运行情况7
4.1.3归纳分析7
4.2工作任务二文件读取与保存7
4.2.1解决方案7
4.2.2归纳分析9
4.3工作任务三添加新卡9
4.3.1解决方案9
4.3.2运行情况10
4.3.3归纳分析10
4.4工作任务四坐车读卡11
4.4.1解决方案11
4.4.2运行情况12
4.4.3归纳分析13
4.5工作任务五修改卡信息13
4.5.1解决方案13
4.5.2运行情况15
4.5.3归纳分析15
4.6工作任务六浏览卡信息16
4.6.1解决方案16
4.6.2运行情况17
4.6.3归纳分析17
4.7工作任务七注销旧卡18
4.7.1解决方案18
4.7.2运行情况19
4.7.3归纳分析19
4.8工作任务八查找续钱19
4.8.1解决方案19
4.8.2运行情况20
4.8.3归纳分析21
小组分工21
附录:
程序源代码21
bus.h文件:
21
bus.cpp文件:
23
一.项目背景及需求分析
在信息技术飞速发展的今天,计算机技术一直以来都有着重要的地位。
自从微软创建完成了Windows操作系统后,计算机的技术得到了更广大的应用,这种应用体现在了各个领域之中。
根据当前社会的需要,制定了一个功能简洁,容易操作的公交一卡通系统,主要实现了用户的添加模块,删除模块,浏览模块,修改模块,坐车读卡模块和查找续钱模块,本系统的前端开发工具选用VC++6.0。
界面简洁大方,为用户提供了人性化的操作方式。
目前很多城市有运用了公交一卡通系统,但是,对于本次的实训任务,不需要大型的数据库系统,只需要一个操作方便,功能实用,能满足本中心对数据的管理及需求的系统就可以。
本项目的目标就是开发一个功能实用,操作方便,简单明了的公交一卡通系统。
二.项目概述
该项目主要实现了用户的录入、删除、浏览及修改的基本功能,还包括了用户的坐车读卡和查找并续钱的功能。
系统功能模块结构图如图2-1所示。
图2-1系统结构模块图
系统各模块的功能说明如下:
2.1.添加功能:
能够添加一张新卡,卡号按照自然数列向下自动产生,而用户姓名和卡内所需金额由键盘输入,此时卡内余额就是户输入的所续金额。
如果整个系统中的卡号之间出现了被注销过的卡标记,则先将此卡号分配给新卡使用,以便尽量保证该系统中卡号的连续性。
2.2.坐车读卡功能:
假设公交票价的规定是10站以内1元,11~15站2元,16~20站3元,21~25站4元,26~30站5元,每趟车不超过30站。
在乘公交车时,由用户输入自己的卡号和将要坐的站数。
如果该卡存在,并且该卡没有被注销,则系统根据票价的规定,从该卡的余额中扣除相应的票价。
在扣除票价时,如果卡内余额不足,则提示用户支付现金。
2.3.修改功能:
由用户输入自己的卡号,如果存在该卡,并且该卡没有被注销,则弹出一个小菜单列出允许修改的选项。
根据用户的选择让用户进行修改。
2.4.浏览功能:
由用户输入卡号,浏览功能分为用户信息的简表及用户信息的详表,根据用户的选择进行浏览。
2.5.删除功能:
判断该卡号是否存在,若存在并且该卡没有注销标记,则将该卡的余额退给用户,同时对该卡做注销标记。
2.6.查找续钱功能:
由用户输入自己卡号和要续金额,如果该卡存在,并且该卡没有被注销,则系统将所续金额和卡内的余额之和作为最终卡内余额。
找出目前所有卡内最多的金额。
三.项目总设计
3.1用户类设计
用户类分为用户信息简表类和用户信息详表类,用户信息简表是对应用户的姓名及性别的应用,用户信息详表类是对用户的电话及初始金额的应用。
classbus1//用户信息简表
{
charname[20];//用户姓名
charsex[10];//用户性别
public:
bus1(char[],char[]);
voidsetname(char[]);
char*getname();
voidsetsex(char[]);
char*getsex();
virtualvoiddisplay();
};
classbus2:
publicbus1//用户信息详表
{
chartel[13];//用户电话
intmoney;//初始金额
public:
bus2(charsex[],charname[],chartel[],intmoney);
voidsettel(chart[]);
char*gettel();
voidsetmoney(intm);
intgetmoney();
voiddisplay();
};
3.2用户管理类设计
classbus_Manage//用户的管理类
{
staticintbuscount;//用户的编号
staticintmancount;//用户的人数
bus1**bt;
bus2**bw;//指向用户的数组
public:
bus_Manage();
voidsavecard();//储存用户信息
voidreadcard();//读取用户信息
voidaddcard();//添加新卡
voiddeletecard();//注销旧卡
voidshowcard();//浏览用户信息
voidchangecard();//修改卡信息
voidplaycard();//坐车读卡
voidmaxcard();//续钱并查找余额最多的用户
voidmenucard();//系统主菜单
~bus_Manage();
};
另设计并重载printer()函数,以便用来根据实际对象输出他们的内容。
voidprinter(bus1*);//输出某用户的信息
四.项目实施方案
4.1工作任务一系统框架和主菜单
首先询问是否要运用系统内用户的信息,在main函数中由于要跟主菜单中的各模块相对应,我们要用一个switch()语句来控制我们的选择。
4.1.1解决方案
//主函数
voidmain()
{
intchoose;
bus_Managebs;
cout<<"是否要运用以前所储存的信息?
(y/n):
";
charch='y';
cin>>ch;
if(ch=='y'||ch=='Y')
{
bs.readcard();
}
while
(1)
{
system("cls");
bs.menucard();
cout<<"请选择主菜单序号:
";
cin>>choose;
switch(choose)
{
case1:
bs.addcard();bs.savecard();break;//添加新卡
case2:
bs.deletecard();bs.savecard();break;//注销旧卡
case3:
bs.changecard();bs.savecard();break;//修改卡信息
case4:
bs.playcard();bs.savecard();break;//坐车读卡
case5:
bs.maxcard();bs.savecard();break;//续钱并查找续钱最多的用户
case6:
bs.showcard();break;//浏览用户信息
case0:
exit(0);//结束系统运行
}
}
}
voidbus_Manage:
:
menucard()
{
system("cls");
cout<cout<<"\t\t|*******************************************|"<cout<<"\t\t|公交一卡通系统|"<cout<<"\t\t|*******************************************|"<cout<<"\t\t|1--添加新卡|"<cout<<"\t\t|2--注销旧卡|"<cout<<"\t\t|3--修改卡信息|"<cout<<"\t\t|4--坐车读卡|"<cout<<"\t\t|5--续钱并查找续钱最多的|"<cout<<"\t\t|6--浏览用户信息|"<cout<<"\t\t|0--退出|"<cout<<"\t\t|*******************************************|"<cout<}
4.1.2运行情况
程序运行结果如图:
图1-1引用用户的信息
主菜单运行结果如图2-2
图1-2系统主菜单
4.1.3归纳分析
1.system("cls");语句的功能是清屏。
system函数包含在stdlib.h头文件中。
2.利用switch函数来进行选择功能。
3.在进入主菜单前要先判断是否使用旧的数据。
4.注意对象的定义。
5.在建主菜单界面图的时候注意Tab键及空格之间的运用。
6.注意及时的调用保存函数,不让数据流失。
4.2工作任务二文件读取与保存
在保存文件的时候是先要注明一个文件,且在储存的时候是从临时空间读取一个,就储存一个。
在读取的时候,是利用碰到空格跳过来读取的,注意保存时标明的前面几行不是我们所要的信息。
4.2.1解决方案
//用户基本信息的储存和读取
//保存用户信息
voidbus_Manage:
:
savecard()
{
ofstreamfeio("用户基本信息.txt",ios:
:
ate);
if(!
feio)
{
cerr<<"打开文件错误!
"<}
else
{
for(inti=1;i<=buscount;i++)
{
if(i==1)
{
feio<<"\n\t----现有学生基本信息详表----"<feio<<"\n\t姓名"<<"\t性别"<<"\t电话"<<"\t余额";
}
feio<<"\n\t"<getname()<<"\t"<getsex()<<"\t"<gettel()<<"\t"<getmoney();
}
}
}
//读取用户信息
voidbus_Manage:
:
readcard()
{
ifstreamrfile("用户基本信息.txt");
charname[20];//姓名
charsex[6];//性别
chartel[15];//电话号码
intmoney;//余额
inti=1;
charline[400];
while(!
rfile.eof())
{
if(i==1)
{
rfile.getline(line,400);
rfile.getline(line,400);
rfile.getline(line,400);
rfile.getline(line,400);
}
rfile>>name;
rfile>>sex;
rfile>>tel;
rfile>>money;
bt[i++]=newbus1(name,sex);//把从文件中读取的信息按顺序放到bt空间中
bw[i++]=newbus2(name,sex,tel,money);//把从文件中读取的信息按顺序放到bw空间中
}
buscount=++i;
rfile.close();
buscount=(buscount/2+1);
}
4.2.2归纳分析
1.注意ios:
:
ate和ios:
:
app的使用。
2.由于储存时在具体内容前有几行介绍,所以我们在读取时应注意把这几行读了并丢掉。
4.3工作任务三添加新卡
添加新卡,卡号按照自然数列向下自动产生,姓名、电话、性别初始金额由用户输入。
4.3.1解决方案
bus_Manage:
:
bus_Manage()
{
bt=newbus1*[SIZE];
bw=newbus2*[SIZE];//临时变量,存储当前输入的用户信息
}
//添加新卡
voidbus_Manage:
:
addcard()
{
intm;//充值金额
charx[10],s[30],t[13];//职工的姓名s和职工的性别x和电话t
charch;
ch='y';
while(ch=='y'||ch=='Y')
{
system("cls");
cout<cout<<"\t\t请输入用户姓名:
";
cin>>s;
cout<cout<<"\t\t请输入用户性别:
";
cin>>x;
cout<cout<<"\t\t请输入用户电话:
";
cin>>t;
cout<cout<<"\t\t请输入用户充值金额:
";
cin>>m;
cout<bt[buscount]=newbus1(s,x);
bw[buscount]=newbus2(s,x,t,m);
cout<<"\n\t\t您的新卡帐号为:
"<cout<<"\n\t\t是否输入下一个用户信息(y/n)";
cin>>ch;
if(ch=='y'||ch=='Y')
{
buscount++;
mancount++;
}
elsebreak;
}
return;
}
4.3.2运行情况
程序运行结果如图:
图3-1录入用户信息界面
4.3.3归纳分析
1.注意静态变量的使用。
2.要先分配新的空间。
4.4工作任务四坐车读卡
完成坐车读卡扣费的功能,先输入用户的卡号,查询用户的卡内余额,然后再输入坐车的站数,完成相应的扣费。
4.4.1解决方案
//坐车读卡
voidbus_Manage:
:
playcard()
{
intm=0;
inter=1;
intj=0,k=10;
system("cls");
while(er)
{
cout<<"\n\t请输入帐号:
";
cin>>j;
if(j<=buscount)
{
cout<<"\n卡内余额为:
"<getmoney()<cout<<"\n\t请输入您要坐的站数(小于30站):
";
cin>>k;
if((k>0)&&(k<=10))
{
m=bw[j]->getmoney();
if(m==0)
cout<<"卡内余额不足,请您支付现金!
"<else
m=m-1;
cout<<"\n卡内余额为:
"<bw[j]->setmoney(m);
}
elseif((k>=11)&&(k<=15))
{
m=bw[j]->getmoney();
if(m<2)
cout<<"卡内余额不足,请您支付现金!
"<else
m=m-2;
cout<<"\n卡内余额为:
"<bw[j]->setmoney(m);
}
elseif((k>=16)&&(k<=20))
{
m=bw[j]->getmoney();
if(m<3)
cout<<"卡内余额不足,请您支付现金!
"<else
m=m-3;
cout<<"\n卡内余额为:
"<bw[j]->setmoney(m);
}
elseif((k>=21)&&(k<=25))
{
m=bw[j]->getmoney();
if(m<4)
cout<<"卡内余额不足,请您支付现金!
"<else
m=m-4;
cout<<"\n卡内余额为:
"<bw[j]->setmoney(m);
}
elseif((k>=26)&&(k<=30))
{
m=bw[j]->getmoney();
if(m<5)
cout<<"卡内余额不足,请您支付现金!
"<else
m=m-5;
cout<<"\n卡内余额为:
"<bw[j]->setmoney(m);
}
else
{
cout<<"站数不存在"<}
}
cout<<"\n是否继续下一位(1继续/0退出)";
cin>>er;
}
return;
}
4.4.2运行情况
程序运行结果如图:
图4-1坐车读卡界面
4.4.3归纳分析
1.注意输二级指针的使用。
2.注意控制循环的次数。
4.5工作任务五修改卡信息
完成修改用户信息的功能,先输入用户的账号,判断该卡是否存在,如果存在则输出用户的信息,然后询问是否修改用户的信息。
4.5.1解决方案
//修改卡信息
voidbus_Manage:
:
changecard()
{
intm,i;//用户初始化金额
charx[10],s[30],t[13];//职工的姓名s和职工的性别x和电话t
intn;
charch='y';
while((ch=='y')||(ch=='Y'))
{
system("cls");
cout<<"\n\t*************修改卡信息****************\n"<cout<<"\n\t请输入要修改用户的帐号:
";
cin>>n;
if(n>buscount)
{
cout<<"要修改的用户不存在!
\n"<break;
}
for(i=1;i<=buscount;i++)
{
if(i==n)
{
cout<<"\n\t要修改的用户信息如下:
\n"<cout<printer(bw[i]);//调用显示用户完整信息
break;
}
}
cout<<"\n\t确定修改吗?
(y/n)\n"<cin>>ch;
if((ch=='y')||(ch=='Y'))
{
system("cls");
cout<<"请进行修改!
\n"<cout<<"\n\t\t用户的帐号:
"<cout<<"请输入用户姓名:
";
cin>>s;
cout<<"请输入用户性别:
";
cin>>x;
cout<<"请输入用户电话:
";
cin>>t;
cout<<"请输入用户充值金额:
";
cin>>m;
cout<<"是否确认更新的内容(y/n):
";
cin>>ch;
if(ch=='y'||ch=='Y')
{
bt[i]=newbus1(s,x);
bw[i]=newbus2(s,x,t,m);
break;
}
elsecontinue;
}
cout<<"是否修改下一个用户的信息?
(y/n)";
cin>>ch;
}
return;
}
4.5.2运行情况
程序运行结果如图:
图5-1修改卡信息
图5-2修改卡信息
图5-3修改卡信息验证
4.5.3归纳分析
1.注意格式控制,界面要清晰。
2.注意修改后的值该怎么传。
4.6工作任务六浏览卡信息
完成浏览用户信息的功能,浏览用户信息分为用户信息的祥表和用户信息的简表,输入生成表的相应编号,输出用户的信息。
4.6.1解决方案
//浏览用户信息
voidbus_Manage:
:
showcard()
{
inti;
ints;//定义表示选择的参数
while
(1)
{
system("cls");
cout<cout<<"|*****************************************|"<cout<<"|浏览用户信息子菜单|"<cout<<"|*****************************************|"<cout<<"|1--生成信息简表|"<cout<<"|2--生成信息详表|"<cout<<"|0--退出|"<cout<<"|*****************************************|"<cout<<"请选择生成表的类型";
cin>>s;
switch(