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

C++中do/while循环无法多次输入amount问题求助

问题修复与优化建议

核心问题分析

你的代码存在两个关键逻辑错误,导致无法持续插入硬币:

  1. do-while循环逻辑错误:循环内仅执行amount += amount(将当前硬币金额翻倍),没有读取新的硬币输入,也没有累计总金额。如果首次输入非0值,会陷入无限循环;如果首次输入0,直接退出循环。
  2. 无效输入处理不彻底:无论是商品ID还是硬币输入,仅做了一次错误重试,若用户再次输入无效值,程序不会继续处理。

修复后的代码

#include <iostream>
using namespace std; 

int main() {
    int productid;
    int total = 0; // 用于累计用户插入的总金额
    int amount;

    // 商品选择:循环处理无效输入
    cout << "Welcome to the coffee machine! We have a variety of beverages we can offer. \n"
         << "Here is our selection: \n"
         << "1) Coffee- 50 cents \n"
         << "2) Tea- 60 cents \n"
         << "3) Cappuccino- 80 cents\n";
    
    do {
        cout << "Please select your drink of choice by entering its ID: (1, 2, or 3): ";
        cin >> productid;
        if (productid != 1 && productid != 2 && productid != 3) {
            cout << "That is an invalid entry; please try again. \n";
        }
    } while (productid != 1 && productid != 2 && productid != 3);

    // 硬币插入:循环处理直到输入0
    cout << "\nPlease insert your coins. \n"
         << "This vending machine only accepts 50 cent coins, 20 cent coins, and 10 cent coins. \n"
         << "When finished, please input '0'. \n";
    
    do {
        cout << "Insert coin: ";
        cin >> amount;
        // 处理无效硬币
        if (amount != 50 && amount != 20 && amount != 10 && amount != 0) {
            cout << "That is an invalid coin; please insert a valid one.\n";
            continue; // 跳过本次循环,重新输入
        }
        // 累计有效硬币金额(0不累计)
        if (amount != 0) {
            total += amount;
            cout << "Current total: " << total << " cents\n";
        }
    } while (amount != 0);

    // 金额校验与出货逻辑
    cout << "\nTotal inserted: " << total << " cents\n";
    int price;
    switch(productid) {
        case 1: price = 50; break;
        case 2: price = 60; break;
        case 3: price = 80; break;
        default: price = 0; // 理论上不会走到这里
    }

    if (total >= price) {
        cout << "Dispensing your drink! Change: " << total - price << " cents\n";
    } else {
        cout << "Insufficient funds. You need " << price - total << " more cents.\n";
        // 可扩展:允许用户继续投币或选择退款
    }

    return 0;
}

关键修复点

  • 新增total变量累计用户插入的总金额,避免覆盖单次硬币输入值。
  • 重构do-while循环:每次循环读取新的硬币输入,判断有效性后再累计金额,直到输入0退出。
  • 商品选择改为循环校验,确保用户输入有效ID后才进入投币环节。
  • 补充了金额校验、找零和出货的基础逻辑框架。

后续开发建议

  • 退款功能:如果用户中途放弃购买或金额不足,实现退还已插入硬币的逻辑。
  • 智能找零:细化找零算法,优先使用大面值硬币(比如找30分时用20+10,而非三个10分)。
  • 库存管理:为每种商品添加库存计数,出货后减少对应库存,库存不足时提示用户。
  • 异常输入处理:处理用户输入非数字的情况(比如输入字母),避免程序崩溃,可结合cin.fail()、cin.clear()和cin.ignore()实现。
  • 循环购买:允许用户在购买完成后选择继续购买或退出,提升交互体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:40:41