本文實(shí)例為大家分享了C語言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、項(xiàng)目簡介
1、本程序?qū)崿F(xiàn)了用戶的點(diǎn)餐功能,共包含五類菜品:涼菜、熱菜、鍋?zhàn)小⒅魇场嬈贰_€有查看所點(diǎn)菜品與結(jié)束等功能。
2、后臺(tái)管理員:按a可進(jìn)入,主頁面并未提示。
3、合理運(yùn)用getch函數(shù),清屏與暫停函數(shù),頁面整潔清爽。
4、菜品與txt文件對(duì)應(yīng),可實(shí)現(xiàn)對(duì)程序與txt的同步增刪改查等功能。
5、使用了C語言很多基礎(chǔ)語法:函數(shù)、指針、結(jié)構(gòu)體、文件等。
二、程序說明
程序運(yùn)行后在主頁面按a進(jìn)入后臺(tái)管理頁面,給相應(yīng)的菜品信息添加菜品,這些信息會(huì)自動(dòng)保存到txt中,下次打開的時(shí)候也會(huì)自動(dòng)讀取,做好菜品信息的創(chuàng)建工作就可以回到主頁面進(jìn)行相應(yīng)的用戶點(diǎn)餐操作。
三、功能演示
四、思維導(dǎo)圖
五、程序代碼
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> /*宏定義區(qū)*/ #define max_str 30 //最大字符串長度 #define max_num 30 //最大菜品數(shù)量 #define max_all 100 //今日售賣總計(jì)最大值 /*定義菜品結(jié)構(gòu)體*/ struct dishes { char name[max_str]; int price; }; /*定義全局變量*/ struct dishes list1[max_num]; //存放涼菜菜品信息 int num1=0; //存放涼菜菜品數(shù)量 int *p1=&num1; struct dishes list2[max_num]; //存放熱菜菜品信息 int num2=0; //存放熱菜菜品數(shù)量 int *p2=&num2; struct dishes list3[max_num]; //存放鍋?zhàn)胁似沸畔? int num3=0; //存放鍋?zhàn)胁似窋?shù)量 int *p3=&num3; struct dishes list4[max_num]; //存放主食菜品信息 int num4=0; //存放主食菜品數(shù)量 int *p4=&num4; struct dishes list5[max_num]; //存放飲品菜品信息 int num5=0; //存放飲品菜品數(shù)量 int *p5=&num5; struct dishes list6[max_num]; //存放顧客點(diǎn)餐菜品信息 int num6=0; //存放顧客點(diǎn)餐菜品數(shù)量 int *p6=&num6; struct dishes list7[max_all]; //存放今日所點(diǎn)總菜品信息 int num7=0; //存放今日所點(diǎn)總菜品數(shù)量 int *p7=&num7; /*全局聲明*/ /*菜單的輸出*/ //一級(jí)主菜單 char menu_m1(); // 管理員一級(jí)菜單 char menu_a1(); // 管理員二級(jí)菜單:添加或刪除菜品的提示 char menu_a2(); //輸出菜單1(包括提示輸入語句) void output_1(struct dishes list[],int num); //輸出菜品信息2(不含有提示輸入語句) void output_2(struct dishes list[],int num); /*函數(shù)*/ //創(chuàng)建程序運(yùn)行所需的txt文件 void creat_file(); //加載菜品信息到結(jié)構(gòu)體數(shù)組,嵌套功能模塊1:讀取txt寫入到單個(gè)結(jié)構(gòu)體數(shù)組中 void load_dishes(struct dishes list1[],int *p1,struct dishes list2[],int *p2,struct dishes list3[],int *p3,struct dishes list4[],int *p4,struct dishes list5[],int *p5); //實(shí)現(xiàn)點(diǎn)餐的函數(shù),嵌套功能模塊2:實(shí)現(xiàn)點(diǎn)餐的結(jié)構(gòu)體數(shù)組寫入數(shù)據(jù) void ordering(struct dishes list1[],int num1,struct dishes list2[],int *p2,struct dishes list3[],int *p3); // 查看與結(jié)算的輸出函數(shù) void settlement(struct dishes list[],int num); // 計(jì)算今日收入 void income(struct dishes list[],int num); // 實(shí)現(xiàn)菜品的價(jià)格修改,內(nèi)嵌功能模塊3:實(shí)現(xiàn)結(jié)構(gòu)體菜品的價(jià)格修改與文件的重構(gòu) void change(struct dishes list[],int *p,char ch); // 實(shí)現(xiàn)菜品的刪除,內(nèi)嵌功能模塊4:實(shí)現(xiàn)結(jié)構(gòu)體菜品的刪除與文件的重構(gòu) void del(struct dishes list[],int *p,char ch); // 函數(shù):實(shí)現(xiàn)菜品的添加,內(nèi)嵌功能模塊5:實(shí)現(xiàn)結(jié)構(gòu)體菜品的添加與文件的重構(gòu) void add(struct dishes list[],int *p,char ch); /*功能模塊區(qū)*/ //功能模塊1:讀取txt寫入到單個(gè)結(jié)構(gòu)體數(shù)組中 int function_read(struct dishes list[],FILE *fp); //功能模塊2:實(shí)現(xiàn)點(diǎn)餐的結(jié)構(gòu)體數(shù)組寫入數(shù)據(jù) void function_ordering(struct dishes list1[],int num1,struct dishes list2[],int *p2,struct dishes list3[],int *p3,int choice); // 功能模塊3:實(shí)現(xiàn)結(jié)構(gòu)體菜品的價(jià)格修改與文件的重構(gòu),內(nèi)嵌功能模塊6:對(duì)經(jīng)過修改的菜品結(jié)構(gòu)體按價(jià)格從低到高排序 int funtion_change(struct dishes list[],int num,FILE *fp); //功能模塊4:實(shí)現(xiàn)結(jié)構(gòu)體菜品的刪除與文件的重構(gòu) int function_del(struct dishes list[],int *p,FILE *fp); //功能模塊5:實(shí)現(xiàn)結(jié)構(gòu)體菜品的添加與文件的重構(gòu),,內(nèi)嵌功能模塊6:對(duì)經(jīng)過修改的菜品結(jié)構(gòu)體按價(jià)格從低到高排序 int function_add(struct dishes list[],int *p,FILE *fp); // 功能模塊6:對(duì)經(jīng)過修改的菜品結(jié)構(gòu)體按價(jià)格從低到高排序 void function_sort(struct dishes list[],int num); int main() { creat_file(); load_dishes(list1,p1,list2,p2,list3,p3,list4,p4,list5,p5); int i,j,choice; char a,b,c; while(1) { a=menu_m1(); switch(a) { case "1": ordering(list1,num1,list6,p6,list7,p7); break; case "2": ordering(list2,num2,list6,p6,list7,p7); break; case "3": ordering(list3,num3,list6,p6,list7,p7); break; case "4": ordering(list4,num4,list6,p6,list7,p7); break; case "5": ordering(list5,num5,list6,p6,list7,p7); break; case "6": system("cls"),settlement(list6,num6),system("pause"),system("cls"); break; case "y": system("cls"),settlement(list6,num6),*p6=0,system("pause"); break; case "a": system("cls"); while(1) { b=menu_a1(); switch(b) { case "1": system("cls"),income(list7,num7),system("pause"),system("cls"); break; case "2": { system("cls"); c=menu_a2(); system("cls"); switch(c) { case "1": change(list1,p1,c); break; case "2": change(list2,p2,c); break; case "3": change(list3,p3,c); break; case "4": change(list4,p4,c); break; case "5": change(list5,p5,c); break; } system("cls"); } break; case "3": { system("cls"); c=menu_a2(); system("cls"); switch(c) { case "1": del(list1,p1,c); break; case "2": del(list2,p2,c); break; case "3": del(list3,p3,c); break; case "4": del(list4,p4,c); break; case "5": del(list5,p5,c); break; } system("cls"); } break; case "4": { system("cls"); c=menu_a2(); system("cls"); switch(c) { case "1": add(list1,p1,c); break; case "2": add(list2,p2,c); break; case "3": add(list3,p3,c); break; case "4": add(list4,p4,c); break; case "5": add(list5,p5,c); break; } system("cls"); } break; case "0": system("cls"); break; } if(b=="0") break; } break; } system("cls"); } } /*菜單的輸出*/ //一級(jí)主菜單 char menu_m1() { char ch; printf(" --------------------------- "); printf(" | 歡迎光臨本餐廳 | "); printf(" | 請(qǐng)按序號(hào)選擇菜品 | "); printf(" --------------------------- "); printf(" | 1 涼菜 | "); printf(" | 2 熱菜 | "); printf(" | 3 鍋?zhàn)? | "); printf(" | 4 主食 | "); printf(" | 5 飲品 | "); printf(" | 6 查看 | "); printf(" | y 結(jié)算 | "); printf(" --------------------------- "); printf(" 輸入序號(hào):"); ch=getch(); return ch; } // 管理員一級(jí)菜單 char menu_a1() { char ch; printf(" ------------------------------- "); printf(" 1 今日收入 "); printf(" 2 修改價(jià)格 "); printf(" 3 刪除菜品 "); printf(" 4 添加菜品 "); printf(" 0 返回上一級(jí) "); printf("------------------------------- "); printf("輸入序號(hào):"); ch=getch(); return ch; } // 管理員二級(jí)菜單:添加或刪除菜品的提示 char menu_a2() { char ch; printf(" ------------------------------- "); printf(" 1 涼菜 "); printf(" 2 熱菜 "); printf(" 3 鍋?zhàn)? "); printf(" 4 主食 "); printf(" 5 飲品 "); printf(" 0 返回上一級(jí) "); printf("------------------------------- "); printf("輸入序號(hào):"); ch=getch(); return ch; } //輸出菜單1(包括提示輸入語句) void output_1(struct dishes list[],int num) { int i; printf(" ------------------------------------------------- "); printf("| 序號(hào) 菜品 價(jià)格 | "); printf("------------------------------------------------- "); for(i=0; i<num; i++) { if(strlen(list[i].name)<=6) printf("| %d %s %d | ",i+1,list[i].name,list[i].price); else printf("| %d %s %d | ",i+1,list[i].name,list[i].price); } printf("| 0 返回 | "); printf("------------------------------------------------- "); printf("請(qǐng)輸入序號(hào): "); } //輸出菜品信息2(不含有提示輸入語句) void output_2(struct dishes list[],int num) { int i; printf(" ------------------------------------------------- "); printf("| 序號(hào) 菜品 價(jià)格 | "); printf("------------------------------------------------- "); for(i=0; i<num; i++) { if(strlen(list[i].name)<=6) printf("| %d %s %d | ",i+1,list[i].name,list[i].price); else printf("| %d %s %d | ",i+1,list[i].name,list[i].price); } printf("| 0 返回 | "); printf("------------------------------------------------- "); } /*函數(shù)*/ //創(chuàng)建程序運(yùn)行所需的txt文件 void creat_file() { FILE *fp=fopen("涼菜.txt","a"); if(fp==NULL) return; fclose(fp); fp=fopen("熱菜.txt","a"); if(fp==NULL) return; fclose(fp); fp=fopen("鍋?zhàn)?txt","a"); if(fp==NULL) return; fclose(fp); fp=fopen("主食.txt","a"); if(fp==NULL) return; fclose(fp); fp=fopen("飲品.txt","a"); if(fp==NULL) return; fclose(fp); } //加載菜品信息到結(jié)構(gòu)體數(shù)組,嵌套功能模塊1:讀取txt寫入到單個(gè)結(jié)構(gòu)體數(shù)組中 void load_dishes(struct dishes list1[],int *p1,struct dishes list2[],int *p2,struct dishes list3[],int *p3,struct dishes list4[],int *p4,struct dishes list5[],int *p5) { FILE *fp; fp=fopen("涼菜.txt","r"); *p1=function_read(list1,fp); fp=fopen("熱菜.txt","r"); *p2=function_read(list2,fp); fp=fopen("鍋?zhàn)?txt","r"); *p3=function_read(list3,fp); fp=fopen("主食.txt","r"); *p4=function_read(list4,fp); fp=fopen("飲品.txt","r"); *p5=function_read(list5,fp); fclose(fp); } //實(shí)現(xiàn)點(diǎn)餐的函數(shù),嵌套功能模塊2:實(shí)現(xiàn)點(diǎn)餐的結(jié)構(gòu)體數(shù)組寫入數(shù)據(jù) void ordering(struct dishes list1[],int num1,struct dishes list2[],int *p2,struct dishes list3[],int *p3) { int choice; system("cls"); output_1(list1,num1); while(1) { scanf("%d",&choice); if(choice>=0&&choice<=num1) { if(choice==0) break; else function_ordering(list1,num1,list2,p2,list3,p3,choice); } else printf("輸入序號(hào)有誤,請(qǐng)重新輸入: "); } } // 查看與結(jié)算的輸出函數(shù) void settlement(struct dishes list[],int num) { int i,sum; for(i=0,sum=0; i<num; i++) sum+=list[i].price; printf(" ------------------------------------------------- "); printf("| 序號(hào) 菜品 價(jià)格 | "); printf("------------------------------------------------- "); for(i=0; i<num; i++) { if(strlen(list[i].name)<=6) printf("| %d %s %d | ",i+1,list[i].name,list[i].price); else printf("| %d %s %d | ",i+1,list[i].name,list[i].price); } printf("------------------------------------------------- "); printf("總價(jià)格為:%d ",sum); } // 計(jì)算今日收入 void income(struct dishes list[],int num) { int i,sum; output_2(list,num); for(i=0,sum=0; i<num; i++) sum+=list[i].price; printf("今日總收入:%d ",sum); } // 實(shí)現(xiàn)菜品的價(jià)格修改,內(nèi)嵌功能模塊3:實(shí)現(xiàn)結(jié)構(gòu)體菜品的價(jià)格修改與文件的重構(gòu) void change(struct dishes list[],int *p,char ch) { int i=1; FILE *fp; while(i!=0) { switch(ch) { case "1": output_2(list1,num1),fp=fopen("涼菜.txt","w"),i=funtion_change(list1,num1,fp),fclose(fp); break; case "2": output_2(list2,num2),fp=fopen("熱菜.txt","w"),i=funtion_change(list2,num2,fp),fclose(fp); break; case "3": output_2(list3,num3),fp=fopen("鍋?zhàn)?txt","w"),i=funtion_change(list3,num3,fp),fclose(fp); break; case "4": output_2(list4,num4),fp=fopen("主食.txt","w"),i=funtion_change(list4,num4,fp),fclose(fp); break; case "5": output_2(list5,num5),fp=fopen("飲品.txt","w"),i=funtion_change(list5,num5,fp),fclose(fp); break; } } } // 實(shí)現(xiàn)菜品的刪除,內(nèi)嵌功能模塊4:實(shí)現(xiàn)結(jié)構(gòu)體菜品的刪除與文件的重構(gòu) void del(struct dishes list[],int *p,char ch) { int i=1; FILE *fp; while(i!=0) { switch(ch) { case "1": output_2(list1,num1),fp=fopen("涼菜.txt","w"),i=function_del(list1,p1,fp),fclose(fp); break; case "2": output_2(list2,num2),fp=fopen("熱菜.txt","w"),i=function_del(list2,p2,fp),fclose(fp); break; case "3": output_2(list3,num3),fp=fopen("鍋?zhàn)?txt","w"),i=function_del(list3,p3,fp),fclose(fp); break; case "4": output_2(list4,num4),fp=fopen("主食.txt","w"),i=function_del(list4,p4,fp),fclose(fp); break; case "5": output_2(list5,num5),fp=fopen("飲品.txt","w"),i=function_del(list5,p5,fp),fclose(fp); break; } } } // 函數(shù):實(shí)現(xiàn)菜品的添加,內(nèi)嵌功能模塊5:實(shí)現(xiàn)結(jié)構(gòu)體菜品的添加與文件的重構(gòu) void add(struct dishes list[],int *p,char ch) { int i=1; FILE *fp; while(i!=0) { switch(ch) { case "1": output_2(list1,num1),fp=fopen("涼菜.txt","w"),i=function_add(list1,p1,fp),fclose(fp); break; case "2": output_2(list2,num2),fp=fopen("熱菜.txt","w"),i=function_add(list2,p2,fp),fclose(fp); break; case "3": output_2(list3,num3),fp=fopen("鍋?zhàn)?txt","w"),i=function_add(list3,p3,fp),fclose(fp); break; case "4": output_2(list4,num4),fp=fopen("主食.txt","w"),i=function_add(list4,p4,fp),fclose(fp); break; case "5": output_2(list5,num5),fp=fopen("飲品.txt","w"),i=function_add(list5,p5,fp),fclose(fp); break; } } } /*功能模塊區(qū)*/ //功能模塊1:讀取txt寫入到單個(gè)結(jié)構(gòu)體數(shù)組中 int function_read(struct dishes list[],FILE *fp) { int num=1;//索引從0開始 定義為1統(tǒng)計(jì)個(gè)數(shù) char t,c[max_str]; int i; if(fp==NULL) { printf("Can"t open this file "); exit(1); } while(!feof(fp)) //檢測流上的文件結(jié)束符,如果文件s結(jié)束,則返回非0值,否則返回0 { t=fgetc(fp); if(t==" ") num++; } rewind(fp); //將指針重置到第一行 for(i=0; i<num; i++) { fgets(c,max_str,fp); sscanf(c,"%s %d",list[i].name,&list[i].price); } fclose(fp); return num; } //功能模塊2:實(shí)現(xiàn)點(diǎn)餐的結(jié)構(gòu)體數(shù)組寫入數(shù)據(jù) void function_ordering(struct dishes list1[],int num1,struct dishes list2[],int *p2,struct dishes list3[],int *p3,int choice) { strcpy(list2[*p2].name,list1[choice-1].name); list2[*p2].price=list1[choice-1].price; strcpy(list3[*p3].name,list1[choice-1].name); list3[*p3].price=list1[choice-1].price; *p2=*p2+1; *p3=*p3+1; } // 功能模塊3:實(shí)現(xiàn)結(jié)構(gòu)體菜品的價(jià)格修改與文件的重構(gòu),內(nèi)嵌功能模塊6:對(duì)經(jīng)過修改的菜品結(jié)構(gòu)體按價(jià)格從低到高排序 int funtion_change(struct dishes list[],int num,FILE *fp) { if(fp==NULL) { printf("Can"t open this file "); exit(1); } int i,n; char temp[max_str],t[max_str]; printf(" 輸入ID:"); scanf("%d",&n); if(n==0) { for(i=0; i<num; i++) { strcpy(temp,list[i].name); strcat(temp," "); itoa(list[i].price,t,10); //itoa():將整型值轉(zhuǎn)換為字符串,參數(shù)依次為:要復(fù)制的內(nèi)容,復(fù)制給誰,以什么進(jìn)制。 strcat(temp,t); strcat(temp," "); fputs(temp,fp); } return n; } printf("輸入修改后的價(jià)格:"); scanf("%d",&list[n-1].price); function_sort(list,num); for(i=0; i<num; i++) { strcpy(temp,list[i].name); strcat(temp," "); itoa(list[i].price,t,10); //itoa():將整型值轉(zhuǎn)換為字符串,參數(shù)依次為:要復(fù)制的內(nèi)容,復(fù)制給誰,以什么進(jìn)制。 strcat(temp,t); strcat(temp," "); fputs(temp,fp); } printf("修改完成 "); system("pause"); system("cls"); return 1; } //功能模塊4:實(shí)現(xiàn)結(jié)構(gòu)體菜品的刪除與文件的重構(gòu) int function_del(struct dishes list[],int *p,FILE *fp) { if(fp==NULL) { printf("Can"t open this file "); exit(1); } int i,n; char temp[max_str],t[max_str]; printf(" 輸入想要修改的菜品ID:"); scanf("%d",&n); if(n==0) { for(i=0; i<*p; i++) { strcpy(temp,list[i].name); strcat(temp," "); itoa(list[i].price,t,10); //itoa():將整型值轉(zhuǎn)換為字符串,參數(shù)依次為:要復(fù)制的內(nèi)容,復(fù)制給誰,以什么進(jìn)制。 strcat(temp,t); strcat(temp," "); fputs(temp,fp); } return 0; } for(i=n-1; i<*p; i++) { strcpy(list[i].name,list[i+1].name); list[i].price=list[i+1].price; } *p=*p-1; for(i=0; i<*p; i++) { strcpy(temp,list[i].name); strcat(temp," "); itoa(list[i].price,t,10); //itoa():將整型值轉(zhuǎn)換為字符串,參數(shù)依次為:要復(fù)制的內(nèi)容,復(fù)制給誰,以什么進(jìn)制。 strcat(temp,t); strcat(temp," "); fputs(temp,fp); } printf("刪除完成 "); system("pause"); system("cls"); return 1; } //功能模塊5:實(shí)現(xiàn)結(jié)構(gòu)體菜品的添加與文件的重構(gòu),內(nèi)嵌功能模塊6:對(duì)經(jīng)過修改的菜品結(jié)構(gòu)體按價(jià)格從低到高排序 int function_add(struct dishes list[],int *p,FILE *fp) { if(fp==NULL) { printf("Can"t open this file "); exit(1); } int i,n,x; char temp[max_str],t[max_str],in[max_str]; printf(" 輸入0 0返回上一級(jí) "); printf("輸入菜品名和價(jià)格,中間使用空格隔開: "); scanf("%s%d",list[*p].name,&list[*p].price); if(list[*p].price == 0) { for(i=0; i<*p; i++) { strcpy(temp,list[i].name); strcat(temp," "); itoa(list[i].price,t,10); //itoa():將整型值轉(zhuǎn)換為字符串,參數(shù)依次為:要復(fù)制的內(nèi)容,復(fù)制給誰,以什么進(jìn)制。 strcat(temp,t); strcat(temp," "); fputs(temp,fp); } return 0; } *p=*p+1; function_sort(list,*p); for(i=0; i<*p; i++) { strcpy(temp,list[i].name); strcat(temp," "); itoa(list[i].price,t,10); //itoa():將整型值轉(zhuǎn)換為字符串,參數(shù)依次為:要復(fù)制的內(nèi)容,復(fù)制給誰,以什么進(jìn)制。 strcat(temp,t); strcat(temp," "); fputs(temp,fp); } printf("添加完成 "); system("pause"); system("cls"); return 1; } // 功能模塊6:對(duì)經(jīng)過修改的菜品結(jié)構(gòu)體按價(jià)格從低到高排序 void function_sort(struct dishes list[],int num) { int i,j; struct dishes t; for(j=num-1; j>0; j--) { for(i=0; i<j; i++) if(list[i].price>list[i+1].price) { t=list[i]; list[i]=list[i+1]; list[i+1]=t; } } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/kcyxws/article/details/105824538