食堂饭卡管理系统C语言——课程设计实习

绪论

饭卡管理系统要实现注册发卡、就餐消费、挂失账户、注销账户、押金记录、查询账户等功能。基于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语言都对自己的职业很有帮助。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值