结构体: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);
}