关闭

华为OJ自动售货系统

1912人阅读 评论(0) 收藏 举报
总体说明
考生需要模拟实现一个简单的自动售货系统,实现投币、购买商品、退币、查询库存商品及存钱盒信息的功能。
系统初始化时自动售货机中商品为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.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
 
知识点 字符串
运行时间限制 0M
内存限制 0
输入

依照说明中的命令码格式输入命令。

命令汇总
命令
命令格式
示例
说明
r
r A1数量-A2数量-A3数量-A4数量-A5数量-A6数量 1元张数-2元张数-5元张数-10元张数;
r 6-5-4-3-2-1 4-3-2-1;
r,初始化商品和存钱盒信息
p 钱币面额;
p 10;
p,向自动售货机投入某个面额的钱币
b 商品名称;
b A1;
b,购买商品
c
c;
c;
c,可退出所有投币余额,投币余额清零。
q
q查询类别;
q0;
q,查询自动售货机中所有商品存量信息及存钱盒信息
返回码汇总
返回码描述
说明
E001:Illegal command
考试系统使用,考生不用关注
E002:Denomination error
“钱币面额”参数不合法;
E003:Change is not enough, pay fail
存钱盒中1元和2元面额钱币总额小于本次投入的钱币面额
E004:Pay the balance is beyond the scope biggest
投币余额最大不能超过10元
E005:All the goods sold out
所有商品存量为0时,不能投币。
E006:Goods does not exist
选择购买的商品不在商品销售列表
E007:The goods sold out
所选择的商品存量为0,不能购买。
E008:Lack of balance
投币余额小于待购买商品价格,不能选择。
E009:Work failure
投币余额为零,不允许退币。
E010:Parameter error
“查询类别”参数不合法。
S001:Initialization is successful
初始化操作成功,考试系统使用,考生不用关注
S002:Pay success,balance=X
投币成功,X 为系统的投币余额。例:
S002:Pay success,balance=5
S003:Buy success,balance=X
购买商品成功,X 为系统的投币余额。例:
S003:Buy success,balance=3
 
3 约束
1、所有指令格式的合法性、范围不做为测试点,考生不需要考虑。
2、测试用例中所有的命令必须以”r”开头,即所有的用例都是以初始化开始的。
3、输入命令的参数与参数之间用”-”(横线)隔开,命令与命令之间用”;”(英文分号)隔开。
4、仔细阅读题目规格,使用给出的参考代码框架,实现OpReset,OpPay,OpBuy,OpChange,OpQuery五个函数的功能,函数已经定义好,直接修改即可。考生也可根据需要自行添加函数,输入输出功能可直接调用参考代码框架中的函数。
4 参考测试用例
测试用例编号 输入 预期输出
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
2 r 1-1-1-1-1-1 10-5-2-1;p 2;q 1; S001:Initialization is successful
S002:Pay success,balance=2
1 yuan coin number=10
2 yuan coin number=6
5 yuan coin number=2
10 yuan coin number=1
3 r 1-1-1-1-1-1 4-0-0-0;p 5;q 1; S001:Initialization is successful
E003:Change is not enough, pay fail
1 yuan coin number=4
2 yuan coin number=0
5 yuan coin number=0
10 yuan coin number=0
4 r 1-1-1-1-1-1 0-5-0-0;p 10; S001:Initialization is successful
S002:Pay success,balance=10
5 r 1-1-1-1-1-1 0-3-0-0;p 5; S001:Initialization is successful
S002:Pay success,balance=5
6 r 1-1-1-1-1-1 2-1-0-0;p 5; S001:Initialization is successful
E003:Change is not enough, pay fail
7 r 1-1-1-1-1-1 3-2-0-0;p 5; S001:Initialization is successful
S002:Pay success,balance=5
8 r 1-1-1-1-1-1 0-0-0-0;p 10; S001:Initialization is successful
E003:Change is not enough, pay fail
9 r 1-1-1-1-1-1 10-5-2-1;p 5;p 5;q 1; S001:Initialization is successful
S002:Pay success,balance=5
S002:Pay success,balance=10
1 yuan coin number=10
2 yuan coin number=5
5 yuan coin number=4
10 yuan coin number=1
10 r 0-0-0-0-0-0 10-5-2-1;p 2; S001:Initialization is successful
E005:All the goods sold out
11 r 1-1-1-1-1-1 0-2-0-0;p 6; S001:Initialization is successful
E002:Denomination error
12 r 1-1-1-1-1-1 0-2-0-0;p 2;p 10; S001:Initialization is successful
S002:Pay success,balance=2
E003:Change is not enough, pay fail
13 r 1-1-1-1-1-1 10-5-2-1;p 10;b A7; S001:Initialization is successful
S002:Pay success,balance=10
E006:Goods does not exist
14 r 0-1-1-1-1-1 10-5-2-1;p 10;b A1; S001:Initialization is successful
S002:Pay success,balance=10
E007:The goods sold out
15 r 1-1-1-1-1-1 10-5-2-1;p 5;b A6; S001:Initialization is successful
S002:Pay success,balance=5
E008:Lack of balance
16 r 1-1-1-1-1-1 10-5-2-1;b A6;q 0; S001:Initialization is successful
E008:Lack of balance
A1 2 1
A2 3 1
A3 4 1
A4 5 1
A5 8 1
A6 6 1
17 r 1-1-1-1-1-1 10-5-2-1;p 5;c;q 1;b A6; S001:Initialization is successful
S002:Pay success,balance=5
1 yuan coin number=0
2 yuan coin number=0
5 yuan coin number=1
10 yuan coin number=0
1 yuan coin number=10
2 yuan coin number=5
5 yuan coin number=2
10 yuan coin number=1
E008:Lack of balance
18 r 1-1-1-1-1-1 10-5-2-1;p 5;b A4;b A6; S001:Initialization is successful
S002:Pay success,balance=5
S003:Buy success,balance=0
E008:Lack of balance
19 r 1-1-1-1-1-1 0-10-0-0;p 10;b A1;c;q 1; S001:Initialization is successful
S002:Pay success,balance=10
S003:Buy success,balance=8
1 yuan coin number=0
2 yuan coin number=4
5 yuan coin number=0
10 yuan coin number=0
1 yuan coin number=0
2 yuan coin number=6
5 yuan coin number=0
10 yuan coin number=1
20 r 1-1-1-1-1-1 0-5-5-0;p 10;b A1;c; S001:Initialization is successful
S002:Pay success,balance=10
S003:Buy success,balance=8
1 yuan coin number=0
2 yuan coin number=4
5 yuan coin number=0
10 yuan coin number=0

 


输出

输出执行结果

样例输入 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

具体题目可见华为OJ
总共提交了两次,第一次提示错误,找了下多输出了一些东西,同时有些逻辑还有问题。修改后再次提交,正确。但是附在题目后面的测试用例第20个我的代码输出与用例给的结果不同在最后也被判为正确的,可能是OJ没有用到那个测试用例或者没有用类似的测试用例吧。不过还是修改了相关的错误,不知道正确与否,不过在次提交显示也是正确的。
下面是代码(JAVA)


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1922次
    • 积分:28
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档
    阅读排行
    评论排行