#include <stdio.h> #include <stdlib.h> #include <string.h> #include<windows.h> #include <conio.h> #define MAX_MENU_SIZE 50 // 菜单最大数量

// 菜品结构体 typedef struct { char name[20]; // 菜品名称 int code; // 菜品编码 float price; // 菜品价格 } Dish;

// 菜单结构体 typedef struct { Dish dishes[MAX_MENU_SIZE]; // 菜品数组 int count; // 菜品数量 } Menu;

// 添加菜品 void addDish(Menu* menu) { Dish dish; printf(' ________________________________ '); printf('| | '); printf('|-------------菜单---------------| '); printf('|-------1.鱼子酱-价格:300-------| '); printf('|-------2.冰淇淋-价格:40 -------| '); printf('|-------3.葱烧海参-价格:200-----| '); printf('|-------4.菲力牛排-价格:350-----| '); printf('|-------5.三文鱼寿司-价格:300---| '); printf('|________________________________| '); /* printf('请输入菜品名称:'); scanf('%s', &dish.name);/ printf('请输入菜品编码:'); scanf('%d', &dish.code); / printf('请输入菜品价格:'); scanf('%f', &dish.price);*/

if (menu->count >= MAX_MENU_SIZE) { printf('菜单已满,无法添加菜品!\n'); } else { switch(dish.code) {case 1:strcpy(dish.name,'鱼子酱');dish.price=300;break; case 2 :strcpy(dish.name,'冰淇淋');dish.price=40;break; case 3:strcpy(dish.name,'葱烧海参');dish.price=200;break; case 4:strcpy(dish.name,'菲力牛排');dish.price=350;break; case 5:strcpy(dish.name,'三文鱼寿司');dish.price=300;break; } menu->dishes[menu->count++] = dish; printf('菜品添加成功!\n'); }

}

// 删除菜品 void deleteDish(Menu* menu) { int code, index = -1; printf('请输入要删除的菜品编码:'); scanf('%d', &code);

for (int i = 0; i < menu->count; i++) { if (menu->dishes[i].code == code) { index = i; break; } }

if (index == -1) { printf('没有找到要删除的菜品!\n'); } else { for (int i = index; i < menu->count - 1; i++) { menu->dishes[i] = menu->dishes[i + 1]; } menu->count--; printf('菜品删除成功!\n'); } }

// 针对数组中的区间[left, right]进行快速排序 void quickSort(Dish dishes[], int left, int right) { if (left >= right) { return; }

int i = left; // 左指针 int j = right; // 右指针 Dish pivot = dishes[left]; // 基准值

while (i < j) { // 从右往左找第一个小于基准值的元素 while (i < j && dishes[j].price >= pivot.price) { j--; } if (i < j) { dishes[i++] = dishes[j]; }

// 从左往右找第一个大于基准值的元素
while (i < j && dishes[i].price <= pivot.price) {
  i++;
}
if (i < j) {
  dishes[j--] = dishes[i];
}

}

// 将基准值放到中间位置 dishes[i] = pivot;

// 对基准值的左右两个子区间分别进行快速排序 quickSort(dishes, left, i - 1); quickSort(dishes, i + 1, right); }

// 按菜品价格排序 void sortByPrice(Menu* menu) { quickSort(menu->dishes, 0, menu->count - 1); printf('按价格排序完成!\n'); }

// 折半插入排序 void binaryInsertionSort(Dish arr[], int n) { for (int i = 1; i < n; i++) { Dish temp = arr[i]; int left = 0; // 已经排序好的左边界 int right = i - 1; // 已经排序好的右边界

// 找到要插入位置的下标
while (left <= right) {
  int mid = (left + right) / 2;
  if (temp.code < arr[mid].code) {
    right = mid - 1;
  } else {
    left = mid + 1;
  }
}

// 把要插入的元素后移,空出插入位置
for (int j = i - 1; j >= left; j--) {
  arr[j + 1] = arr[j];
}

// 把要插入的元素插入到对应位置
arr[left] = temp;

} }

// 按菜品编码排序 void sortByCode(Menu* menu) { binaryInsertionSort(menu->dishes, menu->count); printf('按编码排序完成!\n'); }

// 遍历菜单 void traverseMenu(Menu* menu) { printf('菜单:\n'); if(menu->count!=0) for (int i = 0; i < menu->count; i++) { printf('%s\t%d\t%.2f元\n', menu->dishes[i].name, menu->dishes[i].code, menu->dishes[i].price); } else printf('当前未点餐\n'); }

// 保存菜单 void saveMenu(Menu* menu) {int i; FILE* file = fopen('menu.txt', 'w'); if (file != NULL) { for (i = 0; i < menu->count-1; i++) { fprintf(file, '%s %d %.2f\n', menu->dishes[i].name, menu->dishes[i].code, menu->dishes[i].price); }

fprintf(file, '%s %d %.2f', menu->dishes[i].name, menu->dishes[i].code, menu->dishes[i].price);
fclose(file);
printf('菜单保存成功!\n');

} else { printf('菜单保存失败!\n'); } }

// 加载菜单 void loadMenu(Menu* menu) { FILE* file = fopen('menu.txt', 'r'); if (file != NULL) { while (!feof(file)) { Dish dish; fscanf(file, '%s %d %f', dish.name, &dish.code, &dish.price); if (strlen(dish.name) > 0) { menu->dishes[menu->count++]=dish; } } fclose(file); printf('菜单加载成功!\n'); } else { printf('菜单加载失败!\n'); } }

// 结账函数 void checkout(Menu* menu) { float sum = 0; for (int i = 0; i < menu->count; i++) { sum += menu->dishes[i].price; } printf('总消费金额为:%.2f 元\n', sum);

// 清空菜单缓存,重新生成空的菜单结构体 menu->count = 0; //menu->dishes = NULL;

// 清空文件 FILE* file = fopen('menu.txt', 'w'); if (file != NULL) { fclose(file); printf('菜单文件清空成功!\n'); } else { printf('菜单文件清空失败!\n'); } }

//顺序查找法 void search_shunxu(Menu* menu) { int i,t,tag; tag=0; char na[50]; printf('请输入菜品名:\n'); scanf('%s',na); for(i=0;icount;i++) { t=strcmp(menu->dishes[i].name,na); if(t==0) { printf('该菜品已点'); tag=1; break; } } if(tag==0) printf('未点该菜品'); }

//折半查找 int Search_Bin(Menu *menu,int e)//折半查找 { int low=0,high=menu->count-1,mid; while(low<=high) { mid=(low+high)/2; if(e==menu->dishes[mid].code) {printf('该菜品已点!\n');return 0;} else if(edishes[mid].code) high=mid-1; else low=mid+1; } printf('未点该菜品!\n'); return 0; }

// 主函数 int main() { system('color B'); Menu menu; menu.count = 0; int choice; loadMenu(&menu); int tag; while(1) { lable:printf('----------------------------------------------\n'); printf('|***** 请选择你的身份(1.管理员 2.用户) ********| '); printf('----------------------------------------------\n'); scanf('%d',&tag); system ('cls'); if(tag==1) {

 int sign=1,i;
	 char ch[20],a;
	 printf('请输入密码:');
	
 while(sign)
 {
	 i=0;
 while(1)
	 {
		  a=getch();
		 if(a=='\r') break;
		 ch[i]=a;
		 printf('*');
		 i++;
	 }
		 ch[i]='\0'; 
		 if(strcmp('123123',ch)==0) {printf('\n密码正确\n');sign=0;} 
		 else  printf('\n密码错误,请重新输入:\n');
 }
 system ('cls');	
 printf('----------------------------------------\n');
 printf('==================管理员================\n');
 printf('+              1.查看用户已点菜品       +

'); printf('+ 2.为用户结账 + '); printf('+ 3.返回上一级 + ');
printf('+ 4.删除菜品 + '); printf('----------------------------------------\n'); while(1) { printf('请输入:\n'); int biaoji; scanf('%d',&biaoji); switch(biaoji) { case 1:traverseMenu(&menu);break; //结账函数 case 2: checkout(&menu);break; case 3:system ('cls');goto lable;break; case 4:deleteDish(&menu);break; default:printf('您的输入有误,请重新输入!\n');break;

   }
   
 }
 break;

} else if(tag==2) { while (1) { printf('\n'); printf('----------------------------------------\n'); printf('=============餐厅用户点餐系统=========== '); printf('+ 1.点餐 + '); printf('+ 2.删除菜品 + '); printf('+ 3.将已点餐品按价格排序 + '); printf('+ 4.将已点餐品按编码排序 + '); printf('+ 5.输出已点餐品 + '); printf('+ 6.保存菜单 + '); printf('+ 7.返回上一级 + '); printf('+ 8.按照菜名查看是否已点 + '); printf('+ 9.按照编号查看是否已点 + '); printf('+ 0.退出系统 + '); printf('----------------------------------------\n'); printf('请输入您的选择(0-9):'); scanf('%d', &choice);

switch (choice) {
  case 0:
    printf('欢迎再次光临!\n');
    return 0;
  case 1: system ('cls');	
    addDish(&menu);
    break;
  case 2:system ('cls');	
    deleteDish(&menu);
    break;
  case 3:system ('cls');	
    sortByPrice(&menu);
    break;
  case 4:system ('cls');	
    sortByCode(&menu);
    break;
  case 5:system ('cls');	
    traverseMenu(&menu);
    break;
  case 6:system ('cls');	
    saveMenu(&menu);
    break;
    case 7:system ('cls');	
    	goto lable;break;
    	case 8:system ('cls');	
		 search_shunxu(&menu);break;
		 case 9:system ('cls');	 int e;printf('请输入编码:');scanf('%d',&e); sortByCode(&menu);   Search_Bin(&menu,e);break;
		 	break;
  default:
    printf('您的输入有误,请重新输入!\n');
    break;
}

}

break; } else printf('输入错误请重新输入:\n'); }

return 0; }

本次制作系统让我更深入地了解了数据结构与算法的应用,尤其是排序算法的实现。通过实现快速排序和折半插入排序,我更加深刻地理解了它们的基本原理和实现方式,并且在实际应用中体会到它们的优点和缺点。同时,通过实现菜单的增删改查等操作,我也更加熟悉了结构体和文件操作的使用方法。在编写代码的过程中,我也发现了自己的不足之处,例如代码的可读性和健壮性等方面还需要不断改进和提高。总的来说,本次制作系统让我受益匪浅,也让我更加热爱编程这个领域。

餐厅点餐系统:C语言实现数据结构与算法应用

原文地址: https://www.cveoy.top/t/topic/oA2z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录