c语言从文本中读出菜品信息,链表实现通过查询菜品类型点餐,修改订单,删除订单,计算总价
时间: 2023-05-29 11:02:02 浏览: 135
对于这个问题,需要设计一个菜品信息的数据结构,可以使用结构体来表示一个菜品的信息,包括菜品名称、菜品类型、价格等字段。然后使用链表来存储所有菜品的信息。
读取文本文件中的菜品信息,并将其存储到链表中,可以使用文件读取函数,逐行读取文件,并使用字符串处理函数来分离菜品信息中的各个字段。然后根据读取到的数据构建菜品信息结构体,并加入到链表中。
对于通过查询菜品类型点餐,可以实现一个函数,该函数接收一个菜品类型作为参数,然后遍历链表中的菜品信息,查找出所有符合条件的菜品,将它们显示出来,让用户选择需要点的菜品并输入数量。然后生成一个订单信息,存储订单的菜品名称、数量、单价等信息。
修改订单可以实现一个函数,该函数接收要修改的订单号和修改后的菜品信息,然后遍历订单列表,找到要修改的订单,将订单信息更新为新的菜品信息。
删除订单可以实现一个函数,该函数接收要删除的订单号,然后遍历订单列表,找到要删除的订单,将该订单从订单列表中删除。
计算总价可以实现一个函数,该函数遍历订单列表,累加所有订单的菜品数量和单价,计算出总价并返回给调用者。
整个程序的主要逻辑就是根据用户的输入来执行相应的操作,如查询菜品信息、点餐、修改订单、删除订单等等,每个操作都需要对菜品信息链表和订单列表进行相应的修改。在程序退出时,需要将所有菜品信息和订单信息存储到文件中。
相关问题
c语言从文本中读出菜品信息,链表实现通过查询点餐,修改订单,删除订单,计算总价
这里提供一个简单的代码示例,实现从文本文件中读取菜品信息,并使用链表实现点餐、修改订单、删除订单、计算总价等功能。
菜品信息包括名称、价格、数量,存储在一个文本文件dish.txt中,每行包括名称、价格、数量,用空格分隔。如下所示:
红烧肉 20 10
麻辣肥牛 30 5
鱼香肉丝 25 8
宫保鸡丁 22 12
...
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 50
// 菜品信息结构体
typedef struct dish_info
{
char name[MAX_LEN]; // 名称
float price; // 价格
int num; // 数量
struct dish_info* next; // 下一个节点指针
}DishInfo;
// 读取菜品信息
DishInfo* read_dish_info()
{
DishInfo* head = NULL;
DishInfo* tail = NULL;
FILE* fp = fopen("dish.txt", "r");
if(fp == NULL)
{
printf("Failed to open file\n");
exit(-1);
}
char buffer[MAX_LEN];
while(fgets(buffer, MAX_LEN, fp) != NULL)
{
// 解析每行的信息
char* name = strtok(buffer, " ");
float price = atof(strtok(NULL, " "));
int num = atoi(strtok(NULL, " "));
// 创建节点并加入链表中
DishInfo* temp = (DishInfo*)malloc(sizeof(DishInfo));
strcpy(temp->name, name);
temp->price = price;
temp->num = num;
temp->next = NULL;
if(head == NULL)
{
head = temp;
tail = temp;
}
else
{
tail->next = temp;
tail = temp;
}
}
fclose(fp);
return head;
}
// 打印菜单
void print_menu(DishInfo* head)
{
DishInfo* node = head;
printf("================= Menu =================\n");
while(node != NULL)
{
printf("%s\t%.2f\t%d\n", node->name, node->price, node->num);
node = node->next;
}
printf("=========================================\n");
}
// 查找菜品
DishInfo* find_dish(DishInfo* head, char* name)
{
DishInfo* node = head;
while(node != NULL)
{
if(strcmp(node->name, name) == 0)
{
return node;
}
node = node->next;
}
return NULL;
}
// 点餐
void order(DishInfo* head)
{
print_menu(head);
char name[MAX_LEN];
printf("Enter the dish name: ");
scanf("%s", name);
DishInfo* dish = find_dish(head, name);
if(dish == NULL)
{
printf("Dish not found!\n");
return;
}
int num = 0;
printf("Enter the quantity: ");
scanf("%d", &num);
if(num > dish->num)
{
printf("Not enough dishes, please choose another one or reduce the quantity!\n");
return;
}
dish->num -= num;
printf("Order success!\n");
}
// 修改订单
void modify_order(DishInfo* head)
{
char name[MAX_LEN];
printf("Enter the dish name to be modified: ");
scanf("%s", name);
DishInfo* dish = find_dish(head, name);
if(dish == NULL)
{
printf("Dish not found!\n");
return;
}
int num = 0;
printf("Enter the new quantity: ");
scanf("%d", &num);
if(num > dish->num)
{
printf("Not enough dishes, please choose another one or reduce the quantity!\n");
return;
}
dish->num -= num;
printf("Modify success!\n");
}
// 删除订单
void delete_order(DishInfo* head)
{
char name[MAX_LEN];
printf("Enter the dish name to be deleted: ");
scanf("%s", name);
DishInfo* node = head;
DishInfo* prev = NULL;
while(node != NULL)
{
if(strcmp(node->name, name) == 0)
{
if(prev == NULL)
{
head = node->next;
}
else
{
prev->next = node->next;
}
free(node);
printf("Delete success!\n");
return;
}
prev = node;
node = node->next;
}
printf("Dish not found!\n");
}
// 计算总价
void calculate_total_price(DishInfo* head)
{
float total_price = 0.0f;
DishInfo* node = head;
while(node != NULL)
{
total_price += node->price * node->num;
node = node->next;
}
printf("Total price: %.2f\n", total_price);
}
// 主函数
int main()
{
DishInfo* head = read_dish_info();
// 测试读取菜品信息
/*
DishInfo* node = head;
while(node != NULL)
{
printf("%s\t%.2f\t%d\n", node->name, node->price, node->num);
node = node->next;
}
*/
// 测试点餐
/*
order(head);
print_menu(head);
*/
// 测试修改订单
/*
modify_order(head);
print_menu(head);
*/
// 测试删除订单
/*
delete_order(head);
print_menu(head);
*/
// 测试计算总价
/*
calculate_total_price(head);
*/
int choice = 0;
while(1)
{
printf("=========== Ordering System ============\n");
printf("1. Print menu\n");
printf("2. Order\n");
printf("3. Modify order\n");
printf("4. Delete order\n");
printf("5. Calculate total price\n");
printf("6. Exit\n");
printf("=======================================\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch(choice)
{
case 1:
print_menu(head);
break;
case 2:
order(head);
break;
case 3:
modify_order(head);
break;
case 4:
delete_order(head);
break;
case 5:
calculate_total_price(head);
break;
case 6:
exit(0);
default:
printf("Invalid choice!\n");
break;
}
}
return 0;
}
C语言从文本中读取菜品信息,完成下订单,并随机生成订单号,根据订单号完成查询修改删除操作
这是一道比较复杂的题目,需要多个步骤才能完成。下面是一些可能的实现思路:
1. 从文本文件中读取菜品信息
可以使用标准库函数fopen()和fscanf()来实现。首先打开文件,然后逐行读取文件内容并将每行数据存储到一个结构体中。可以使用一个数组来存储所有菜品的信息。
2. 下订单
可以让用户输入要购买的菜品编号和数量,然后将这些信息添加到一个订单结构体中。可以使用一个链表来存储所有订单。
3. 随机生成订单号
可以使用标准库函数rand()来生成随机数,然后将其转换为字符串格式作为订单号。需要注意的是,每个订单号应该是唯一的,所以可能需要使用时间戳等其他信息来增加随机性。
4. 查询订单
可以让用户输入订单号,然后在订单链表中查找相应的订单并输出相关信息。
5. 修改订单
可以让用户输入订单号和要修改的菜品信息,然后在订单链表中查找相应的订单并更新对应的数据。
6. 删除订单
可以让用户输入订单号,然后在订单链表中查找相应的订单并删除对应的节点。
这些步骤涉及到了很多细节,需要仔细设计和实现。另外,还需要考虑一些异常情况,比如用户输入错误的菜品编号或订单号,文件读取失败等等。
阅读全文
相关推荐















