C/C++餐厅自动化点餐系统

发布于:2023-07-04 ⋅ 阅读:(203) ⋅ 点赞:(0)

结构体:C 版本

#include <stdio.h>
            #include <windows.h> 
        

        //定义 菜品 结构体
    struct Food {
                    char name[15] ; // 名称
                    double price ; // 价格
                    char description[20] ; // 描述
            };
    //定义全局 菜品 数组
    struct Food foodList [100];
    //定义全局 菜品 数组栈指针
    int foodCount = 0;
        //定义 点单 结构体
    struct Order {
                    char food[15] ; // 菜品
                    char num[10] ; // 餐桌号
                    int count ; // 盘数
                    char remarks[10] ; // 备注
            };
    //定义全局 点单 数组
    struct Order orderList [100];
    //定义全局 点单 数组栈指针
    int orderCount = 0;
    
        //菜品 读入文件
    void readFood ();
    //菜品 写入文件
    void writeFood ();
    //菜品 添加记录
    void addFood ();
        //菜品 删除记录
    void delFood ();
    //菜品 根据下标删除
    int delFoodByIndex (int index);
    //菜品 修改记录
    void modFood ();
    //菜品 查找记录
    void findFood (int all);
    //菜品 排序
    void sortFood ();
    //交换
    void exchangeFood (int i ,int j);
    //存在判断函数
                                    int getOneFood (const char *name,char *s);
                                    //点单 读入文件
    void readOrder ();
    //点单 写入文件
    void writeOrder ();
    //点单 添加记录
    void addOrder ();
        //点单 删除记录
    void delOrder ();
    //点单 根据下标删除
    int delOrderByIndex (int index);
    //点单 修改记录
    void modOrder ();
    //点单 查找记录
    void findOrder (int all);
    //点单 排序
    void sortOrder ();
    //交换
    void exchangeOrder (int i ,int j);
    //存在判断函数
                    
        //菜单
            void menu();
    
    // 主函数
    int main(){
            //读取数据
                        readFood ();//读取菜品
                            readOrder ();//读取点单
                while(1){
                        int choice;
                                    menu ();
                scanf("%d",&choice);
        switch(choice){
                                        case 1 :
                            addFood ();//添加菜品
                break;
                                                    case 2 :
                            findFood (1);//查找菜品
                                delFood ();//删除菜品
                break;
                                                    case 3 :
                            findFood (1);//查找菜品
                                modFood ();//修改菜品
                break;
                                                    case 4 :
                            findFood (0);//查找菜品
                break;
                            case 5 :
                            sortFood ();//排序菜品
                break;
                                                            case 6 :
                            addOrder ();//添加点单
                break;
                                                    case 7 :
                            findOrder (1);//查找点单
                                delOrder ();//删除点单
                break;
                                                    case 8 :
                            findOrder (1);//查找点单
                                modOrder ();//修改点单
                break;
                                                    case 9 :
                            findOrder (0);//查找点单
                break;
                            case 10 :
                            sortOrder ();//排序点单
                break;
                                            case 0:
                    printf("\n\n\n\t\t\t感谢使用\n\n\n");            exit(0);
                default :
        getchar();
                    printf("\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n");            system("pause");
        break;
    }
                        }
        return 0;
    }


		
//菜品 是否存在判断
int getOneFood (const char *name,char *s){
	int res = -1,i;
	for( i = 0;i < foodCount ;i++){
							if( strcmp(name,"name")==0 && strcmp(s, foodList [i]. name )==0){
				res = i;
				break;
			}
													}
	return res;
}
//菜品 读入文件
void readFood (){
	FILE *fp = NULL;
	if (NULL == (fp = fopen("Food.txt", "r")))//读打开
	{
		return;
	}
	int i=0;
	//从文件读取数据
	while (fscanf(fp, "%s%lf%s"
								 ,foodList[i].name  ,&foodList[i].price  ,foodList[i].description 
	) != EOF)//读取
	{
		i++;
	}
	//记录总数
	foodCount = i;
	fclose(fp);
}
	//菜品 写入文件
void writeFood (){
	FILE *fp = NULL;
	int i;
	fp = fopen("Food.txt", "w+");
	for( i = 0;i< foodCount ;i++){
		fprintf(fp,"%s %lf %s\n"
				 ,foodList[i].name  ,foodList[i].price  ,foodList[i].description );
	}
	fclose(fp);
}
	//菜品 添加记录
void addFood (){
	char selectYNFlag = 'y';
	while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
	            printf("\n");    						 				            printf("请输入名称 :");    				char name[15]; 				            scanf("%s",name);
    									strcpy(foodList [ foodCount ] . name,name);
								 				//检索Food 不重复
				int getOneFoodname = getOneFood ("name",foodList [ foodCount ] . name);
				if( getOneFoodname >=0){//检索不为空
					            printf("名称已存在!\n");    				break;
				}
																							 				            printf("请输入价格 :");    				double price; 				            scanf("%lf",&price);
    									foodList [ foodCount ] . price = price ;
																											 				            printf("请输入描述 :");    				char description[20]; 				            scanf("%s",description);
    									strcpy(foodList [ foodCount ] . description,description);
																								//foodCount 是全局变量
		foodCount ++;
		            printf("\n是否继续录入?(y/n)");    		getchar();
		            scanf("%c",&selectYNFlag);
    	}
	writeFood ( );
	            printf("\n*****************************\n");    	            printf("录入完成\n");    	            printf("*****************************\n");    }
	//菜品 删除
void delFood (){
	            printf("请输入您要删除的 菜品 序号(输入-1退出):");    	int index;
	            scanf("%d",&index);
    
	if(index >= 0){
		int res = delFoodByIndex (index);
		if(res){
			            printf("删除成功!\n\n");    			writeFood ();
		}else{
			            printf("删除失败!\n\n");    		}
	}

}
	//菜品 根据下标删除
int delFoodByIndex (int index){
	if(index >= foodCount || index < 0){
		return 0;
	}
	//开始删除!
	int i;
	for(i = index; i < foodCount - 1 ; i++){
		//元素全部往前移一位。
		foodList [i] = foodList [i+1];
	}
	//最后令栈的长度减一
	foodCount = foodCount - 1;
	return 1;
}
	//菜品 修改
void modFood (){
	            printf("请输入您要修改的菜品 序号(输入-1退出):");    	int indexOfMod = -1;
	            scanf("%d",&indexOfMod);
    	if(indexOfMod >= 0 && indexOfMod < foodCount ){
		//开始修改
					 									            printf("请输入名称 :");    					char name[15];
					            scanf("%s",name);
    
															if(strcmp(foodList [indexOfMod] . name,name) != 0 && getOneFood ("name",name)>=0){//检索不为空
						            printf("名称 已存在!\n");    						return;
					}
																											 									            printf("请输入价格 :");    					double price;
					            scanf("%lf",&price);
    
																																 									            printf("请输入描述 :");    					char description[20];
					            scanf("%s",description);
    
																															//输入完毕,赋值
					 									strcpy(foodList [ indexOfMod ] . name,name);
												 									foodList [ indexOfMod ] . price = price ;
												 									strcpy(foodList [ indexOfMod ] . description,description);
											            printf("修改成功!\n");    		writeFood ();
	}else{
		            printf("输入错误!\n");    	}

}
//菜品 查找 如果all=1:查询全部 否则按条件查询
void findFood (int all){
	int select = 0;
	char conCharArr[40];
	double conNum1,conNum2;
	while(1){
		printf("\n%-5s%-15s%-12s%-20s\n\n","序号" ,"名称","价格","描述" );
		if( foodList ){
			//用于统计信息所用
			int count = 0,i;
																			double priceSum=0;
																	for (i = 0;i <  foodCount ; i++)
			{
				if(select == 0
																														|| select == 1 && strstr(foodList [i]. name,conCharArr) //根据名称,模糊查询
																																												){
															printf("%-5d%-15s%-12lf%-20s \n\n",i
																			,foodList [i] . name
													,foodList [i] . price
													,foodList [i] . description
											);
					//用于统计信息所用
																													priceSum += foodList [i].price;
																											count++;
				}else{
					delFoodByIndex(i--);//删掉
				}
			}
			            printf("共%d条结果\n",count);    			            printf("-----------------------------------------------------------------------------------------------------\n");    																											printf("【价格】平均:%.2lf\n" ,count!=0?priceSum * 1.0 / count :0);
																						            printf("\n");    		}else{
			            printf("\n【无记录!】\n\n");    		}
		//如果参数all为1,则表示列出所有就退出
		if(all == 1)break;
		//进入过滤。
		            printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n");    		            printf("0:退出\n");    									            printf("1:按 名称 筛选\n");    																	            printf("请输入选择:");    		            scanf("%d",&select);
    		if(select>0){
			if(0  ||select==1 ){
				            printf("请输入筛选条件:");    				            scanf("%s",conCharArr);
    			}else if(0 ){
				            printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):");    				            scanf("%lf",&conNum1);
                scanf("%lf",&conNum2);
    			}
		}else{
			break;
		}
	}
	readFood();//从新读取数据。
}
	//菜品 排序
void sortFood (){
	int select,i,j;
			            printf("1:按 名称 排序\n");    			            printf("2:按 价格 排序\n");    			            printf("3:按 描述 排序\n");    		            printf("请输入选择:");    	            scanf("%d",&select);
    	for( i = foodCount -1;i>0;i--){
		for( j = 0;j < i;j++){
			if(	0
											|| select == 1 && strcmp(foodList [j]. name , foodList [j+1]. name)>0
															|| select == 2 && foodList [j]. price - foodList [j+1]. price > 0
															|| select == 3 && strcmp(foodList [j]. description , foodList [j+1]. description)>0
										){
				exchangeFood (j,j+1);
			}
		}
	}
	findFood (1);
	writeFood ();
}
//菜品 交换
void exchangeFood (int i,int j){
	struct Food food = foodList [i];
	foodList [i] = foodList  [j];
	foodList [j] = food ;
}
//点单 读入文件
void readOrder (){
	FILE *fp = NULL;
	if (NULL == (fp = fopen("Order.txt", "r")))//读打开
	{
		return;
	}
	int i=0;
	//从文件读取数据
	while (fscanf(fp, "%s%s%d%s"
								 ,orderList[i].food  ,orderList[i].num  ,&orderList[i].count  ,orderList[i].remarks 
	) != EOF)//读取
	{
		i++;
	}
	//记录总数
	orderCount = i;
	fclose(fp);
}
	//点单 写入文件
void writeOrder (){
	FILE *fp = NULL;
	int i;
	fp = fopen("Order.txt", "w+");
	for( i = 0;i< orderCount ;i++){
		fprintf(fp,"%s %s %d %s\n"
				 ,orderList[i].food  ,orderList[i].num  ,orderList[i].count  ,orderList[i].remarks );
	}
	fclose(fp);
}
	//点单 添加记录
void addOrder (){
	char selectYNFlag = 'y';
	while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
	            printf("\n");    						 				            printf("请输入菜品 :");    				char food[15]; 				            scanf("%s",food);
    									strcpy(orderList [ orderCount ] . food,food);
																				//检索Order 是否存在
				int getOneFoodFrn =getOneFood ("name",orderList [ orderCount ] . food);
				if(getOneFoodFrn ==-1){//检索不为空
					            printf("菜品不存在!\n");    				break;
				}
															 				            printf("请输入餐桌号 :");    				char num[10]; 				            scanf("%s",num);
    									strcpy(orderList [ orderCount ] . num,num);
																											 				            printf("请输入盘数 :");    				int count; 				            scanf("%d",&count);
    									orderList [ orderCount ] . count = count ;
																											 				            printf("请输入备注 :");    				char remarks[10]; 				            scanf("%s",remarks);
    									strcpy(orderList [ orderCount ] . remarks,remarks);
																								//orderCount 是全局变量
		orderCount ++;
		            printf("\n是否继续录入?(y/n)");    		getchar();
		            scanf("%c",&selectYNFlag);
    	}
	writeOrder ( );
	            printf("\n*****************************\n");    	            printf("录入完成\n");    	            printf("*****************************\n");    }
	//点单 删除
void delOrder (){
	            printf("请输入您要删除的 点单 序号(输入-1退出):");    	int index;
	            scanf("%d",&index);
    
	if(index >= 0){
		int res = delOrderByIndex (index);
		if(res){
			            printf("删除成功!\n\n");    			writeOrder ();
		}else{
			            printf("删除失败!\n\n");    		}
	}

}
	//点单 根据下标删除
int delOrderByIndex (int index){
	if(index >= orderCount || index < 0){
		return 0;
	}
	//开始删除!
	int i;
	for(i = index; i < orderCount - 1 ; i++){
		//元素全部往前移一位。
		orderList [i] = orderList [i+1];
	}
	//最后令栈的长度减一
	orderCount = orderCount - 1;
	return 1;
}
	//点单 修改
void modOrder (){
	            printf("请输入您要修改的点单 序号(输入-1退出):");    	int indexOfMod = -1;
	            scanf("%d",&indexOfMod);
    	if(indexOfMod >= 0 && indexOfMod < orderCount ){
		//开始修改
					 									            printf("请输入菜品 :");    					char food[15];
					            scanf("%s",food);
    
																									if(getOneFood ("name",food)==-1){//检索不为空
						            printf("菜品 不存在!\n");    						return;
					}
																	 									            printf("请输入餐桌号 :");    					char num[10];
					            scanf("%s",num);
    
																																 									            printf("请输入盘数 :");    					int count;
					            scanf("%d",&count);
    
																																 									            printf("请输入备注 :");    					char remarks[10];
					            scanf("%s",remarks);
    
																															//输入完毕,赋值
					 									strcpy(orderList [ indexOfMod ] . food,food);
												 									strcpy(orderList [ indexOfMod ] . num,num);
												 									orderList [ indexOfMod ] . count = count ;
												 									strcpy(orderList [ indexOfMod ] . remarks,remarks);
											            printf("修改成功!\n");    		writeOrder ();
	}else{
		            printf("输入错误!\n");    	}

}
//点单 查找 如果all=1:查询全部 否则按条件查询
void findOrder (int all){
	int select = 0;
	char conCharArr[40];
	double conNum1,conNum2;
	while(1){
		printf("\n%-5s%-15s%-10s%-10s%-10s\n\n","序号" ,"菜品","餐桌号","盘数","备注" );
		if( orderList ){
			//用于统计信息所用
			int count = 0,i;
																										int countSum=0;
																	for (i = 0;i <  orderCount ; i++)
			{
				if(select == 0
																														|| select == 1 && strstr(orderList [i]. food,conCharArr) //根据菜品,模糊查询
																																						|| select == 2 && strstr(orderList [i]. num,conCharArr) //根据餐桌号,模糊查询
																																												){
															printf("%-5d%-15s%-10s%-10d%-10s \n\n",i
																			,orderList [i] . food
													,orderList [i] . num
													,orderList [i] . count
													,orderList [i] . remarks
											);
					//用于统计信息所用
																																								countSum += orderList [i].count;
																											count++;
				}else{
					delOrderByIndex(i--);//删掉
				}
			}
			            printf("共%d条结果\n",count);    			            printf("-----------------------------------------------------------------------------------------------------\n");    																																		printf("【盘数】总计:%d \n",countSum );
																						            printf("\n");    		}else{
			            printf("\n【无记录!】\n\n");    		}
		//如果参数all为1,则表示列出所有就退出
		if(all == 1)break;
		//进入过滤。
		            printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n");    		            printf("0:退出\n");    									            printf("1:按 菜品 筛选\n");    												            printf("2:按 餐桌号 筛选\n");    																	            printf("请输入选择:");    		            scanf("%d",&select);
    		if(select>0){
			if(0  ||select==1 ||select==2 ){
				            printf("请输入筛选条件:");    				            scanf("%s",conCharArr);
    			}else if(0 ){
				            printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):");    				            scanf("%lf",&conNum1);
                scanf("%lf",&conNum2);
    			}
		}else{
			break;
		}
	}
	readOrder();//从新读取数据。
}
	//点单 排序
void sortOrder (){
	int select,i,j;
			            printf("1:按 菜品 排序\n");    			            printf("2:按 餐桌号 排序\n");    			            printf("3:按 盘数 排序\n");    			            printf("4:按 备注 排序\n");    		            printf("请输入选择:");    	            scanf("%d",&select);
    	for( i = orderCount -1;i>0;i--){
		for( j = 0;j < i;j++){
			if(	0
											|| select == 1 && strcmp(orderList [j]. food , orderList [j+1]. food)>0
															|| select == 2 && strcmp(orderList [j]. num , orderList [j+1]. num)>0
															|| select == 3 && orderList [j]. count - orderList [j+1]. count > 0
															|| select == 4 && strcmp(orderList [j]. remarks , orderList [j+1]. remarks)>0
										){
				exchangeOrder (j,j+1);
			}
		}
	}
	findOrder (1);
	writeOrder ();
}
//点单 交换
void exchangeOrder (int i,int j){
	struct Order order = orderList [i];
	orderList [i] = orderList  [j];
	orderList [j] = order ;
}

                void menu (){
        //菜单
                    printf("*------------------主菜单---------------------*\n");                                                    printf("*-------------1 :添加菜品\n");                                                        printf("*-------------2 :删除菜品\n");                                                        printf("*-------------3 :修改菜品\n");                                                        printf("*-------------4 :查找菜品\n");                                printf("*-------------5 :排序菜品\n");                                                                printf("*-------------6 :添加点单\n");                                                        printf("*-------------7 :删除点单\n");                                                        printf("*-------------8 :修改点单\n");                                                        printf("*-------------9 :查找点单\n");                                printf("*-------------10 :排序点单\n");                                            printf("*-------------0:退出\n");                                printf("*---------------------------------------------*\n");                        printf("请输入选择:");        }

结构体:C++版本

#include <io.h>
            #include <iostream>
            #include <windows.h>
            using namespace std; 
        

        //定义 菜品 结构体
    struct Food {
                    char name[15] ; // 名称
                    double price ; // 价格
                    char description[20] ; // 描述
            };
    //定义全局 菜品 数组
    struct Food foodList [100];
    //定义全局 菜品 数组栈指针
    int foodCount = 0;
        //定义 点单 结构体
    struct Order {
                    char food[15] ; // 菜品
                    char num[10] ; // 餐桌号
                    int count ; // 盘数
                    char remarks[10] ; // 备注
            };
    //定义全局 点单 数组
    struct Order orderList [100];
    //定义全局 点单 数组栈指针
    int orderCount = 0;
    
        //菜品 读入文件
    void readFood ();
    //菜品 写入文件
    void writeFood ();
    //菜品 添加记录
    void addFood ();
        //菜品 删除记录
    void delFood ();
    //菜品 根据下标删除
    int delFoodByIndex (int index);
    //菜品 修改记录
    void modFood ();
    //菜品 查找记录
    void findFood (int all);
    //菜品 排序
    void sortFood ();
    //交换
    void exchangeFood (int i ,int j);
    //存在判断函数
                                    int getOneFood (const char *name,char *s);
                                    //点单 读入文件
    void readOrder ();
    //点单 写入文件
    void writeOrder ();
    //点单 添加记录
    void addOrder ();
        //点单 删除记录
    void delOrder ();
    //点单 根据下标删除
    int delOrderByIndex (int index);
    //点单 修改记录
    void modOrder ();
    //点单 查找记录
    void findOrder (int all);
    //点单 排序
    void sortOrder ();
    //交换
    void exchangeOrder (int i ,int j);
    //存在判断函数
                    
        //菜单
            void menu();
    
    // 主函数
    int main(){
            //读取数据
                        readFood ();//读取菜品
                            readOrder ();//读取点单
                while(1){
                        int choice;
                                    menu ();
                cin>>choice;
        switch(choice){
                                        case 1 :
                            addFood ();//添加菜品
                break;
                                                    case 2 :
                            findFood (1);//查找菜品
                                delFood ();//删除菜品
                break;
                                                    case 3 :
                            findFood (1);//查找菜品
                                modFood ();//修改菜品
                break;
                                                    case 4 :
                            findFood (0);//查找菜品
                break;
                            case 5 :
                            sortFood ();//排序菜品
                break;
                                                            case 6 :
                            addOrder ();//添加点单
                break;
                                                    case 7 :
                            findOrder (1);//查找点单
                                delOrder ();//删除点单
                break;
                                                    case 8 :
                            findOrder (1);//查找点单
                                modOrder ();//修改点单
                break;
                                                    case 9 :
                            findOrder (0);//查找点单
                break;
                            case 10 :
                            sortOrder ();//排序点单
                break;
                                            case 0:
                    cout<<"\n\n\n\t\t\t感谢使用\n\n\n";
            exit(0);
                default :
        getchar();
                    cout<<"\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n";
            system("pause");
        break;
    }
                        }
        return 0;
    }


		
//菜品 是否存在判断
int getOneFood (const char *name,char *s){
	int res = -1,i;
	for( i = 0;i < foodCount ;i++){
							if( strcmp(name,"name")==0 && strcmp(s, foodList [i]. name )==0){
				res = i;
				break;
			}
													}
	return res;
}
//菜品 读入文件
void readFood (){
	FILE *fp = NULL;
	if (NULL == (fp = fopen("Food.txt", "r")))//读打开
	{
		return;
	}
	int i=0;
	//从文件读取数据
	while (fscanf(fp, "%s%lf%s"
								 ,foodList[i].name  ,&foodList[i].price  ,foodList[i].description 
	) != EOF)//读取
	{
		i++;
	}
	//记录总数
	foodCount = i;
	fclose(fp);
}
	//菜品 写入文件
void writeFood (){
	FILE *fp = NULL;
	int i;
	fp = fopen("Food.txt", "w+");
	for( i = 0;i< foodCount ;i++){
		fprintf(fp,"%s %lf %s\n"
				 ,foodList[i].name  ,foodList[i].price  ,foodList[i].description );
	}
	fclose(fp);
}
	//菜品 添加记录
void addFood (){
	char selectYNFlag = 'y';
	while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
	            cout<<"\n";
    						 				            cout<<"请输入名称 :";
    				char name[15]; 				            cin>>name;
    									strcpy(foodList [ foodCount ] . name,name);
								 				//检索Food 不重复
				int getOneFoodname = getOneFood ("name",foodList [ foodCount ] . name);
				if( getOneFoodname >=0){//检索不为空
					            cout<<"名称已存在!\n";
    				break;
				}
																							 				            cout<<"请输入价格 :";
    				double price; 				            cin>>price;
    									foodList [ foodCount ] . price = price ;
																											 				            cout<<"请输入描述 :";
    				char description[20]; 				            cin>>description;
    									strcpy(foodList [ foodCount ] . description,description);
																								//foodCount 是全局变量
		foodCount ++;
		            cout<<"\n是否继续录入?(y/n)";
    		getchar();
		            cin>>selectYNFlag;
    	}
	writeFood ( );
	            cout<<"\n*****************************\n";
    	            cout<<"录入完成\n";
    	            cout<<"*****************************\n";
    }
	//菜品 删除
void delFood (){
	            cout<<"请输入您要删除的 菜品 序号(输入-1退出):";
    	int index;
	            cin>>index;
    
	if(index >= 0){
		int res = delFoodByIndex (index);
		if(res){
			            cout<<"删除成功!\n\n";
    			writeFood ();
		}else{
			            cout<<"删除失败!\n\n";
    		}
	}

}
	//菜品 根据下标删除
int delFoodByIndex (int index){
	if(index >= foodCount || index < 0){
		return 0;
	}
	//开始删除!
	int i;
	for(i = index; i < foodCount - 1 ; i++){
		//元素全部往前移一位。
		foodList [i] = foodList [i+1];
	}
	//最后令栈的长度减一
	foodCount = foodCount - 1;
	return 1;
}
	//菜品 修改
void modFood (){
	            cout<<"请输入您要修改的菜品 序号(输入-1退出):";
    	int indexOfMod = -1;
	            cin>>indexOfMod;
    	if(indexOfMod >= 0 && indexOfMod < foodCount ){
		//开始修改
					 									            cout<<"请输入名称 :";
    					char name[15];
					            cin>>name;
    
															if(strcmp(foodList [indexOfMod] . name,name) != 0 && getOneFood ("name",name)>=0){//检索不为空
						            cout<<"名称 已存在!\n";
    						return;
					}
																											 									            cout<<"请输入价格 :";
    					double price;
					            cin>>price;
    
																																 									            cout<<"请输入描述 :";
    					char description[20];
					            cin>>description;
    
																															//输入完毕,赋值
					 									strcpy(foodList [ indexOfMod ] . name,name);
												 									foodList [ indexOfMod ] . price = price ;
												 									strcpy(foodList [ indexOfMod ] . description,description);
											            cout<<"修改成功!\n";
    		writeFood ();
	}else{
		            cout<<"输入错误!\n";
    	}

}
//菜品 查找 如果all=1:查询全部 否则按条件查询
void findFood (int all){
	int select = 0;
	char conCharArr[40];
	double conNum1,conNum2;
	while(1){
		printf("\n%-5s%-15s%-12s%-20s\n\n","序号" ,"名称","价格","描述" );
		if( foodList ){
			//用于统计信息所用
			int count = 0,i;
																			double priceSum=0;
																	for (i = 0;i <  foodCount ; i++)
			{
				if(select == 0
																														|| select == 1 && strstr(foodList [i]. name,conCharArr) //根据名称,模糊查询
																																												){
															printf("%-5d%-15s%-12lf%-20s \n\n",i
																			,foodList [i] . name
													,foodList [i] . price
													,foodList [i] . description
											);
					//用于统计信息所用
																													priceSum += foodList [i].price;
																											count++;
				}else{
					delFoodByIndex(i--);//删掉
				}
			}
			            cout<<"共" << count <<"条结果\n";
    			            cout<<"-----------------------------------------------------------------------------------------------------\n";
    																											cout<<"【价格】"  <<"平均:"<<  (count!=0?priceSum*1.0/count:0)<<"\n";
																						            cout<<"\n";
    		}else{
			            cout<<"\n【无记录!】\n\n";
    		}
		//如果参数all为1,则表示列出所有就退出
		if(all == 1)break;
		//进入过滤。
		            cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
    		            cout<<"0:退出\n";
    									            cout<<"1:按 名称 筛选\n";
    																	            cout<<"请输入选择:";
    		            cin>>select;
    		if(select>0){
			if(0  ||select==1 ){
				            cout<<"请输入筛选条件:";
    				            cin>>conCharArr;
    			}else if(0 ){
				            cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
    				            cin>>conNum1;
                cin>>conNum2;
    			}
		}else{
			break;
		}
	}
	readFood();//从新读取数据。
}
	//菜品 排序
void sortFood (){
	int select,i,j;
			            cout<<"1:按 名称 排序\n";
    			            cout<<"2:按 价格 排序\n";
    			            cout<<"3:按 描述 排序\n";
    		            cout<<"请输入选择:";
    	            cin>>select;
    	for( i = foodCount -1;i>0;i--){
		for( j = 0;j < i;j++){
			if(	0
											|| select == 1 && strcmp(foodList [j]. name , foodList [j+1]. name)>0
															|| select == 2 && foodList [j]. price - foodList [j+1]. price > 0
															|| select == 3 && strcmp(foodList [j]. description , foodList [j+1]. description)>0
										){
				exchangeFood (j,j+1);
			}
		}
	}
	findFood (1);
	writeFood ();
}
//菜品 交换
void exchangeFood (int i,int j){
	struct Food food = foodList [i];
	foodList [i] = foodList  [j];
	foodList [j] = food ;
}
//点单 读入文件
void readOrder (){
	FILE *fp = NULL;
	if (NULL == (fp = fopen("Order.txt", "r")))//读打开
	{
		return;
	}
	int i=0;
	//从文件读取数据
	while (fscanf(fp, "%s%s%d%s"
								 ,orderList[i].food  ,orderList[i].num  ,&orderList[i].count  ,orderList[i].remarks 
	) != EOF)//读取
	{
		i++;
	}
	//记录总数
	orderCount = i;
	fclose(fp);
}
	//点单 写入文件
void writeOrder (){
	FILE *fp = NULL;
	int i;
	fp = fopen("Order.txt", "w+");
	for( i = 0;i< orderCount ;i++){
		fprintf(fp,"%s %s %d %s\n"
				 ,orderList[i].food  ,orderList[i].num  ,orderList[i].count  ,orderList[i].remarks );
	}
	fclose(fp);
}
	//点单 添加记录
void addOrder (){
	char selectYNFlag = 'y';
	while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
	            cout<<"\n";
    						 				            cout<<"请输入菜品 :";
    				char food[15]; 				            cin>>food;
    									strcpy(orderList [ orderCount ] . food,food);
																				//检索Order 是否存在
				int getOneFoodFrn =getOneFood ("name",orderList [ orderCount ] . food);
				if(getOneFoodFrn ==-1){//检索不为空
					            cout<<"菜品不存在!\n";
    				break;
				}
															 				            cout<<"请输入餐桌号 :";
    				char num[10]; 				            cin>>num;
    									strcpy(orderList [ orderCount ] . num,num);
																											 				            cout<<"请输入盘数 :";
    				int count; 				            cin>>count;
    									orderList [ orderCount ] . count = count ;
																											 				            cout<<"请输入备注 :";
    				char remarks[10]; 				            cin>>remarks;
    									strcpy(orderList [ orderCount ] . remarks,remarks);
																								//orderCount 是全局变量
		orderCount ++;
		            cout<<"\n是否继续录入?(y/n)";
    		getchar();
		            cin>>selectYNFlag;
    	}
	writeOrder ( );
	            cout<<"\n*****************************\n";
    	            cout<<"录入完成\n";
    	            cout<<"*****************************\n";
    }
	//点单 删除
void delOrder (){
	            cout<<"请输入您要删除的 点单 序号(输入-1退出):";
    	int index;
	            cin>>index;
    
	if(index >= 0){
		int res = delOrderByIndex (index);
		if(res){
			            cout<<"删除成功!\n\n";
    			writeOrder ();
		}else{
			            cout<<"删除失败!\n\n";
    		}
	}

}
	//点单 根据下标删除
int delOrderByIndex (int index){
	if(index >= orderCount || index < 0){
		return 0;
	}
	//开始删除!
	int i;
	for(i = index; i < orderCount - 1 ; i++){
		//元素全部往前移一位。
		orderList [i] = orderList [i+1];
	}
	//最后令栈的长度减一
	orderCount = orderCount - 1;
	return 1;
}
	//点单 修改
void modOrder (){
	            cout<<"请输入您要修改的点单 序号(输入-1退出):";
    	int indexOfMod = -1;
	            cin>>indexOfMod;
    	if(indexOfMod >= 0 && indexOfMod < orderCount ){
		//开始修改
					 									            cout<<"请输入菜品 :";
    					char food[15];
					            cin>>food;
    
																									if(getOneFood ("name",food)==-1){//检索不为空
						            cout<<"菜品 不存在!\n";
    						return;
					}
																	 									            cout<<"请输入餐桌号 :";
    					char num[10];
					            cin>>num;
    
																																 									            cout<<"请输入盘数 :";
    					int count;
					            cin>>count;
    
																																 									            cout<<"请输入备注 :";
    					char remarks[10];
					            cin>>remarks;
    
																															//输入完毕,赋值
					 									strcpy(orderList [ indexOfMod ] . food,food);
												 									strcpy(orderList [ indexOfMod ] . num,num);
												 									orderList [ indexOfMod ] . count = count ;
												 									strcpy(orderList [ indexOfMod ] . remarks,remarks);
											            cout<<"修改成功!\n";
    		writeOrder ();
	}else{
		            cout<<"输入错误!\n";
    	}

}
//点单 查找 如果all=1:查询全部 否则按条件查询
void findOrder (int all){
	int select = 0;
	char conCharArr[40];
	double conNum1,conNum2;
	while(1){
		printf("\n%-5s%-15s%-10s%-10s%-10s\n\n","序号" ,"菜品","餐桌号","盘数","备注" );
		if( orderList ){
			//用于统计信息所用
			int count = 0,i;
																										int countSum=0;
																	for (i = 0;i <  orderCount ; i++)
			{
				if(select == 0
																														|| select == 1 && strstr(orderList [i]. food,conCharArr) //根据菜品,模糊查询
																																						|| select == 2 && strstr(orderList [i]. num,conCharArr) //根据餐桌号,模糊查询
																																												){
															printf("%-5d%-15s%-10s%-10d%-10s \n\n",i
																			,orderList [i] . food
													,orderList [i] . num
													,orderList [i] . count
													,orderList [i] . remarks
											);
					//用于统计信息所用
																																								countSum += orderList [i].count;
																											count++;
				}else{
					delOrderByIndex(i--);//删掉
				}
			}
			            cout<<"共" << count <<"条结果\n";
    			            cout<<"-----------------------------------------------------------------------------------------------------\n";
    																																		cout<<"【盘数】" << "总计:"<<countSum<<" " <<"\n";
																						            cout<<"\n";
    		}else{
			            cout<<"\n【无记录!】\n\n";
    		}
		//如果参数all为1,则表示列出所有就退出
		if(all == 1)break;
		//进入过滤。
		            cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
    		            cout<<"0:退出\n";
    									            cout<<"1:按 菜品 筛选\n";
    												            cout<<"2:按 餐桌号 筛选\n";
    																	            cout<<"请输入选择:";
    		            cin>>select;
    		if(select>0){
			if(0  ||select==1 ||select==2 ){
				            cout<<"请输入筛选条件:";
    				            cin>>conCharArr;
    			}else if(0 ){
				            cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
    				            cin>>conNum1;
                cin>>conNum2;
    			}
		}else{
			break;
		}
	}
	readOrder();//从新读取数据。
}
	//点单 排序
void sortOrder (){
	int select,i,j;
			            cout<<"1:按 菜品 排序\n";
    			            cout<<"2:按 餐桌号 排序\n";
    			            cout<<"3:按 盘数 排序\n";
    			            cout<<"4:按 备注 排序\n";
    		            cout<<"请输入选择:";
    	            cin>>select;
    	for( i = orderCount -1;i>0;i--){
		for( j = 0;j < i;j++){
			if(	0
											|| select == 1 && strcmp(orderList [j]. food , orderList [j+1]. food)>0
															|| select == 2 && strcmp(orderList [j]. num , orderList [j+1]. num)>0
															|| select == 3 && orderList [j]. count - orderList [j+1]. count > 0
															|| select == 4 && strcmp(orderList [j]. remarks , orderList [j+1]. remarks)>0
										){
				exchangeOrder (j,j+1);
			}
		}
	}
	findOrder (1);
	writeOrder ();
}
//点单 交换
void exchangeOrder (int i,int j){
	struct Order order = orderList [i];
	orderList [i] = orderList  [j];
	orderList [j] = order ;
}

                void menu (){
        //菜单
                    cout<<"*------------------主菜单---------------------*\n";
                                                    cout<<"*-------------1 :添加菜品\n";
                                                        cout<<"*-------------2 :删除菜品\n";
                                                        cout<<"*-------------3 :修改菜品\n";
                                                        cout<<"*-------------4 :查找菜品\n";
                                cout<<"*-------------5 :排序菜品\n";
                                                                cout<<"*-------------6 :添加点单\n";
                                                        cout<<"*-------------7 :删除点单\n";
                                                        cout<<"*-------------8 :修改点单\n";
                                                        cout<<"*-------------9 :查找点单\n";
                                cout<<"*-------------10 :排序点单\n";
                                            cout<<"*-------------0:退出\n";
                                cout<<"*---------------------------------------------*\n";
                        cout<<"请输入选择:";
        }

链表:C版本

#include <stdio.h>
            #include <windows.h> 
        

        //定义 菜品 链表
    struct Food {
                    char name[15] ; // 名称
                    double price ; // 价格
                    char description[20] ; // 描述
                struct Food* next;//链式存储
    };
    struct  Food *foodList;//定义全局 菜品 指针
    int foodCount = 0;//菜品 个数记录
        //定义 点单 链表
    struct Order {
                    char food[15] ; // 菜品
                    char num[10] ; // 餐桌号
                    int count ; // 盘数
                    char remarks[10] ; // 备注
                struct Order* next;//链式存储
    };
    struct  Order *orderList;//定义全局 点单 指针
    int orderCount = 0;//点单 个数记录
    
        //菜品 读入文件
    void readFood ();
    //菜品 写入文件
    void writeFood ();
    //菜品 添加记录
    void addFood ();
        void addOneFood (struct Food *food);
        //菜品 删除记录
    void delFood ();
    //菜品 根据下标删除
    int delFoodByIndex (int index);
    //菜品 修改记录
    void modFood ();
    //菜品 查找记录
    void findFood (int all);
    //菜品 排序
    void sortFood ();
    //交换
    void exchangeFood (int i ,int j);
    //存在判断函数
                                    struct Food* getOneFood (const char *name,char *s);
                                    //点单 读入文件
    void readOrder ();
    //点单 写入文件
    void writeOrder ();
    //点单 添加记录
    void addOrder ();
        void addOneOrder (struct Order *order);
        //点单 删除记录
    void delOrder ();
    //点单 根据下标删除
    int delOrderByIndex (int index);
    //点单 修改记录
    void modOrder ();
    //点单 查找记录
    void findOrder (int all);
    //点单 排序
    void sortOrder ();
    //交换
    void exchangeOrder (int i ,int j);
    //存在判断函数
                    
        //菜单
            void menu();
    
    // 主函数
    int main(){
            //读取数据
                        readFood ();//读取菜品
                            readOrder ();//读取点单
                while(1){
                        int choice;
                                    menu ();
                scanf("%d",&choice);
        switch(choice){
                                        case 1 :
                            addFood ();//添加菜品
                break;
                                                    case 2 :
                            findFood (1);//查找菜品
                                delFood ();//删除菜品
                break;
                                                    case 3 :
                            findFood (1);//查找菜品
                                modFood ();//修改菜品
                break;
                                                    case 4 :
                            findFood (0);//查找菜品
                break;
                            case 5 :
                            sortFood ();//排序菜品
                break;
                                                            case 6 :
                            addOrder ();//添加点单
                break;
                                                    case 7 :
                            findOrder (1);//查找点单
                                delOrder ();//删除点单
                break;
                                                    case 8 :
                            findOrder (1);//查找点单
                                modOrder ();//修改点单
                break;
                                                    case 9 :
                            findOrder (0);//查找点单
                break;
                            case 10 :
                            sortOrder ();//排序点单
                break;
                                            case 0:
                    printf("\n\n\n\t\t\t感谢使用\n\n\n");            exit(0);
                default :
        getchar();
                    printf("\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n");            system("pause");
        break;
    }
                        }
        return 0;
    }


		
            //是否存在判断
        struct Food *getOneFood (const char *name,char *s){
            struct Food *head = foodList;
            while(head){
                                                        if( strcmp(name,"name")==0 && strcmp(s, head->name )==0){
                        return head;
                    }
                                                                                                                            head = head->next;
            }
            return NULL;
        }
    //菜品 读入文件
void readFood (){
    FILE *fp = NULL;
    if (NULL == (fp = fopen("Food.txt", "r")))//读打开
    {
        //文件不存在,不读取
        return;
    }
    int i=0;
    //从文件读取数据
    foodList = NULL;
    struct Food *tail = foodList;
    while (1)//读取
    {
        //给节点分配空间
        struct Food *p=(struct Food*)malloc(sizeof(struct Food));
        //读取数据到p
        if(fscanf(fp, "%s%lf%s"
             ,p->name  ,&p->price  ,p->description 
        ) == EOF)  {
            break;
        }
        p->next=NULL;
        //指针为空则赋值。
        if (foodList  == NULL)
        {
            foodList=p;
            tail=p;
        }
        else {
            tail->next=p;
            tail=p;
        }
        i++;
    }
    //记录总数
    foodCount = i;
    fclose(fp);
}
//菜品 写入文件
void writeFood (){
    //打开文件
    FILE *fp = NULL;
    fp = fopen("Food.txt", "w+");
    //定义指针
    struct Food *p = foodList;
    //写入
    while(p){
        fprintf(fp,"%s %lf %s\n"
             ,p->name  ,p->price  ,p->description );
        p=p->next;
    }
    fclose(fp);
}
//菜品 添加记录
void addFood (){
    char selectYNFlag = 'y';
    while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
                    printf("\n");            struct Food *tempValue = (struct Food*)malloc(sizeof(struct Food)); //必须重新分配地址空间。
                                                                     printf("请输入名称 :");                        char name[15];                                 scanf("%s",name);
                                                strcpy(tempValue->name,name);
                                                                 struct Food* onename = getOneFood ("name",tempValue->name);
                        if(onename !=NULL){//检索不为空
                                        printf("名称已存在!\n");                            break;
                        }
                                                                                                                                                             printf("请输入价格 :");                        double price;                                 scanf("%lf",&price);
                                                tempValue->price = price ;
                                                                                                                                                                                 printf("请输入描述 :");                        char description[20];                                 scanf("%s",description);
                                                strcpy(tempValue->description,description);
                                                                                                                            //TODO

        //加入链表
        tempValue->next = NULL;
        addOneFood (tempValue);
                    printf("\n是否继续录入?(y/n)");            getchar();
                    scanf("%c",&selectYNFlag);
        }
    writeFood ( );
                printf("\n*****************************\n");                    printf("录入完成\n");                    printf("*****************************\n");    }
void addOneFood (struct Food *temp){
    //采用头插法
    if(foodList == NULL){
        foodList = temp;
    }else{
        temp->next = foodList;
        foodList = temp;
    }
    foodCount ++;
}
//菜品 删除
void delFood (){
                printf("请输入您要删除的 菜品 序号(输入-1退出):");        int index;
                scanf("%d",&index);
    
    if(index >= 0){
        int res = delFoodByIndex (index);
        if(res){
                        printf("删除成功!\n\n");                writeFood ();
        }else{
                        printf("删除失败!\n\n");            }
    }
}
//菜品 根据下标删除
int delFoodByIndex (int index){
    if(index > foodCount || index < 1){
        return 0;//删除失败 ,数量没那么多
    }
    //开始删除!
    struct Food *p = (struct Food*)malloc(sizeof(struct Food));
    struct Food *q = foodList;
    p->next = foodList;
    if(index == 1){
        foodList = foodList ->next;
    }else{
        int i;
        for(i = 0;i < index-1 ; i++){
            p = p->next;
            q = q->next;
        }
        p->next = q->next;
    }
    foodCount = foodCount - 1;
    return 1;
}
//菜品 修改
void modFood (){
                printf("请输入您要修改的菜品 序号(输入-1退出):");        int indexOfMod = -1,i;
                scanf("%d",&indexOfMod);
        if(indexOfMod > 0 && indexOfMod <= foodCount ){
        //开始修改
        struct Food *temp = foodList ;
        for( i = 0;i < indexOfMod-1;i++){
            temp=temp->next;
        }
                                                                     printf("请输入名称 :");                        char name[15];
                                scanf("%s",name);
    
                                                            if(strcmp(temp->name,name) != 0 && getOneFood ("name",name)!=NULL){//检索不为空
                                    printf("名称 已存在!\n");                            return;
                    }
                                                                                                                                                             printf("请输入价格 :");                        double price;
                                scanf("%lf",&price);
    
                                                                                                                                                                                 printf("请输入描述 :");                        char description[20];
                                scanf("%s",description);
    
                                                                                                                            //输入完毕,赋值
                                                     strcpy(temp-> name,name);
                                                                                 temp-> price = price ;
                                                                                 strcpy(temp-> description,description);
                                                        printf("修改成功!\n");            writeFood ();
    }else{
                    printf("输入错误!\n");        }
}
//菜品 查找 如果all=1:查询全部 否则按条件查询
void findFood (int all){
    int select = 0;
    char conCharArr[40];
    double conNum1,conNum2;
    while(1){
        printf("\n%-5s%-15s%-12s%-20s\n\n","序号" ,"名称","价格","描述" );
        int i=1,count = 0;
        if( foodList ){
            //用于统计信息所用
                                                                            double priceSum=0;
                                                                    struct Food *t = foodList;
            while(t){
                int delFlag = 0;
                if(select == 0
                                                                                                                        || select == 1 && strstr(t->name,conCharArr) //根据名称,模糊查询
                                                                                                                                                                                ){
                                                            printf("%-5d%-15s%-12lf%-20s \n\n",i
                                                                    ,t->name
                                                ,t->price
                                                ,t->description
                                            );
                    //用于统计信息所用
                                                                                                                    priceSum += t->price;
                                                                                                            count++;
                }else{
                    delFlag = 1;//删掉
                }
                t=t->next;
                if(delFlag){
                    delFoodByIndex (i--);
                }
                i++;
            }
                        printf("共%d条结果\n",count);                            printf("-----------------------------------------------------------------------------------------------------\n");                                                                                                                printf("【价格】平均:%.2lf\n" ,count!=0?priceSum * 1.0 / count :0);
                                                                                                    printf("\n");            }else{
                        printf("\n【无记录!】\n\n");            }
        //如果参数all为1,则表示列出所有就退出
        if(all == 1)break;
        //进入过滤。
                    printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n");                        printf("0:退出\n");                                                    printf("1:按 名称 筛选\n");                                                                                    printf("请输入选择:");                        scanf("%d",&select);
            if(select>0){
            if(0  ||select==1 ){
                            printf("请输入筛选条件:");                                scanf("%s",conCharArr);
                }else if(0 ){
                            printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):");                                scanf("%lf",&conNum1);
                scanf("%lf",&conNum2);
                }
        }else{
            break;
        }
    }
    readFood();//从新读取数据。
}
//菜品 排序
void sortFood (){
    int select,i,j;
                        printf("1:按 名称 排序\n");                            printf("2:按 价格 排序\n");                            printf("3:按 描述 排序\n");                        printf("请输入选择:");                    scanf("%d",&select);
        struct Food *list[100];
    for(i = 0;i< foodCount;i++){
        list[i] = foodList;
        foodList = foodList ->next;
    }
    for( i = foodCount -1;i>0;i--){
        for( j = 0;j < i;j++){
            if(	0
                                                || select == 1 && strcmp(list[j]->name , list[j+1]->name)>0
                                                                || select == 2 && list[j]->price - list[j+1]->price > 0
                                                                || select == 3 && strcmp(list[j]->description , list[j+1]->description)>0
                                            ){
                struct Food *temp = (struct Food*)malloc(sizeof(struct Food));
                temp = list[j]; //交换位置
                list[j] = list[j+1];
                list[j+1] = temp;
            }

        }
    }
    for(i = 0;i< foodCount -1;i++){
        list[i]->next = list[i+1];
    }
    list[ foodCount -1 ]->next = NULL;
    foodList = list[0];
    findFood (1);
    writeFood ();
}
    //点单 读入文件
void readOrder (){
    FILE *fp = NULL;
    if (NULL == (fp = fopen("Order.txt", "r")))//读打开
    {
        //文件不存在,不读取
        return;
    }
    int i=0;
    //从文件读取数据
    orderList = NULL;
    struct Order *tail = orderList;
    while (1)//读取
    {
        //给节点分配空间
        struct Order *p=(struct Order*)malloc(sizeof(struct Order));
        //读取数据到p
        if(fscanf(fp, "%s%s%d%s"
             ,p->food  ,p->num  ,&p->count  ,p->remarks 
        ) == EOF)  {
            break;
        }
        p->next=NULL;
        //指针为空则赋值。
        if (orderList  == NULL)
        {
            orderList=p;
            tail=p;
        }
        else {
            tail->next=p;
            tail=p;
        }
        i++;
    }
    //记录总数
    orderCount = i;
    fclose(fp);
}
//点单 写入文件
void writeOrder (){
    //打开文件
    FILE *fp = NULL;
    fp = fopen("Order.txt", "w+");
    //定义指针
    struct Order *p = orderList;
    //写入
    while(p){
        fprintf(fp,"%s %s %d %s\n"
             ,p->food  ,p->num  ,p->count  ,p->remarks );
        p=p->next;
    }
    fclose(fp);
}
//点单 添加记录
void addOrder (){
    char selectYNFlag = 'y';
    while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
                    printf("\n");            struct Order *tempValue = (struct Order*)malloc(sizeof(struct Order)); //必须重新分配地址空间。
                                                                     printf("请输入菜品 :");                        char food[15];                                 scanf("%s",food);
                                                strcpy(tempValue->food,food);
                                                                                                        struct Food* foodTemp = getOneFood ("name",tempValue->food);
                        if(foodTemp==NULL){//检索不为空
                                        printf("菜品不存在!\n");                            break;
                        }
                                                                                                                     printf("请输入餐桌号 :");                        char num[10];                                 scanf("%s",num);
                                                strcpy(tempValue->num,num);
                                                                                                                                                                                 printf("请输入盘数 :");                        int count;                                 scanf("%d",&count);
                                                tempValue->count = count ;
                                                                                                                                                                                 printf("请输入备注 :");                        char remarks[10];                                 scanf("%s",remarks);
                                                strcpy(tempValue->remarks,remarks);
                                                                                                                            //TODO

        //加入链表
        tempValue->next = NULL;
        addOneOrder (tempValue);
                    printf("\n是否继续录入?(y/n)");            getchar();
                    scanf("%c",&selectYNFlag);
        }
    writeOrder ( );
                printf("\n*****************************\n");                    printf("录入完成\n");                    printf("*****************************\n");    }
void addOneOrder (struct Order *temp){
    //采用头插法
    if(orderList == NULL){
        orderList = temp;
    }else{
        temp->next = orderList;
        orderList = temp;
    }
    orderCount ++;
}
//点单 删除
void delOrder (){
                printf("请输入您要删除的 点单 序号(输入-1退出):");        int index;
                scanf("%d",&index);
    
    if(index >= 0){
        int res = delOrderByIndex (index);
        if(res){
                        printf("删除成功!\n\n");                writeOrder ();
        }else{
                        printf("删除失败!\n\n");            }
    }
}
//点单 根据下标删除
int delOrderByIndex (int index){
    if(index > orderCount || index < 1){
        return 0;//删除失败 ,数量没那么多
    }
    //开始删除!
    struct Order *p = (struct Order*)malloc(sizeof(struct Order));
    struct Order *q = orderList;
    p->next = orderList;
    if(index == 1){
        orderList = orderList ->next;
    }else{
        int i;
        for(i = 0;i < index-1 ; i++){
            p = p->next;
            q = q->next;
        }
        p->next = q->next;
    }
    orderCount = orderCount - 1;
    return 1;
}
//点单 修改
void modOrder (){
                printf("请输入您要修改的点单 序号(输入-1退出):");        int indexOfMod = -1,i;
                scanf("%d",&indexOfMod);
        if(indexOfMod > 0 && indexOfMod <= orderCount ){
        //开始修改
        struct Order *temp = orderList ;
        for( i = 0;i < indexOfMod-1;i++){
            temp=temp->next;
        }
                                                                     printf("请输入菜品 :");                        char food[15];
                                scanf("%s",food);
    
                                                                                                    if(getOneFood ("name",food)==NULL){//检索不为空
                                    printf("菜品 不存在!\n");                            return;
                    }
                                                                                                                     printf("请输入餐桌号 :");                        char num[10];
                                scanf("%s",num);
    
                                                                                                                                                                                 printf("请输入盘数 :");                        int count;
                                scanf("%d",&count);
    
                                                                                                                                                                                 printf("请输入备注 :");                        char remarks[10];
                                scanf("%s",remarks);
    
                                                                                                                            //输入完毕,赋值
                                                     strcpy(temp-> food,food);
                                                                                 strcpy(temp-> num,num);
                                                                                 temp-> count = count ;
                                                                                 strcpy(temp-> remarks,remarks);
                                                        printf("修改成功!\n");            writeOrder ();
    }else{
                    printf("输入错误!\n");        }
}
//点单 查找 如果all=1:查询全部 否则按条件查询
void findOrder (int all){
    int select = 0;
    char conCharArr[40];
    double conNum1,conNum2;
    while(1){
        printf("\n%-5s%-15s%-10s%-10s%-10s\n\n","序号" ,"菜品","餐桌号","盘数","备注" );
        int i=1,count = 0;
        if( orderList ){
            //用于统计信息所用
                                                                                                        int countSum=0;
                                                                    struct Order *t = orderList;
            while(t){
                int delFlag = 0;
                if(select == 0
                                                                                                                        || select == 1 && strstr(t->food,conCharArr) //根据菜品,模糊查询
                                                                                                                                                        || select == 2 && strstr(t->num,conCharArr) //根据餐桌号,模糊查询
                                                                                                                                                                                ){
                                                            printf("%-5d%-15s%-10s%-10d%-10s \n\n",i
                                                                    ,t->food
                                                ,t->num
                                                ,t->count
                                                ,t->remarks
                                            );
                    //用于统计信息所用
                                                                                                                                                                countSum += t->count;
                                                                                                            count++;
                }else{
                    delFlag = 1;//删掉
                }
                t=t->next;
                if(delFlag){
                    delOrderByIndex (i--);
                }
                i++;
            }
                        printf("共%d条结果\n",count);                            printf("-----------------------------------------------------------------------------------------------------\n");                                                                                                                                            printf("【盘数】总计:%d \n",countSum );
                                                                                                    printf("\n");            }else{
                        printf("\n【无记录!】\n\n");            }
        //如果参数all为1,则表示列出所有就退出
        if(all == 1)break;
        //进入过滤。
                    printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n");                        printf("0:退出\n");                                                    printf("1:按 菜品 筛选\n");                                                                printf("2:按 餐桌号 筛选\n");                                                                                    printf("请输入选择:");                        scanf("%d",&select);
            if(select>0){
            if(0  ||select==1 ||select==2 ){
                            printf("请输入筛选条件:");                                scanf("%s",conCharArr);
                }else if(0 ){
                            printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):");                                scanf("%lf",&conNum1);
                scanf("%lf",&conNum2);
                }
        }else{
            break;
        }
    }
    readOrder();//从新读取数据。
}
//点单 排序
void sortOrder (){
    int select,i,j;
                        printf("1:按 菜品 排序\n");                            printf("2:按 餐桌号 排序\n");                            printf("3:按 盘数 排序\n");                            printf("4:按 备注 排序\n");                        printf("请输入选择:");                    scanf("%d",&select);
        struct Order *list[100];
    for(i = 0;i< orderCount;i++){
        list[i] = orderList;
        orderList = orderList ->next;
    }
    for( i = orderCount -1;i>0;i--){
        for( j = 0;j < i;j++){
            if(	0
                                                || select == 1 && strcmp(list[j]->food , list[j+1]->food)>0
                                                                || select == 2 && strcmp(list[j]->num , list[j+1]->num)>0
                                                                || select == 3 && list[j]->count - list[j+1]->count > 0
                                                                || select == 4 && strcmp(list[j]->remarks , list[j+1]->remarks)>0
                                            ){
                struct Order *temp = (struct Order*)malloc(sizeof(struct Order));
                temp = list[j]; //交换位置
                list[j] = list[j+1];
                list[j+1] = temp;
            }

        }
    }
    for(i = 0;i< orderCount -1;i++){
        list[i]->next = list[i+1];
    }
    list[ orderCount -1 ]->next = NULL;
    orderList = list[0];
    findOrder (1);
    writeOrder ();
}

                void menu (){
        //菜单
                    printf("*------------------主菜单---------------------*\n");                                                    printf("*-------------1 :添加菜品\n");                                                        printf("*-------------2 :删除菜品\n");                                                        printf("*-------------3 :修改菜品\n");                                                        printf("*-------------4 :查找菜品\n");                                printf("*-------------5 :排序菜品\n");                                                                printf("*-------------6 :添加点单\n");                                                        printf("*-------------7 :删除点单\n");                                                        printf("*-------------8 :修改点单\n");                                                        printf("*-------------9 :查找点单\n");                                printf("*-------------10 :排序点单\n");                                            printf("*-------------0:退出\n");                                printf("*---------------------------------------------*\n");                        printf("请输入选择:");        }

链表:C++版本

#include <io.h>
            #include <iostream>
            #include <windows.h>
            using namespace std; 
        

        //定义 菜品 链表
    struct Food {
                    char name[15] ; // 名称
                    double price ; // 价格
                    char description[20] ; // 描述
                struct Food* next;//链式存储
    };
    struct  Food *foodList;//定义全局 菜品 指针
    int foodCount = 0;//菜品 个数记录
        //定义 点单 链表
    struct Order {
                    char food[15] ; // 菜品
                    char num[10] ; // 餐桌号
                    int count ; // 盘数
                    char remarks[10] ; // 备注
                struct Order* next;//链式存储
    };
    struct  Order *orderList;//定义全局 点单 指针
    int orderCount = 0;//点单 个数记录
    
        //菜品 读入文件
    void readFood ();
    //菜品 写入文件
    void writeFood ();
    //菜品 添加记录
    void addFood ();
        void addOneFood (struct Food *food);
        //菜品 删除记录
    void delFood ();
    //菜品 根据下标删除
    int delFoodByIndex (int index);
    //菜品 修改记录
    void modFood ();
    //菜品 查找记录
    void findFood (int all);
    //菜品 排序
    void sortFood ();
    //交换
    void exchangeFood (int i ,int j);
    //存在判断函数
                                    struct Food* getOneFood (const char *name,char *s);
                                    //点单 读入文件
    void readOrder ();
    //点单 写入文件
    void writeOrder ();
    //点单 添加记录
    void addOrder ();
        void addOneOrder (struct Order *order);
        //点单 删除记录
    void delOrder ();
    //点单 根据下标删除
    int delOrderByIndex (int index);
    //点单 修改记录
    void modOrder ();
    //点单 查找记录
    void findOrder (int all);
    //点单 排序
    void sortOrder ();
    //交换
    void exchangeOrder (int i ,int j);
    //存在判断函数
                    
        //菜单
            void menu();
    
    // 主函数
    int main(){
            //读取数据
                        readFood ();//读取菜品
                            readOrder ();//读取点单
                while(1){
                        int choice;
                                    menu ();
                cin>>choice;
        switch(choice){
                                        case 1 :
                            addFood ();//添加菜品
                break;
                                                    case 2 :
                            findFood (1);//查找菜品
                                delFood ();//删除菜品
                break;
                                                    case 3 :
                            findFood (1);//查找菜品
                                modFood ();//修改菜品
                break;
                                                    case 4 :
                            findFood (0);//查找菜品
                break;
                            case 5 :
                            sortFood ();//排序菜品
                break;
                                                            case 6 :
                            addOrder ();//添加点单
                break;
                                                    case 7 :
                            findOrder (1);//查找点单
                                delOrder ();//删除点单
                break;
                                                    case 8 :
                            findOrder (1);//查找点单
                                modOrder ();//修改点单
                break;
                                                    case 9 :
                            findOrder (0);//查找点单
                break;
                            case 10 :
                            sortOrder ();//排序点单
                break;
                                            case 0:
                    cout<<"\n\n\n\t\t\t感谢使用\n\n\n";
            exit(0);
                default :
        getchar();
                    cout<<"\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n";
            system("pause");
        break;
    }
                        }
        return 0;
    }


		
            //是否存在判断
        struct Food *getOneFood (const char *name,char *s){
            struct Food *head = foodList;
            while(head){
                                                        if( strcmp(name,"name")==0 && strcmp(s, head->name )==0){
                        return head;
                    }
                                                                                                                            head = head->next;
            }
            return NULL;
        }
    //菜品 读入文件
void readFood (){
    FILE *fp = NULL;
    if (NULL == (fp = fopen("Food.txt", "r")))//读打开
    {
        //文件不存在,不读取
        return;
    }
    int i=0;
    //从文件读取数据
    foodList = NULL;
    struct Food *tail = foodList;
    while (1)//读取
    {
        //给节点分配空间
        struct Food *p=(struct Food*)malloc(sizeof(struct Food));
        //读取数据到p
        if(fscanf(fp, "%s%lf%s"
             ,p->name  ,&p->price  ,p->description 
        ) == EOF)  {
            break;
        }
        p->next=NULL;
        //指针为空则赋值。
        if (foodList  == NULL)
        {
            foodList=p;
            tail=p;
        }
        else {
            tail->next=p;
            tail=p;
        }
        i++;
    }
    //记录总数
    foodCount = i;
    fclose(fp);
}
//菜品 写入文件
void writeFood (){
    //打开文件
    FILE *fp = NULL;
    fp = fopen("Food.txt", "w+");
    //定义指针
    struct Food *p = foodList;
    //写入
    while(p){
        fprintf(fp,"%s %lf %s\n"
             ,p->name  ,p->price  ,p->description );
        p=p->next;
    }
    fclose(fp);
}
//菜品 添加记录
void addFood (){
    char selectYNFlag = 'y';
    while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
                    cout<<"\n";
            struct Food *tempValue = (struct Food*)malloc(sizeof(struct Food)); //必须重新分配地址空间。
                                                                     cout<<"请输入名称 :";
                        char name[15];                                 cin>>name;
                                                strcpy(tempValue->name,name);
                                                                 struct Food* onename = getOneFood ("name",tempValue->name);
                        if(onename !=NULL){//检索不为空
                                        cout<<"名称已存在!\n";
                            break;
                        }
                                                                                                                                                             cout<<"请输入价格 :";
                        double price;                                 cin>>price;
                                                tempValue->price = price ;
                                                                                                                                                                                 cout<<"请输入描述 :";
                        char description[20];                                 cin>>description;
                                                strcpy(tempValue->description,description);
                                                                                                                            //TODO

        //加入链表
        tempValue->next = NULL;
        addOneFood (tempValue);
                    cout<<"\n是否继续录入?(y/n)";
            getchar();
                    cin>>selectYNFlag;
        }
    writeFood ( );
                cout<<"\n*****************************\n";
                    cout<<"录入完成\n";
                    cout<<"*****************************\n";
    }
void addOneFood (struct Food *temp){
    //采用头插法
    if(foodList == NULL){
        foodList = temp;
    }else{
        temp->next = foodList;
        foodList = temp;
    }
    foodCount ++;
}
//菜品 删除
void delFood (){
                cout<<"请输入您要删除的 菜品 序号(输入-1退出):";
        int index;
                cin>>index;
    
    if(index >= 0){
        int res = delFoodByIndex (index);
        if(res){
                        cout<<"删除成功!\n\n";
                writeFood ();
        }else{
                        cout<<"删除失败!\n\n";
            }
    }
}
//菜品 根据下标删除
int delFoodByIndex (int index){
    if(index > foodCount || index < 1){
        return 0;//删除失败 ,数量没那么多
    }
    //开始删除!
    struct Food *p = (struct Food*)malloc(sizeof(struct Food));
    struct Food *q = foodList;
    p->next = foodList;
    if(index == 1){
        foodList = foodList ->next;
    }else{
        int i;
        for(i = 0;i < index-1 ; i++){
            p = p->next;
            q = q->next;
        }
        p->next = q->next;
    }
    foodCount = foodCount - 1;
    return 1;
}
//菜品 修改
void modFood (){
                cout<<"请输入您要修改的菜品 序号(输入-1退出):";
        int indexOfMod = -1,i;
                cin>>indexOfMod;
        if(indexOfMod > 0 && indexOfMod <= foodCount ){
        //开始修改
        struct Food *temp = foodList ;
        for( i = 0;i < indexOfMod-1;i++){
            temp=temp->next;
        }
                                                                     cout<<"请输入名称 :";
                        char name[15];
                                cin>>name;
    
                                                            if(strcmp(temp->name,name) != 0 && getOneFood ("name",name)!=NULL){//检索不为空
                                    cout<<"名称 已存在!\n";
                            return;
                    }
                                                                                                                                                             cout<<"请输入价格 :";
                        double price;
                                cin>>price;
    
                                                                                                                                                                                 cout<<"请输入描述 :";
                        char description[20];
                                cin>>description;
    
                                                                                                                            //输入完毕,赋值
                                                     strcpy(temp-> name,name);
                                                                                 temp-> price = price ;
                                                                                 strcpy(temp-> description,description);
                                                        cout<<"修改成功!\n";
            writeFood ();
    }else{
                    cout<<"输入错误!\n";
        }
}
//菜品 查找 如果all=1:查询全部 否则按条件查询
void findFood (int all){
    int select = 0;
    char conCharArr[40];
    double conNum1,conNum2;
    while(1){
        printf("\n%-5s%-15s%-12s%-20s\n\n","序号" ,"名称","价格","描述" );
        int i=1,count = 0;
        if( foodList ){
            //用于统计信息所用
                                                                            double priceSum=0;
                                                                    struct Food *t = foodList;
            while(t){
                int delFlag = 0;
                if(select == 0
                                                                                                                        || select == 1 && strstr(t->name,conCharArr) //根据名称,模糊查询
                                                                                                                                                                                ){
                                                            printf("%-5d%-15s%-12lf%-20s \n\n",i
                                                                    ,t->name
                                                ,t->price
                                                ,t->description
                                            );
                    //用于统计信息所用
                                                                                                                    priceSum += t->price;
                                                                                                            count++;
                }else{
                    delFlag = 1;//删掉
                }
                t=t->next;
                if(delFlag){
                    delFoodByIndex (i--);
                }
                i++;
            }
                        cout<<"共" << count <<"条结果\n";
                            cout<<"-----------------------------------------------------------------------------------------------------\n";
                                                                                                                cout<<"【价格】"  <<"平均:"<<  (count!=0?priceSum*1.0/count:0)<<"\n";
                                                                                                    cout<<"\n";
            }else{
                        cout<<"\n【无记录!】\n\n";
            }
        //如果参数all为1,则表示列出所有就退出
        if(all == 1)break;
        //进入过滤。
                    cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n";
                        cout<<"0:退出\n";
                                                    cout<<"1:按 名称 筛选\n";
                                                                                    cout<<"请输入选择:";
                        cin>>select;
            if(select>0){
            if(0  ||select==1 ){
                            cout<<"请输入筛选条件:";
                                cin>>conCharArr;
                }else if(0 ){
                            cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
                                cin>>conNum1;
                cin>>conNum2;
                }
        }else{
            break;
        }
    }
    readFood();//从新读取数据。
}
//菜品 排序
void sortFood (){
    int select,i,j;
                        cout<<"1:按 名称 排序\n";
                            cout<<"2:按 价格 排序\n";
                            cout<<"3:按 描述 排序\n";
                        cout<<"请输入选择:";
                    cin>>select;
        struct Food *list[100];
    for(i = 0;i< foodCount;i++){
        list[i] = foodList;
        foodList = foodList ->next;
    }
    for( i = foodCount -1;i>0;i--){
        for( j = 0;j < i;j++){
            if(	0
                                                || select == 1 && strcmp(list[j]->name , list[j+1]->name)>0
                                                                || select == 2 && list[j]->price - list[j+1]->price > 0
                                                                || select == 3 && strcmp(list[j]->description , list[j+1]->description)>0
                                            ){
                struct Food *temp = (struct Food*)malloc(sizeof(struct Food));
                temp = list[j]; //交换位置
                list[j] = list[j+1];
                list[j+1] = temp;
            }

        }
    }
    for(i = 0;i< foodCount -1;i++){
        list[i]->next = list[i+1];
    }
    list[ foodCount -1 ]->next = NULL;
    foodList = list[0];
    findFood (1);
    writeFood ();
}
    //点单 读入文件
void readOrder (){
    FILE *fp = NULL;
    if (NULL == (fp = fopen("Order.txt", "r")))//读打开
    {
        //文件不存在,不读取
        return;
    }
    int i=0;
    //从文件读取数据
    orderList = NULL;
    struct Order *tail = orderList;
    while (1)//读取
    {
        //给节点分配空间
        struct Order *p=(struct Order*)malloc(sizeof(struct Order));
        //读取数据到p
        if(fscanf(fp, "%s%s%d%s"
             ,p->food  ,p->num  ,&p->count  ,p->remarks 
        ) == EOF)  {
            break;
        }
        p->next=NULL;
        //指针为空则赋值。
        if (orderList  == NULL)
        {
            orderList=p;
            tail=p;
        }
        else {
            tail->next=p;
            tail=p;
        }
        i++;
    }
    //记录总数
    orderCount = i;
    fclose(fp);
}
//点单 写入文件
void writeOrder (){
    //打开文件
    FILE *fp = NULL;
    fp = fopen("Order.txt", "w+");
    //定义指针
    struct Order *p = orderList;
    //写入
    while(p){
        fprintf(fp,"%s %s %d %s\n"
             ,p->food  ,p->num  ,p->count  ,p->remarks );
        p=p->next;
    }
    fclose(fp);
}
//点单 添加记录
void addOrder (){
    char selectYNFlag = 'y';
    while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
                    cout<<"\n";
            struct Order *tempValue = (struct Order*)malloc(sizeof(struct Order)); //必须重新分配地址空间。
                                                                     cout<<"请输入菜品 :";
                        char food[15];                                 cin>>food;
                                                strcpy(tempValue->food,food);
                                                                                                        struct Food* foodTemp = getOneFood ("name",tempValue->food);
                        if(foodTemp==NULL){//检索不为空
                                        cout<<"菜品不存在!\n";
                            break;
                        }
                                                                                                                     cout<<"请输入餐桌号 :";
                        char num[10];                                 cin>>num;
                                                strcpy(tempValue->num,num);
                                                                                                                                                                                 cout<<"请输入盘数 :";
                        int count;                                 cin>>count;
                                                tempValue->count = count ;
                                                                                                                                                                                 cout<<"请输入备注 :";
                        char remarks[10];                                 cin>>remarks;
                                                strcpy(tempValue->remarks,remarks);
                                                                                                                            //TODO

        //加入链表
        tempValue->next = NULL;
        addOneOrder (tempValue);
                    cout<<"\n是否继续录入?(y/n)";
            getchar();
                    cin>>selectYNFlag;
        }
    writeOrder ( );
                cout<<"\n*****************************\n";
                    cout<<"录入完成\n";
                    cout<<"*****************************\n";
    }
void addOneOrder (struct Order *temp){
    //采用头插法
    if(orderList == NULL){
        orderList = temp;
    }else{
        temp->next = orderList;
        orderList = temp;
    }
    orderCount ++;
}
//点单 删除
void delOrder (){
                cout<<"请输入您要删除的 点单 序号(输入-1退出):";
        int index;
                cin>>index;
    
    if(index >= 0){
        int res = delOrderByIndex (index);
        if(res){
                        cout<<"删除成功!\n\n";
                writeOrder ();
        }else{
                        cout<<"删除失败!\n\n";
            }
    }
}
//点单 根据下标删除
int delOrderByIndex (int index){
    if(index > orderCount || index < 1){
        return 0;//删除失败 ,数量没那么多
    }
    //开始删除!
    struct Order *p = (struct Order*)malloc(sizeof(struct Order));
    struct Order *q = orderList;
    p->next = orderList;
    if(index == 1){
        orderList = orderList ->next;
    }else{
        int i;
        for(i = 0;i < index-1 ; i++){
            p = p->next;
            q = q->next;
        }
        p->next = q->next;
    }
    orderCount = orderCount - 1;
    return 1;
}
//点单 修改
void modOrder (){
                cout<<"请输入您要修改的点单 序号(输入-1退出):";
        int indexOfMod = -1,i;
                cin>>indexOfMod;
        if(indexOfMod > 0 && indexOfMod <= orderCount ){
        //开始修改
        struct Order *temp = orderList ;
        for( i = 0;i < indexOfMod-1;i++){
            temp=temp->next;
        }
                                                                     cout<<"请输入菜品 :";
                        char food[15];
                                cin>>food;
    
                                                                                                    if(getOneFood ("name",food)==NULL){//检索不为空
                                    cout<<"菜品 不存在!\n";
                            return;
                    }
                                                                                                                     cout<<"请输入餐桌号 :";
                        char num[10];
                                cin>>num;
    
                                                                                                                                                                                 cout<<"请输入盘数 :";
                        int count;
                                cin>>count;
    
                                                                                                                                                                                 cout<<"请输入备注 :";
                        char remarks[10];
                                cin>>remarks;
    
                                                                                                                            //输入完毕,赋值
                                                     strcpy(temp-> food,food);
                                                                                 strcpy(temp-> num,num);
                                                                                 temp-> count = count ;
                                                                                 strcpy(temp-> remarks,remarks);
                                                        cout<<"修改成功!\n";
            writeOrder ();
    }else{
                    cout<<"输入错误!\n";
        }
}
//点单 查找 如果all=1:查询全部 否则按条件查询
void findOrder (int all){
    int select = 0;
    char conCharArr[40];
    double conNum1,conNum2;
    while(1){
        printf("\n%-5s%-15s%-10s%-10s%-10s\n\n","序号" ,"菜品","餐桌号","盘数","备注" );
        int i=1,count = 0;
        if( orderList ){
            //用于统计信息所用
                                                                                                        int countSum=0;
                                                                    struct Order *t = orderList;
            while(t){
                int delFlag = 0;
                if(select == 0
                                                                                                                        || select == 1 && strstr(t->food,conCharArr) //根据菜品,模糊查询
                                                                                                                                                        || select == 2 && strstr(t->num,conCharArr) //根据餐桌号,模糊查询
                                                                                                                                                                                ){
                                                            printf("%-5d%-15s%-10s%-10d%-10s \n\n",i
                                                                    ,t->food
                                                ,t->num
                                                ,t->count
                                                ,t->remarks
                                            );
                    //用于统计信息所用
                                                                                                                                                                countSum += t->count;
                                                                                                            count++;
                }else{
                    delFlag = 1;//删掉
                }
                t=t->next;
                if(delFlag){
                    delOrderByIndex (i--);
                }
                i++;
            }
                        cout<<"共" << count <<"条结果\n";
                            cout<<"-----------------------------------------------------------------------------------------------------\n";
                                                                                                                                            cout<<"【盘数】" << "总计:"<<countSum<<" " <<"\n";
                                                                                                    cout<<"\n";
            }else{
                        cout<<"\n【无记录!】\n\n";
            }
        //如果参数all为1,则表示列出所有就退出
        if(all == 1)break;
        //进入过滤。
                    cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n";
                        cout<<"0:退出\n";
                                                    cout<<"1:按 菜品 筛选\n";
                                                                cout<<"2:按 餐桌号 筛选\n";
                                                                                    cout<<"请输入选择:";
                        cin>>select;
            if(select>0){
            if(0  ||select==1 ||select==2 ){
                            cout<<"请输入筛选条件:";
                                cin>>conCharArr;
                }else if(0 ){
                            cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
                                cin>>conNum1;
                cin>>conNum2;
                }
        }else{
            break;
        }
    }
    readOrder();//从新读取数据。
}
//点单 排序
void sortOrder (){
    int select,i,j;
                        cout<<"1:按 菜品 排序\n";
                            cout<<"2:按 餐桌号 排序\n";
                            cout<<"3:按 盘数 排序\n";
                            cout<<"4:按 备注 排序\n";
                        cout<<"请输入选择:";
                    cin>>select;
        struct Order *list[100];
    for(i = 0;i< orderCount;i++){
        list[i] = orderList;
        orderList = orderList ->next;
    }
    for( i = orderCount -1;i>0;i--){
        for( j = 0;j < i;j++){
            if(	0
                                                || select == 1 && strcmp(list[j]->food , list[j+1]->food)>0
                                                                || select == 2 && strcmp(list[j]->num , list[j+1]->num)>0
                                                                || select == 3 && list[j]->count - list[j+1]->count > 0
                                                                || select == 4 && strcmp(list[j]->remarks , list[j+1]->remarks)>0
                                            ){
                struct Order *temp = (struct Order*)malloc(sizeof(struct Order));
                temp = list[j]; //交换位置
                list[j] = list[j+1];
                list[j+1] = temp;
            }

        }
    }
    for(i = 0;i< orderCount -1;i++){
        list[i]->next = list[i+1];
    }
    list[ orderCount -1 ]->next = NULL;
    orderList = list[0];
    findOrder (1);
    writeOrder ();
}

                void menu (){
        //菜单
                    cout<<"*------------------主菜单---------------------*\n";
                                                    cout<<"*-------------1 :添加菜品\n";
                                                        cout<<"*-------------2 :删除菜品\n";
                                                        cout<<"*-------------3 :修改菜品\n";
                                                        cout<<"*-------------4 :查找菜品\n";
                                cout<<"*-------------5 :排序菜品\n";
                                                                cout<<"*-------------6 :添加点单\n";
                                                        cout<<"*-------------7 :删除点单\n";
                                                        cout<<"*-------------8 :修改点单\n";
                                                        cout<<"*-------------9 :查找点单\n";
                                cout<<"*-------------10 :排序点单\n";
                                            cout<<"*-------------0:退出\n";
                                cout<<"*---------------------------------------------*\n";
                        cout<<"请输入选择:";
        }

C++面向对象

#include <iostream>
            #include  <vector>
            #include <fstream>
            #include <string.h>
            using namespace std; 
    

int compare(int a,int b);
int compare(const char *a,const char *b);


class Food  //定义 菜品 类
{
public:
    static vector< Food*> dataList;
            char name[15] ; // 名称
            double price ; // 价格
            char description[20] ; // 描述
        static void read();//读文件
    static void write();//写文件
    static void add();//添加
    static void del();//删除
    static void mod();//修改
    static void find(int all);//查找
    static void sort();//排序
        static Food* getOne(string name, string s);//存在判断函数
        };
vector< Food*> Food::dataList;//必须类外初始化,用于存储菜品
class Order  //定义 点单 类
{
public:
    static vector< Order*> dataList;
            char food[15] ; // 菜品
            char num[10] ; // 餐桌号
            int count ; // 盘数
            char remarks[10] ; // 备注
        static void read();//读文件
    static void write();//写文件
    static void add();//添加
    static void del();//删除
    static void mod();//修改
    static void find(int all);//查找
    static void sort();//排序
        };
vector< Order*> Order::dataList;//必须类外初始化,用于存储点单

//定义菜单
void menu();

    // 主函数
    int main(){
            //读取数据
                        Food::read ();//读取菜品
                            Order::read ();//读取点单
                while(1){
                        int choice;
                                    menu ();
                cin>>choice;
        switch(choice){
                                        case 1 :
                            Food::add ();//添加菜品
                break;
                                                    case 2 :
                            Food::find (1);//查找菜品
                                Food::del ();//删除菜品
                break;
                                                    case 3 :
                            Food::find (1);//查找菜品
                                Food::mod ();//修改菜品
                break;
                                                    case 4 :
                            Food::find (0);//查找菜品
                break;
                            case 5 :
                            Food::sort ();//排序菜品
                break;
                                                            case 6 :
                            Order::add ();//添加点单
                break;
                                                    case 7 :
                            Order::find (1);//查找点单
                                Order::del ();//删除点单
                break;
                                                    case 8 :
                            Order::find (1);//查找点单
                                Order::mod ();//修改点单
                break;
                                                    case 9 :
                            Order::find (0);//查找点单
                break;
                            case 10 :
                            Order::sort ();//排序点单
                break;
                                            case 0:
                    cout<<"\n\n\n\t\t\t感谢使用\n\n\n";
            exit(0);
                default :
        getchar();
                    cout<<"\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n";
            system("pause");
        break;
    }
                        }
        return 0;
    }


		
//是否存在判断
Food* Food::getOne(string name, string s) {
    for (int i = 0; i < dataList.size();i++) {
                                if( strcmp(name.c_str(),"name")==0 && strcmp(s.c_str(), dataList[i]->name )==0){
                return dataList[i];
            }
                                                                }
    return NULL;
}
//读取文件内的菜品
void Food::read() {
    FILE *fp = NULL;
    if (NULL == (fp = fopen("Food.txt", "r")))//读打开
    {
        //文件不存在,不读取
        return;
    }
    //从文件读取数据
    dataList.clear();
    while (1)//读取
    {
        //新建菜品对象
        Food *t = new Food;
        //读取数据到p
        if(fscanf(fp, "%s%lf%s"
             ,t->name  ,&t->price  ,t->description 
        ) == EOF)  {
            break;
        }
        dataList.push_back(t);//将内容加入vector
    }
    fclose(fp);
}
//菜品 写入文件
void Food::write() {
    //打开文件
    FILE *fp = NULL;
    fp = fopen("Food.txt", "w+");
    //写入
    for (int i = 0; i < dataList.size(); i++) {
        Food *t = dataList.at(i);
        fprintf(fp,"%s %lf %s\n"
             ,t->name  ,t->price  ,t->description );
    }
    fclose(fp);
}
//菜品 添加记录
void Food::add() {
    char selectYNFlag = 'y';
    while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
        cout<<"\n";
        Food *tempValue = new Food (); //必须重新分配地址空间。
                                                         cout<<"请输入名称 :";
                    char name[15];                     cin>>name ;
                                            strcpy(tempValue->name,name);
                                                                 Food* onename = getOne("name",tempValue->name);
                        if(onename!=NULL){//检索不为空
                        cout<<("名称已存在!\n");
                        break;
                    }
                                                                                                                             cout<<"请输入价格 :";
                    double price;                     cin>>price ;
                                            tempValue->price = price ;
                                                                                                                                                 cout<<"请输入描述 :";
                    char description[20];                     cin>>description ;
                                            strcpy(tempValue->description,description);
                                                                                                        //TODO,

        //加入记录
        dataList.push_back(tempValue);
        cout<<"\n是否继续录入?(y/n)";
        getchar();
        cin>>selectYNFlag;
    }
    //写入文件
    write();
    cout<<"\n*****************************\n";
    cout<<"录入结束\n";
    cout<<"*****************************\n";
}
//菜品 删除
void Food::del() {
    cout<<"请输入您要删除的 菜品 序号(输入-1退出):";
    char c;
    cin >> c;
    int index = c - '0';
    if (index >= 0 && index < dataList.size()) {
        dataList.erase(dataList.begin()+index);
        write();
        cout << "删除成功!\n\n";
    }
    else if(index>0){
        cout << "请输入正确序号!\n\n";
    }
}

//菜品 修改
void Food::mod() {
    cout<<"请输入您要修改的菜品 序号(输入-1退出):";
    char c;
    cin >> c;
    int indexOfMod = c - '0';
    if(indexOfMod >= 0 && indexOfMod < dataList.size() ){
        //开始修改
        Food *temp = dataList.at(indexOfMod);
                                                         cout<<"请输入名称 :";
                    char name[15];
                    cin>> name ;
                                                            if(compare(temp->name,name) != 0 && getOne("name",name)!=NULL){//检索不为空
                        cout<<("名称 已存在!\n");
                        return;
                    }
                                                                                                                                                 cout<<"请输入价格 :";
                    double price;
                    cin>> price ;
                                                                                                                                                                     cout<<"请输入描述 :";
                    char description[20];
                    cin>> description ;
                                                                                                                            //输入完毕,赋值
                                                     strcpy(temp-> name,name);
                                                                                 temp-> price = price ;
                                                                                 strcpy(temp-> description,description);
                                            cout<<"修改成功!\n";
        write();
    }else{
        cout<<"输入错误!\n";
    }
}
//菜品 查找 如果all=1:查询全部 否则按条件查询
void Food :: find(int all){
    int select = 0;
    char conCharArr[40];
    double conNum1,conNum2;
    //复制一个容器dataList2,查询的操作再dataList2里面进行
    vector<Food*> dataList2 = dataList;
    while(1){
        printf("\n%-5s%-15s%-12s%-20s\n\n","序号" ,"名称","价格","描述" );
        int count = 0;
        //用于统计信息所用
                                                        double priceSum=0;
                                                for(int i = 0;i < dataList2.size();i++){
            Food* t = dataList2.at(i);
            if(select == 0
                                                                                                    || select == 1 && strstr(t->name,conCharArr) //根据名称,模糊查询
                                                                                                                                                ){
                                            printf("%-5d%-15s%-12lf%-20s \n\n",i
                                                        ,t->name
                                        ,t->price
                                        ,t->description
                                    );
                //用于统计信息所用
                                                                                                priceSum += t->price;
                                                                                        count++;
            }else {
                dataList2.erase(dataList2.begin()+i);
                i--;
            }
        }
        cout<<"共"<< count <<"条结果\n";
        cout<<("-----------------------------------------------------------------------------------------------------\n");
                                                                cout<<"【价格】"  <<"平均:"<<  (count!=0?priceSum*1.0/count:0)<<"\n";
                                                cout<<"\n";
        //如果参数all为1,则表示列出所有就退出
        if(all == 1)break;
        //进入过滤。
                    cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
                        cout<<"0:退出\n";
                                                    cout<<"1:按 名称 筛选\n";
                                                                                    cout<<"请输入选择:";
                        cin>>select;
            if(select>0){
            if(0  ||select==1 ){
                            cout<<"请输入筛选条件:";
                                cin>>conCharArr;
                }else if(0 ){
                            cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
                                cin>>conNum1;
                cin>>conNum2;
                }
        }else{
            break;
        }
    }
}
//菜品 排序
void Food::sort(){
    int select,i,j;
            cout<<"1:按 名称 排序\n";
            cout<<"2:按 价格 排序\n";
            cout<<"3:按 描述 排序\n";
        cout<<"请输入选择:";
    cin>>select;
    for (i = dataList.size() - 1; i > 0; i--) {
        for( j = 0;j < i;j++){
            if(	0
                                || select == 1 && compare(dataList[j]->name , dataList[j+1]->name )>0
                                || select == 2 && compare(dataList[j]->price , dataList[j+1]->price )>0
                                || select == 3 && compare(dataList[j]->description , dataList[j+1]->description )>0
                            ){
                swap(dataList[j], dataList[j + 1]);
            }
        }
    }
    find(1);//排序后打印
    write();
}
//读取文件内的点单
void Order::read() {
    FILE *fp = NULL;
    if (NULL == (fp = fopen("Order.txt", "r")))//读打开
    {
        //文件不存在,不读取
        return;
    }
    //从文件读取数据
    dataList.clear();
    while (1)//读取
    {
        //新建点单对象
        Order *t = new Order;
        //读取数据到p
        if(fscanf(fp, "%s%s%d%s"
             ,t->food  ,t->num  ,&t->count  ,t->remarks 
        ) == EOF)  {
            break;
        }
        dataList.push_back(t);//将内容加入vector
    }
    fclose(fp);
}
//点单 写入文件
void Order::write() {
    //打开文件
    FILE *fp = NULL;
    fp = fopen("Order.txt", "w+");
    //写入
    for (int i = 0; i < dataList.size(); i++) {
        Order *t = dataList.at(i);
        fprintf(fp,"%s %s %d %s\n"
             ,t->food  ,t->num  ,t->count  ,t->remarks );
    }
    fclose(fp);
}
//点单 添加记录
void Order::add() {
    char selectYNFlag = 'y';
    while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
        cout<<"\n";
        Order *tempValue = new Order (); //必须重新分配地址空间。
                                                         cout<<"请输入菜品 :";
                    char food[15];                     cin>>food ;
                                            strcpy(tempValue->food,food);
                                                                                    Food* foodTemp = Food :: getOne("name",tempValue->food);
                        if(foodTemp==NULL){//检索不为空
                        cout<<("菜品不存在!\n");
                        break;
                        }
                                                                                                         cout<<"请输入餐桌号 :";
                    char num[10];                     cin>>num ;
                                            strcpy(tempValue->num,num);
                                                                                                                                                 cout<<"请输入盘数 :";
                    int count;                     cin>>count ;
                                            tempValue->count = count ;
                                                                                                                                                 cout<<"请输入备注 :";
                    char remarks[10];                     cin>>remarks ;
                                            strcpy(tempValue->remarks,remarks);
                                                                                                        //TODO,

        //加入记录
        dataList.push_back(tempValue);
        cout<<"\n是否继续录入?(y/n)";
        getchar();
        cin>>selectYNFlag;
    }
    //写入文件
    write();
    cout<<"\n*****************************\n";
    cout<<"录入结束\n";
    cout<<"*****************************\n";
}
//点单 删除
void Order::del() {
    cout<<"请输入您要删除的 点单 序号(输入-1退出):";
    char c;
    cin >> c;
    int index = c - '0';
    if (index >= 0 && index < dataList.size()) {
        dataList.erase(dataList.begin()+index);
        write();
        cout << "删除成功!\n\n";
    }
    else if(index>0){
        cout << "请输入正确序号!\n\n";
    }
}

//点单 修改
void Order::mod() {
    cout<<"请输入您要修改的点单 序号(输入-1退出):";
    char c;
    cin >> c;
    int indexOfMod = c - '0';
    if(indexOfMod >= 0 && indexOfMod < dataList.size() ){
        //开始修改
        Order *temp = dataList.at(indexOfMod);
                                                         cout<<"请输入菜品 :";
                    char food[15];
                    cin>> food ;
                                                                                                    if(Food :: getOne("name",food)==NULL){//检索不为空
                        cout<<("菜品 不存在!\n");
                        return;
                    }
                                                                                                         cout<<"请输入餐桌号 :";
                    char num[10];
                    cin>> num ;
                                                                                                                                                                     cout<<"请输入盘数 :";
                    int count;
                    cin>> count ;
                                                                                                                                                                     cout<<"请输入备注 :";
                    char remarks[10];
                    cin>> remarks ;
                                                                                                                            //输入完毕,赋值
                                                     strcpy(temp-> food,food);
                                                                                 strcpy(temp-> num,num);
                                                                                 temp-> count = count ;
                                                                                 strcpy(temp-> remarks,remarks);
                                            cout<<"修改成功!\n";
        write();
    }else{
        cout<<"输入错误!\n";
    }
}
//点单 查找 如果all=1:查询全部 否则按条件查询
void Order :: find(int all){
    int select = 0;
    char conCharArr[40];
    double conNum1,conNum2;
    //复制一个容器dataList2,查询的操作再dataList2里面进行
    vector<Order*> dataList2 = dataList;
    while(1){
        printf("\n%-5s%-15s%-10s%-10s%-10s\n\n","序号" ,"菜品","餐桌号","盘数","备注" );
        int count = 0;
        //用于统计信息所用
                                                                            int countSum=0;
                                                for(int i = 0;i < dataList2.size();i++){
            Order* t = dataList2.at(i);
            if(select == 0
                                                                                                    || select == 1 && strstr(t->food,conCharArr) //根据菜品,模糊查询
                                                                                                                                || select == 2 && strstr(t->num,conCharArr) //根据餐桌号,模糊查询
                                                                                                                                                ){
                                            printf("%-5d%-15s%-10s%-10d%-10s \n\n",i
                                                        ,t->food
                                        ,t->num
                                        ,t->count
                                        ,t->remarks
                                    );
                //用于统计信息所用
                                                                                                                                    countSum += t->count;
                                                                                        count++;
            }else {
                dataList2.erase(dataList2.begin()+i);
                i--;
            }
        }
        cout<<"共"<< count <<"条结果\n";
        cout<<("-----------------------------------------------------------------------------------------------------\n");
                                                                                    cout<<"【盘数】" << "总计:"<<countSum<<" " <<"\n";
                                                cout<<"\n";
        //如果参数all为1,则表示列出所有就退出
        if(all == 1)break;
        //进入过滤。
                    cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
                        cout<<"0:退出\n";
                                                    cout<<"1:按 菜品 筛选\n";
                                                                cout<<"2:按 餐桌号 筛选\n";
                                                                                    cout<<"请输入选择:";
                        cin>>select;
            if(select>0){
            if(0  ||select==1 ||select==2 ){
                            cout<<"请输入筛选条件:";
                                cin>>conCharArr;
                }else if(0 ){
                            cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
                                cin>>conNum1;
                cin>>conNum2;
                }
        }else{
            break;
        }
    }
}
//点单 排序
void Order::sort(){
    int select,i,j;
            cout<<"1:按 菜品 排序\n";
            cout<<"2:按 餐桌号 排序\n";
            cout<<"3:按 盘数 排序\n";
            cout<<"4:按 备注 排序\n";
        cout<<"请输入选择:";
    cin>>select;
    for (i = dataList.size() - 1; i > 0; i--) {
        for( j = 0;j < i;j++){
            if(	0
                                || select == 1 && compare(dataList[j]->food , dataList[j+1]->food )>0
                                || select == 2 && compare(dataList[j]->num , dataList[j+1]->num )>0
                                || select == 3 && compare(dataList[j]->count , dataList[j+1]->count )>0
                                || select == 4 && compare(dataList[j]->remarks , dataList[j+1]->remarks )>0
                            ){
                swap(dataList[j], dataList[j + 1]);
            }
        }
    }
    find(1);//排序后打印
    write();
}

                void menu (){
        //菜单
                    cout<<"*------------------主菜单---------------------*\n";
                                                    cout<<"*-------------1 :添加菜品\n";
                                                        cout<<"*-------------2 :删除菜品\n";
                                                        cout<<"*-------------3 :修改菜品\n";
                                                        cout<<"*-------------4 :查找菜品\n";
                                cout<<"*-------------5 :排序菜品\n";
                                                                cout<<"*-------------6 :添加点单\n";
                                                        cout<<"*-------------7 :删除点单\n";
                                                        cout<<"*-------------8 :修改点单\n";
                                                        cout<<"*-------------9 :查找点单\n";
                                cout<<"*-------------10 :排序点单\n";
                                            cout<<"*-------------0:退出\n";
                                cout<<"*---------------------------------------------*\n";
                        cout<<"请输入选择:";
        }
    
//对比函数
int compare(int a,int b){
	return a-b;
}
int compare(const char *a,const char *b){
	return strcmp(a,b);
}


网站公告

今日签到

点亮在社区的每一天
去签到