绪论
饭卡管理系统要实现注册发卡、就餐消费、挂失账户、注销账户、押金记录、查询账户等功能。基于C语言开发实现的食堂饭卡管理系统,是一套针对大学校园食堂交费和一般消费等方面的信息管理系统,它包括学生在校内消费的各方面内容:刷卡消费、查询、充值和持卡者信息管理等,方便对饭卡信息进行各项操作,保持数据的一致性和准确性。另外,各方面的内容应该相互联系,最终产生各种查询统计报表,以供持卡者进行检查。对于此系统的任务就是把人们从繁琐的交费、找零工作中解放出来,用计算实现存款、消费、查询,修改、删除以及存储等功能。同时,用计算机能够快速准确地完成资料的统计和汇总工作,迅速地打印出各种报表以供使用。当今世界已经进入了在计算机领域中激烈竞争的时代,应用计算机已经变得十分普遍了,随着科学技术的不断提高,计算机日益成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用,越来越多的管理人员意识到信息管理的重要性。
设计要求:
(1)发卡 持有效证件到管理处缴纳押金办理就餐卡。
(2)存款 持卡人存款不足时,到管理处交款存入就餐卡,并打印一张收据。
(3)就餐 显示就餐卡中的余额,工作人员键入本次用餐金额进行结算。(4)挂失 持卡人不慎将卡丢失,可到管理处进行挂失。
(5)注销 退取押金。
设计框图:
设计内容:
-
设计主界面
设计主界面,主界面中分为七个选项,分别为发卡,存款,就餐,挂失,注销,退出,查看饭卡信息,用户可进行功能选择。 -
注册发卡
根据学生用户唯一学号进行注册饭卡账户信息,即只能拥有唯一账户,重复系统给出提示,管理员根据提示要求输入相关信息,系统写入文件并进行持久化存储,以便后期维护查询。 -
就餐消费
学生使用饭卡进行刷卡消费,使用饭卡输入唯一标识学号,判断余额足够的情况的下可以进行消费,成功消费并显示余额,否则根据系统提示进行相关操作。 -
挂失账户
挂失界面设计 ,分为挂失,解挂选项,挂失的账户处于临时冻结状态,消费,充值等功能无效。 -
注销账户
输入唯一标识学号进行注销操作,系统写入文件并删除该用户信息,领取押金。 -
查询账户
主界面选择相关功能,查看已注册的用户的信息。 -
退出系统
主界面选择退出功能,退出系统。
模块设计:
- void menu() //主菜单
- void Create_card() //注册发卡
- void Recharge_money() //充值金额
- void Consume() //消费就餐
- void Show_information() //查询信息
- void Lose_card() //挂失账户
- void Cancel_card() //注销账户
- void Save() //保存信息
- void Exit() //退出系统
C语言源程序——建议使用Devc ++ 运行
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
# define max 10
struct Card
{
char Id[100]; //学号定义为字符串
char Name[100]; //名字定义为字符串
char State; //饭卡状态0 为正常 1为挂失饭卡
float Balance; //饭卡余额为浮点类型
int Deposit; //押金
} Card [max]; //定义结构体最大2000人
int Count=0; //标记建立饭卡的数量
void menu(){ //菜单
printf("\n");
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 食堂饭卡管理系统 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 1. 发卡 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 2. 存款 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 3. 就餐 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 4. 挂失 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 5. 注销 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 6. 退出 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 7. 查看饭卡信息 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
printf("\t\t\t\t\t\t 请您选择(1-7):\t");
}
void Save()
{
FILE *fp;//打开文件保存信息所用的指针
int i;
fp= fopen("饭卡管理数据.txt", "w");//建立一个名字为:饭卡管理数据.txt的文件
for(i=0; i<Count; i++)//for循环进行储存信息
{
fprintf(fp,"%d %s %s %d %.2f %d\n",Count,Card[i].Id,Card[i].Name,Card[i].State,Card[i].Balance,Card[i].Deposit);//储存标记 学号 姓名 饭卡状态 饭卡余额
}
fclose(fp);//关闭文件
}
void Exit(){
Save();
}
void Create_card()
{
char a;
fflush(stdin); //使输入内容不影响以后的程序
printf("\n请输入卡号:");
gets( Card[Count].Id);//获取卡号
for(int i=0;i<Count;i++){
if(strcmp(Card[Count].Id,Card[i].Id)==0){
printf("===================================该用户已存在!======================================\n");
printf("\n请重新输入卡号:");
gets( Card[Count].Id);//获取卡号
}
}
fflush(stdin);
printf("\n请输入姓名:");
gets(Card[Count].Name);//获得名字
fflush(stdin);
Card[Count].State=0;//建立饭卡初状态为0表示可以使用
fflush(stdin);
printf("\n请输入饭卡余额:");
scanf("%f",&Card[Count].Balance);//获得饭卡费
printf("\n请输入押金:");
scanf("%d",&Card[Count].Deposit);//获得饭卡费
//Card[Count].Deposit = 20 ;
printf("\n");
fflush(stdin);
printf("=====================================建立成功!======================================\n");
printf("===================================轻触回车以继续!====================================");
a=getchar();
Count++;
Save();
}
void Show_information()
{
int j;
char x;
do
{
printf("\n");
printf("\t\t=================================用户======================================\n");
printf("\t\t卡号\t\t姓名\t\t状态\t\t 余额 押金\n");
for(j=0; j<Count; j++){ //循环,显示出所建立饭卡的各个信息
if(Card[j].State == 0){
printf("\t\t%s\t\t%s\t\t正常 \t", Card[j].Id, Card[j].Name, Card[j].State);
printf("\t\t%6.2f",Card[j].Balance);
printf("\t\t%d\n",Card[j].Deposit);
}else{
printf("\t\t%s\t\t%s\t\t已锁定\t", Card[j].Id, Card[j].Name, Card[j].State);
printf("\t\t%6.2f",Card[j].Balance);
printf("\t\t%d\n",Card[j].Deposit);
}
}
fflush(stdin);
printf("请输入回车以返回:");
x=getchar();
}
while(x=='n');
}
void Consume()
{
int i;
float m;
char a;
char num[20];
do
{
system("cls");
fflush(stdin);
printf("\n请输入您的卡号:");
gets(num);
fflush(stdin);
printf("\n请输入价格:");
scanf("%f",&m);
if(m<=0)
printf("\n请正确输入饭费!\n");
else
{
for(i=0; i<Count; i++)
if(strcmp(num,Card[i].Id)==0) //字符串比较寻找饭卡
break;
if(i==Count)
printf("=================================该用户不存在!====================================\n");
else if(Card[i].State==1)
printf("===================================该卡号已冻结!======================================\n");
else if(Card[i].Balance < m) //小于饭钱则提醒充卡费
{
printf("================================余额不足,请充值!!==================================\n");
printf("===============================该用户余额:%5.2f 元===================================\n",Card[i].Balance);
}
else
{
printf("\n消费前:%5.2f\n",Card[i].Balance);
Card[i].Balance=Card[i].Balance-m; //实现饭卡费的扣除
printf("\n消费后:%5.2f\n",Card[i].Balance);
}
}
printf("\n是否继续买饭?\n请输入【y或n】:\t\t");
fflush(stdin);
a=getchar();
}
while(a=='y');//do while循环
Save();
}
void Recharge_money()
{
int i;
float m;
char num[10];
char a;
do
{
system("cls");
fflush(stdin);
printf("\n请输入您的卡号:");
gets(num);
fflush(stdin);
printf("\n请输入您的充值金额:");
scanf("%f",&m);
if(m<=0)
printf("================================ 输入错误!====================================\n");
else
{
for(i=0; i<Count; i++)
if(strcmp(num,Card[i].Id)==0) //字符串比较寻找饭卡
break;
if(i==Count)
printf("=================================该用户不存在!====================================\n");
else
{
printf("\n原卡钱:%5.2f\n",Card[i].Balance);
Card[i].Balance=Card[i].Balance+m; //实现饭卡的充钱
printf("\n现卡钱:%5.2f\n",Card[i].Balance);
}
}
printf("\n是否继续充值?\n请输入【y或n】\t\t");
fflush(stdin);
a=getchar();
}
while (a=='y');
Save();
}
void Cancel_card()
{
char Id[20],c;
int a,b,i;
do
{
fflush(stdin);
printf("请输入要注销的卡号!");
gets(Id);
for(a=0; a<Count; a++)
{
if(strcmp(Id,Card[a].Id)==0)
break;
}
for(b=a; b<Count; b++)
Card[b]=Card[b+1];
if(a>=Count)
printf("================================ 此用户不存在!====================================\n");
else
{
Count--;
printf("=====================================注销成功!!======================================\n");
Show_information();
}
fflush(stdin);
printf("是否继续进行注销操作?【(y/n)】 \t\t");
c=getchar();
}
while(c=='y');
Save();
}
void Lose_card()
{
char temp[20];
int b,c;
fflush(stdin);
printf("\n请输入您的卡号:");
gets(temp);
for(c=0; c<Count; c++)
{
if(strcmp(temp,Card[c].Id)==0)//比较数组中的学号字符串信息是否有一致的
break;
}
fflush(stdin);
printf("\n==========================");
printf("\n请选择功能:1.挂失 2.解挂");
printf("\n==========================\n");
scanf("%d",&b);
if(c>=Count){
printf("====================================该用户不存在!!======================================\n");
}else{
if(b==1)
{
Card[c].State=1;
printf("====================================挂失成功!!======================================\n");
}
if(b==2)
{
Card[c].State=0;//通过改变状态0或爱着1 来实现饭卡挂失与解挂
printf("====================================解挂成功!!======================================\n");
}
}
Show_information();//调用显示函数来显示还剩余的饭卡数量
Save();
}
int main()
{
system("color 0f");
int Option;
int i=0;
FILE *fp;
if((fp=fopen("饭卡管理数据.txt","a+"))==NULL)// 打开文件并且让fp指向 文件
{
printf("Can not open file\n");
Save();
}
while(!feof(fp)) //读取一组数据后指针指向下一组数据,并且判断是否指向最后一行
{
fscanf(fp,"%d %s %s %d %f %d\n",&Count,&Card[i].Id,&Card[i].Name,&Card[i].State,&Card[i].Balance,&Card[i].Deposit);//分别读取txt文档中的 标记,学号,姓名,状态,余额信息并存入数组
i++;
}
fclose(fp);//关闭文件
do
{ system("cls");
menu();
fflush(stdin);
scanf("%d",&Option);
switch(Option)
{
case 1:
Create_card();
break;
case 2:
Recharge_money();
break;
case 3:
Consume();
break;
case 4:
Lose_card();
break;
case 5:
Cancel_card();
break;
case 6:
Exit();
break;
case 7:
Show_information();
break;
default : printf("\n===================================输入错误!======================================\n");
system("pause");
}//通过switch函数来选择需要调用的函数
}
while (Option!=6);
return 0;
}
简要说明
- 代码运行后在同一路径自动创建相应TXT文件,并进行持久化存储
- 自动创建失败,可手动创建(饭卡管理数据.txt),运行代码
- 使用DevC ++ 编译并运行,否则出现不同语法错误!!
结论
经过一段时间的设计和开发,食堂饭卡系统基本开发完毕,系统功能基本符合饭卡管理的需求,由于时间比较紧迫,该系统还有些不足之处,比如有些界面做的不够漂亮,不够人性化。有的操作有点繁琐,这些都是后续工作可以更好完善的。功能不够周全,还需要进一步的完善。 对于一些复杂的代码还需要进一步的修改,使之更加简捷易懂。在开发食堂饭卡系统的过程中,出现了很多问题,如当调试时,出现,页面加载不进去,以前我们只知道单- -的调试方法,即点击调试按钮,不知道代码出错信息在哪里,很难调试成功,后来经过到网上搜索信息,以及请教老师和同学,渐渐的懂得了如何调试程序,这需要在相应的函数添加断点,按F10 分段调试, 一点一点地调试,就能找出错误出现在哪个地方,然后再不断的调试。
还有自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲自编写一个陌生的程序的时候会有种无法下手的感觉,找不到突破口。逐渐理清了顺序,对于简单的程序和一些相对比较繁琐的嵌套,循环,不在是看着一头雾水。其实只要理清了思路,把基础知识掌握了,然后有条不紊的分析,一步一步理解,C语言还是很有意思的课程。 自己亲自动手编写程序让我增加了对C语言程序开发环境的了解,在上课的时候老师就讲,学习C语言最重要的是学习C语言的逻辑思维,不管以后从事什么行业,学习C语言都对自己的职业很有帮助。