首頁 > 軟體

C語言實現餐飲管理系統

2022-03-18 19:00:49

本文範例為大家分享了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("===============歡迎來到贛味客家餐館管理系統===============nnnn");
    printf("t 1.登入n"); 
    printf("t 2.註冊n");
    printf("請選擇[1 2] : [   ]bbb");
    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 %dn", p->username ,p->password , p->vip, p->adm);
        p=p->next;
    }*/
    do{
        char t, c, k, name1[12], password1[18];
        int i = 0;
        printf("***************************nnnn");
        printf("tt     登陸狀態       ");
        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] = '';
        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] = '';
        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] = '';
}
 
 
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 %dn", p->username , p->password , p->vip , p->adm );
    //}

這是以前寫的餐飲管理系統,和大佬們沒得比,可以參考一下,因為是以前寫的所以檔案找不到了,可以自己把檔案部分修改一下重新建立即可 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com