You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++餐食生成器逻辑异常求助:意面类多选及餐量规则不符

餐食生成器代码问题排查与修复方案

核心规则回顾

先明确必须严格遵守的规则,作为排查基准:

  • 意面类餐食(Pesto/Spaghetti/Tortellini)最多仅能选1种,且计为2餐
  • 无意义面时输出4餐(全非意面);选中1种意面时输出3餐(1意面+2非意面)
  • 意面类餐食绝对不能出现在第4餐位(仅当代码误生成4餐且混入意面时需拦截)

问题排查方向

1. 意面类互斥逻辑缺失

出现多种意面同时选中的核心原因是代码未实现意面互斥选择:

  • 检查mealSelector.cpp中是否有统一的意面集合定义,比如:
    const std::vector<std::string> PASTA_LIST = {"Pesto", "Spaghetti", "Tortellini"};
    
  • 确认选中任意一种意面后,是否立即排除另外两种意面的候选资格,避免重复选中。

2. 餐单总餐数计算错误

意面出现在第4位、总餐数超标,本质是餐数逻辑未根据是否选中意面动态调整:

  • 错误逻辑:固定生成4餐,导致选中意面时总餐数变为1意面+3非意面(违反1意面+2非意面的规则)
  • 正确逻辑:先决定是否选意面,再对应设置总餐数:
    • 选意面→总餐数设为3
    • 不选意面→总餐数设为4

3. 意面位置未做限制

若代码误在4餐模式下混入意面,需额外拦截意面出现在第4位的情况;若在3餐模式下,需确保意面不会被错误放到不存在的第4位(本质是餐数逻辑错误导致)。


代码修复示例

1. mealSelector.h 定义基础结构

#ifndef MEALSELECTOR_H
#define MEALSELECTOR_H

#include <vector>
#include <string>

class MealSelector {
private:
    const std::vector<std::string> PASTA_MEALS = {"Pesto", "Spaghetti", "Tortellini"};
    std::vector<std::string> non_pasta_meals;
public:
    MealSelector();
    std::vector<std::string> generate_plan();
    bool is_pasta(const std::string& meal);
};

#endif

2. mealSelector.cpp 实现核心逻辑

#include "mealSelector.h"
#include <random>
#include <algorithm>
#include <cassert>

MealSelector::MealSelector() {
    // 初始化非意面餐食列表
    non_pasta_meals = {"Grilled Chicken", "Caesar Salad", "Baked Fish", "Vegetable Soup", "Beef Stir Fry"};
}

bool MealSelector::is_pasta(const std::string& meal) {
    return std::find(PASTA_MEALS.begin(), PASTA_MEALS.end(), meal) != PASTA_MEALS.end();
}

std::vector<std::string> MealSelector::generate_plan() {
    std::vector<std::string> plan;
    std::random_device rd;
    std::mt19937 gen(rd());

    // 随机决定是否包含意面(可自定义概率)
    bool include_pasta = std::uniform_int_distribution<>(0, 1)(gen) == 1;

    if (include_pasta) {
        // 随机选1种意面
        std::uniform_int_distribution<> pasta_idx(0, PASTA_MEALS.size()-1);
        std::string selected_pasta = PASTA_MEALS[pasta_idx(gen)];
        plan.push_back(selected_pasta);

        // 随机选2种不重复的非意面
        std::shuffle(non_pasta_meals.begin(), non_pasta_meals.end(), gen);
        for (int i = 0; i < 2; ++i) {
            plan.push_back(non_pasta_meals[i]);
        }

        // 打乱餐单顺序(可选)
        std::shuffle(plan.begin(), plan.end(), gen);
    } else {
        // 随机选4种不重复的非意面
        std::shuffle(non_pasta_meals.begin(), non_pasta_meals.end(), gen);
        for (int i = 0; i < 4; ++i) {
            plan.push_back(non_pasta_meals[i]);
        }
    }

    // 调试断言:强制校验规则
    int pasta_count = 0;
    for (const auto& meal : plan) {
        if (is_pasta(meal)) pasta_count++;
    }
    assert(pasta_count <= 1);
    assert((pasta_count == 0 && plan.size() == 4) || (pasta_count == 1 && plan.size() == 3));
    if (plan.size() == 4) assert(!is_pasta(plan[3]));

    return plan;
}

3. main.cpp 调用输出

#include "mealSelector.h"
#include <iostream>

int main() {
    MealSelector selector;
    std::vector<std::string> meal_plan = selector.generate_plan();

    std::cout << "餐单结果:" << std::endl;
    for (size_t i = 0; i < meal_plan.size(); ++i) {
        std::cout << "第" << (i+1) << "餐:" << meal_plan[i] << std::endl;
    }

    return 0;
}

调试验证步骤

  1. 强制边界测试:手动设置include_pasta = true或false,多次运行确认:
    • 选意面时仅出现1种意面,总餐数3
    • 不选意面时总餐数4,无任何意面
  2. 打印中间变量:在选中餐食的步骤添加打印,排查是否出现重复选中意面的情况
  3. 启用断言:代码中已添加断言,运行时若触发断言直接定位规则违反点

内容的提问来源于stack exchange,提问作者monki_mayn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:21:17