公交IC卡管理系统实验报告.docx
《公交IC卡管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《公交IC卡管理系统实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
![公交IC卡管理系统实验报告.docx](https://file1.bdocx.com/fileroot1/2023-4/19/e579e0b3-9b7c-48ca-9c28-02b743b889e6/e579e0b3-9b7c-48ca-9c28-02b743b889e61.gif)
公交IC卡管理系统实验报告
公交IC卡管理系统
一目的
运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。
通过课程设计提高学生综合运用所学知识来解决实际问题及进行科学实验或技术设计的初步能力。
对于本课程设计而言重点在熟悉C语言基本语法规范以及灵活运用C语言编程解决实际问题。
二需求分析
1、该程序主要为实现某公交公司关于公交IC卡的管理,首先应包括基本卡号及其相关信息(如卡号所对应的初始金额)的录入系统;
2、应拥有用户乘车处理系统,即记录用户乘车明细(如乘车日期,所称车辆)并实现将乘车费用在相应卡上进行扣除;
3、当某卡余额不足时,用户可对其进行充值以实现长久使用;
4、应具有查询功能,即输入某一卡号,便可对该卡内余额,扣费明细进行查询;
5、以上功能以菜单方式出现并执行。
三概要设计
1、主函数模块
定义一个结构体组,用来储存IC卡信息
typedefstructinformation
{
charcardnumber[11];/*卡号*/
floatbalance;/*余额*/
longdate[N];/*乘车日期*/
intbusnumber[N];/*所乘车*/
floatexpenses[N];/*费用*/
}INFORMATION;
main()
{
定义变量及对其进行初始化;
利用do-while循环执行菜单;
将调用函数插入菜单中;
由键盘录入来确定循环是否继续;
}
2、被调用函数模块
①intInputInformation(INFORMATIONinf[])
/*函数功能:
基本信息包括卡号(只允许录入十位卡号)和初始金额的录入
函数参数:
inf为结构体组
函数返回值:
录入卡号个数
*/
{
定义变量及其初始化;
利用do-while进行基本信息即卡号(只允许录入十位)及初始金额的录入,并记录每位卡号所对应的下标值;
由键盘录入的字符来确定是否停止对该函数的调用;
返回录入的卡号个数;
}
②intProcessingService(INFORMATIONinf[],inti,float*p)
/*函数功能:
乘车明细输入以及对帐户进行扣费处理,若余额不足则进行提示
函数参数:
inf为结构体组,i为所输卡号对应下标值,*p为账户余额地址
函数返回值:
乘车次数
*/
{
定义变量及其初始化;
在主函数中输入卡号并调用查找函数找到该卡号所对应下标值传值给该函数;
记录该卡号的扣费明细;
当卡内余额不足时不予以扣费并提示尽快充值;
由键盘录入的字符来确定是否停止对该函数的调用;
}
③voidRecharge(INFORMATIONinf[N],intn,float*p)
/*函数功能:
输入用户卡号及充值金额进行充值
函数参数:
inf为结构体组,n为录入卡号总数,*p为账户余额地址
函数返回值:
无
*/
{
定义变量及其初始化;
在主函数中输入卡号并调用函数找到该卡号对应余额地址传值给该函数;
由键盘录入用户想要充值的金额并进行充值;
}
④voidInquiryBusiness(INFORMATIONinf[],intn,intm)
/*函数功能:
性息查询,用户输入卡号,程序打印相关信息
函数参数:
inf为结构体组,n为录入卡号总数,m为乘车次数
函数返回值:
无
*/
{
定义变量及其初始化;
输入卡号并调用查找函数找到该卡号所对应下标值;
打印出有关该卡号的信息;
}
⑤intLinsearch(INFORMATIONinf[N],charx[],intn)
/*函数功能:
运用线性查找法查找用户输入的卡号
函数参数:
inf为结构体组,x为用户输入的卡号,n为录入卡号总数
函数返回值:
若找到则返回其下标值,找不到则返回-1
*/
{
定义变量及其初始化;
输入卡号并调用查找函数找到该卡号所对应下标值并返回给调用函数;
}
⑥intInputInformationTwo(INFORMATIONinf[],intn)
/*函数功能:
第二次及其以后再次录入基本信息
函数参数:
inf为结构体组,n为录入卡号总数
函数返回值:
录入卡号个数
*/
{
定义变量及其初始化;
利用do-while进行基本信息即卡号(只允许录入十位)及初始金额的录入,并记录每位卡号所对应的下标值;
由键盘录入的字符来确定是否停止对该函数的调用;
返回录入的卡号个数;
}
整个程序的流程图如下所示:
order不等于5
四详细设计
/*主题:
公交IC卡管理系统
功能:
基本信息包括卡号,初始金额的录入;输入卡号进行乘车扣费,充值,乘车明细答应
编程语言:
C
*/
#include
#include
#include
#defineN100
typedefstructinformation
{
charcardnumber[11];/*卡号*/
floatbalance;/*余额*/
longdate[N];/*乘车日期*/
intbusnumber[N];/*所乘车*/
floatexpenses[N];/*费用*/
}INFORMATION;
intInputInformation(INFORMATIONinf[]);
intInputInformationTwo(INFORMATIONinf[],intn);
voidRecharge(INFORMATIONinf[],intn,float*p);
intLinsearch(INFORMATIONinf[N],charx[],intn);
voidInquiryBusiness(INFORMATIONinf[],intn,intm);
intProcessingService(INFORMATIONinf[],inti,float*p);
intmain()
{
intorder;
intn;/*录入卡号的个数*/
inti;/*用户输入查找卡号的返回下标值*/
intj;/*某卡号记载的乘车明细的下标值*/
charx[11];
INFORMATIONinf[N];
printf("Enter1toinputthebasicinformation\n");
printf("Enter2toentertoprocessingservice\n");
printf("Enter3torecharge\n");
printf("Enter4toinquirybusiness\n");
printf("Enter5tostoptheprogram\n");
do{
printf("Inputthenumberwhichyouchoose\n");
scanf("%d",&order);
}while(order!
=1&&order!
=2&&order!
=3&&order!
=4&&order!
=5);
if(order==1)
{
n=InputInformation(inf);
printf("Thereare%dcards\n",n);
}
elseif(order==2||order==3||order==4)
{
do{
printf("Pleasechoose1andinputthebasicinformation\n");
scanf("%d",&order);
}while(order!
=1);
n=InputInformation(inf);
printf("Thereare%dcards\n",n);
}
else
exit(0);
do{
printf("Enter1toinputthebasicinformation\n");
printf("Enter2toentertoprocessingservice\n");
printf("Enter3torecharge\n");
printf("Enter4toinquirybusiness\n");
printf("Enter5tostoptheprogram\n");
do{
printf("Inputthenumberwhichyouchoose\n");
scanf("%d",&order);
}while(order!
=1&&order!
=2&&order!
=3&&order!
=4&&order!
=5);
if(order==1)
{
n=InputInformationTwo(inf,n);
printf("Thereare%dcards\n",n);
}
if(order==2)
{
do{
printf("inputyourcardnumber\n");
scanf("%s",x);
i=Linsearch(inf,x,n);
}while(i==-1);
j=ProcessingService(inf,i,&inf[i].balance);/*j为乘车次数*/
}
if(order==3)
{
do{
printf("inputyourcardnumber\n");
scanf("%s",x);
i=Linsearch(inf,x,n);
}while(i==-1);
Recharge(inf,n,&inf[i].balance);
}
if(order==4)
{
InquiryBusiness(inf,n,j);
}
}while(order!
=5);
return0;
}
/*输入用户卡号及充值金额进行充值,无返回值*/
voidRecharge(INFORMATIONinf[N],intn,float*p)
{
floatmoney;
printf("yourcard'sbalanceis%.2f\n",*p);
do{
printf("Howmuchmoneydoyouwanttorecharge?
\n");
scanf("%f",&money);
}while(money<0);
*p=*p+money;
printf("yourcard'sbalanceis%.2f\n",*p);
}
/*基本信息包括卡号(只允许录入十位卡号)和初始金额的录入,并返回录入卡号个数*/
intInputInformation(INFORMATIONinf[])
{
intdigit;
inti,j,a;
charreply;
i=-1;
do{
i++;
do{
digit=0;
printf("inputthecardnumber\n");
scanf("%s",inf[i].cardnumber);
for(j=0;inf[i].cardnumber[j]!
='\0';j++)
{
if(inf[i].cardnumber[j]>='0'&&inf[i].cardnumber[j]<='9')
digit++;
else
;
}
}while(digit!
=10);
do{
printf("Inputinitialmoney\n");
scanf("%f",&inf[i].balance);
}while(inf[i].balance<0);
printf("Doyouwanttocontinue?
\n");
printf("enter'y'iscontinue,and'n'isstop\n");
scanf("%c",&reply);
}while(reply=='y'||reply=='Y');
a=i+1;
returna;
}
/*运用线性查找法查找用户输入的卡号,若找到则返回其下标值,找不到则返回-1*/
intLinsearch(INFORMATIONinf[N],charx[],intn)
{
inti;
for(i=0;i{
if(strcmp(x,inf[i].cardnumber)==0)
returni;
else;
}
return-1;
}
/*性息查询,用户输入卡号,程序打印相关信息,无返回值*/
voidInquiryBusiness(INFORMATIONinf[],intn,intm)
{
charx[11];
inti;
intj;
do{
printf("inputyourcardnumber\n");
scanf("%s",x);
i=Linsearch(inf,x,n);
}while(i==-1);
printf("theinformationis:
\n");
printf("thecardnumberis%s\n",inf[i].cardnumber);
printf("thebalanceis%.2f\n",inf[i].balance);
for(j=0;j<=m;j++)
{
printf("thedateis%ld\n",inf[i].date[j]);
printf("thebusnumberis%d\n",inf[i].busnumber[j]);
printf("theexpensesis%.2f\n",inf[i].expenses[j]);
}
}
/*乘车明细输入以及对帐户进行扣费处理,若余额不足则进行提示,返回值为乘车次数*/
intProcessingService(INFORMATIONinf[],inti,float*p)
{
intj=-1;
intflag=1;
charreply;
do{
j++;
do{
printf("Inputthedate,busnumberandexpenses\n");
scanf("%ld",&inf[i].date[j]);
scanf("%d",&inf[i].busnumber[j]);
scanf("%f",&inf[i].expenses[j]);
}while(inf[i].date[j]<=0||inf[i].busnumber[j]<=0||inf[i].expenses[j]<=0);
*p=*p-inf[i].expenses[j];
if(*p<0)
{
printf("thebalanceisnotenough,pleaserechargeasquicklyaspossible\n");
flag=0;
*p=*p+inf[i].expenses[j];
printf("yourcradbalanceis%.2f\n",*p);
}
else
{
printf("yourcradbalanceis%.2f\n",*p);
}
printf("Doyouwanttocontinue?
\n");
printf("enter'y'iscontinue,and'n'isstop\n");
scanf("%c",&reply);
}while(reply=='y'||reply=='Y');
returnj;
}
/*第二次及其以后再次录入基本信息,并返回录入卡号个数*/
intInputInformationTwo(INFORMATIONinf[],intn)
{
intdigit;
inti,j,a;
charreply;
i=n-1;
do{
i++;
do{
digit=0;
printf("inputthecardnumber\n");
scanf("%s",inf[i].cardnumber);
for(j=0;inf[i].cardnumber[j]!
='\0';j++)
{
if(inf[i].cardnumber[j]>='0'&&inf[i].cardnumber[j]<='9')
digit++;
else
;
}
}while(digit!
=10);
do{
printf("Inputinitialmoney\n");
scanf("%f",&inf[i].balance);
}while(inf[i].balance<0);
printf("Doyouwanttocontinue?
\n");
printf("enter'y'iscontinue,and'n'isstop\n");
scanf("%c",&reply);
}while(reply=='y'||reply=='Y');
a=i+1;
returna;
}
五调试分析
1、应使用循环以确保录入的初始金额,充值金额,乘车费用均不为负值;
2、应使用循环以确保录入卡号位数的正确性;
3、由于有从键盘录入字符环节,则应防止缓冲区中回车符的误入而影响程序;
4、由于程序信息没有用文件进行保存,因此每次程序运行都要进行初始信息的录入。
六测试结果
1、录入卡号及初始金额;
2.、输入用户卡号录入乘车明细并对其进行扣费处理;
3、输入卡号并进行充值;
4、输入卡号进行相关信息的查询。
七用户使用说明
1、该程序可在VC环境中运行;
2、程序开始运行后,会以菜单的方式展开,用户可通过由键盘输入相应的数字进入需要的功能系统;
3、本程序只允许位数为十位的卡号;
八课程设计总结
程序使用结构体组,函数调用,多种循环以及选择结构基本完成设计要求。