公交IC卡管理系统
#include "stdio.h" //标准输入输出头文件
#include "string.h" //字符串处理头文件
#include "windows.h" //为界面改变背景及文字颜色
#include "stdlib.h"
/*
** 定义一个结构体,用于存储公交IC卡的基本信息
*/
typedef struct
{
char NO[10]; //公交IC卡卡号
char name[20]; //公交IC卡持卡人姓名
double money; //公交IC卡中现有金额
int flag; //标志变量,用于
公交IC卡的状态是否为挂失
}IC_card;
static int card_num; //存储所有的IC卡数目
static int total_thing[1000]; //存储IC卡使用乘车总次数
static int car_num[1000][50]; //存储乘坐的车次
static double car_money[1000][50]; //存储乘坐的车的费用
void input_card_information(IC_card Card[]); int input_card_number_1(IC_card Card[]); int input_card_number_2(IC_card Card[]); void charge_card(IC_card Card[], int card_num); void search_information(IC_card Card[], int counter); void consume_card(IC_card Card[], int counter); void register_loss(IC_card Card[], int counter); void cancel_register_loss(IC_card Card[], int counter);
void cancel_card(IC_card Card[], int counter); int main()
{
IC_card Card[1000];
int counter, choice, flag_1 = 1;
char s[20]; //对公交IC卡进行操作用于存储公交卡号以用于
char reply;
system("color 02");
do
{
/*
** 操作菜单
*/
printf("\n******************************************************************
****\n");
printf(" ??????????????????????????\n");
printf(" ?************欢迎使用公交IC卡管理系统************?\n");
printf(" ??????????????????????????\n");
printf(" ?1 公交IC卡的基本信息(包含卡号、初始金额)录入: ?\n");
printf(" ??????????????????????????\n");
printf(" ?2 公交IC卡消费: ?\n");
printf(" ??????????????????????????\n");
printf(" ?3 公交IC卡充值: ?\n");
printf(" ??????????????????????????\n");
printf(" ?4 公交IC卡查询: ?\n");
printf(" ??????????????????????????\n");
printf(" ?5 公交IC卡挂失: ?\n");
printf(" ??????????????????????????\n");
printf(" ?6 公交IC卡解除挂失: ?\n");
printf(" ??????????????????????????\n");
printf(" ?7 公交IC卡注销: ?\n");
printf(" ??? printf(" ?0 退出系统:
?\n");
printf(" ??????????????????????????\n");
printf("\n****请输入您想要进行的操作的选项前面的数字:");
scanf("%d",&choice);
printf("\n");
/*
** 对菜单的选择进行处理
*/
switch (choice)
{
/*
** 处理公交IC卡的基本信息录入
*/
case 1:
{
do
{
input_card_information(Card);
printf("你想继续录入公交IC卡信息吗,\n");
printf("继续请按’Y‘或者’y‘,退出录入请按’N‘或者’n‘:");
scanf("%c",&reply);
getchar(); //吸收回车符
printf("***********************************************************\n\n");
}while ((reply=='Y')||(reply=='y'));
reply = 'n';
system("pause");
break;
}
/*
** 公交卡消费
*/
case 2:
{
do
{
counter = input_card_number_1(Card);
if (counter == -1)
{
break;
}
else
{
consume_card(Card, counter);
}
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
printf("***********************************************************\n\n");
}while ((reply=='Y')||(reply=='y'));
reply = 'n';
counter = 0;
system("pause");
break;
}
/*
** 处理公交IC卡的充值
*/
case 3:
{
do
{
counter = input_card_number_1(Card);
if (counter == -1)
{
break;
}
else
{
charge_card(Card, counter);
}
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
printf("***********************************************************\n\n");
}while ((reply=='Y')||(reply=='y'));
reply = 'n';
counter = 0;
system("pause");
break;
}
/*
** 处理公交IC卡的信息查询
*/
case 4:
{
do
{
counter = input_card_number_1(Card);
if (counter == -1)
{
break;
}
else
{
search_information(Card, counter);
}
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
printf("***************** }while ((reply=='Y')||(reply=='y'));
reply = 'n';
counter = 0;
system("pause");
break;
}
/*
** 处理公交IC卡的挂失
*/
case 5:
{
do
{
counter = input_card_number_1(Card);
if (counter == -1)
{
break;
}
else
{
register_loss(Card, counter);
}
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
printf("***********************************************************\n\n");
}while ((reply=='Y')||(reply=='y'));
reply = 'n';
counter = 0;
system("pause");
break;
}
case 6:
{
do
{
counter = input_card_number_2(Card);
if (counter == -1)
{
break;
}
else
{
cancel_register_loss(Card, counter);
}
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
printf("***********************************************************\n\n");
}while ((reply=='Y')||(reply=='y'));
reply = 'n';
counter = 0;
system("pause");
break;
}
/*
** 处理公交IC卡的注销
*/
case 7:
{
do
{
counter = input_card_number_1(Card);
if (counter == -1)
{
break;
}
else
{
cancel_card(Card, counter);
}
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
printf("***********************************************************\n\n");
}while ((reply=='Y')||(reply=='y'));
reply = 'n';
counter = 0;
system("pause");
break;
}
/*
** 程序退出
*/
case 0:
{
do
{
printf("是否确定退出程序,确定请按’Y‘或者’y‘不退出请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
printf("欢迎下次使用本程序~\n");
system("pause");
exit(0);
}while ((reply == 'Y')||(reply == 'y'));
break;
}
}
}while (1);
}
/*
** 自定义函数:录入IC卡信息
*/
void input_card_information(IC_card Card[])
{
printf("请输入新录入公交IC卡信息:\n");
printf("****编号:");
scanf("%s", Card[card_num].NO); //键盘输入公交IC卡的卡号
getchar(); printf("****姓名:");
scanf("%s", Card[card_num].name); //输入IC卡持有者姓名
getchar(); //吸收回车符
printf("****初始金额:");
scanf("%lf", &Card[card_num].money); //初始化IC卡金额
getchar();
Card[card_num].flag = 1; //标识变量定位该卡未被注销
card_num ++; //每录入一个IC卡的信息后,IC卡总数就加一
printf("????????????????????\n");
printf("新卡录入成功,当前共有%d个公交IC卡!\n", card_num);
printf("????????????????????\n");
}
/*
** 自定义函数:对IC卡充值
*/
void charge_card(IC_card Card[], int counter)
{
double charge; //存储对公交IC卡充值时的金额
printf("请输入充值金额:");
scanf("%lf", &charge);
getchar();
/*
** 如果找到系统中的要充值的卡号,则执行充值
*/
if (Card[counter].flag == 1)
{
printf("充值成功!\n");
printf("公交IC卡的编号:%s\n姓名:%s\n初始金额:%.2lf 目前金额:%.2lf\n",Card[counter].NO,
Card[counter].name,
Card[counter].money,
Card[counter].money+charge);
Card[counter].money += charge; //将系统中存储的金额改为充值后的金额
printf("***********************************************************\n\n");
}
}
/*
** 自定义函数:输入IC卡号,从系统中找出该卡
*/
int input_card_number_1(IC_card Card[]) {
char card_ID[20], reply;
int counter;
do
{
printf("请输入公交IC卡的编号:");
scanf("%s", card_ID);
getchar();
/*
** 将输入的要进行操作的IC卡卡号与系统录入的卡对比
*/
for(counter = 0; counter < card_num; counter++)
{
if (strcmp(card_ID, Card[counter].NO) == 0)
{
break;
}
}
/*
** 如果没有找出系统中要充值的卡号,counter会大于所输入的卡的数目
*/
if (counter == card_num)
{
printf("对不起,系统没有此IC卡的记录~~\n");
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
}
else if (Card[counter].flag == 0)
{
printf("此卡正在挂失中~~");
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
}
else
{
return counter; //若找到IC卡,则返回卡的序号
}
}while ((reply == 'Y')||(reply == 'y'));
if ((reply == 'N')||(repl {
return -1; //若返回值为-1,则放弃操作
}
}
int input_card_number_2(IC_card Card[]) {
char card_ID[20], reply;
int counter;
do
{
printf("请输入公交IC卡的编号:");
scanf("%s", card_ID);
getchar();
/*
** 将输入的要进行操作的IC卡卡号与系统录入的卡对比
*/
for(counter = 0; counter < card_num; counter++)
{
if (strcmp(card_ID, Card[counter].NO) == 0)
{
break;
}
}
/*
** 如果没有找出系统中要充值的卡号,counter会大于所输入的卡的数目
*/
if (counter == card_num)
{
printf("对不起,系统没有此IC卡的记录~~\n");
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
}
else if (Card[counter].flag == 1)
{
printf("此卡没有被挂失~~");
printf("您是否需要重新输入IC卡号以便进入操作,\n");
printf("如果您要继续输入,请按’Y‘或者’y‘,进入主菜单请按’N‘或者’n‘:");
scanf("%c", &reply);
getchar(); //吸收回车符
}
else
{
return counter; //若找到IC卡,则返回卡的序号
}
}while ((reply == 'Y')||(reply == 'y'));
if ((reply == 'N')||(reply == 'n'))
{
return -1; //若返回值为-1,则放弃操作
}
}
/*
** IC卡信息查询
*/
void search_information(IC_card Card[], int counter) {
int counter_1;
printf("**公交IC卡的编号:%s\n", Card[counter].NO);
printf("**姓名:%s\n****目前金额:%.2f\n", Card[counter].name,
Card[counter].money,
Card[counter].money);
for(counter_1 = 0; counter_1 < total_thing[counter]; counter_1++)
{
printf("**乘坐的公共汽车的车次有:%d\n", car_num[counter][counter_1]);
printf("**乘坐该次公共汽车消费为:%.2f\n", car_money[counter][counter_1]);
}
printf("***********************************************************\n\n");
}
/*
** IC卡消费
*/
void consume_card(IC_card Card[], int counter) {
int N = total_thing[counter];
printf("请输入乘坐的公共汽车的车次:");
scanf("%d", &car_num[counter][N]);
getchar();
printf("请输入乘坐该车次的费用:");
scanf("%lf", &car_money[counter][N]);
getchar();
Card[counter].money -= car_money[counter][N];
total_thing[counter] ++;
printf("***********************************************************\n\n");
}
void register_loss(IC_card Card[], int counter) {
Card[counter].flag = 0;
printf("公交IC卡已成功挂失。\n");
printf("***********************************************************\n\n");
}
void cancel_register_loss(IC_card Card[], int counter) {
Card[counter].flag = 1;
pr
printf("***********************************************************\n\n");
}
void cancel_card(IC_card Card[], int counter) {
for(; counter < card_num-1; counter++)
{
Card[counter] = Card[counter+1];
}
card_num --; //注销成功后,将目前公交IC卡的数目改为目前的总数
printf("注销成功,还剩余%d公交IC卡\n", card_num);
printf("***********************************************************\n\n");
}