C语言如何实现餐饮管理系统

本文实例为大家分享了C语言实现餐饮管理系统的具体代码,供大家参考,具体内容如下 include include

本文实例为大家分享了C语言实现餐饮管理系统的具体代码,供大家参考,具体内容如下

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define N sizeof(user) 
#define M sizeof(table) 
#define T sizeof(order) 
#define S sizeof(menu) 
 
typedef struct User{
    char username[12];//账号 
    char password[18];//密码
    int vip;//1为会员  0不是
    int adm;//administrator同上
    //或将以上的采用数据域的方式存储 
    struct User* next; 
}user; //注意初始化 ,可以写一个初始化函数  借鉴7月9号的笔记中的“初始化” 
 
 
typedef struct Menu{
    int num;//1~10为热菜  11~20为冷菜  21~25为饮料 
    char name[20];
    int price;
    struct Menu* next; 
}menu;
 
 
typedef struct Table{
    int number;
    int is_blank;
    int peoplenum;
    struct Order* ordert;//接该桌的订单的头结点 
    int price;//该桌的总价 
    struct Table* next; 
}table; 
 
 
typedef struct Order{
    int number;//菜的编号
    char name[20];
    int copies;//菜的份数
    int price;
    int xiaoji;
    struct Order* next; 
}order;
 
 
//以下为自定义函数
void welcome();
int ORDER(order* head);//点菜函数 
//void reg();//注册函数 
void login();
void logon();
void show();//显示菜单函数 
void client();//客户函数 
void look_amend();//查看修改函数 
void add();//加菜函数 
void cancel();//取消菜函数 
int priceall();//计算总价函数 
void getpassword(char password[18],char againpassword[18]);
int is_password_same(char password[18],char againpassword[18]);
void save_user(user* p);
menu* ffmenuhot();
menu* ffmenucold();
menu* ffmenudrink();
table* fftable();
void resave_table(table* head);
 
 
 
table* fftable()
{
    FILE *fp1;       //文件指针 
    int n = 0;
    table* head = NULL;
    table* q;
    table* p;
    //system("md E:\\canyin\\table");
    fp1 = fopen("E:\\canyin\\table\\table.txt","a+");     //以只读的方式打开文件 
    if(fp1 == NULL)
    {
        printf("文件打开失败\n");
        //getchar();
        //exit(0);
    }
    else
    {
        while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
        {
            n ++;
               p = (table*)malloc(sizeof(table)); //向内存申请一段空间 
            //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
            fscanf(fp1,"%d %d %d %d %d", &p->number , &p->is_blank , &p->peoplenum , &p->price , &p->ordert ); 
            if(n == 1)
            {
                  head = p;
                  q = p;
            }
            else             //创建链表 
            {
                q->next = p;
                q = p;
            }
        }
        q->next = NULL;
    }
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}
 
 
 
void resave_table(table* head)
{
    table* p;
    p = head;
    //system("md E:\\canyin\\table");
    FILE *file;       //文件指针 
    file = fopen("E:\\canyin\\table\\table.txt","wb+");    //以追加的方式打开文件 
    if(file == NULL)
    {
        printf("文件打开失败\n");
    }
    ///if(fwrite(p, N, 1, fp)!=1)    //将p所指向的1个大小为N的数据结构写入fp所指向的文件中 
    //{
        //printf("文件写入失败\n");
    while(p->next != NULL)
    {
        fprintf( file ,"%d %d %d %d %d \n", p->number, p->is_blank , p->peoplenum , p->price , p->ordert);
        p=p->next;
    }
    //}
    fclose(file);        //关闭文件 
}
 
 
 
void client()
{
    order* orderh;
    orderh=(order*)malloc(sizeof(order));
    int tablenum;
    printf("当前可选择的桌位有:\n");
    table* head;
    table* p;
    head = (table*)malloc(sizeof(table));
    p = (table*)malloc(sizeof(table));
    head = fftable();
    p = head;
    while(p->next != NULL)
    {
        if(p->is_blank==0)
            printf("%d号\t",p->number);
    }
    printf("请选择你的桌位号:");
    scanf("%d",&tablenum);
    p = head;
    while(p->number == tablenum)
    {
        p->is_blank = 1;
        p->ordert = orderh;
        break;
    }
    //确定座位号 
    //char a;
    /* 
    printf("1.点菜");
    printf("2.查看已点的菜"); 
    scanf("%s",&a);
    switch(a)
    {
        case'1':order();break;//调用点菜函数 
        case'2':look_amend();break;//调用查看函数
        default:printf("请输入正确的选项!");break; 
     } */
     printf("请点菜:\n");
     p->price = ORDER(orderh);
     resave_table(head); 
}
 
 
int ORDER(order* head)
{
    menu* hot;
    menu* cold;
    menu* drink;
    int copies;
    int i=1;
    int priceall = 0;
    hot = ffmenuhot();
    cold = ffmenucold();
    drink = ffmenudrink();
    menu *h , *c , *d;
    show();//显示菜单函数 
    int numo; 
    printf("\n请输入你要点的菜的序号:(以#结束)"); 
    //将要点的菜加入订单链表中
    //order* head;
    order* p;
    order* q;
    head = (order*)malloc(sizeof(order));
    p = head;
    while(getch()!='#')
    {
        printf("%d:",i);
        scanf("%d",&numo);
        printf("份数:");
        scanf("%d",&copies);
        h = hot;
        c = cold;
        d = drink;
        while(h->next != NULL)
        {
            if(h->num==numo)
            {
                //p = (order*)malloc(sizeof(order));
                q = (order*)malloc(sizeof(order));
                q->next = NULL;
                p->number = h->num;
                strcmp(p->name , h->name );
                p->price = h->price;
                p->copies = copies;
                p->next = q;
                q = p;
                priceall = priceall + copies*(h->price);
                break;
            }
        }
        
        while(c->next != NULL)
        {
            if(c->num==numo)
            {
                //p = (order*)malloc(sizeof(order));
                q = (order*)malloc(sizeof(order));
                q->next = NULL;
                p->number = c->num;
                strcmp(p->name , c->name );
                p->price = c->price;
                p->copies = copies;
                p->next = q;
                q = p;
                priceall = priceall + copies*(h->price);
                break;
            }
        }
        
        while(d->next != NULL)
        {
            if(d->num==numo)
            {
                //p = (order*)malloc(sizeof(order));
                q = (order*)malloc(sizeof(order));
                q->next = NULL;
                p->number = d->num;
                strcmp(p->name , d->name );
                p->price = d->price;
                p->copies = copies;
                p->next = q;
                q = p;
                priceall = priceall + copies*(h->price);
                break;
            }
        }
        i++;
    }
    
    
    printf("\n点菜成功!"); 
    printf("您的订单总价是:%d",priceall);
    Sleep(10000);
    system("cls");
    return priceall;
    //look_amend();
}
 
void look_amend()
{
    char a; 
    printf("你点的菜是:\n");
    //将订单链表中的菜逐个输出 
    printf("1.添加菜品\n");
    printf("2.删除菜品\n");
    printf("3.确定\n"); 
    scanf("%s",&a);
    switch(a)
    {
        case'1':add();break;//调用加菜函数 
        case'2':cancel();break;//调用减菜函数
        case'3':priceall();break; 
        default:printf("请输入正确的选项!");break; 
     } 
}
 
void add()
{
    show();
    printf("请输入你要加入的菜的序号:");
    //将菜加入订单链表
    printf("\n加菜成功!");
    Sleep(2000);
    system("cls"); 
    look_amend();
}
 
 
void cancel()
{
    printf("你点的菜是:");
    printf("\n请输入你要删除的菜的序号:");
    //将菜从订单链表中删除
    printf("\n取消成功!"); 
    Sleep(2000);
    system("cls"); 
    look_amend();
}
 
/*
void enter()//登录 
{ 
    printf("账号:\n"); 
    printf("密码:");
    //调用判断登录函数; 
    printf("\n登录成功!");
    Sleep(2000);
    printf("\n欢迎您!");//判断普通客户  会员  管理员 
    client();
}*/
/*
void login()
{
    printf("账号:\n"); 
    printf("密码:");
    //调用判断登录函数; 
    printf("\n登录成功!");
    Sleep(2000);
    printf("\n欢迎您!");//判断普通客户  会员  管理员 
    client();
}*/
 
/*
void reg()//注册函数 
{
    //注册账户 
    printf("注册成功!");
    Sleep(2000);
    system("cls");
    order();//调用点菜函数 
} */
 
 
void show()//显示 
{
    menu* p1;
    menu* p2;
    menu* p3;
    menu* headhot;
    menu* headcold;
    menu* headdrink;
    headhot = ffmenuhot();
    headcold = ffmenucold();
    headdrink = ffmenudrink();
    p1 = headhot;
    p2 = headcold;
    p3 = headdrink;
    printf("热菜:\n");
    printf("序号       菜名       价格\n"); 
    printf("%d %s %d \n", p1->num, p1->name  , p1->price);
    while(p1->next != NULL)
    {
        printf("%d %s %d \n", p1->num, p1->name  , p1->price);
        p1=p1->next;
    }
    
    
    printf("冷菜:\n");
    printf("序号       菜名       价格\n");
    while(p2->next!=NULL)
    {
        printf("%d %s %d \n", p2->num, p2->name  , p2->price);
        p2=p2->next;
    }
    
    printf("饮料:\n");
    printf("序号       菜名       价格\n"); 
    while(p3->next!=NULL)
    {
        printf("%d %s %d \n", p3->num, p3->name  , p3->price);
        p3=p3->next;
    }
} 
 
 
int priceall()//合计价格 
{
    //计算总价并输出 
    printf("您订单的总价是:");
     printf("\n请等待服务员为你上菜(如需修改请和服务员联系)");
} 
 
 
void welcome()
{
    system("cls");
    system("color 3E");
    printf("===============欢迎来到赣味客家餐馆管理系统===============\n\n\n\n");
    printf("\t 1.登录\n"); 
    printf("\t 2.注册\n");
    printf("请选择[1 2] : [   ]\b\b\b");
    int n;
    while(1)
    {
        scanf("%d",&n);
        switch(n)
        {
            case 1:
                login();//登录 
                break;
            case 2:
                logon();//注册 
                break;    
            default:
                break;
        }
    }
}
 
user* ff1()               //将存账号的文件里的内容输出到链表中
{
    FILE *fp1;       //文件指针 
    int n = 0;
    user* head = NULL;
    user* q;
    user* p;
    system("md E:\\canyin\\zhanghu");
    fp1 = fopen("E:\\canyin\\zhanghu\\zhanghu.txt","a+");     //以只读的方式打开文件 
    if(fp1 == NULL)
    {
        printf("文件打开失败\n");
        //getchar();
        //exit(0);
    }
    else
    {
        while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
        {
            n ++;
               p = (user*)malloc(N); //向内存申请一段空间 
            //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
            fscanf(fp1,"%s %s %d %d",p->username ,p->password ,&p->vip ,&p->adm); 
            if(n == 1)
            {
                  head = p;
                  q = p;
            }
            else             //创建链表 
            {
                q->next = p;
                q = p;
            }
        }
        q->next = NULL;
    }
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}
 
//从菜单文件中读取菜单 
menu* ffmenuhot()
{
    FILE *fp1;       //文件指针 
    int n = 0;
    menu* head = NULL;
    menu* q;
    menu* p;
    system("md E:\\canyin\\menu");
    fp1 = fopen("E:\\canyin\\menu\\hotcai.txt","a+");     //以只读的方式打开文件 
    if(fp1 == NULL)
    {
        printf("文件打开失败\n");
        //getchar();
        //exit(0);
    }
    else
    {
        while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
        {
            n ++;
               p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间 
            //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
            fscanf(fp1,"%d %s %d",&p->num ,p->name ,&p->price); 
            if(n == 1)
            {
                  head = p;
                  q = p;
            }
            else             //创建链表 
            {
                q->next = p;
                q = p;
            }
        }
        q->next = NULL;
    }
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}
 
 
menu* ffmenucold()
{
    FILE *fp1;       //文件指针 
    int n = 0;
    menu* head = NULL;
    menu* q;
    menu* p;
    system("md E:\\canyin\\menu");
    fp1 = fopen("E:\\canyin\\menu\\coldcai.txt","a+");     //以只读的方式打开文件 
    if(fp1 == NULL)
    {
        printf("文件打开失败\n");
        //getchar();
        //exit(0);
    }
    else
    {
        while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
        {
            n ++;
               p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间 
            //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
            fscanf(fp1,"%d %s %d",&p->num ,p->name ,&p->price); 
            if(n == 1)
            {
                  head = p;
                  q = p;
            }
            else             //创建链表 
            {
                q->next = p;
                q = p;
            }
        }
        q->next = NULL;
    }
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}
 
 
menu* ffmenudrink()
{
    FILE *fp1;       //文件指针 
    int n = 0;
    menu* head = NULL;
    menu* q;
    menu* p;
    system("md E:\\canyin\\menu");
    fp1 = fopen("E:\\canyin\\menu\\drink.txt","a+");     //以只读的方式打开文件 
    if(fp1 == NULL)
    {
        printf("文件打开失败\n");
        //getchar();
        //exit(0);
    }
    else
    {
        while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
        {
            n ++;
               p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间 
            //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
            fscanf(fp1,"%d %s %d",&p->num ,p->name ,&p->price); 
            if(n == 1)
            {
                  head = p;
                  q = p;
            }
            else             //创建链表 
            {
                q->next = p;
                q = p;
            }
        }
        q->next = NULL;
    }
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}
 
 
void login()      // 账号登陆 
{ 
    system("cls");   //清屏 
    user* p;
    user* head;    
    head = ff1();
    p = head;
    //调用函数 ,返回值为头结点的指针
    /*
    p = head;
    while(p->next!=NULL)
    {
        printf("%s %s %d %d\n", p->username ,p->password , p->vip, p->adm);
        p=p->next;
    }*/
    do{
        char t, c, k, name1[12], password1[18];
        int i = 0;
        printf("***************************\n\n\n\n");
        printf("\t\t     登陆状态       ");
        printf("请输入您的账号:");
        scanf("%s", name1);
        printf("请输入您的密码:");
        for(;;)              //此处为输入密码不回显操作 
        {
            k = getch();       //输入k 
            if(k == '\r')      //如果输入k为回车,则跳出循环 
            {
                break;
            }
            else if(k == '\b')  //如果输入k为删除键 
            {
                if(i > 0)       //如若密码还没完全删除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else              //如果输入的k既不是删除键,也不是回车键 
            {
                password1[i] = k;   //把k的值赋给_password[i]; 
                printf("*");      //输出*号,保护用户隐私 
                i ++;              //密码位数加1 
            }
        }
        password1[i] = '\0';
        while( (p != NULL) && (strcmp(p->username, name1) != 0) )   //遍历链表,寻找当前输入的账户的账号 
        {
            p = p->next;
        }
        if(p != NULL)   //如果p不为空 
        {
            if(strcmp(p->password, password1) == 0)     //如果输入的密码正确 
            {
                printf("正在登陆....\n");
                Sleep(500);      //暂停0.5秒
                system("cls");
                printf("登陆成功!\n");
                break;    //跳出循环
            }
            else      //如果输入的密码错误
            { 
                printf("正在登陆....\n");
                Sleep(500);
                system("cls");
                printf("-------------------------\n");
                printf("|                       |\n");
                printf("| 密码错误!是否继续?  |\n");
                printf("| 1.是             2.否 |\n");
                printf("|                       |\n");
                printf("-------------------------\n");
                while(1)
                {
                    t = getch();  //输入t    
                    if(t == '1')          
                    {
                        system("cls");  //清屏 
                        break;
                    }
                    else if(t == '2')     //如果输入t为n,进入开始界面 
                    {
                        welcome();
                        break;
                    }
                }
            } 
       }
       else              //如果p为空,即输入的账号不正确 
       {
               printf("正在登陆....\n");
               Sleep(500);
               system("cls");
               printf("-------------------------\n");
               printf("|                       |\n");
            printf("|  账号错误!是否继续? |\n");
            printf("|                       |\n");
            printf("|  1.是            2.否 |\n"); 
            printf("|                       |\n");
            printf("-------------------------\n");
            while(1)      //死循环防止其他按键干扰 
            {
                c = getch();
                if(c == '1')
                {  
                    system("cls");
                    break;
                }
                else if(c == '2')
                {
                    welcome();
                    break;
                }
            }
       }
    }while(1);      //永远为真 
       Sleep(500);      //暂停0.5秒 
       client();
       //menu();         //账号密码均正确,进入主菜单 
}
 
 
 
 
 
void logon()        //注册账号 
{    
    //system("md E:\\canyin\\zhanghu");
    system("cls");
    user* p; 
    p = (user*)malloc(N);     //向内存申请一段空间 
    p->next==NULL;
    //do
    //{
        char name[12],password[18],againpassword[18],c,k;
        int i = 0; 
        printf("赣味客家餐饮管理系统\n");
        printf("**************************\n");
        printf("请输入账号(手机号):\n");
        scanf("%s",name);
        //printf("请输入密码:\n");
        for(;;)              //此处为输入密码不回显操作 
        {
            getpassword(password,againpassword);
            if(is_password_same(password,againpassword)==1);
        //if(strcmp(password, againpassword) == 0)        //如果输入的两次密码均正确 
            {
                strcpy(p->username, name);
                strcpy(p->password, password);
                printf("\n是否注册为会员(0.否,1.是)");
                scanf("%d", &p->vip);
                printf("\n是否注册为管理员(0.否,1.是)"); 
                scanf("%d", &p->adm); 
                printf("正在注册....\n");
                save_user(p);
                Sleep(500);
                system("cls");
                printf("注册成功!\n");
                Sleep(500);         //暂停0.5秒 
                break;              //跳出循环 
            }
        /*
        else    //如果输入的两次密码不同 
        {
            printf("正在注册....\n");
            Sleep(500);
            system("cls");
            printf("-----------------------------");
            printf("|                           |");
            printf("|  注册失败!两次密码不统一,是否继续注册? |");
            printf("|                           |");
            printf("|  1.是               2.否  |"); 
            printf("|                           |");
            printf("-----------------------------");
            while(1)
            {
                c = getch();
                if(c == '1')
                {
                    system("cls");
                    //logon();
                    
                    break;
                }
                else if(c == '2')
                {
                    welcome();
                    break;
                }
            }
        }*/
    }
    //}while(1);    //永远为真 
    printf("正在自动为您登陆....\n");
    Sleep(500);
    printf("\n登录成功!");
    Sleep(2000);
    printf("\n欢迎您!");//判断普通客户  会员  管理员 
    client();
    //login();
}
 
void getpassword(char password[18],char againpassword[18])
{
    char k;
    int i=0;
    printf("请输入密码:\n");
        for(;;)              //此处为输入密码不回显操作 
        {
            k = getch();       //输入k 
            if(k == '\r')      //如果输入k为回车,则跳出循环 
            {
                break;
            }
            
            else if(k == '\b')  //如果输入k为删除键 
            {
                if(i > 0)       //如若密码还没完全删除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i --;
                }
            }
            
            else              //如果输入的k既不是删除键,也不是回车键 
            {
                password[i] = k;   //把k的值赋给_password[i]; 
                printf("*");      //输出*号,保护用户隐私 
                i ++;              //密码位数加1 
            }
        }
        
        password[i] = '\0';
        i = 0;
        printf("\n请确认您的密码:\n");
        for(;;)              //此处为输入密码不回显操作 
        {
            k = getch();       //输入k 
            if(k == '\r')      //如果输入k为回车,则跳出循环 
            {
                break;
            }
            else if(k == '\b')  //如果输入k为删除键 
            {
                if(i > 0)       //如若密码还没完全删除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i --;
                }
            }
            else              //如果输入的k既不是删除键,也不是回车键 
            {
                againpassword[i] = k;   //把k的值赋给_password[i]; 
                printf("*");      //输出*号,保护用户隐私 
                i++;              //密码位数加1 
            }
        }
        againpassword[i] = '\0';
}
 
 
int is_password_same(char password[18],char againpassword[18])
{
    char c;
    if(strcmp(password, againpassword) != 0)
    {
        {
            printf("正在注册....\n");
            Sleep(500);
            system("cls");
            printf("-----------------------------");
            printf("|                           |");
            printf("|  注册失败!两次密码不统一,是否继续注册? |");
            printf("|                           |");
            printf("|  1.是               2.否  |"); 
            printf("|                           |");
            printf("-----------------------------");
            while(1)
            {
                c = getch();
                if(c == '1')
                {
                    system("cls");
                    //logon();
                    getpassword(password,againpassword);
                    break;
                }
                else if(c == '2')
                {
                    return 0;
                    welcome();
                    //break;
                }
            }
        }
    }
    else
        return 1;
}
 
void save_user(user* p)
{
    system("md E:\\canyin\\zhanghu");
    FILE *file;       //文件指针 
    file = fopen("E:\\canyin\\zhanghu\\zhanghu.txt","a");    //以追加的方式打开文件 
    if(file == NULL)
    {
        printf("文件打开失败\n");
    }
    ///if(fwrite(p, N, 1, fp)!=1)    //将p所指向的1个大小为N的数据结构写入fp所指向的文件中 
    //{
        //printf("文件写入失败\n");
    fprintf( file ,"%s %s %d %d\n", p->username , p->password , p->vip , p->adm );
    //}

这是以前写的餐饮管理系统,和大佬们没得比,可以参考一下,因为是以前写的所以文件找不到了,可以自己把文件部分修改一下重新创建即可 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好代码网。