题解 | #自动售货系统#
自动售货系统
https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 商品
const goods = [
{name: 'A1', price: 2, num: 0},
{name: 'A2', price: 3, num: 0},
{name: 'A3', price: 4, num: 0},
{name: 'A4', price: 5, num: 0},
{name: 'A5', price: 8, num: 0},
{name: 'A6', price: 6, num: 0},
]
// 钱
const moneyBox = [
{value: '1', num: 0},
{value: '2', num: 0},
{value: '5', num: 0},
{value: '10', num: 0},
]
let totalMoney = 0
rl.on('line', function (line) {
const data = line.split(';').filter(item=>item)
data.forEach(item=>{
const tempArr = item.split(' ')
const key = tempArr[0]
switch(key) {
//初始化
case 'r':
const goodsNum = tempArr[1].split('-')
const moneyNum = tempArr[2].split('-')
goodsNum.map((item, index)=>{
goods[index].num = item
})
moneyNum.map((item, index)=>{
moneyBox[index].num = item
})
console.log('S001:Initialization is successful')
break
//投币
case 'p':
const moneyValue = Number(tempArr[1])
if(![1, 2, 5, 10].includes(moneyValue)) {
console.log('E002:Denomination error')
} else if ((calc1and2()<moneyValue) && ![1,2].includes(moneyValue)) {
console.log('E003:Change is not enough, pay fail')
} else if(calcGoodsTotalNum()==0) {
console.log('E005:All the goods sold out')
} else {
moneyBox.forEach(item=>{
if(+item.value==moneyValue) {
item.num++
}
})
totalMoney+=moneyValue
console.log(`S002:Pay success,balance=${totalMoney}`)
}
break
//购买商品
case 'b':
const goodsName = tempArr[1]
if(!goods.map(item=>item.name).includes(goodsName)) {
console.log('E006:Goods does not exist')
} else if(findNowGoods(goodsName).num==0) {
console.log('E007:The goods sold out')
} else if(totalMoney<findNowGoods(goodsName).price) {
console.log('E008:Lack of balance')
} else {
totalMoney-=findNowGoods(goodsName).price
findNowGoods(goodsName).num--
console.log(`S003:Buy success,balance=${totalMoney}`)
}
break
//退币
case 'c':
if(totalMoney==0) {
console.log('E009:Work failure')
} else if(totalMoney>0) {
const res = countMoney(totalMoney)
updateMoneyBox(res)
for(let k in res) {
console.log(`${k} yuan coin number=${res[k]}`)
}
totalMoney = 0
}
break
//查询类别
case 'q':
const num = tempArr[1]
// 商品0 存钱盒1
if(num==0) {
goods.forEach(item=>{
console.log(`${item.name} ${item.price} ${item.num}`)
})
} else if(num==1) {
moneyBox.forEach(item=>{
console.log(`${item.value} yuan coin number=${item.num}`)
})
} else {
console.log('E010:Parameter error')
}
break
default:
console.log('E010:Parameter error')
}
})
});
// 计算1和2元钱币总和
function calc1and2() {
const money1 = moneyBox[0]
const money2 = moneyBox[1]
return +money1.value * money1.num + +money2.value * money2.num
}
// 计算商品总数量
function calcGoodsTotalNum() {
let total = 0
goods.map(item=>{
total+=item.num
})
return total
}
// 找出当前商品
function findNowGoods(name) {
return goods.filter(item=>name==item.name)[0]
}
// 找零钱
function countMoney(num) {
let res = {
'1': 0,
'2': 0,
'5': 0,
'10': 0,
}
const c10 = Math.floor(num/10)
if(moneyBox.filter(item=>item.value=='10')[0].num>=c10) {
res['10'] = c10
} else {
res['10'] = moneyBox.filter(item=>item.value=='10')[0].num
}
num = num - res['10']*10
const c5 = Math.floor(num/5)
if(moneyBox.filter(item=>item.value=='5')[0].num>=c5) {
res['5'] = c5
} else {
res['5'] = moneyBox.filter(item=>item.value=='5')[0].num
}
num = num - res['5']*5
const c2 = Math.floor(num/2)
if(moneyBox.filter(item=>item.value=='2')[0].num>=c2) {
res['2'] = c2
} else {
res['2'] = moneyBox.filter(item=>item.value=='2')[0].num
}
num = num - res['2']*2
const c1 = num
if(moneyBox.filter(item=>item.value=='1')[0].num>=c1) {
res['1'] = c1
} else {
res['1'] = moneyBox.filter(item=>item.value=='1')[0].num
}
return res
}
//更新盒子钱数
function updateMoneyBox(res) {
for(let k in res) {
switch(k) {
case '1':
moneyBox[0].num-=res[k]
break
case '2':
moneyBox[1].num-=res[k]
break
case '5':
moneyBox[2].num-=res[k]
break
case '10':
moneyBox[3].num-=res[k]
break
}
}
}
查看14道真题和解析
上海得物信息集团有限公司公司福利 1263人发布