自动售货系统源码
来源:互联网 发布:sqlserver二进制数据 编辑:程序博客网 时间:2024/04/27 20:14
这里给出的是华为公司在线软件训练与测试平台(网址:career-oj.huawei.com)上一道编程挑战题,在其系统中查看名为:自动收获系统的题目可以找到该题的详细信息。
view plaincopy to clipboardprint?import java.util.HashSet; import java.util.Scanner; import java.util.Stack; public class Main { class Goods { public String name; public int price; public int count; public Goods(String name,int price) { this.name = name; this.price = price; count = 0; } public String print() { return new String(name + " " + price + " " + count); } public int getNameOrder() { return Integer.parseInt(name.substring(1)); } } class GoodsAll { public Goods A1 = new Goods("A1",2); public Goods A2 = new Goods("A2",3); public Goods A3 = new Goods("A3",4); public Goods A4 = new Goods("A4",5); public Goods A5 = new Goods("A5",8); public Goods A6 = new Goods("A6",6); public Goods getA(int i) { switch(i) { case 1: return A1; case 2: return A2; case 3: return A3; case 4: return A4; case 5: return A5; case 6: return A6; default: return null; } } public String print() { Goods[] goods = new Goods[] {A1,A2,A3,A4,A5,A6}; Goods tmp = null; int i,j; for (i = 0; i < goods.length - 1; i++) { for (j = i + 1; j < goods.length; j++) { if (goods[i].count < goods[j].count) { tmp = goods[i]; goods[i] = goods[j]; goods[j] = tmp; } else if (goods[i].count == goods[j].count) { if (goods[i].getNameOrder() > goods[j].getNameOrder()) { tmp = goods[i]; goods[i] = goods[j]; goods[j] = tmp; } } } } StringBuilder sb = new StringBuilder(); for (i = 0; i < goods.length; i++) { sb.append(goods[i].print() + "\r\n"); } return sb.toString(); } public boolean isEmpty() { int sum = 0; for (int i = 1; i <= 6; i++) { sum += getA(i).count; } if (sum == 0) { return true; }else { return false; } } } class Moneys { //按次序依次存储10、5、2、1的信息 int[] change = new int[4]; //向存钱罐中增加钱 public String addMoney(int m) { boolean ok = true; StringBuilder sb = new StringBuilder(); if (m != 1 && m != 2 && m != 5 && m != 10) { sb.append("E002:Denomination error\r\n"); ok = false; return sb.toString(); } if (m > 2 && m > change[3] + change[2] * 2) { sb.append("E003:Change is not enough, pay fail\r\n"); ok = false; return sb.toString(); } if (m > 10) { sb.append("E004:Pay the balance is beyond the scope biggest\r\n"); ok = false; return sb.toString(); } if (goodsAll.isEmpty()) { sb.append("E005:All the goods sold out\r\n"); ok = false; return sb.toString(); } if(ok) { switch(m) { case 1: change[3]++; break; case 2: change[2]++; break; case 5: change[1]++; break; case 10: change[0]++; break; default: break; } consumer.balance += m; sb.append("S002:Pay success,balance=" + consumer.balance + "\r\n"); } return sb.toString(); } //找钱 public String exchange(int m) { int mtmp = m; //将所有零钱压栈,将最小的先入栈 Stack<Integer> stackChange = new Stack<Integer>(); //新建一个堆栈用来存储找零结果 Stack<Integer> stackResult = new Stack<Integer>(); int i,j,k; int one, two, five, ten; // for (i = 0; i < change[3]; i++) { // stackChange.push(1); // } // for (i = 0; i < change[2]; i++) { // stackChange.push(2); // } // for (i = 0; i < change[1]; i++) { // stackChange.push(5); // } // for (i = 0; i < change[0]; i++) { // stackChange.push(10); // } // // while(!stackChange.isEmpty()) { // int test = stackChange.pop(); // if (m >= test) { // m -= test; // stackResult.push(test); // } // } for (i = 0; i <= 3; i++) { for(j = 3; j >= i; j-- ) { for (k = 0; k < change[j]; k++) { if (j == 3) { stackChange.push(1); } else if(j == 2) { stackChange.push(2); } else if(j == 1) { stackChange.push(5); } else { stackChange.push(10); } } } while(!stackChange.isEmpty()) { int test = stackChange.pop(); if (m >= test) { m -= test; stackResult.push(test); } } if (m == 0) { break; } else { m = mtmp; stackChange.clear(); stackResult.clear(); } } //将找零结果存储在这四个Int变量中。 one = two = five = ten = 0; while(!stackResult.isEmpty()) { int result = stackResult.pop(); switch(result) { case 1: one++; break; case 2: two++; break; case 5: five++; break; case 10: ten++; break; default: } } //更新存钱罐 change[0] -= ten; change[1] -= five; change[2] -= two; change[3] -= one; //消费余额清零 consumer.balance = 0; //生成找钱信息 StringBuilder sb = new StringBuilder(); sb.append("1 yuan coin number=" + one + "\r\n"); sb.append("2 yuan coin number=" + two + "\r\n"); sb.append("5 yuan coin number=" + five + "\r\n"); sb.append("10 yuan coin number=" + ten + "\r\n"); return sb.toString(); } //打印钱盒信息 String print() { StringBuilder sb = new StringBuilder(); sb.append("1 yuan coin number=" + change[3] + "\r\n"); sb.append("2 yuan coin number=" + change[2] + "\r\n"); sb.append("5 yuan coin number=" + change[1] + "\r\n"); sb.append("10 yuan coin number=" + change[0] + "\r\n"); return sb.toString(); } } //消费者类 class Consumer { int balance = 0; //str is like 'A1' or 'A3' public String buy(String str) { StringBuilder sb = new StringBuilder(); boolean ok = true; HashSet<String> names = new HashSet<String>(); names.add("A1"); names.add("A2"); names.add("A3"); names.add("A4"); names.add("A5"); names.add("A6"); if (!names.contains(str)) { sb.append("E006:Goods does not exist"); ok = false; return sb.toString(); } int goodsId = Integer.parseInt(str.substring(1)); if (goodsAll.getA(goodsId).count == 0) { sb.append("E007:The goods sold out\r\n"); ok = false; return sb.toString(); } if (consumer.balance < goodsAll.getA(goodsId).price) { sb.append("E008:Lack of balance\r\n"); ok =false; return sb.toString(); } if (ok) { consumer.balance -= goodsAll.getA(goodsId).price; goodsAll.getA(goodsId).count -- ; sb.append("S003:Buy success,balance=" + consumer.balance + "\r\n"); } return sb.toString(); } } //初始化 public String reset(String str) { String[] strOne = str.split(" "); String[] strA = strOne[1].split("-"); String[] strMoney = strOne[2].split("-"); int i; for (i = 0; i < strA.length; i++) { goodsAll.getA(i + 1).count = Integer.parseInt(strA[i]); } for (i = 0; i < strMoney.length; i++) { moneys.change[3 - i] = Integer.parseInt(strMoney[i]); } return new String("S001:Initialization is successful"); } public String pay(String str) { String s = str.substring(2); return moneys.addMoney(Integer.parseInt(s)); } public String buy(String str) { return consumer.buy(str.substring(2)); } public String change(String str) { if (consumer.balance > 0) { return moneys.exchange(consumer.balance); } else { return new String("E009:Work failure"); } } public String query(String str) { if (!str.equals("q 0") && !str.equals("q 1")) { return new String("E010:Parameter error"); } else { int queryId = Integer.parseInt(str.substring(2)); if (queryId == 0) { return goodsAll.print(); } else { return moneys.print(); } } } ////////////////////////////////////////////////////////// public GoodsAll getGoodsAll() { return new GoodsAll(); } public Moneys getMoneys() { return new Moneys(); } public Consumer getConsumer() { return new Consumer(); } public static Main main = new Main(); public static Main.Consumer consumer = main.getConsumer(); public static Main.GoodsAll goodsAll = main.getGoodsAll(); public static Main.Moneys moneys = main.getMoneys(); //////////////////////////////////////////////////////////// public static void main(String[] args) { // Main main = new Main(); // Main.Consumer consumer = main.getConsumer(); // Main.GoodsAll goodsAll = main.getGoodsAll(); // Main.Moneys moneys = main.getMoneys(); Scanner sca = new Scanner(System.in); String order = sca.nextLine(); //while(!((order = sca.nextLine()).equals("0"))){ String[] str = order.split(";"); for (String s:str) { String title = s.substring(0,1); switch(title) { case "r": System.out.println(main.reset(s)); //System.out.print(goodsAll.print()); //System.out.print(moneys.print()); break; case "p": System.out.print(main.pay(s)); break; case "b": System.out.print(main.buy(s)); break; case "c": System.out.print(main.change(s)); break; case "q": System.out.print(main.query(s)); break; default: } } //} } }
需要注意的是:在给出输出信息的时候,一定要按照题目所给的格式来编写,比如给出找钱信息的时候 1 yuan coin number=X,这句话中每一个单词之间都要用空格隔开,我曾经因为1和yuan之间没有用空格隔开而导致测试结果出错,所以如果一定要追求答题的准确,就必须注意这些细节性的东西。
代码质量不高,仅仅能完成功能。
0 0
- 自动售货系统源码
- 自动售货系统
- 华为OJ自动售货系统
- 自动售货机销售系统 C
- 华为2017校招题:自动售货系统
- 手机自动售货机的嵌入式系统设计
- 自动售货机
- 自动售货机
- 测试自动售货机
- 自动售货机控制系统
- 自动饮料售货机
- 自动售货机代码
- 自动售货机简单代码
- JAVA模拟自动售货机
- Verilog自动售货机设计
- [JAVA]模拟自动售货机
- 华为oj-自动售货机
- FPGA自动售货机设计
- Uva——11827 Maximum gcd
- 2014多校1(1003)hdu4863
- 《安东尼罗宾上海演讲整理讲义》
- ios5 app启动过程中执行到过程分析
- 黑马程序员_7_内部类
- 自动售货系统源码
- 二叉树的遍历与创建
- hdu 4786 最小生成树与最大生成树
- ZOJ-1238
- java自动装箱与拆箱
- wax lua 脚本升级练习(2)
- BOJ 474. 小妹妹送很多快递
- Ajax请求中的async:false/true的作用(ajax返回值在外部调用问题)
- BF暴力匹配算法