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

Java循环中如何正确更新总和?硬币统计程序求和异常求助

Java硬币统计程序总枚数累加错误修正

问题说明

练习需求:实现程序让用户输入硬币类型(500/100/50/10日元)和数量,统计钱包中硬币的总枚数与总金额。
当前问题:总金额计算已正常,但总枚数在第二次循环后累加结果错误,尝试sum += sum + i的方式导致总和翻倍。

错误原因分析

  1. 变量命名混淆:代码中kindSum用于存储总金额、amountSum用于存储总枚数,命名与用途完全不符,增加逻辑出错概率。
  2. 总枚数计算逻辑错误:循环内amountSum = amountInput + totalCoin + myMoney.getCount(kindInput)的逻辑完全错误:
    • totalCoin是初始总枚数,每次循环重复累加会导致重复计算初始值
    • myMoney.getCount(kindInput)是当前类型硬币的总数,已经包含了本次输入的数量,再次累加会重复计算
  3. 总金额计算逻辑冗余:kindSum = kindInput + myMoney.getAmount() + myMoney.addCoins(kindInput, amountInput)中,kindInput是硬币类型(如500),直接加到总金额里完全错误,且addCoins方法返回0,无实际作用。

修正方案

  1. 修正变量命名:使用直观的变量名,如totalCount(总枚数)、totalAmount(总金额)。
  2. 总枚数正确计算方式:
    • 初始化时,totalCount直接取初始总枚数
    • 每次循环只需将本次输入的amountInput累加到totalCount;或者更可靠的方式:每次重新计算所有硬币的总数(通过myMoney.getCount()方法求和),避免累加误差。
  3. 总金额正确计算方式:每次调用myMoney.getAmount()即可,因为addCoins方法已经更新了钱包内的硬币数量,getAmount()会自动计算最新总金额。
  4. 移除错误逻辑:删除循环内错误的累加表达式,简化计算逻辑。

修正后的代码片段

// 修正变量命名
int totalAmount = 0; // 总金额
int totalCount = totalCoin; // 初始总枚数

// 循环提问10次
for (int count = 1; count <= 10; count++) {
    // 输入硬币类型
    System.out.println(count + "次。请输入硬币类型。");
    int kindInput = inputScanner.nextInt();
    // 输入硬币数量
    System.out.println(count + "次。请输入硬币数量。");
    int amountInput = inputScanner.nextInt();

    // 先更新钱包内的硬币数量
    myMoney.addCoins(kindInput, amountInput);
    // 重新计算总枚数(可靠方式,避免累加错误)
    totalCount = myMoney.getCount(500) + myMoney.getCount(100) + myMoney.getCount(50) + myMoney.getCount(10);
    // 获取最新总金额
    totalAmount = myMoney.getAmount();

    // 每次输入后显示合计
    System.out.println("硬币总枚数为" + totalCount + "枚,总金额为" + totalAmount);
}

完整修正代码

import java.util.Scanner;

class ManageCoin {
    // 硬币种类对应的数量
    int yen500 = 0;
    int yen100 = 0;
    int yen50 = 0;
    int yen10 = 0;

    // 通过addCoins方法增减硬币数量,参数为硬币类型和数量
    public void addCoins(int kind, int count) { // 改为void,因为不需要返回值
        // 判断硬币类型
        switch (kind) {
            case 500:
                yen500 += count;
                break;
            case 100:
                yen100 += count;
                break;
            case 50:
                yen50 += count;
                break;
            case 10:
                yen10 += count;
                break;
            default:
                System.out.println("无效的硬币类型,请输入500/100/50/10");
        }
    }

    // 通过getCount方法获取对应类型硬币的数量,参数为硬币类型
    public int getCount(int kind) {
        switch(kind) {
            case 500:
                return yen500;
            case 100:
                return yen100;
            case 50:
                return yen50;
            case 10:
                return yen10;
            default:
                return 0;
        }
    }

    // 通过getAmount方法获取硬币总金额,无参数
    public int getAmount() {
        return (yen500 * 500) + (yen100 * 100) + (yen50 * 50) + (yen10 * 10);
    }
}

public class CoinManager {
    public static void main(String[] args) {
        ManageCoin myMoney = new ManageCoin();

        // 初始化钱包中的硬币数量
        myMoney.yen500 = 1;
        myMoney.yen100 = 4;
        myMoney.yen50 = 1;
        myMoney.yen10 = 4;

        // 计算并显示初始硬币总枚数和总金额
        int totalCoin = myMoney.getCount(500) + myMoney.getCount(100) + myMoney.getCount(50) + myMoney.getCount(10);
        System.out.println("初始化的硬币总枚数为" + totalCoin + "枚,总金额为" + myMoney.getAmount() + "日元。");

        // 创建输入扫描器
        Scanner inputScanner = new Scanner(System.in);
        // 输入提示
        System.out.println("请从500日元、100日元、50日元、10日元中选择,");
        System.out.println("输入硬币类型和数量,共输入10次。");
        System.out.println("也可以增减硬币数量。");
        System.out.println();

        // 初始化总金额和总枚数
        int totalAmount = myMoney.getAmount();
        int totalCount = totalCoin;

        // 循环提问10次
        for (int count = 1; count <= 10; count++) {
            // 输入硬币类型
            System.out.println(count + "次。请输入硬币类型。");
            int kindInput = inputScanner.nextInt();
            // 输入硬币数量
            System.out.println(count + "次。请输入硬币数量。");
            int amountInput = inputScanner.nextInt();

            // 更新钱包硬币数量
            myMoney.addCoins(kindInput, amountInput);
            // 重新计算总枚数和总金额
            totalCount = myMoney.getCount(500) + myMoney.getCount(100) + myMoney.getCount(50) + myMoney.getCount(10);
            totalAmount = myMoney.getAmount();

            // 每次输入后显示合计
            System.out.println("硬币总枚数为" + totalCount + "枚,总金额为" + totalAmount);
        }

        // 显示最终合计
        System.out.println("\n最终硬币总枚数为" + totalCount + "枚,总金额为" + totalAmount + "日元。");
        inputScanner.close();
    }
}

额外优化点

  • 将addCoins方法返回值改为void,因为原方法返回0无实际意义,简化逻辑
  • 增加无效硬币类型的提示,提升用户体验
  • 关闭Scanner资源,避免资源泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:15:35