efferfd 2024-05-26 21:04 采纳率: 50%
浏览 55
已结题

麦当劳点餐系统代码纠错

问题描述
2023年5月,麦当劳在北邮开业。大量的学生去那里订餐。正因为如此,麦当劳的在线点餐系统经常关闭以避免拥挤,尤其是在午餐和晚餐时间。该系统的关闭时间不确定。北邮的学生认为这非常麻烦。
然而,北邮学生无所畏惧。北京邮电大学最优秀的学生之一(也是北邮ICPC团队的一员)Zhai Xie (ThomasX)在飞书上开发了一个实时监控机器人,它告诉我们麦当劳在线点餐系统的实时状态。有了这个机器人,北邮学生可以更方便地点餐。
在这个问题中,需要你像他一样完成这个任务,开发一个系统来模拟麦当劳的在线点餐系统。
北邮的麦当劳和它的点餐系统在开始工作,在关闭。麦当劳一共有种食物和种套餐类型,每种套餐中包含多种食物,具体配置信息将在菜单文件 (dict.dic) 中提供。对于制作和存储每种食物,规定第种食物在秒内完成,其最大存储容量为 ,表示该种食物最多可以存储个。麦当劳系统每天开放前,所有食物存储容量都为0,在任何时间点如果某种食物的存储量小于,则会立即制作该食物,直到达到。其中,不同种类食物可以同时制作,同种类食物只能依次制作。
从到(含),学生可以在系统中点餐(如果系统未关闭)。每一天按照顺序有个订单,第个订单发生在时间::,其要求一份类型(,其中和分别表示全体的套餐和食物的集合)的套餐或食物。如果点餐时系统关闭,会导致点餐失败。22:00以后如果还有之前的订单未完成,则麦当劳会继续加班,且保证23:59:59(含)前一定能完成所有订单。
对于订单处理存在如下规则:
•在每一秒的开始,如果有新的食物完成,则首先存储食物,然后接受订单(如果存在)。
•订单按照“先来先到,异步处理”原则进行处理。
–先来先到:指的是对于有存量的食物,总会被分配给时间最早的订单(套餐或单点)。
–异步处理:指的是当一个订单(套餐或单点)因为请求的食物没有被全部满足时,不必等待该订单完成,可以直接处理下一个订单。
•食物一旦被分配给订单,就不能撤销。食物被分配给订单后,即便该订单尚未完成,该食物也不再占用对应类型的容量。
•当订单(套餐或单点)中要求的所有食物,均已被分配给该订单,则该订单会立刻完成。
•如果在某个时刻,有人下了一个订单,并且该订单无法立刻完成,导致未完成订单的数量大于,则系统立即自动关闭(不再接受订单),但该订单仍然算作成功下单。
•如果在某个时刻,未完成订单的数量小于,则系统将在1秒后重新打开。即系统可以接受时刻的订单,而不能接受时刻的订单。
你的系统需要输出:每一个订单是否下单成功,以及完成的时间。
菜单文件
本题为大家提供麦当劳的菜单文件(dict.dic),按如下格式给出:
第一行给出和,其中表示食物的种类数(),表示套餐的种类数()。
第二行包含个字符串,每个字符串 表示第种食物的名称(不超过50个字符)。
第三行包含个整数(),其中表示第种食物的制作时长。
第四行包含个整数(),其中表示第种食物的最大存储容量。
第五行包含两个整数()。
接下来行,其中的第行包含多个字符串,第一个字符串表示第个套餐的名称(不超过50个字符),后续的第个字符串表示第个套餐中包含的第种食物的名称。一个套餐包含的食物种类不超过5,每种食物只有1个。
注:系统每次运行时所读取的菜单文件内容可能不一样。
输入
第一行包含一个整数()表示订单个数。
对于接下来的行,用格式类似于的方式,给出第个订单的时间。然后输入一个字符串,表示套餐或食物的名称(参见dict.dic)。所有订单时间一定在内,同一个时间点不可能出现多个订单,第个订单一定早于第个(),且保证23:59:59(含)前一定能完成所有订单。
具体参见input.txt
输出
输出包括行,按照订单顺序输出订单完成时间。对于第行,如果第个订单不成功,则输出Fail;否则,输出这个订单完成的时间,时间格式与输入格式()一致。
具体参见output.txt

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_FOODS 50
#define MAX_ORDERS 1000
#define MAX_TIME 86400 // 24小时,以秒为单位

int num_foods, num_meals, open_threshold, close_threshold;
char food_names[MAX_FOODS][50];
int production_time[MAX_FOODS];
int storage_capacity[MAX_FOODS];
int current_storage[MAX_FOODS];
int is_food_being_made[MAX_FOODS];  // 正在制作的食物计时
int system_closed = 0;

typedef struct {
    char time[9];   // 订单时间
    char type[50];  // 订单类型(套餐或单点)
    int status;     // 订单状态:0-未处理,1-完成,-1-失败
} Order;

Order orders[MAX_ORDERS];
int num_orders;
int num_uncompleted_orders = 0;

// 更新食物制作状态
void update_food_production() {
    for (int i = 0; i < num_foods; i++) {
        if (is_food_being_made[i] > 0) {
            is_food_being_made[i]--;
            if (is_food_being_made[i] == 0) {
                // 完成食物制作,更新库存
                current_storage[i]++;
            }
        } else if (current_storage[i] < storage_capacity[i]) {
            // 开始新的食物制作
            is_food_being_made[i] = production_time[i];
        }
    }
}

// 检查订单是否可以被完成
void check_and_process_orders() {
    for (int i = 0; i < num_orders; i++) {
        if (orders[i].status == 0) {
            // 假设订单需要的食物只有1种,数量1个(简化处理)
            for (int j = 0; j < num_foods; j++) {
                if (strcmp(orders[i].type, food_names[j]) == 0 && current_storage[j] > 0) {
                    current_storage[j]--;
                    orders[i].status = 1;
                    num_uncompleted_orders--;
                    break;
                }
            }
        }
    }
}

// 模拟每一秒的系统运行
void simulate_second() {
    if (!system_closed) {
        update_food_production();
        check_and_process_orders();
    }

    // 检查是否需要关闭系统
    if (num_uncompleted_orders > close_threshold) {
        system_closed = 1;
    }

    // 检查是否需要重新打开系统
    if (system_closed && num_uncompleted_orders < open_threshold) {
        system_closed = 0;
    }
}

int main() {
    // 读取菜单文件和订单文件的逻辑省略,模拟中直接给定值
    FILE *menuFile = fopen("dict.dic", "r");
    FILE *orderFile = fopen("input.txt", "r");

    // 读取食物信息和套餐配置
    fscanf(menuFile, "%d %d", &num_foods, &num_meals);
    for (int i = 0; i < num_foods; i++) {
        fscanf(menuFile, "%s %d %d", food_names[i], &production_time[i], &storage_capacity[i]);
        current_storage[i] = 0;
    }

    // 读取订单信息
    fscanf(orderFile, "%d", &num_orders);
    for (int i = 0; i < num_orders; i++) {
        fscanf(orderFile, "%s %s", orders[i].time, orders[i].type);
        orders[i].status = 0; // 初始化为未处理状态
    }

    // 模拟每一秒的系统运行,直到所有订单处理完毕或达到一天的时限
    int seconds = 0;
    while (seconds < MAX_TIME && num_uncompleted_orders > 0) {
        simulate_second();
        seconds++;
    }

    // 输出订单完成情况
    for (int i = 0; i < num_orders; i++) {
        if (orders[i].status == 1) {
            printf("%s\n", orders[i].time);
        } else {
            printf("Fail\n");
        }
    }

    fclose(menuFile);
    fclose(orderFile);
    return 0;
}
  • 写回答

24条回答 默认 最新

  • 檀越@新空间 2024-05-26 21:04
    关注
    获得0.50元问题酬金

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    序File, "%s", &food_names[i]);

    // 初始化数据结构和变量
    scanf("%d %d", &open_threshold, &close_threshold);
    
    // 开始模拟
    simulate_second();
    
    // 打印结果
    printf("Order Status: ");
    for (int i = 0; i < num_orders; i++) {
        if (orders[i].status == 1) {
            printf("%d ", orders[i].time);
        } else {
            printf("- %d ", orders[i].time);
        }
    }
    printf("\nUncompleted Orders: %d\n", num_uncompleted_orders);
    
    fclose(menuFile);
    fclose(orderFile);
    
    return 0;
    

    }

    
    这是一个基于C语言编写的在线点餐系统模拟。模拟中,我们使用了动态规划的方法来解决实际问题。我们的目标是确保用户能够轻松地通过点餐系统点餐,同时也能知道他们的订单是否已经成功完成。
    
    我们使用了Python的set和list数据结构来保存食物、套餐和食物的集合。我们将食物分为两种类型:50个元素的套餐和不超过5个元素的食物。我们还定义了一些额外的变量来记录正在制作的食物和已知的订单。
    
    在模拟每一秒的时候,我们首先检查系统是否关闭。如果是,我们会重新打开系统。然后,我们更新食物的生产状态,并检查是否可以将未完成的订单添加到系统中。最后,我们打印出当前的状态,以及所有的未完成订单的数量。
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 创建了问题 5月26日