模拟实现简单的自动售货系统
题目描述
1 总体说明
考生需要模拟实现一个简单的自动售货系统,实现投币、购买商品、退币、查询库存商品及存钱盒信息的功能。
系统初始化时自动售货机中商品为6种商品,商品的单价参见1.1规格说明,存钱盒内放置1元、2元、5元、10元钱币,商品数量和钱币张数通过初始化命令设置,参见2.1 系统初始化。
1.1规格说明
1. 商品:每种商品包含商品名称、单价、数量三种属性,其中商品名不重复。考生不能修改商品名称和单价,初始化命令设置商品数量。这些信息在考试框架中进行定义,考生在实现功能代码时可直接使用。
商品 名称 |
单价 |
数量 |
A1 | 2 | X |
A2 | 3 | X |
A3 | 4 | X |
A4 | 5 | X |
A5 | 8 | X |
A6 | 6 | X |
2. 存钱盒信息:钱币面额、张数两种属性。初始化命令设置各种面额钱币张数。这些信息在考试框架中进行定义,考生在实现功能代码时可直接使用。
钱币面额 |
张数 |
10元 |
X |
5元 |
X |
2元 | X |
1元 | X |
3. 退币原则 :
1) 根据系统存钱盒内钱币的 信息 ,按钱币总张数最少的原则进行退币。
2) 如果因零钱不足导致不能退币,则尽最大可能退币,以减少用户损失。
例如:假设存钱盒内只有4张2元,无其它面额钱币。如果需要退币7元,系统因零钱不足无法退币,则继续尝试退币6元,最终系统成功退币3张2元,用户损失1元钱币。
4. 投币操作说明:每次投币成功,投入的钱币面额累加到投币余额;同时,本次投入的钱币放入存钱盒中,存钱盒相应面额钱币增加。
5. 投币余额:指当前自动售货机中用户剩余的可购买商品的钱币总额;例如:投入2元面额的钱币,投币余额增加2元;购买一件价格2元的商品,投币余额减少2元;
6. 投币余额约束:投币余额不能超过10元。
7. 退币操作说明:退币操作需要遵守 退币原则 ;退币成功后,投币余额清零,同时扣除存钱盒相应的金额。
8. 购买商品操作说明:一次仅允许购买一件商品;购买商品成功后,自动售货机中对应商品数量减1,投币余额扣除本次购买商品的价格。
2 操作说明
命令字与第一个参数间使用一个空格分隔,多条命令采用分号隔开。考试系统会对输入命令格式进行处理,考生不需要关注输入命令格式的合法性,只需要实现命令处理函数。
2.1 系统初始化
命令格式:
r A1 数量 -A2 数量 -A3 数量 -A4 数量 -A5 数量 -A6 数量 1 元张数 -2 元张数 -5 元张数 -10 元张数
参数名称 |
参数说明 |
类型 |
取值范围 |
A1数量 |
商品A1数量 |
整数 |
[0,10] |
A2数量 |
商品A2数量 |
整数 |
[0,10] |
A3数量 |
商品A3数量 |
整数 |
[0,10] |
A4数量 |
商品A4数量 |
整数 |
[0,10] |
A5数量 |
商品A5数量 |
整数 |
[0,10] |
A6数量 |
商品A6数量 |
整数 |
[0,10] |
1元张数 |
面额1元钱币张数 |
整数 |
[0,10] |
2元张数 |
面额2元钱币张数 |
整数 |
[0,10] |
5元张数 |
面额5元钱币张数 |
整数 |
[0,10] |
10元张数 |
面额10元钱币张数 |
整数 |
[0,10] |
商品和各种面额钱币取值范围只是作为初始化命令的限制,其它场景下不限制取值范围;考试框架已经实现取值范围的检查,考生不需要关注。
功能说明:设置自动售货机中商品数量和存钱盒各种面额的钱币张数;
约束说明:系统在任意阶段均可执行r初始化系统;考生不需要关注参数的合法性,不需要关注增加或缺少参数的场景;
输出说明:输出操作成功提示(执行完r命令后系统会自动输出操作结果,考生不需要再次调用输出函数),例:
命令 | 输出 | 含义 |
r 6-5-4-3-2-1 4-3-2-1; | S001:Initialization is successful | 初始化成功 |
2.2 投币
命令格式:p 钱币面额
功能说明:
(1) 如果投入非1元、2元、5元、10元的钱币面额(钱币面额不考虑负数、字符等非正整数的情况),输出“E002:Denomination error”;
(2) 如果存钱盒中1元和2元面额钱币总额小于本次投入的钱币面额,输出“E003:Change is not enough, pay fail”,但投入1元和2元面额钱币不受此限制。
(3) 如果投币余额大于10元,输出“E004:Pay the balance is beyond the scope biggest”;
(4) 如果自动售货机中商品全部销售完毕,投币失败。输出“E005:All the goods sold out”;
(5) 如果投币成功,输出“S002:Pay success,balance=X”;
约束说明:
(1) 系统在任意阶段都可以投币;
(2) 一次投币只能投一张钱币;
(3) 同等条件下,错误码的优先级:E002 > E003 > E004 > E005;
输出说明:如果投币成功,输出“S002:Pay success,balance=X”。
例:
命令 |
输出 |
p 10; |
S002:Pay success,balance=10 |
2.3 购买商品
命令格式:b 商品名称
功能说明:
(1) 如果购买的商品不在商品列表中,输出“E006:Goods does not exist”;
(2) 如果所购买的商品的数量为0,输出“E007:The goods sold out”;
(3) 如果投币余额小于待购买商品价格,输出“E008:Lack of balance”;
(4) 如果购买成功,输出“S003:Buy success,balance=X”;
约束说明:
(1) 一次购买操作仅能购买一件商品,可以多次购买;
(2) 同等条件下,错误码的优先级:E006 > E007 > E008;
输出说明:
如果购买成功,输出“S003:Buy success,balance=X”。
例:
命令 |
输出 |
b A1; |
S003:Buy success,balance=8 |
2.4 退币
命令格式:c
功能说明:
(1) 如果投币余额等于0的情况下,输出“E009:Work failure”;
(2) 如果投币余额大于0的情况下,按照 退币原则 进行“找零”,输出退币信息;
约束说明:
(1) 系统在任意阶段都可以退币;
(2) 退币方式必须按照 退币原则 进行退币;
输出说明:如果退币成功,按照 退币原则 输出退币信息。
例,退5元钱币:
命令 |
输出 |
c; |
1 yuan coin number=0 2 yuan coin number=0 5 yuan coin number=1 10 yuan coin number=0 |
2.5 查询
命令格式:q 查询类别
功能说明:
(1) 查询自动售货机中商品信息,包含商品名称、单价、数量。 根据商品数量从大到小进行排序;商品数量相同时,按照商品名称的先后顺序进行排序 。
例如:A1的商品名称先于A2的商品名称,A2的商品名称先于A3的商品名称。
(2) 查询存钱盒信息,包含各种面额钱币的张数;
(3) 查询类别如下表所示:
查询类别 |
查询内容 |
0 |
查询商品信息 |
1 | 查询存钱盒信息 |
如果“查询类别”参数错误,输出“E010:Parameter error”。“查询类别”参数错误时,不进行下面的处理;
输出说明:
“查询类别”为0时,输出自动售货机中所有商品信息(商品名称单价数量)例:
命令 |
输出 |
q 0; |
A1 2 6 A2 3 5 A3 4 4 A4 5 3 A5 8 2 A6 6 0 |
“查询类别”为1时,输出存钱盒信息(各种面额钱币的张数),格式固定。例:
命令 |
输出 |
|
q 1; |
1 yuan coin number=4 2 yuan coin number=3 5 yuan coin number=2 10 yuan coin number=1 |
输入描述:
依照说明中的命令码格式输入命令。
输出描述:
输出执行结果
示例1
输入
r 1-1-1-1-1-1 10-5-2-1;p 1;q 1;
输出
S001:Initialization is successful S002:Pay success,balance=1 1 yuan coin number=11 2 yuan coin number=5 5 yuan coin number=2 10 yuan coin number=1
Java实现
import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){String s = sc.nextLine();doString(s);}sc.close();}public static void doString(String input){String[] arr = input.split(";");String initial = arr[0];Goods goods = OpReset(initial);for(int i=1;i<arr.length;i++){String temp = arr[i];String[] temp2 = temp.split(" ");if(temp2[0].equals("p")){goods = OpPay(temp,goods);}else if(temp2[0].equals("b")){goods = OpBuy(temp,goods);}else if(temp2[0].equals("c")){goods = OpChange(temp,goods);}else if(temp2[0].equals("q")||temp2[0].matches("q\\d")){OpQuery(temp,goods);}}}public static Goods OpReset(String initial){//初始化String[] arr = initial.split(" ");String[] Asome = arr[1].split("-");String[] Moneysome = arr[2].split("-");int[] A = new int[Asome.length];int[] B = new int[Moneysome.length];for(int i=0;i<Asome.length;i++){A[i]=Integer.valueOf(Asome[i]);}for(int i=0;i<Moneysome.length;i++){B[i]=Integer.valueOf(Moneysome[i]);}Goods goods = new Goods(A,B,0);System.out.println("S001:Initialization is successful");return goods;}public static Goods OpPay(String payString,Goods goods){//投币String[] arr = payString.split(" ");int payNum = Integer.valueOf(arr[1]);if(payNum!=1&&payNum!=2&&payNum!=5&&payNum!=10){System.out.println("E002:Denomination error");return goods;}else if((payNum==5||payNum==10)&&(goods.num_coin[0]*1+goods.num_coin[1]*2<payNum)){System.out.println("E003:Change is not enough, pay fail");return goods;}else if(payNum>10){System.out.println("E004:Pay the balance is beyond the scope biggest");return goods;}else if(goods.num_goods[0]==0&&goods.num_goods[1]==0&&goods.num_goods[2]==0&&goods.num_goods[3]==0&&goods.num_goods[4]==0&&goods.num_goods[5]==0){System.out.println("E005:All the goods sold out");return goods;}else{switch(payNum){case 1:goods.num_coin[0]++;break;case 2:goods.num_coin[1]++;break;case 5:goods.num_coin[2]++;break;case 10:goods.num_coin[3]++;break;}int tmp = payNum + goods.toubi_yu_e;goods.toubi_yu_e += payNum;System.out.println("S002:Pay success,balance="+tmp);return goods;}}public static Goods OpBuy(String buyString,Goods goods){//购买商品String[] goodsString = {"A1","A2","A3","A4","A5","A6"};String[] arr = buyString.split(" ");String buy = arr[1];int price = 0;int index = 10;for(int i=0;i<goodsString.length;i++){if(buy.equals(goodsString[i])){switch(i){case 0:price = 2;index=i;break;case 1:price = 3;index=i;break;case 2:price = 4;index=i;break;case 3:price = 5;index=i;break;case 4:price = 8;index=i;break;case 5:price = 6;index=i;break;}}}if(index==10){System.out.println("E006:Goods does not exist");return goods;}else if(goods.toubi_yu_e<price){System.out.println("E008:Lack of balance");return goods;}else if(goods.num_goods[index]==0){System.out.println("E007:The goods sold out");return goods;}else{goods.toubi_yu_e=goods.toubi_yu_e-price;System.out.println("S003:Buy success,balance="+goods.toubi_yu_e);return goods;}}public static Goods OpChange(String changeString,Goods goods){//退币if(goods.toubi_yu_e==0){System.out.print("E009:Work failure");return goods;}else{int tuibi = goods.toubi_yu_e;int num_shi = tuibi/10;if(goods.num_coin[3]-num_shi<0){num_shi = goods.num_coin[3];}int num_wu = (tuibi-10*num_shi)/5;if(goods.num_coin[2]-num_wu<0){num_wu = goods.num_coin[2];}int num_er = (tuibi-10*num_shi-5*num_wu)/2;if(goods.num_coin[1]-num_er<0){num_er = goods.num_coin[1];}int num_yi = (tuibi-10*num_shi-5*num_wu-2*num_er)/1;if(goods.num_coin[0]-num_yi<0){num_yi = goods.num_coin[0];}goods.num_coin[3] = goods.num_coin[3]-num_shi;goods.num_coin[0] = goods.num_coin[0]-num_yi;goods.num_coin[1] = goods.num_coin[1]-num_er;goods.num_coin[2] = goods.num_coin[2]-num_wu;goods.toubi_yu_e=0;System.out.println("1 yuan coin number="+num_yi);System.out.println("2 yuan coin number="+num_er);System.out.println("5 yuan coin number="+num_wu);System.out.println("10 yuan coin number="+num_shi);return goods;}}public static void OpQuery(String queryString,Goods goods){String[] arr = queryString.split(" ");String query = "";if(arr.length==2){query = arr[1];}else{System.out.print("E010:Parameter error");}if(query.equals("0")){System.out.println("A1 "+"2 "+goods.num_goods[0]);System.out.println("A2 "+"3 "+goods.num_goods[1]);System.out.println("A3 "+"4 "+goods.num_goods[2]);System.out.println("A4 "+"5 "+goods.num_goods[3]);System.out.println("A5 "+"6 "+goods.num_goods[4]);System.out.println("A6 "+"7 "+goods.num_goods[5]);}else if(query.equals("1")){System.out.println("1 yuan coin number="+goods.num_coin[0]);System.out.println("2 yuan coin number="+goods.num_coin[1]);System.out.println("5 yuan coin number="+goods.num_coin[2]);System.out.println("10 yuan coin number="+goods.num_coin[3]);}}
}
class Goods{int[] num_goods = new int[6];int[] num_coin = new int[4];int toubi_yu_e;public Goods(int[] num_goods,int[] num_coin,int toubi_yu_e){this.num_goods = num_goods;this.num_coin = num_coin;this.toubi_yu_e = toubi_yu_e;}}
模拟实现简单的自动售货系统相关推荐
- 华为机试HJ98:自动售货系统
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 1 总体说明 考生需要模拟实现一个简单的自动售货系统,实现投币.购买商品.退币.查询 ...
- python练习题之自动售货系统:
有瑕疵,待改进: 题目描述 总体说明 考生需要模拟实现一个简单的自动售货系统,实现投币.购买商品.退币.查询库存商品及存钱盒信息的功能. 系统初始化时自动售货机中商品为6种商品,商品的单价自定义,存钱 ...
- 自动售货机软件工程课设_毕业设计----自动售货系统
内容介绍 原文档由会员 灵活的胖子 发布 自动售货系统 全文约7500字 图文并茂 设计独到 需求分析 1.问题定义 本系统解决的问题:通过本系统可以无需售货员就能使顾客自行根据商品的金额将硬币投入自 ...
- 用模拟精灵写的自动投票系统
<?xml version="1.0" encoding="gb2312" ?> <ApeML LID="CHS" MD= ...
- 《华为机试》刷题之HJ98 自动售货系统
一.题目 二.示例 三.代码 def fun_r(temp): # 初始化函数b = temp.split()m = b[1].split('-')q = b[2].split('-')dic_n[' ...
- python超市售货统计程序_用Python实现简易超市售货系统
今天来实现一个简单的超市售货系统 数据存储形式为json的数据 首先是读取数据,这里用到的Python的json库,用于处理json类型的数据 ```python def load(): # 数据读取 ...
- 用Python实现简易超市售货系统
今天来实现一个简单的超市售货系统 数据存储形式为json的数据 首先是读取数据,这里用到的Python的json库,用于处理json类型的数据 def load(): # 数据读取j = open(' ...
- 使用Python自动发送微信信息【附自动恋爱系统】
文章目录 按 简单案例 自动恋爱系统 按 主要借助PyAutoGUI实现,因此需要先安装PyAutoGUI pip install PyAutoGUI 以下是PyAutoGUI的官方资料: https ...
- 基于PHP的自动化售货系统(简洁优雅)
基于PHP的自动化售货系统 一 系统介绍 源码免费,可提供系统搭建服务,快速上云,一包到底! (自动售货系统)-开源式站长自动化售货解决方案.高效.稳定.快速! 框架来自:laravel/framew ...
最新文章
- 不要网上乱拷贝代码了!一段网上找的代码突然炸了!
- 学完python还需要学什么语言好_python基础学完了之后还需要学习什么
- php $s=#039;kkk#039; if($s==0),之前收集到的PHP总结笔记
- fuse java_java中的Fuse文件系统 - JVM错误双重免费或损坏
- 你需要的是持续的服务改进
- 浅谈SQL注入风险 - 一个Login拿下Server(转)
- 如何通过 反射 调用某个对象的私有方法?
- node之koa核心代码
- 【编辑器】VSCode界面美化,图标与主题插件大全
- 自制VBS自动刷屏器,再也不怕刷屏刷不过别人了
- 网易云音乐下载MP3的方法
- 聊聊CMSIS-RTOS是什么东东
- YouTube改进之transformer
- linux学校_济南教师招聘 |济南市益友培训学校7大岗位教师招聘(月薪4k15k、包住)...
- CEO陈睿多措施并举,为B站的创新发展护航
- Fiddler调式使用(一)深入研究[转载]
- Exp9 Web安全基础实践 20164323段钊阳
- cisco路由器基本实验之五 配置Loopback接口进行远程登录 (Boson NetSim)
- 宝宝营养粥及如何提高宝宝睡眠
- WSL 解决code .报‘code‘ not fount无法打开Vscode问题
热门文章
- Cesium 实战 - 最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层
- 华为网络工程师项目模拟
- 传统责任链模式和变种责任链模式
- 03-MySQL:DBeaver 客户端使用
- 计算机统计学作业,浙江科技學院计算机专业统计学原理复习题参考答案.doc
- SpringBoot + Spring Cloud +Vue 管理系统前端搭建(六、完善登录流程)
- html 设置移动端页面滚动,a.html · 焚心/移动端页面上下滚动加多页面上拉加载功能及mescroll插件的使用 - Gitee.com...
- 黑客攻防技术宝典(十八)
- 《深入理解Elasticsearch(原书第2版)》——第1章 Elasticsearch简介
- IDEA Material Theme UI 暗黑系主题的安装