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

为什么我的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()

关键修复点说明

  1. 类型统一:将prompt获取的输入统一转换为Number类型,确保和数组中的数字类型匹配,替换原有的valor === i为includes方法更简洁高效。
  2. 调整主菜单调用时机:将menuPrincipal()移到addMoedas函数的最后,确保硬币添加逻辑执行完成后再回到主菜单。
  3. 修复删除逻辑:使用indexOf找到要删除元素的索引,再用splice方法从数组中删除,实现正确的删除功能。
  4. 增加边界处理:添加金库为空时的提示,避免无意义的操作。
  5. 优化菜单逻辑:用switch替代多层if-else,代码更清晰易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:27:29