C语言编写停车场系统(有漏洞)

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <time.h>  
#define N 4  
#define M 5  
#define money_min 0.1  //该停车场每分钟停车费用  
  
void taxi();  
void buy();  
void search();  
void menu();  
void put();  
void manage();  
int  check1(int cnum,char key[]);  
int  check2(int cnum);  
  
int count=0;             //count为已停车位  
int insert_num=0;        //管理员每次要存入信息的人数  
int insert_sum=0;       //存入信息总人数  
int car[N][M]={0};      //车位停车情况,1为已停车,0为未停车  
  
//停车人信息,carnum为车牌号,ts,te,to分别为开始停车时间,结束停车时间,停车时间  
struct stud  
{  
    char carnum[35];  
    int ts,te,to;  
}cus[N][M];  
  
//停车卡信息,num卡号,password密码,money余额,最多存储100个车卡信息  
struct stub  
{  
    int num;  
    char password[35];  
    double money;  
}inf[100];  
  
//管理员信息,name姓名,num卡号,password为密码  
struct stup  
{  
    char name[25];  
    int num;  
    char password[35];  
}manager;   
  
int main()  
{  
    strcpy(manager.name,"hehe");  
    manager.num=10000;  
    strcpy(manager.password,"without");  
    while(1)  
    {  
        menu();  
        printf("请输入您的选择,同时按回车键确认:");  
        while(1)  
        {  
            int sel;  
            scanf("%d",&sel);  
            fflush(stdin);  
            switch(sel)  
            {             
            case 1:search();break; //停车状态查询           
            case 2:taxi();break;   //停车           
            case 3:buy();break;    //取车   
            case 4:put();break;    //自助充值  
            case 5:manage();break; //管理员管理系统  
            case 0:system("pause");system("cls");break;  
            default :printf("           输入错误,请重新输入\n");  
  
            }  
            if(sel>=0 && sel<=5) break;  
        }  
    }  
    return 0;  
}  
  
//充值函数  
void put()  
{  
    int num,i;  
    printf("充值系统已开启:\n");  
    printf("注意您每次的充值仅限为100RMB!\n");  
    printf("请输入您的卡号:");  
    scanf("%d",&num);  
    fflush(stdin);  
    if(num==0)  
    {  
        system("cls");  
        return ;  
    }  
    printf("请放好您的人民币\n");  
    system("pause");  
    //充值操作  
    for(i=0;i<insert_sum;i++)  
        if(num==inf[i].num)  
    {  
        inf[i].money+=100;  
        FILE *ft;  
        ft=fopen("pass.txt","a");  
        time_t t=time(NULL);  
        char *time=ctime(&t);  
        fprintf(ft,"id=%d,password=%s,money=%.1lf,time=%s",inf[i].num,inf[i].password,inf[i].money,time);  
        fclose(ft);  
        break;  
    }  
    printf("充值成功,您的停车卡余额:%.1lf\n",inf[i].money);  
    system("pause");  
    system("cls");  
    return ;  
}  
  
//管理员管理函数  
void manage()  
{  
    char name[25];  
    int num;  
    char password[35];  
    while(1)  
    {  
        printf("请输入姓名:");  
        scanf("%s",name);  
        fflush(stdin);  
        if(strcmp(name,"0")==0)  
        {  
            system("cls");  
            return ;  
        }  
        printf("请输入卡号:");  
        scanf("%d",&num);  
        fflush(stdin);  
        if(num==0)  
        {  
            system("cls");  
            return ;  
        }  
        printf("请输入密码:");  
        scanf("%s",password);  
        fflush(stdin);  
        if(strcmp(password,"0")==0)  
        {  
            system("cls");  
            return ;  
        }  
        if( !(strcmp(name,manager.name)==0 && (num==manager.num) &&  
           strcmp(password,manager.password)==0) )  
        {  
            printf("输入错误,请重新输入!\n");  
            system("pause");  
            system("cls");  
            continue;  
        }  
        else break;  
    }  
    printf("输入正确!\n");  
    int p_num,i;  
    FILE *fp;  
    printf("请输入您要添加信息的人数:");  
    scanf("%d",&p_num);  
    //取当前系统时间  
    time_t t=time(NULL); //调用时间函数  
    insert_num=p_num;  
    system("pause");  
    for(i=0;i<=p_num;i++)  
    {  
        system("cls");  
        if(i==p_num) //该次添加人数已满  
        {  
            printf("本次添加人数已满,将返回菜单模式!\n");  
            system("pause");  
            system("cls");  
            continue;  
        }  
        printf("已添加信息的人数:%d,剩余添加信息的人数:%d\n",i,insert_num);  
        fp=fopen("pass.txt","a");  
        char *time=ctime(&t); //记录此处的时间  
        int _num,flag;  //_num为停车卡所属者的卡号,flag为判断卡号是否有重复  
        while(1)  
        {  
            printf("卡号:");  
            scanf("%d",&_num);  
            fflush(stdin);  
            if(_num==0)  
            {  
                system("cls");  
                return ;  
            }  
            flag=check2(_num);  
            if(flag==1)  
            {  
                printf("信息已存在,请重新输入!\n");  
                continue;  
            }  
            else break;  
        }  
        inf[insert_sum].num=_num;  
        printf("密码:");  
        scanf("%s",inf[insert_sum].password);  
        fflush(stdin);  
        printf("金额:");  
        scanf("%lf",&inf[insert_sum].money);  
        fflush(stdin);  
        fprintf(fp,"id=%d,password=%s,money=%.1lf,time=%s",inf[insert_sum].num,  
                inf[insert_sum].password,inf[insert_sum].money,time); //讲信息读入文件保存以供管理员查询  
        fclose(fp);  
        printf("添加信息成功!\n");  
        insert_num--;  
        insert_sum++;  
        system("pause");  
        system("cls");  
    }  
}  
  
//查询重复号  
int check2(int _num)  
{  
    int flag=0; //flag=1表示该号已存在,0表示不存在  
    int i;  
    for(i=0;i<insert_sum;i++)  
        if(_num==inf[i].num)  
    {  
        flag=1;break;  
    }  
    return flag;  
}  
  
//查询功能,cnum为卡号,key数组为持卡人输入的密码  
int check1(int cnum,char key[])  
{  
     int flag=-1,i;  
     for(i=0;i<insert_sum;i++) //  
         if(inf[i].num==cnum)  
         {  
             if(strcmp(inf[i].password,key)==0)  
             {  
                flag=i;break;  
             }  
  
         }  
     return flag;  
}  
  
//取车系统  
void buy()  
{  
    char carnum[35];  
    int num;  
    while(1)  
    {  
        printf("请输入您的停车号:");  //停车号为num,则在密码数组中的号码为num-1;  
        scanf("%d",&num);  
        fflush(stdin);  
        if(num==0)  
        {  
            system("cls");  
            return ; //返回主菜单  
        }  
        if( !(num>0 && num<=N*M)) //停车号不大于最大停车数量  
        {  
            printf("输入错误,请重新输入!\n");  
            continue;  
        }  
        else ;  
        while(1)  
        {  
            printf("请输入您的车牌号:"); //车牌号为15个字符内  
            scanf("%s",carnum);  
            fflush(stdin);  
            if(strlen(carnum)>=15)  
            {  
                printf("输入错误,请重新输入!\n");  
                continue;  
            }  
            else break;  
        }  
        if(strcmp(carnum,cus[num/N][num%N-1].carnum)!=0) //当前用户所停车位的车牌号,与先前输入的车牌号不相同  
        {  
            printf("输入错误,请重新输入!\n");  
            continue;  
        }  
        else break;  
    }  
    int cnum,flag;  
    char key[35];  
    while(1)  
    {  
        printf("刷卡消费,请输入您的卡号:");  
        scanf("%d",&cnum);  
        fflush(stdin);  
        printf("请输入您的密码:");  
        gets(key);  
        fflush(stdin);  
        flag=check1(cnum,key);  //检查卡号和密码是否匹配  
        if(flag==-1)  
        {  
             printf("输入错误,请重新输入,必要时与管理员联系!\n"); //注意flag变量的作用  
             continue;  
        }  
        else break;  
    }  
    printf("输入正确\n");  
    system("pause");  
    system("cls");  
  
    //计录结束停车时间,并计算该车的停车时间  
    cus[num/N][num%N-1].te=time(NULL); //结束该车的停车时间  
    cus[num/N][num%N-1].to=cus[num/N][num%N-1].te-cus[num/N][num%N-1].ts;  
    int time_min=cus[num/N][num%N-1].to/60;  
    time_min= (cus[num/N][num%N-1].to-time_min*60)!=0 ? time_min+1 : time_min; //不足一分钟按一分钟计算  
    printf("您的本次停车费用:%.1lfRMB\n",time_min*money_min);  
  
    while(inf[flag].money<time_min*money_min) //当余额不足时,调用充值系统  
    {  
        printf("您的余额为%.1lf,不足,请充值\n",inf[flag].money);  
        put();  //调用充值系统  
    }  
  
    //扣除费用  
    inf[flag].money-=time_min*money_min;  
    printf("您的停车时间:%dmin\n",time_min);  
    printf("每分钟停车费用:%.1lfRMB\n",money_min);  
    printf("缴费后您的余额为:%.1lfRMB\n",inf[flag].money);  
    printf("缴费成功!\n");  
    count--;//该车离开,所停总车位-1  
    int _num;  
    srand((unsigned)time(NULL)); //调用随机函数,为该车分配出口离开  
    _num=rand()%2;  
    printf("请选择%d号出口,欢迎下次光临\n",flag+1);  
  
    //清除某车离开后该车在在停车场某车位原有的信息  
    car[num/N][num%N-1]=0;  
    strcpy(cus[num/N][num%N-1].carnum,"\0");  
    cus[num/N][num%N-1].ts=0;  
    cus[num/N][num%N-1].te=0;  
    cus[num/N][num%N-1].to=0;  
    system("pause");  
    system("cls");            
}  
  
//停车系统  
void taxi()  
{  
    char carnum[35];  
    int i,j,flag=0;  
                    //添加停车提示,为完成  
    while(1)  
    {  
        printf("请输入您的车牌号:"); //车牌号含有汉字,字母和数字,用字符  
        scanf("%s",carnum);  
        fflush(stdin);  
        if(strcmp(carnum,"0")==0)  
        {  
            system("cls");  
            return ; //返回主菜单  
        }  
        if(strlen(carnum)>=35)  
        {  
            printf("输入错误,请重新输入!\n");  
            continue;  
        }  
        else break;  
    }  
    for(i=0;i<N;i++)  
    {  
        for(j=0;j<M;j++)  
        {  
            if(car[i][j]==0)    //寻找空余可停车位  
            {  
                printf("分配给您的车位:");  
                printf("%d\n",i*N+j+1);    //i*N+j+1 为所停车位号  
                car[i][j]=1;  
                strcpy(cus[i][j].carnum,carnum);  //count 为已停车位的数目  
                flag=1;  
                break;  
            }  
        }  
        if(flag==1) break;  
    }  
    if(flag==0)  
    {  
        printf("尊敬的用户,您好,该停车场已满,请找其他停车场\n");  
        system("pause");  
        system("cls");  
    }  
    else  
    {  
        count++;  
        system("pause");  
        cus[i][j].ts=time(NULL); //计时开始  
        system("cls");  
    }  
    return ;  
}  
  
//查询系统  
void search()  
{  
    printf("\t\t\t *******欢迎使用智能停车场系统*******\n");  
    printf("\t\t\t ******************\n");  
    int i,j;  
    for(i=0; i<N; i++)  
    {  
        printf("\t\t\t  ");  
        for(j=0;j<M;j++)  
        {  
            printf(" ┃");  
            if(car[i][j]==1)  
            {  
                printf(" ■ ");  
            }  
            else  
            {  
                printf(" □ ");  
            }  
        }  
        printf(" ┃\n");  
        printf("\t\t\t  ");  
        for(j=i*M+0;j<=i*M+N;j++)  
        {  
            printf(" ┃");  
            printf(" %2d",j+1);  
        }  
            printf(" ┃\n");  
        if(i<N-1)  
    printf("\t\t\t******************\n");  
    }  
    printf("\t\t\t******************\n");  
    if(count==N*M)  
    {  
        printf("尊贵的用户,您好,该停车场已满,请找其他停车场!\n");  
    }  
    else  
    {  
        printf("尊贵的用户,您好,已停车位:%d,可停车位%d,您可以停车!\n",count,N*M-count);  
    }  
    system("pause");  
    system("cls");  
    return ;  
}  
  
//菜单  
void menu()             //菜单中添加显示当前时间  
{  
    time_t t=time(NULL);  
    char *time=ctime(&t);  
    printf("\t\t\t******************\n");  
    printf("\t\t\t     欢迎使用智能停车场系统         \n");  
    printf("\t\t\t                                    \n");  
    printf("\t\t\t         1-停放状态查询             \n");  
    printf("\t\t\t         2-停车                     \n");  
    printf("\t\t\t         3-取车                     \n");  
    printf("\t\t\t         4-自助充值                 \n");  
    printf("\t\t\t         5-管理员管理系统           \n");  
    printf("\t\t\t         0-返回主菜单               \n");  
    printf("\t\t\t     请按相关输入对应数字           \n");  
    printf("\t\t\t        注:□ -空位,■ -已停          \n");  
    printf("\t\t\t******************\n");   
    printf("\t\t\t 当前时间:%s",time);  
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值