C语言餐饮预约订位管理信息系统

第一个完全自己做的实验:

内容功能

要求

问题:

		布局未调整好,未进行完整测试可能存在bug,未加入输入判别机制,未优化代码,复制粘贴冗余多。如果有bug,请留言反馈,谢谢!

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include<conio.h>
#define MaxAssistantNumber 10
#define MaxOrderNumber 20

// Size:  UserID:20 password:12 UserFlag:4 total:36 数组应该除以36得到数组元素个数
typedef struct User
{
    char UserID[20];    //用户ID
    char password[12];  //密码
    int  UserFlag;      //使用者标签 判别使用者 管理员:-1、店长:0、前台:1
}User;

typedef struct Order_Info
{
    //记录客户基本信息(姓名、电话、日期、就餐时间、人数、编号、分配的餐位等)
    char OIname[10];	    //姓名
	char OItell[11];	    //电话
    char OIdate[20];	    //日期        year-mon-dd hh:mm
    char OItime[20];	    //就餐时间    year-mon-dd hh:mm
    int  OImember;	        //人数
    long int OIid;	        //编号  就餐时间数值 可用于判断
    char OIplaceNo[2];	    //餐位
}OI;

//预设一个 管理员 账户 管理员可以更改店长信息 操作店员信息
User UserAdministrator = {"Administrator","root",-1};
//预设一个 店长   账户 店长可以操作店员信息也可以执行店员的功能
User UserOwner = {"Owner","123456",0};
//店员账户数组 最大店员数量:N  现有店员数量:Number_Of_Assistant
User UserAssistant[MaxAssistantNumber];
int Number_Of_Assistant = 0;

//订餐人员信息数组
OI Order_Info[MaxOrderNumber];
int Number_Of_Order = 0;

//登录状态  -1:错误次数上限、0:未登录、1:已登录管理员账户、2:已登录店长账户、3:已登录店员账户
int LoginStatus = 0;

//格式化 登录 登出 还原
void init_sys();
int Login();
void Logout();
void Restore();

//首页 管理者菜单 店主菜单 前台菜单
int Menu();
void AdministratorMenu();
void OwnerMenu();
void AssistantMenu();

//修改店主信息
void Modify_Owner();

//添加前台 删除前台 修改前台 查看所有前台信息
void Add_Assistant();
void Delete_Assistant();
void Modify_Assistant();
void Find_Assistant();

//添加订单 取消订单 修改订单 查询订单 修改订单预订时间 修改订单餐位 修改订单就餐人数
void Add_Order();
void Delete_Order();
void Modify_Order();
void Find_AllOrder();
void Find_Order();
void Modify_OrderTime(int index);
void Modify_OrderPlaceNo(int index);
void Modify_OrderMember(int index);

//YYYY-MM-DD hh:mm 提取成 YYYYMMDDhhmm的长整型
long int TimeStrToInt(char *str);
int main()
{
    int i = 1;
    while(i){
        init_sys();
        i = Menu();
    }
   return 0;
}


//初始化系统
void init_sys(){
    FILE  *fp;

    //打开店主信息文件,若存在则读取内容修改 UserOwner变量
    if((fp=fopen("Owner.txt","r+"))==NULL) // w: 文件不存在则创建文件 r:文件不存在则返回NULL不创建文件
    {
        //不存在
        printf("店主信息为默认信息...\n");
    }else{
        //修改店主信息
        fscanf(fp,"%s %s", UserOwner.UserID, UserOwner.password);

        fclose(fp);
    }

    //打开店员数量信息文件,若存在则读取内容修改 Number_Of_Assistant变量
    if((fp=fopen("AssistantNumber.txt","r+"))==NULL)
    {
        //不存在
        printf("店员数量为0...\n");
    }else{
        //修改店员数量信息 读取成功了说明存在店员信息文件 数量也不为0
        fscanf(fp,"%d", &Number_Of_Assistant);//后面应该传地址
        fclose(fp);

        if((fp=fopen("Assistant.txt","r+"))==NULL)
        {
            //不存在
            printf("店员信息文件读取失败或不存在,店员数量归零...\n");
            remove("AssistantNumber.txt");
        }else{
            //修改店员信息
            for(int i = 0; i < Number_Of_Assistant; i++){
                //读取店员信息
                fscanf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password);
            }
            fclose(fp);
        }
    }

    //打开预订数量信息文件,若存在则读取内容修改 Number_Of_Order变量
    if((fp=fopen("OrderNumber.txt","r+"))==NULL)
    {
        //不存在
        printf("预订数量为0...\n");
    }else{

        //修改预订数量信息 读取成功了说明存在预订信息文件 数量也不为0
        fscanf(fp,"%d", &Number_Of_Order);
        fclose(fp);

        if((fp=fopen("OrderInfo.txt","r+"))==NULL)
        {
            //不存在
            printf("预订信息文件读取失败或不存在,预订数量归零...\n");
            remove("OrderNumber.txt");
        }else{
            //修改预订信息变量
            for(int i = 0; i < Number_Of_Order; i++){
                //读取预订信息
                fscanf(fp,"%s %s %s %s %d %d %s\n",
                       Order_Info[i].OIname, Order_Info[i].OItell,   Order_Info[i].OIdate,
                       Order_Info[i].OItime, &Order_Info[i].OImember, &Order_Info[i].OIid,   Order_Info[i].OIplaceNo);
            }
            fclose(fp);
        }
    }

}

int Menu(){
    while(1){
        system("cls");
        printf("\t********************************\n");
        printf("\t*                              *\n");
        printf("\t*          1. 用户登录         *\n");
        printf("\t*                              *\n");
        printf("\t*        ESC. 退出系统         *\n");
        printf("\t*                              *\n");
        printf("\t********************************\n");
        switch(getch()){
            case 49: LoginStatus = Login();break;
            case 27: printf("        系统退出成功.\n");return 0;
        }
        if(LoginStatus == 1){
            AdministratorMenu();
        }else if(LoginStatus == 2){
            OwnerMenu();
        }else if(LoginStatus == 3){
            AssistantMenu();
        }else if(LoginStatus == -1){
            printf("        系统退出成功.\n");
            return 0;
        }
    }
}


void AdministratorMenu(){
	while(1){
        system("cls");
        printf("\t********************************\n");
        printf("\t*                              *\n");
        printf("\t*        1. 修改店主信息       *\n");
        printf("\t*                              *\n");
        printf("\t*        2. 修改店员信息       *\n");
        printf("\t*                              *\n");
        printf("\t*        3. 还原系统信息       *\n");
        printf("\t*                              *\n");
        printf("\t*      ESC. 退出登录           *\n");
        printf("\t*                              *\n");
        printf("\t********************************\n");
        switch(getch()){
            case 49: Modify_Owner();break;
            case 50: Modify_Assistant();break;
            case 51: Restore();return;
            case 27: Logout();return;
        }
    }
}
void OwnerMenu(){
	while(1){
        system("cls");
        printf("\t********************************\n");
	    printf("\t*                              *\n");
	    printf("\t*        1. 添加前台用户        *\n");
	    printf("\t*                              *\n");
	    printf("\t*        2. 删除前台用户        *\n");
	    printf("\t*                              *\n");
	    printf("\t*        3. 修改前台用户信息    *\n");
	    printf("\t*                              *\n");
	    printf("\t*        4. 查看所有前台信息    *\n");
	    printf("\t*                              *\n");
	    printf("\t*        5. 查询所有预订信息    *\n");
	    printf("\t*                              *\n");
	    printf("\t*      ESC. 退出登录            *\n");
	    printf("\t*                              *\n");
	    printf("\t********************************\n");
        switch(getch()){
            case 49: Add_Assistant();break;
            case 50: Delete_Assistant();break;
            case 51: Modify_Assistant();break;
            case 52: Find_Assistant();break;
            case 53: Find_AllOrder();break;
            case 27: Logout();return;
        }
    }
}
void AssistantMenu(){
	while(1){
        system("cls");
        printf("\t********************************\n");
	    printf("\t*                              *\n");
	    printf("\t*        1. 添加新预订         *\n");
	    printf("\t*                              *\n");
	    printf("\t*        2. 取消预订           *\n");
	    printf("\t*                              *\n");
	    printf("\t*        3. 修改预订信息       *\n");
	    printf("\t*                              *\n");
	    printf("\t*        4. 查询预订信息       *\n");
	    printf("\t*                              *\n");
	    printf("\t*      ESC. 退出登录           *\n");
	    printf("\t*                              *\n");
	    printf("\t********************************\n");
        switch(getch()){
            case 49: Add_Order();break;
            case 50: Delete_Order();break;
            case 51: Modify_Order();break;
            case 52: Find_Order();break;
            case 27: Logout();return;
        }
    }
}

//登录
int Login(){
    char _UserID[20];
    char _password[12];
    int count = 6; //限制5次登录尝试

    system("cls");
    printf("\t********************************\n");
	printf("\t*           用户登录           *\n");
	printf("\t********************************\n");

    while(1){
        //首次登录
        if(count == 6){
            printf("               用户ID :");
            scanf("%s",_UserID);
            printf("                密码  :");
            scanf("%s",_password);
            count--;
        }else if(count == 0){
            printf("        错误次数已达上限,系统关闭");
            return -1;
        }else{
            printf("        用户ID或密码错误,您还有 %d 次机会\n",count);
            printf("               用户ID :");
            scanf("%s",_UserID);
            printf("                密码  :");
            scanf("%s",_password);
            count--;
        }

    //strcmp(str1,str2) 返回值:
    //如果返回值 < 0,则表示 str1 小于 str2。
    //如果返回值 > 0,则表示 str2 小于 str1。
    //如果返回值 = 0,则表示 str1 等于 str2。
        if((strcmp(_UserID,UserAdministrator.UserID) == 0) && (strcmp(_password,UserAdministrator.password) == 0)){
            //登录的是管理员账户
            return 1;

        }else if((strcmp(_UserID,UserOwner.UserID) == 0) && (strcmp(_password,UserOwner.password) == 0)){
            //登录的是店主账户
            return 2;
        }
        for(int i = 0; i < Number_Of_Assistant;i++){
            //登录的是店员账户
            if((strcmp(_UserID,UserAssistant[i].UserID) == 0) && (strcmp(_password,UserAssistant[i].password) == 0)){
                return 3;
            }
        }
    }
}
//登出
void Logout(){
    LoginStatus = 0;
}

//修改店主信息
void Modify_Owner(){
    FILE  *fp;
    char NewID[20];
    char Newpassword[12];

    system("cls");
    printf("\t********************************\n");
	printf("\t*         修改店主信息         *\n");
	printf("\t********************************\n");
    printf("   请输入新的用户ID :");
    scanf("%s",NewID);
    printf("    请输入新的密码  :");
    scanf("%s",Newpassword);
    strncpy(UserOwner.UserID, NewID,strlen(NewID));
    strncpy(UserOwner.password, Newpassword,strlen(Newpassword));
    if((fp=fopen("Owner.txt","w+"))==NULL){
        printf("  修改失败!\n  按任意键以继续。");
    }else{
        if(fprintf(fp,"%s %s", UserOwner.UserID, UserOwner.password)<0){
            fclose(fp);
            remove("Owner.txt");
            printf("  修改失败!\n  按任意键以继续。");
        }
        else{
            fclose(fp);
            printf("  修改成功!\n  按任意键以继续。");
        }
    }
    getch();
}

//操作店员信息
void Add_Assistant(){
    int i = 0, num = 0;
    FILE  *fp;
    char UserID[20];
    char password[12];
    system("cls");
    printf("\t********************************\n");
	printf("\t*         添加前台用户         *\n");
	printf("\t********************************\n");
    printf("        请输入用户ID :");
    scanf("%s",UserID);
    printf("        请输入密码  :");
    scanf("%s",password);
    strncpy(UserAssistant[Number_Of_Assistant].UserID, UserID,strlen(UserID));
    strncpy(UserAssistant[Number_Of_Assistant].password, password,strlen(password));
    UserAssistant[Number_Of_Assistant].UserFlag = 1;
    Number_Of_Assistant++;
    if((fp=fopen("Assistant.txt","w+"))==NULL){
        printf("  添加失败!\n  按任意键以继续。");
    }else{
        for(i = 0; i < Number_Of_Assistant; i++){
            if(fprintf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password)<0){
                fclose(fp);
                remove("Assistant.txt");
                printf("  添加失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                break;
            }
        }
        if(i == Number_Of_Assistant){
            fclose(fp);
            if((fp=fopen("AssistantNumber.txt","r+"))!=NULL){
                //暂存数据
                fscanf(fp,"%d",&num);
                fclose(fp);
            }
            if((fp=fopen("AssistantNumber.txt","w+"))==NULL){
                printf("  添加失败!\n  按任意键以继续。");
            }else{

                if(fprintf(fp,"%d", Number_Of_Assistant)<0){
                    fclose(fp);

                    //写入客服数量数据失败,还原数据
                    if( num == 0){
                        remove("AssistantNumber.txt");
                    }else{
                        if((fp=fopen("AssistantNumber.txt","w+"))!=NULL){
                            fprintf(fp,"%d", num);
                            fclose(fp);
                        }
                    }
                    printf("  添加失败!\n  按任意键以继续。");
                }else{
                    fclose(fp);
                    printf("  添加成功!\n  按任意键以继续。");
                }
            }
        }
    }
    getch();
}

void Delete_Assistant(){
    int i = 0, num = 0;
    FILE  *fp;
    char UserID[20];
    char password[12];
    system("cls");
    printf("\t********************************\n");
	printf("\t*         删除前台用户         *\n");
	printf("\t********************************\n");

	if(Number_Of_Assistant == 0){
        printf("  目前还没有前台用户。\n  按任意键返回。");
        getch();
        return;
	}

    printf("    请输入前台用户的ID :");
    scanf("%s",UserID);
    for(i = 0; i < Number_Of_Assistant; i++){
        if(strcmp(UserAssistant[i].UserID,UserID) == 0)
            break;
    }
    if(i == Number_Of_Assistant){
        printf("未找到该前台用户信息!\n  按任意键返回。\n");
        getch();
        return;
    }
    printf("   请确认前台用户密码:");
    scanf("%s",password);
    if(strcmp(UserAssistant[i].password,password) == 0){
        for(;i < (Number_Of_Assistant-1);i++){
            UserAssistant[i] = UserAssistant[i+1];
        }

        Number_Of_Assistant--;
        if((fp=fopen("Assistant.txt","w+"))==NULL){
            printf("  删除失败!\n  按任意键以继续。");
        }else{
            for(i = 0; i < Number_Of_Assistant; i++){
                    //如果小于0,说明写入数据失败,跳出循环后要将原有的数据文件删除。之后通过操作重新写入
                if(fprintf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password)<0){
                    fclose(fp);
                    remove("Assistant.txt");
                    printf("  删除失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                    break;
                }
            }
            //满足该条件说明写入成功
            if(i == Number_Of_Assistant){
                fclose(fp);

                if((fp=fopen("AssistantNumber.txt","r+"))!=NULL ){
                    //暂存数据
                    fscanf(fp,"%d",&num);
                    fclose(fp);
                }

                if((fp=fopen("AssistantNumber.txt","w+"))==NULL){
                    remove("AssistantNumber.txt");
                    remove("Assistant.txt");
                    printf("  删除失败!前台用户数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                }else{

                    if(fprintf(fp,"%d", Number_Of_Assistant)<0){
                        fclose(fp);
                        if(num == 1){
                            remove("AssistantNumber.txt");
                        }else{
                            if((fp=fopen("AssistantNumber.txt","w+"))!=NULL){
                                fprintf(fp,"%d", num);
                                fclose(fp);
                            }
                        }
                        printf("  删除失败!\n  按任意键以继续。");
                    }else{
                        fclose(fp);
                        printf("  删除成功!\n  按任意键以继续。");
                    }
                }
            }
        }
    }else{
        printf("密码错误, 未能找到改前台信息!\n  按任意键返回。\n");
        getch();
        return;
    }
    getch();
}

void Modify_Assistant(){
    int i = 0;
    FILE  *fp;
    char UserID[20];
    char password[12];
    char NewID[20];
    char Newpassword[12];
    system("cls");
    printf("\t********************************\n");
	printf("\t*         修改前台信息         *\n");
	printf("\t********************************\n");

	if(Number_Of_Assistant == 0){
        printf("  目前还没有前台用户。\n  按任意键返回。");
        getch();
        return;
	}

    printf("    请输入前台的用户ID :");
    scanf("%s",UserID);
    for(i = 0; i < Number_Of_Assistant; i++){
        if(strcmp(UserAssistant[i].UserID,UserID) == 0)
            break;
    }
    if(i == Number_Of_Assistant){
        printf("未找到该前台信息!\n  按任意键返回。\n");
        getch();
        return;
    }
    printf("   请确认前台用户密码:");
    scanf("%s",password);
    if(strcmp(UserAssistant[i].password,password) == 0){
        printf("      已找到该前台信息\n");
        printf("当前其用户ID为: %s   密码为: %s\n", UserAssistant[i].UserID,UserAssistant[i].password);
        printf("   请输入新的用户ID :");
        scanf("%s",NewID);
        printf("    请输入新的密码  :");
        scanf("%s",Newpassword);
        strncpy(UserAssistant[i].UserID, NewID,strlen(NewID));
        strncpy(UserAssistant[i].password, Newpassword,strlen(Newpassword));
        if((fp=fopen("Assistant.txt","w+"))==NULL){
            printf("  修改失败!\n  按任意键以继续。");
        }else{
            for(i = 0; i < Number_Of_Assistant; i++){
                    //如果小于0,说明写入数据失败,跳出循环后要将原有的数据文件删除。之后通过操作重新写入
                if(fprintf(fp,"%s %s\n", UserAssistant[i].UserID, UserAssistant[i].password)<0){
                    fclose(fp);
                    remove("Assistant.txt");
                    printf("  修改失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                    break;
                }
            }
            if(i == Number_Of_Assistant){
                fclose(fp);
                printf("  修改成功!\n  按任意键以继续。");
            }
        }
    getch();
    }
}
void Find_Assistant(){
    system("cls");
    printf("\t********************************\n");
	printf("\t*       查询所有前台信息       *\n");
	printf("\t********************************\n");
    if(Number_Of_Assistant == 0){
        printf("目前没有前台人员. 按任意键返回...");
        getch();
        return;
    }
	printf("\t* No  用户名   *****   密码    *\n");
    for(int i = 0; i < Number_Of_Assistant; i++){
	    printf("\t* %d  %s\t *    %s\t*\n",i + 1 , UserAssistant[i].UserID, UserAssistant[i].password);
    }
	printf("\t********************************\n");
    printf("查询结束,按任意键返回...");
    getch();
}

//操作预订信息
void Add_Order(){
    int i = 0, num = 0;
    FILE  *fp;
    char OIname[10];	    //姓名
	char OItell[11];	    //电话
    char OIdate[20];	    //日期        year-mon-dd hh:mm

    char OItime[20];	    //就餐时间    year-mon-dd hh:mm
    char Year[5];	        //年
    char Mon[2] ;	        //月
    char Day[2] ;	        //日
    char Hour[2];	        //时
    char Min[2] ;	        //分

    int  OImember;	        //人数
    long int OIid;	        //编号
    char OIplaceNo[2];	    //餐位

    /*
        获取时间
        struct tm{
            int tm_sec;  //代表目前秒数, 正常范围为0-59, 但允许至61 秒
            int tm_min;  //代表目前分数, 范围0-59
            int tm_hour;  //从午夜算起的时数, 范围为0-23
            int tm_mday;  //目前月份的日数, 范围01-31
            int tm_mon;  //代表目前月份, 从一月算起, 范围从0-11
            int tm_year;  //从1900 年算起至今的年数
            int tm_wday;  //一星期的日数, 从星期一算起, 范围为0-6
            int tm_yday;  //从今年1 月1 日算起至今的天数, 范围为0-365
            int tm_isdst;  //日光节约时间的旗标
        };
    */
    time_t now;//时间
    struct tm *p;
    time(&now);
    p = localtime(&now);

    system("cls");
    printf("\t********************************\n");
	printf("\t*          添加新预订          *\n");
	printf("\t********************************\n");
    printf("        请输入预订人姓名 :");
    scanf("%s",OIname);
    strncpy(Order_Info[Number_Of_Order].OIname, OIname,strlen(OIname));
    printf("        请输入  11位电话 :");
    scanf("%s",OItell);
    strncpy(Order_Info[Number_Of_Order].OItell, OItell,strlen(OItell));

    strftime(OIdate, sizeof(OIdate), "%Y-%m-%d>%H:%M", p);//自动获取日期
    strncpy(Order_Info[Number_Of_Order].OIdate, OIdate,strlen(OIdate));

    //就餐时间  YY-MON-DD HH:MM
    printf("        请输入 年份(20xx) :");
    scanf("%s",Year);
    strncat(OItime, Year, strlen(Year));
    strncat(OItime, "-",  1 );
    printf("        请输入 月份(01~12):");
    scanf("%s",Mon);
    strncat(OItime, Mon,  strlen(Mon) );
    strncat(OItime, "-",  1 );
    printf("        请输入 日期(01~31):");
    scanf("%s",Day);
    strncat(OItime, Day,  strlen(Day) );
    strncat(OItime, ">",  1 );
    printf("        请输入  时 (00~23):");
    scanf("%s",Hour);
    strncat(OItime, Hour, strlen(Hour));
    strncat(OItime, ":",  1 );
    printf("        请输入  分 (00~59):");
    scanf("%s",Min);
    strncat(OItime, Min,  strlen(Min) );
    strncpy(Order_Info[Number_Of_Order].OItime, OItime,strlen(OItime));

    //订单编号
    OIid = TimeStrToInt(OItime);
    Order_Info[Number_Of_Order].OIid = OIid;

    printf("        请输入(A-D 1-5)餐位 :");
    scanf("%s",OIplaceNo);
    strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
    //若存在预订信息,需要遍历预订信息中的就餐时间和餐桌是否有冲突,若冲突则要重新输入
    //就餐时间中时间相差3则需要重新填写
    if(Number_Of_Order != 0){
        for(i = 0; i < Number_Of_Order; i++){
            //同日 前三小时 后三小时
            if((OIid / 100 == Order_Info[i].OIid / 100) &&
               ((OIid % 100 - 3) < (Order_Info[i].OIid % 100)) &&
               ((OIid % 100 + 3) > (Order_Info[i].OIid % 100)) &&
               (strcmp(OIplaceNo, Order_Info[i].OIplaceNo)==0)){
                    printf("非常抱歉,该餐位在此时段已被预订\n");
                    printf("输入 1 修改时间;2 修改餐桌: \n");
                    switch(getch()){
                        case 49:

                            //就餐时间  YY-MON-DD HH:MM
                            printf("        请输入 年份(20xx) :");
                            scanf("%s",Year);
                            strncat(OItime, Year, strlen(Year));
                            strncat(OItime, "-",  1 );
                            printf("        请输入 月份(01~12):");
                            scanf("%s",Mon);
                            strncat(OItime, Mon,  strlen(Mon) );
                            strncat(OItime, "-",  1 );
                            printf("        请输入 日期(01~31):");
                            scanf("%s",Day);
                            strncat(OItime, Day,  strlen(Day) );
                            strncat(OItime, ">",  1 );
                            printf("        请输入  时 (00~23):");
                            scanf("%s",Hour);
                            strncat(OItime, Hour, strlen(Hour));
                            strncat(OItime, ":",  1 );
                            printf("        请输入  分 (00~59):");
                            scanf("%s",Min);
                            strncat(OItime, Min,  strlen(Min) );
                            strncpy(Order_Info[Number_Of_Order].OItime, OItime,strlen(OItime));
                            //订单编号
                            OIid = TimeStrToInt(OItime);
                            Order_Info[Number_Of_Order].OIid = OIid;
                            break;
                        case 50:
                            printf("        请输入(A-D 1-5)餐位 :");
                            scanf("%s",OIplaceNo);
                            strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
                            break;
                    }
                    //重置i
                    i = 0;
               }
        }
    }
    printf("        请输入 就餐人数(不超过15人) :");
    scanf("%d",&OImember);
    Order_Info[Number_Of_Order].OImember = OImember;
    while(OImember>15){
        printf("        输入超过15人!\n");
        printf("        请重新输入 :");
        scanf("%d",&OImember);
    }

    Number_Of_Order++;
    if((fp=fopen("OrderInfo.txt","w+"))==NULL){
        printf("  添加失败!\n  按任意键以继续。");
    }else{
        for(i = 0; i < Number_Of_Order; i++){
            if(fprintf(fp,"%s %s %s %s %d %d %s\n",
                       Order_Info[i].OIname, Order_Info[i].OItell,   Order_Info[i].OIdate,
                       Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid,   Order_Info[i].OIplaceNo)<0){
                fclose(fp);
                remove("OrderInfo.txt");
                printf("  添加失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                break;
            }
        }
        if(i == Number_Of_Order){
            fclose(fp);
            if((fp=fopen("OrderNumber.txt","r+"))!=NULL){
                //暂存数据
                fscanf(fp,"%d",&num);
                fclose(fp);
            }
            if((fp=fopen("OrderNumber.txt","w+"))==NULL){
                printf("  添加失败!\n  按任意键以继续。");
            }else{

                if(fprintf(fp,"%d", Number_Of_Order)<0){
                    fclose(fp);

                    //写入预订数量数据失败,还原数据
                    if( num == 0){
                        remove("OrderNumber.txt");
                    }else{
                        if((fp=fopen("OrderNumber.txt","w+"))!=NULL){
                            fprintf(fp,"%d", num);
                            fclose(fp);
                        }
                    }
                    printf("  添加失败!\n  按任意键以继续。");
                }else{
                    fclose(fp);
                    printf("  添加成功!\n  按任意键以继续。");
                }
            }
        }
    }
    getch();
}
void Delete_Order(){
    int i = 0, num = 0;
    FILE  *fp;
    //根据姓名+编号+餐位定位
    char OIname[10];	    //姓名
    long int OIid;	        //编号
    char OIplaceNo[2];	    //餐位

    system("cls");
    printf("\t********************************\n");
	printf("\t*         删除预订信息         *\n");
	printf("\t********************************\n");

	if(Number_Of_Order == 0){
        printf("  目前还没有预订订单。\n  按任意键返回。");
        getch();
        return;
	}

    printf("    请输入预订人姓名 :");
    scanf("%s",OIname);
    for(i = 0; i < Number_Of_Order; i++){
        if(strcmp(Order_Info[i].OIname,OIname) == 0)
            break;
    }
    if(i == Number_Of_Assistant){
        printf("未找到该客户的预订信息!\n  按任意键返回。\n");
        getch();
        return;
    }
	printf("\t********************************\n");
	printf("\t*            查询结果           *\n");
	printf("\t* 订单编号  预订时间      餐位   *\n");
    for(i = 0; i < Number_Of_Order; i++){
        if(strcmp(Order_Info[i].OIname,OIname) == 0){
            printf("\t* %d %s %s *\n",
                Order_Info[i].OIid,Order_Info[i].OItime,Order_Info[i].OIplaceNo);
        }
    }
	printf("\t********************************\n");

    printf("   请输入要删除的订单编号:");
    scanf("%d",&OIid);
    printf("   请输入        餐位编号:");
    scanf("%s",OIplaceNo);

    for(i = 0; i < Number_Of_Order; i++){
        if((strcmp(Order_Info[i].OIname,OIname) == 0)
            && (Order_Info[i].OIid == OIid)
            && (strcmp(Order_Info[i].OIplaceNo,OIplaceNo) == 0))
            break;
    }
    if(i == Number_Of_Order){
        printf("未找到该订单信息!\n  按任意键返回。\n");
        getch();
        return;
    }

    for(;i < (Number_Of_Order-1);i++){
        Order_Info[i] = Order_Info[i+1];
    }
    Number_Of_Order--;

    if((fp=fopen("OrderInfo.txt","w+"))==NULL){
        printf("  删除失败!\n  按任意键以继续。");
    }else{
        for(i = 0; i < Number_Of_Order; i++){
            //如果小于0,说明写入数据失败,跳出循环后要将原有的数据文件删除。之后通过操作重新写入
            if(fprintf(fp,"%s %s %s %s %d %d %s\n",
                       Order_Info[i].OIname, Order_Info[i].OItell,   Order_Info[i].OIdate,
                       Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid,   Order_Info[i].OIplaceNo)<0){
                fclose(fp);
                remove("OrderInfo.txt");
                printf("  删除失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                break;
            }
        }
        //满足该条件说明写入成功
        if(i == Number_Of_Order){
            fclose(fp);

            if((fp=fopen("OrderNumber.txt","r+"))!=NULL ){
                //暂存数据
                fscanf(fp,"%d",&num);
                fclose(fp);
            }

            if((fp=fopen("OrderNumber.txt","w+"))==NULL){
                remove("OrderNumber.txt");
                remove("OrderInfo.txt");
                printf("  删除失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
            }else{
                //预订信息数据已写入 写入数量信息
                if(fprintf(fp,"%d", Number_Of_Order)<0){
                    fclose(fp);
                    if(num == 1){
                        remove("OrderNumber.txt");
                    }else{
                        if((fp=fopen("OrderNumber.txt","w+"))!=NULL){
                            fprintf(fp,"%d", num);
                            fclose(fp);
                        }
                    }
                    printf("  删除失败!\n  按任意键以继续。");
                }else{
                    fclose(fp);
                    printf("  删除成功!\n  按任意键以继续。");
                }
            }
        }
    }
    getch();
}
void Modify_Order(){
    int i = 0;
    FILE  *fp;
    //根据姓名+编号+餐位定位
    char OIname[10];	    //姓名
    long int OIid;	        //编号
    long int TempOIid;	    //暂存
    char OIplaceNo[2];	    //餐位

    system("cls");
    printf("\t********************************\n");
	printf("\t*         修改订单信息         *\n");
	printf("\t********************************\n");

	if(Number_Of_Order == 0){
        printf("  目前还没有预订订单。\n  按任意键返回。");
        getch();
        return;
	}

    printf("    请输入预订人姓名 :");
    scanf("%s",OIname);
    for(i = 0; i < Number_Of_Order; i++){
        if(strcmp(Order_Info[i].OIname,OIname) == 0)
            break;
    }
    if(i == Number_Of_Assistant){
        printf("未找到该客户的预订信息!\n  按任意键返回。\n");
        getch();
        return;
    }
	printf("************************************************************\n");
	printf("*                         查询结果                         *\n");
	printf("* 预订人         预订时间       餐位  人数       订单编号    *\n");
    for(i = 0; i < Number_Of_Order; i++){
        if(strcmp(Order_Info[i].OIname,OIname) == 0){
            printf("* %s %s %s %d %d *\n",
                Order_Info[i].OIname,Order_Info[i].OItime, Order_Info[i].OIplaceNo,
                Order_Info[i].OImember,Order_Info[i].OIid);
        }
    }
	printf("*************************************************************\n");

    printf("   请输入要修改的订单编号:");
    scanf("%d",&TempOIid);
    OIid = TempOIid;
    printf("   请输入        餐位编号:");
    scanf("%s",OIplaceNo);
    for(i = 0; i < Number_Of_Order; i++){
        if((strcmp(Order_Info[i].OIname,OIname) == 0)
            && (Order_Info[i].OIid == OIid)
            && (strcmp(Order_Info[i].OIplaceNo,OIplaceNo) == 0))
            break;
    }
    if(i == Number_Of_Order){
        printf("未找到该订单信息!\n  按任意键返回。\n");
        getch();
        return;
    }

    printf("               已找到该订单信息\n");
    printf("   输入 1 :修改订单预订时间");
    printf("   输入 2 :修改订单餐位");
    printf("   输入 3 :修改订单预订人数\n");
    switch(getch()){
        case 49:
            Modify_OrderTime(i);
            break;
        case 50:
            Modify_OrderPlaceNo(i);
            break;
        case 51:
            Modify_OrderMember(i);
            break;
    }
}
void Find_AllOrder(){
    int i = 0;
    system("cls");
	printf("**************************************************************\n");
	printf("*                        查询所有订单                        *\n");
	printf("**************************************************************\n");

	if(Number_Of_Order == 0){
        printf("            目前还没有预订订单。\n  按任意键返回。");
        getch();
        return;
	}
    printf("*************************************************************\n");
	printf("*                          查询结果                          *\n");
	printf("* 预订人     电话      预订时间      餐位  人数     订单编号   *\n");
    for(i = 0; i < Number_Of_Order; i++){
	    printf("* %s %s %s %s %d %d *\n",
            Order_Info[i].OIname,Order_Info[i].OItell,Order_Info[i].OItime,
            Order_Info[i].OIplaceNo, Order_Info[i].OImember,Order_Info[i].OIid);
    }
	printf("*************************************************************\n");
	printf("按任意键返回\n");
    getch();
}
void Find_Order(){
    int i = 0;
    char OIname[10];	    //姓名

    system("cls");
	printf("**************************************************************\n");
	printf("*                          查询订单                          *\n");
	printf("**************************************************************\n");

	if(Number_Of_Order == 0){
        printf("            目前还没有预订订单。\n  按任意键返回。");
        getch();
        return;
	}

    printf("            请输入需要查询客户的姓名 :");
    scanf("%s",OIname);
    for(i = 0; i < Number_Of_Order; i++){
        if(strcmp(Order_Info[i].OIname,OIname) == 0)
            break;
    }
    if(i == Number_Of_Order){
        printf("未找到该客户的预订信息!\n  按任意键返回。\n");
        getch();
        return;
    }
	printf("**************************************************************\n");
	printf("*                          查询结果                          *\n");
	printf("* 预订人     电话      预订时间      餐位  人数     订单编号   *\n");
    for(i = 0; i < Number_Of_Order; i++){
        if(strcmp(Order_Info[i].OIname,OIname) == 0){
            printf("* %s %s %s %s %d %d *\n",
                Order_Info[i].OIname,Order_Info[i].OItell,Order_Info[i].OItime,
                Order_Info[i].OIplaceNo, Order_Info[i].OImember,Order_Info[i].OIid);
        }
    }
	printf("**************************************************************\n");
	printf("按任意键返回\n");
    getch();
}

void Modify_OrderTime(int index){
    int i = 0;
    FILE *fp;
    char OItime[20];	    //就餐时间    year-mon-dd hh:mm
    char Year[4];	        //年
    char Mon[2];	        //月
    char Day[2];	        //日
    char Hour[2];	        //时
    char Min[2];	        //分
    long int OIid;	        //编号
    //就餐时间  YY-MON-DD HH:MM
    printf("        请输入 年份(20xx) :");
    scanf("%s",Year);
    strncat(OItime, Year, strlen(Year));
    strncat(OItime, "-",  1 );
    printf("        请输入 月份(01~12):");
    scanf("%s",Mon);
    strncat(OItime, Mon,  strlen(Mon) );
    strncat(OItime, "-",  1 );
    printf("        请输入 日期(01~31):");
    scanf("%s",Day);
    strncat(OItime, Day,  strlen(Day) );
    strncat(OItime, ">",  1 );
    printf("        请输入  时 (00~23):");
    scanf("%s",Hour);
    strncat(OItime, Hour, strlen(Hour));
    strncat(OItime, ":",  1 );
    printf("        请输入  分 (00~59):");
    scanf("%s",Min);
    strncat(OItime, Min,  strlen(Min) );
    strncpy(Order_Info[index].OItime, OItime,strlen(OItime));
    printf("%s",Order_Info[index].OItime);
    //订单编号
    OIid = TimeStrToInt(OItime);
    Order_Info[index].OIid = OIid;
    printf("%d",Order_Info[index].OIid);

    //若存在预订信息,需要遍历预订信息中的就餐时间和餐桌是否有冲突,若冲突则要重新输入
    //就餐时间中时间相差3则需要重新填写
    if(Number_Of_Order != 0){
        for(i = 0; i < Number_Of_Order; i++){
            //同日 前三小时 后三小时
            if((OIid / 100 == Order_Info[i].OIid / 100) &&
               ((OIid % 100 - 3) < (Order_Info[i].OIid % 100)) &&
               ((OIid % 100 + 3) > (Order_Info[i].OIid % 100)) &&
               (strcmp(Order_Info[index].OIplaceNo, Order_Info[i].OIplaceNo)==0) &&
               (i != index)){
                    printf("非常抱歉,该餐位在此时段已被预订,请重新输入预定时间\n");
                    //就餐时间  YY-MON-DD HH:MM
                    printf("        请输入 年份(20xx) :");
                    scanf("%s",Year);
                    strncat(OItime, Year, strlen(Year));
                    strncat(OItime, "-",  1 );
                    printf("        请输入 月份(01~12):");
                    scanf("%s",Mon);
                    strncat(OItime, Mon,  strlen(Mon) );
                    strncat(OItime, "-",  1 );
                    printf("        请输入 日期(01~31):");
                    scanf("%s",Day);
                    strncat(OItime, Day,  strlen(Day) );
                    strncat(OItime, ">",  1 );
                    printf("        请输入  时 (00~23):");
                    scanf("%s",Hour);
                    strncat(OItime, Hour, strlen(Hour));
                    strncat(OItime, ":",  1 );
                    printf("        请输入  分 (00~59):");
                    scanf("%s",Min);
                    strncat(OItime, Min,  strlen(Min) );
                    strncpy(Order_Info[index].OItime, OItime,strlen(OItime));
                    //订单编号
                    OIid = TimeStrToInt(OItime);
                    Order_Info[index].OIid = OIid;
                    //重置i
                    i = 0;
                }
        }
    }
    if((fp=fopen("OrderInfo.txt","w+"))==NULL){
        printf("  修改失败!\n  按任意键以继续。");
    }else{
        for(i = 0; i < Number_Of_Order; i++){
            if(fprintf(fp,"%s %s %s %s %d %d %s\n",
                       Order_Info[i].OIname, Order_Info[i].OItell,   Order_Info[i].OIdate,
                       Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid,   Order_Info[i].OIplaceNo)<0){
                fclose(fp);
                remove("OrderInfo.txt");
                printf("  修改失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                break;
            }
        }
        if(i == Number_Of_Order){
            fclose(fp);
            printf("订单预订时间修改成功!订单编号发生改变. 按任意键返回...");
        }
    }
    getch();
}
void Modify_OrderPlaceNo(int index){
    int i = 0;
    FILE *fp;
    char OIplaceNo[2];	    //餐位
    printf("     请输入(A-D 1-5)餐位 :");
    scanf("%s",OIplaceNo);
    strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
    if(Number_Of_Order != 0){
        for(i = 0; i < Number_Of_Order; i++){
            //同日 前三小时 后三小时
            if((Order_Info[index].OIid / 100 == Order_Info[i].OIid / 100) &&
               ((Order_Info[index].OIid % 100 - 3) < (Order_Info[i].OIid % 100)) &&
               ((Order_Info[index].OIid % 100 + 3) > (Order_Info[i].OIid % 100)) &&
               (strcmp(OIplaceNo, Order_Info[i].OIplaceNo)==0)){
                    printf("非常抱歉,该餐位在此时段已被预订,请重新输入餐位\n");
                    printf("     请输入(A-D 1-5)餐位 :");
                    scanf("%s",OIplaceNo);
                    strncpy(Order_Info[Number_Of_Order].OIplaceNo, OIplaceNo,strlen(OIplaceNo));
                    //重置i
                    i = 0;
                }
        }
    }
    if((fp=fopen("OrderInfo.txt","w+"))==NULL){
        printf("  修改失败!\n  按任意键以继续。");
    }else{
        for(i = 0; i < Number_Of_Order; i++){
            if(fprintf(fp,"%s %s %s %s %d %d %s\n",
                       Order_Info[i].OIname, Order_Info[i].OItell,   Order_Info[i].OIdate,
                       Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid,   Order_Info[i].OIplaceNo)<0){
                fclose(fp);
                remove("OrderInfo.txt");
                printf("  修改失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                break;
            }
        }
        if(i == Number_Of_Order){
            fclose(fp);
            printf("订单预订餐位修改成功!按任意键返回...");
        }
    }
    getch();
}
void Modify_OrderMember(int index){
    int i = 0, OImember = 0;
    FILE *fp;
    printf("     请输入 就餐人数(不超过15人) :");
    scanf("%d",&OImember);
    while(OImember>15){
        printf("     输入超过15人!\n");
        printf("     请重新输入 :");
        scanf("%d",&OImember);
    }
    Order_Info[index].OImember = OImember;
    if((fp=fopen("OrderInfo.txt","w+"))==NULL){
        printf("  修改失败!\n  按任意键以继续。");
    }else{
        for(i = 0; i < Number_Of_Order; i++){
            if(fprintf(fp,"%s %s %s %s %d %d %s\n",
                       Order_Info[i].OIname, Order_Info[i].OItell,   Order_Info[i].OIdate,
                       Order_Info[i].OItime, Order_Info[i].OImember, Order_Info[i].OIid,   Order_Info[i].OIplaceNo)<0){
                fclose(fp);
                remove("OrderInfo.txt");
                printf("  修改失败!数据已丢失!请重新执行写入操作.\n  按任意键以继续。");
                break;
            }
        }
        if(i == Number_Of_Order){
            fclose(fp);
            printf("订单预订就餐人数修改成功!按任意键返回...");
        }
    }
    getch();
}

//还原
void Restore(){
    FILE *fp;
    if((fp=fopen("Owner.txt","r+"))==NULL){
        printf("店主信息还原成功...\n");
    }else{
        fclose(fp);
        if(remove("Owner.txt") == 0){
            printf("店主信息还原成功...\n");
        }else{
            printf("店主信息还原失败\n");
        }
    }

    if((fp=fopen("AssistantNumber.txt","r+"))==NULL){
        printf("店员数量信息已归零...\n");
        printf("店员信息还原成功...\n");
    }else{
        fclose(fp);
        if(remove("AssistantNumber.txt") == 0){
            if((fp=fopen("Assistant.txt","r+"))==NULL){
                printf("店员数量信息已归零...\n");
                printf("店员信息还原成功...\n");
            }else{
                fclose(fp);
                if(remove("Assistant.txt") == 0){
                    printf("店员数量信息已归零...\n");
                    printf("店员信息还原成功...\n");
                }else{
                    printf("店员信息还原失败\n");
                }
            }
        }else{
            printf("店员信息还原失败\n");
        }
    }

    if((fp=fopen("OrderNumber.txt","r+"))==NULL){
        printf("预订数量信息已归零...\n");
        printf("预订信息还原成功...\n");
    }else{
        fclose(fp);
        if(remove("OrderNumber.txt") == 0){
            if((fp=fopen("OrderInfo.txt","r+"))==NULL){
                printf("预订数量信息已归零...\n");
                printf("预订信息还原成功...\n");
            }else{
                fclose(fp);
                if(remove("OrderInfo.txt") == 0){
                    printf("预订数量信息已归零...\n");
                    printf("预订信息还原成功...\n");
                }else{
                    printf("预订信息还原失败\n");
                }
            }
        }else{
            printf("预订信息还原失败\n");
        }
    }
    LoginStatus = 0;
    init_sys();
    printf("系统信息还原完成,请重新打开程序。\n");
    getch();
    exit(0);
}

//YYYY-MM-DD hh:mm 提取成 YYYYMMDDhhmm的长整型
long int TimeStrToInt(char *str){
    long int ID;
    for (int i = 0,j = 0; i < strlen(str); i++){
        if(str[i]>47 && str[i]<58){
            j++;
            switch(j){
                case 1: ID += ((int)str[i]-48)*1000000000;break;
                case 2: ID += ((int)str[i]-48)*100000000;break;
                case 3: ID += ((int)str[i]-48)*10000000;break;
                case 4: ID += ((int)str[i]-48)*1000000;break;
                case 5: ID += ((int)str[i]-48)*100000;break;
                case 6: ID += ((int)str[i]-48)*10000;break;
                case 7: ID += ((int)str[i]-48)*1000;break;
                case 8: ID += ((int)str[i]-48)*100;break;
                case 9: ID += ((int)str[i]-48)*10;break;
                case 10:ID += ((int)str[i]-48)*1;break;
            }
        }
    }
    return ID;
}

  • 16
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值