本文实例为大家分享了C语言实现简易订餐系统的具体代码,供大家参考,具体内容如下
主要功能:(1)菜单维护(餐厅管理人员使用)采用顺序表实现
1、添加新菜
2、删除菜品
3、修改菜品信息
4、打印现有的菜品信息
(2)点餐(客户使用) 采用链表实现
1、订单菜品添加、删除、显示
2、计算显示订单总价.........
对此我们可以创建一个结构体类型,并将其重命名为ElemType,结构体里面存放有id,name,price分别表示菜品的id号,菜名和价格。接着分别定义一个顺序表和链表。接着我们就可以开始实现代码啦!
这里我采用的是多文件编程的方式,总共包含七个文件,三个.h文件,四个.c文件。
你只需要创建一个工程,然后分别创建下列七个文件并命名好就可以啦。
main.c文件中代码如下:
#include"run.h"
int main()
{
run_init();
return 0;
}
main函数里只调用了一个run_init()函数
run.h文件代码如下:
#ifndef __RUN_H
#define __RUN_H
#include"list.h"
#include"link.h"
void run_init();
SqList * menu_mt(SqList * List);
void menu_help();
Link_Node * order_mt(Link_Node *Head,SqList *List);
void order_help();
#endif
run.c文件代码:
#include"run.h"
#include"stdlib.h"
void run_init()
{
int a;
SqList * List;
Link_Node * Head;
while(1)
{
printf("\t\t****输入1进入菜单维护模式****\n\t\t****输入2进入点餐模式****\n");
printf("\t\t****输入3退出程序****\n");
printf("请进行模式选择:\n");
scanf("%d",&a);
switch(a)
{
case 1: List = menu_mt(List);break;
case 2: Head = order_mt(Head,List);break;
case 3: printf("谢谢使用本程序!期待下次与你会见!\n");
if(List != NULL) free(List);return ; //结束程序
default:printf("error,没有这个选项!请重新选择!\n");break;
}
}
}
SqList * menu_mt(SqList * List)
{
int flag = 1,a;//flag为退出标志
while(flag)
{
menu_help();
printf("请进行模式选择:");
scanf("%d",&a);
switch(a)
{
case 1:List = Create_List();break;
case 2: Display_List(List);break;
case 3:List = Add_List(List);break;
case 4:List = Delete_List(List);break;
case 5:List = Updata_List(List);break;
case 6:flag = 0;break;
default:printf("error,没有这个选项,请重新选择!\n");break;
}
}
printf("已成功退出菜单维护模式!\n");
return List;
}
void menu_help()
{
printf("\t\t******1------>创建菜单表------******\n");
printf("\t\t******2------>打印菜单表------******\n");
printf("\t\t******3------> 添加菜品 ------******\n");
printf("\t\t******4------> 删除菜品 ------******\n");
printf("\t\t******5------> 修改菜品 ------******\n");
printf("\t\t******6------> 返回上级 ------******\n");
}
void order_help()
{
printf("\t\t******1------>开始点餐(创建链表)------******\n");
printf("\t\t******2------> 显示所有菜品信息 ------******\n");
printf("\t\t******3------> 订单菜品添加 ------******\n");
printf("\t\t******4------> 订单菜品删除 ------******\n");
printf("\t\t******5------> 显示已点菜品信息 ------******\n");
printf("\t\t******6------> 计算订单价格 ------******\n");
printf("\t\t******7------> 返回上级 ------******\n");
}
Link_Node * order_mt(Link_Node *Head,SqList *List)
{
int flag = 1,a;//flag为退出标志
while(flag)
{
order_help();
printf("请进行模式选择:");
scanf("%d",&a);
switch(a)
{
case 1:Head = Create_Link(Head);break;
case 2: Display_List(List);break;
case 3:Head = Add_Link(Head,List);break;
case 4:Head = Delete_Link(Head);break;
case 5: Display_Link(Head);break;
case 6: Count_Link(Head);break;
case 7:flag = 0;break;
default:printf("error,没有这个选项,请重新选择!\n");break;
}
}
Destory_Link(Head);
printf("已成功退出点餐模式!\n");
return Head;
}
link.h代码如下:
#ifndef __LINK_H
#define __LINK_H
#include "list.h"
typedef struct LNode
{
ElemType data;
struct LNode *next;
}Link_Node;
Link_Node *Create_Link(Link_Node * Head);
Link_Node *Add_Link(Link_Node *Head,SqList *List);
Link_Node *Delete_Link(Link_Node *Head);
void Count_Link(Link_Node *Head);
void Display_Link(Link_Node *Head);
void Destory_Link(Link_Node *Head);
#endif
link.c代码如下:
#include"link.h"
#include "stdlib.h"
//创建链表
Link_Node *Create_Link(Link_Node * Head)
{
Head = (Link_Node*)malloc(sizeof(Link_Node));
if(Head == NULL)
printf("申请空间失败!\n");
else
{
Head->next = NULL;
printf("订单申请成功,您现在可以开始点餐啦!\n");
}
return Head;
}
//添加结点
Link_Node *Add_Link(Link_Node *Head,SqList *List)
{
int id_input,a;
Link_Node *Ptemp = NULL;
Ptemp = (Link_Node*)malloc(sizeof(Link_Node));
if(Ptemp == NULL)
printf("申请空间失败!\n");
else
{
printf("输入你想添加菜品的id:");
scanf("%d",&id_input);
a = Searchid_List(List,id_input);
if(a == -1)
{
printf("暂时还没有这个菜呀,请您重新选择。\n");
}
else
{
Ptemp->data = List->data[a];
Ptemp->next = Head->next;
Head->next = Ptemp;
printf("菜品已成功添加到您的订单!\n");
}
}
return Head;
}
//删除结点
Link_Node *Delete_Link(Link_Node *Head)
{
int id_input;
Link_Node *Pt=Head->next,*Pq=Head;
printf("请输入你想删除菜品的id:");
scanf("%d",&id_input);
while (Pt!=NULL)
{
if(id_input == (Pt->data).id) //找到便删除
{
Pq->next = Pt->next;
free(Pt);
printf("已成功删除!\n");
break;
}
Pt = Pt->next;
Pq = Pq->next;//向后走链
}
if(Pt==NULL)
{
printf("删除失败,您的订单中没有这个菜喔.\n");
}
return Head;
}
//打印订单
void Display_Link(Link_Node *Head)
{
Link_Node *Pt=Head->next;
printf("已点菜品如下:\n");
while (Pt!=NULL)
{
printf("id:%d\t",(Pt->data).id);
printf("name:%s\t",(Pt->data).name);
printf("price:%d\n",(Pt->data).price);
Pt = Pt->next;
}
}
//计算订单总价
void Count_Link(Link_Node *Head)
{
int sum = 0;
Link_Node *Pt=Head->next;
while (Pt!=NULL)
{
sum += (Pt->data).price;
Pt = Pt->next;
}
printf("您的订单总价格为:%d元\n",sum);
}
//销毁链表
void Destory_Link(Link_Node *Head)
{
Link_Node *Pt=Head;
while(Head!=NULL)
{
Head = Head->next;
free(Pt);
Pt = Head;
}
printf("链表空间已释放!\n");
}
list.h文件代码如下:
#ifndef __LIST_H
#define __LIST_H
#include "stdio.h"
#define MaxSize 100
typedef struct
{
int id;
char name[50];
int price;
}ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;
SqList * Create_List();
void input_one(SqList *List,int i);
void Display_List(SqList *List);
SqList * Add_List(SqList *List);
SqList * Delete_List(SqList *List);
SqList * Updata_List(SqList *List);
int Searchid_List(SqList *List,int id_input);
int Searchname_List(SqList *List,char *name_input);
int mode_choose(SqList *List);
#endif
list.c文件代码如下:
#include "list.h"
#include "stdlib.h"
#include "string.h"
//创建顺序表并初始化
SqList * Create_List()
{
int num;
SqList * List;
List = (SqList*)malloc(sizeof(SqList));
if(List == NULL)
{
printf("申请空间失败!\n");
return 0;
}
printf("请输入你要初始化的菜品个数:");
scanf("%d",&num);
if(num == 0)
{
printf("初始化错误!\n");
free(List);
return 0;
}
for(int i=0;i<num;i++)
{
input_one(List, i);
}
List->length = num;
return List;
}
//输入一个菜品信息
void input_one(SqList *List,int i)
{
int flag = 0;//flag=0表示第一次输入id、name
int id_temp;
char name_temp[50];
do{
if(flag)
printf("输入的id已被占用,请重新输入!\n");
flag = 1;
printf("请输入第%d个菜品的id:",i+1);
scanf("%d",&id_temp);
}while( Searchid_List(List,id_temp) != -1); //没找到返回-1
(List->data[i]).id = id_temp;
flag = 0; //flag=0表示第一次输入id、name
do{
if(flag)
printf("输入的name已被占用,请重新输入!\n");
flag = 1;
printf("请输入第%d个菜品的名字:",i+1);
scanf("%s",name_temp);
}while( Searchname_List(List,name_temp) != -1); //没找到返回-1
strcpy((List->data[i]).name, name_temp);
printf("请输入第%d个菜品的价格:",i+1);
scanf("%d",&(List->data[i]).price);
}
//打印顺序表中所有信息
void Display_List(SqList *List)
{
int len = List->length;
printf("已有如下菜品:\n");
for(int i=0;i<len;i++)
{
printf("id:%d\t",(List->data[i]).id);
printf("name:%s\t",(List->data[i]).name);
printf("price:%d\n",(List->data[i]).price);
}
}
//添加一个新菜品
SqList * Add_List(SqList *List)
{
int i = List->length;
if(i==MaxSize)
{
printf("空间已满,正在返回上级\n");
return List;
}
Display_List(List);
input_one(List, i);
(List->length)++;
return List;
}
int mode_choose(SqList *List)
{
int a,flag = 1;
while(flag)
{
printf("******1----> 按id删除/修改 ----******\n");
printf("******2----> 按name删除/修改 ----******\n");
printf("******3----> 退出删除/修改 ----******\n");
printf("请进行模式选择:");
scanf("%d",&a);
switch(a)
{
case 1: return Searchid_List(List,-1);break;
case 2: return Searchname_List(List,"-1");break;
case 3:flag = 0;break;
default:printf("error,没有这个选项请重新选择!\n");break;
}
}
return -2; //取消删除/修改 返回上级
}
//删除一个菜品
SqList * Delete_List(SqList *List)
{
int a; //用来保存找到的下标
a = mode_choose(List);
if(a == -1)
{
printf("没有查询到这个id/name!\n");
}
else if(a == -2)
{
printf("正在返回上一级!\n");
}
else
{
for(int i=a;i<List->length - 1;i++) //前移删除
{
List->data[i] = List->data[i+1];
}
(List->length)-- ;
printf("删除成功!\n");
}
return List;
}
//修该菜品
SqList * Updata_List(SqList *List)
{
int a,flag = 0; //用来保存找到的下标
a = mode_choose(List);
if(a == -1)
{
printf("没有查询到这个id/name!\n");
}
else if(a == -2)
{
printf("正在返回上一级!\n");
}
else
{
printf("原菜品信息为:");
printf("id:%d\t",(List->data[a]).id);
printf("name:%s\t",(List->data[a]).name);
printf("price:%d\n",(List->data[a]).price);
input_one(List, a);
}
return List;
}
//按id查找 id_input == -1为输入查找 否则为传参查找
int Searchid_List(SqList *List,int id_input)
{
int ret = -1;
if(id_input == -1)
{
printf("请输入你想查询并修改/删除的id:");
scanf("%d",&id_input);
}
for(int i=0;i<List->length;i++)
{
if((List->data[i]).id == id_input)
{
ret = i; //找到返回下标
break;
}
}
return ret; //没找到
}
//按菜名查找
int Searchname_List(SqList *List,char *name_input0)
{
int ret = -1;
char name_input1[50];
if(strcmp(name_input0,"-1")==0)
{
printf("请输入你想查找并修改/删除的name:");
scanf("%s",name_input1);
}
else
{
strcpy(name_input1,name_input0);
}
for(int i=0;i<List->length;i++)
{
if(strcmp( (List->data[i]).name, name_input1) == 0 )
{
ret = i; //找到返回下标
break;
}
}
return ret;
}