面试题:模拟自动售货机

2023-11-05 14:10

本文主要是介绍面试题:模拟自动售货机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   前两天面试,编程题是写一个模拟自动售货机的程序,当时时间匆忙,匆匆写了一下,回来就在机器上做了完善。记下来,下次或许能用到这些代码。

 

    代码还需要优化,如果卖的饮料品牌有变化,就得改类了,不符合开闭原则,暂时还没想到什么好的方法,期待高手指点。

 

/*** 消费者* * @author ma_clin* */
public class Consumer implements ConsumeAction {private List<Drink> orders = new ArrayList<Drink>();private Commander commander;public Consumer(Commander commander) {this.commander = commander;}public void buyCola(int num) {while (num > 0) {orders.add(new Cola());num--;}}public void buyOrangeJuice(int num) {while (num > 0) {orders.add(new OrangeJuice());num--;}}public void buySprite(int num) {while (num > 0) {orders.add(new Sprite());num--;}}public String check(double payment) {System.out.println(commander.check(orders, payment));return "";}}

 

/*** 消费动作* @author ma_clin**/
public interface ConsumeAction {/*** * @param num 购买数量*/public void buyCola(int num);public void buySprite(int num);public void buyOrangeJuice(int num);}

 

/*** 命令* @author ma_clin**/
public class Commander{private VendingMachine machine;public Commander(VendingMachine machine){this.machine = machine;}public String check(List orders, double payment) {return machine.check(orders, payment);}}

 

/*** 自动售货机* * @author ma_clin* */
public class VendingMachine {// 自动售货机中的可乐private List<Drink> colaBox = new ArrayList<Drink>();// 雪碧private List<Drink> spriteBox = new ArrayList<Drink>();// 橙汁private List<Drink> orangeJuiceBox = new ArrayList<Drink>();// 价格管理器private PriceManager priceManager;// 本次交易应付款private double sumPrice = 0;// 本次交易结果private String result;// 最大存储数量private int maxCapacity = 50;/*** * @param number*            售货机中各款饮料的数量* @throws IOException*/public VendingMachine(int number) throws IOException {// 初始化价格管理器try {priceManager = new PriceManager();System.out.println("售货机价格设定完毕。");System.out.println("可乐,雪碧,橙汁: " + priceManager.getColaPrice() + ","+ priceManager.getSpritePrice() + ","+ priceManager.getOrangeJuicePrice());} catch (IOException e) {throw e;}// 入货if(number > maxCapacity){number = maxCapacity;}while (number > 0) {colaBox.add(new Cola());number--;spriteBox.add(new Sprite());number--;orangeJuiceBox.add(new OrangeJuice());number--;}System.out.println("售货机入货完毕。");System.out.println("当前数量: 可乐\t雪碧\t橙汁\n\t" + colaBox.size() + "\t"+ spriteBox.size() + "\t" + orangeJuiceBox.size());}/*** * @param payment*            付款金额* @return*/public String check(List orders, double payment) {Iterator itr = orders.iterator();Drink drink;// 算账while (itr.hasNext()) {drink = (Drink) itr.next();if (drink instanceof Cola) {sumPrice += priceManager.getColaPrice();} else if (drink instanceof Sprite) {sumPrice += priceManager.getSpritePrice();} else if (drink instanceof OrangeJuice) {sumPrice += priceManager.getOrangeJuicePrice();}}// 结帐if (payment >= sumPrice) {spitOutDrink(orders);result = "本次应付账款:" + sumPrice + "元,实收现金:" + payment + "元,找零:"+ (payment - sumPrice) + "元";} else {result = "对不起,现金不足。您本次需要支付" + sumPrice + "元";}// 本次交易结束,次交易金额重置为0sumPrice = 0;return result;}/*** 售货机吐出饮料* * @param orders*/private void spitOutDrink(List orders) {Iterator itr = orders.iterator();Drink drink;while (itr.hasNext()) {drink = (Drink) itr.next();if (drink instanceof Cola && colaBox.size()>0) {colaBox.remove(colaBox.size()-1);System.out.println(" >>> 可乐 ");} else if (drink instanceof Sprite && spriteBox.size()>0) {spriteBox.remove(spriteBox.size()-1);System.out.println(" >>> 雪碧 ");} else if (drink instanceof OrangeJuice && orangeJuiceBox.size()>0) {orangeJuiceBox.remove(orangeJuiceBox.size()-1);System.out.println(" >>> 橙汁 ");}}}/*** 查询当前数量*/public void showNum(){System.out.println("当前数量: 可乐\t雪碧\t橙汁\n\t" + colaBox.size() + "\t"+ spriteBox.size() + "\t" + orangeJuiceBox.size());}}

 

/** 售货机的价格管理器*/
public class PriceManager {private double colaPrice;private double spritePrice;private double orangeJuicePrice;private Properties properties = new Properties(); public PriceManager() throws IOException{InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("price.properties");try {properties.load(inputStream);this.colaPrice = Double.valueOf(properties.getProperty("colaPrice"));this.spritePrice = Double.valueOf(properties.getProperty("spritePrice"));this.orangeJuicePrice = Double.valueOf(properties.getProperty("orangeJuicePrice"));} catch (IOException e) {throw e;}}public double getColaPrice() {return colaPrice;}public double getSpritePrice() {return spritePrice;}public double getOrangeJuicePrice() {return orangeJuicePrice;}}

 

#src目录下的price.properties#可乐价格
colaPrice=2.00
#雪碧价格
spritePrice=2.00
#橙汁价格 
orangeJuicePrice=3.00

 

/**
*测试类
*/
public class ConsumeTest {public static void main(String[] args) {VendingMachine machine = null; try {machine = new VendingMachine(50);} catch (IOException e) {System.out.println("初始化售货机失败");}Commander commander = new Commander(machine);Consumer consumer = new Consumer(commander);consumer.buyCola(2);consumer.buyOrangeJuice(20);consumer.buySprite(10);consumer.check(100);machine.showNum();}}
 

 

 

这篇关于面试题:模拟自动售货机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350365

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+