c语言中简易公交一卡通系统的实现
1.基本功能介绍:
系统启动则进入登陆菜单。
根据不同角色的选取来确定是普通用户还是管理员帐户
- 添加新卡
能够添加一张新卡,卡号按照自然数列向下自动产生,而用户名键盘输入,系统创建新卡用户,初始余额为0,状态为使用中。 - 注销旧卡
由用户输入要注销的用户名,并输入要注销的卡号,若输入正确则显示卡用户注销成功!该卡状态为已注销。 - 修改卡的信息
由用户输入自己的用户账号,如果输入正确的用户账号,则显示用户的旧用户名,然后由用户输入进行更改的用户名,并且输入两次,两次必须输入一致,若两次输入不一致,则需要重新输入,两次输入一致则显示用户名修改成功。 - 查询所有用户信息及状态
系统显示目前的所有用户账号,用户名称,用户余额以及用户状态,状态显示为1则为可用,状态显示为0则为已注销。 - 查询现有余额最多的用户
系统会自动找出目前余额最多的用户,并显示其全部信息。 - 进入乘车读卡扣费界面
由用户输入自己的卡号,若输入卡号正确,则系统会要求输入乘坐的站数,站数为130站,10站以内1元,1115站2元,1620站3元,2125站4元,2630站5元。用户输入范围内的乘坐站数后显示交易成功,并扣除相应的金额,并显示本卡余额。若输入的站数不是130,则显示输入的站数非法,请重新刷卡。若输入的卡号不正确则会提示:该账户不存在,请联系管理员注册用户。 - 公交一卡通充值
由用户输入要充值的卡号,若输入正确则显示账号名和用户名,用户再输入要充值的金额,出入完成后系统会显示充值成功;若输入的卡号不存在,则提示该账户不存在,请注册新用户。
2.设计思路
1.需要存储一定的信息,则考虑使用结构体进行存储,为了查找使用链表。
2.每次使用完程序关闭程序后将链表转存成进文件,下次打开该程序后将上次已经存入的数据转成链表进行相关操作。
3.代码
// An highlighted block
/*编译项目:公交一卡通系统*/
/*编译环境:vs2010*/
/*编译人:李和平*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>
#include<malloc.h>
#include<time.h>
#include<string.h>
typedef struct Bus //自定义结构体
{
int num; //卡号从0开始依次上升
char name[20]; //卡用户的姓名
int money; //卡用户的余额默认为0
int state; //用户状态默认为1(使用),状态为0(注销)
struct Bus * pnext;
//连接
}Bus;
static int NUMBER=0; //静态全局变量
struct Bus * Head = NULL;//链表头指针
struct Bus * End = NULL; //链表尾指针
void Save() //存入板块
{
FILE * pfile=NULL;
struct Bus * atemp=Head;
if(atemp==NULL)
{
return;
}
pfile=fopen("公交一卡通.dat","wb");
//以二进制格式打开一个文件只用于写入。
//如果该文件已存在则将其覆盖。
//如果该文件不存在,创建新文件。
if(pfile==NULL)
{
printf("\n警告:用户数据丢失请检查!!!\n");
}
while(atemp!=NULL)
{
fwrite(atemp,sizeof(struct Bus),1,pfile);
/*是要输出数据的地址。
要写入的字节数;
要进行写入size字节的数据项的个数;
目标文件指针。*/
atemp=atemp->pnext;
}
fclose(pfile);
}
void Read() //读取板块
{
int count=0;
FILE *fp;
if ((fp = fopen("公交一卡通.dat", "rb")) == NULL )
{
printf("\n警告:用户数据丢失请检查!!!\n");
return;
}
else
{
while(!feof(fp))
{
Bus * atemp=(struct Bus *)malloc(sizeof(struct Bus));
fread(atemp, sizeof(struct Bus), 1, fp);
count++;
}
fp = fopen("公交一卡通.dat", "rb");
while(count!=1)
{
Bus * atemp=(struct Bus *)malloc(sizeof(struct Bus));
fread(atemp, sizeof(struct Bus), 1, fp);
if (NULL==Head||NULL==End) //排除只有头尾的情况
{
Head = atemp; //链表为空,新节点即是头也是尾
End = atemp;
}
else
{
End->pnext =atemp; //新节点下一个指向尾
End = atemp; //新节点变成尾
}
count--;
}
}
fclose(fp);
}
void loading()//虚假的加载界面
{
int k=1;
system("color 0c");
for(;k<3;k++)
{
system("cls");
printf("| 请稍等. | \n");
printf("| 加载中: -- | \n");
Sleep(200);system("cls");
printf("| 请稍等.. | \n");
printf("| 加载中: \\ | \n");
Sleep(200);system("cls");
printf("| 请稍等... | \n");
printf("| 加载中: || | \n");
Sleep(200);system("cls");
printf("| 请稍等.... | \n");
printf("| 加载中: // | \n");
Sleep(200);system("cls");
printf("| 请稍等..... | \n");
printf("| 加载中: -- | \n");
Sleep(200);system("cls");
printf("| 请稍等...... | \n");
printf("| 加载中: \\ | \n");
Sleep(200);system("cls");
printf("| 请稍等...... | \n");
printf("| 加载中: || | \n");
Sleep(200);system("cls");
printf("| 请稍等...... | \n");
printf("| 加载中: // | \n");
Sleep(200);system("cls");
}
}
void CreateList() //创建板块
{
Bus * atemp=(struct Bus *)malloc(sizeof(struct Bus));//空信息结点
//struct Bus * temp =Head; //重新定义一个指针记住头
strcpy(atemp->name,"--++--++");
atemp->num =-1;
atemp->state =-1;
atemp->pnext =NULL;
Head = atemp; //链表为空,新节点即是头也是尾
End =atemp; //
}
void Add2() //回收板块
{
char name[20];
struct Bus * atemp=Head;
while(atemp!=NULL)
{
if(atemp->state == 0)
{
break;
}
atemp=atemp->pnext ;
}
printf("欢迎添加新用户:\n");Sleep(50);
printf("请输入新用户的用户名\n");Sleep(50);
scanf("%s",name);
atemp->money =0;
atemp->state =1;
strcpy(atemp->name,name);
printf("新卡用户创建成功!\n");Sleep(50);
printf("卡号:%d\n",atemp->num );Sleep(50);
printf("用户名:%s\n",atemp->name );Sleep(50);
printf("余额:%d\n",atemp->money );Sleep(50);
if(atemp->state ==1)
{
printf("状态:使用中\n");Sleep(50);
}
else
{
printf("状态:已注销\n");Sleep(50);
}
system("pause");
}
void Add1() //添加板块
{
char name[20];
Bus * atemp=(struct Bus *)malloc(sizeof(struct Bus));
printf("欢迎添加新用户:\n");Sleep(50);
printf("请输入新用户的用户名\n");Sleep(50