为什么我的addMoedas()函数无法向金库(cofre)添加硬币?
Node.js硬币管理程序问题排查与修复
核心问题分析
1. 条件判断valor === i的错误
prompt()返回的是字符串类型,而moedasAceitas数组中的元素是数字类型,严格相等运算符===会同时比较值和类型,因此valor === i永远不会成立,导致硬币无法添加到cofre数组中。
2. 循环内错误调用主菜单
在addMoedas的for循环中,每次迭代都会调用menuPrincipal(),导致还未完成硬币添加逻辑就直接回到主菜单,后续代码无法执行。
3. 其他函数的逻辑问题
deleteMoeda函数的删除逻辑完全错误:delete apagar[j]操作的是输入的字符串,而非cofre数组,无法实现删除硬币的功能。menuPrincipal中未处理非有效数字输入,比如输入字母或超出范围的数字时没有提示。
修复后的完整代码
// 金库(存储硬币的数组) const cofre = [] // Node.js的npm包prompt-sync,用于获取用户输入 const prompt = require('prompt-sync')() const menuPrincipal = () => { console.log('\n=== 硬币管理菜单 ===') console.log('1 - 添加硬币') console.log('2 - 删除硬币') console.log('3 - 查看所有硬币') console.log('4 - 计算总金额') const opcao = Number(prompt('请选择操作选项: ')) if (opcao >= 1 && opcao <= 4) { switch(opcao) { case 1: addMoedas() break case 2: deleteMoeda() break case 3: suasReservas() break case 4: valorTotal() break } } else { console.log('无效选项,请重新选择!') menuPrincipal() } } const addMoedas = () => { // 仅允许的硬币面值 const moedasAceitas = [5, 10, 25, 50, 100] console.log('\n=== 选择货币类型 ===') console.log('1 - 雷亚尔') console.log('2 - 美元') console.log('3 - 欧元') const currency = Number(prompt('请选择货币类型: ')) const valor = Number(prompt('请输入硬币面值(仅支持5/10/25/50/100): ')) // 检查面值是否合法 const valorValido = moedasAceitas.includes(valor) if (!valorValido) { console.log('无效的硬币面值!') menuPrincipal() return } // 根据货币类型转换并添加到金库 let valorAdicionado switch (currency) { case 1: valorAdicionado = valor console.log(`已添加 R$${valorAdicionado} 分至金库。`) break case 2: valorAdicionado = valor * 5 console.log(`已添加 $${valorAdicionado} 分至金库。`) break case 3: valorAdicionado = valor * 6 console.log(`已添加 €${valorAdicionado} 分至金库。`) break default: console.log('无效的货币类型!') menuPrincipal() return } cofre.push(valorAdicionado) menuPrincipal() } // 从金库中删除硬币的函数 const deleteMoeda = () => { if (cofre.length === 0) { console.log('金库为空,无需删除!') menuPrincipal() return } console.log(`当前金库硬币: ${cofre.join(', ')}`) const valorApagar = Number(prompt('请输入要删除的硬币面值: ')) const index = cofre.indexOf(valorApagar) if (index === -1) { console.log('金库中不存在该面值的硬币!') } else { cofre.splice(index, 1) console.log(`已删除面值为 ${valorApagar} 的硬币。`) } menuPrincipal() } // 展示金库中所有硬币的函数 const suasReservas = () => { if (cofre.length === 0) { console.log('金库为空!') } else { console.log('金库中的硬币:') console.log(cofre.join(', ')) } menuPrincipal() } // 计算总金额的函数 const valorTotal = () => { if (cofre.length === 0) { console.log('金库为空,总金额为0!') } else { const total = cofre.reduce((a, b) => a + b, 0) console.log(`金库总金额: ${total} 分`) } menuPrincipal() } menuPrincipal()
关键修复点说明
- 类型统一:将
prompt获取的输入统一转换为Number类型,确保和数组中的数字类型匹配,替换原有的valor === i为includes方法更简洁高效。 - 调整主菜单调用时机:将
menuPrincipal()移到addMoedas函数的最后,确保硬币添加逻辑执行完成后再回到主菜单。 - 修复删除逻辑:使用
indexOf找到要删除元素的索引,再用splice方法从数组中删除,实现正确的删除功能。 - 增加边界处理:添加金库为空时的提示,避免无意义的操作。
- 优化菜单逻辑:用
switch替代多层if-else,代码更清晰易读。
内容的提问来源于stack exchange,提问作者Arthur Bailon
相关产品推荐
相关产品推荐

