Java循环中如何正确更新总和?硬币统计程序求和异常求助
Java硬币统计程序总枚数累加错误修正
问题说明
练习需求:实现程序让用户输入硬币类型(500/100/50/10日元)和数量,统计钱包中硬币的总枚数与总金额。
当前问题:总金额计算已正常,但总枚数在第二次循环后累加结果错误,尝试sum += sum + i的方式导致总和翻倍。
错误原因分析
- 变量命名混淆:代码中
kindSum用于存储总金额、amountSum用于存储总枚数,命名与用途完全不符,增加逻辑出错概率。 - 总枚数计算逻辑错误:循环内
amountSum = amountInput + totalCoin + myMoney.getCount(kindInput)的逻辑完全错误:totalCoin是初始总枚数,每次循环重复累加会导致重复计算初始值myMoney.getCount(kindInput)是当前类型硬币的总数,已经包含了本次输入的数量,再次累加会重复计算
- 总金额计算逻辑冗余:
kindSum = kindInput + myMoney.getAmount() + myMoney.addCoins(kindInput, amountInput)中,kindInput是硬币类型(如500),直接加到总金额里完全错误,且addCoins方法返回0,无实际作用。
修正方案
- 修正变量命名:使用直观的变量名,如
totalCount(总枚数)、totalAmount(总金额)。 - 总枚数正确计算方式:
- 初始化时,
totalCount直接取初始总枚数 - 每次循环只需将本次输入的
amountInput累加到totalCount;或者更可靠的方式:每次重新计算所有硬币的总数(通过myMoney.getCount()方法求和),避免累加误差。
- 初始化时,
- 总金额正确计算方式:每次调用
myMoney.getAmount()即可,因为addCoins方法已经更新了钱包内的硬币数量,getAmount()会自动计算最新总金额。 - 移除错误逻辑:删除循环内错误的累加表达式,简化计算逻辑。
修正后的代码片段
// 修正变量命名 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
相关产品推荐
相关产品推荐

