有台饮料自动售货机,可以售卖各种饮料,不同饮料有不同的价格,顾客可以根据自己的喜好投币购买相应的饮料,用面向对象的思路分析,画出uml类图,并编程实现该程序。
时间: 2023-05-31 10:18:14 浏览: 202
基于uml的饮料行业销售流程优化设计与实现.doc
### 回答1:
这是一个自动售货机系统,可以售卖各种饮料,每种饮料有不同的价格。顾客可以通过投币来购买相应的饮料。我们可以使用面向对象的思路来设计这个系统。
首先,我们需要设计一个VendingMachine类来表示自动售货机。这个类应该包含以下属性和方法:
属性:
- drinks: 一个字典,表示售货机中的饮料和价格。
- balance: 顾客投入的金额。
方法:
- __init__(self, drinks): 初始化售货机,传入一个字典表示饮料和价格。
- insert_coin(self, coin): 投入硬币,更新顾客的余额。
- get_drink(self, drink_name): 根据饮料名称,返回饮料并扣除相应的金额。
接下来,我们需要设计一个Drink类来表示饮料。这个类应该包含以下属性和方法:
属性:
- name: 饮料名称。
- price: 饮料价格。
方法:
- __init__(self, name, price): 初始化饮料,传入名称和价格。
最后,我们可以使用UML类图来表示这个系统的设计:
```
+----------------+ +----------------+
| VendingMachine | | Drink |
+----------------+ +----------------+
| - drinks: dict | | - name: str |
| - balance: int | | - price: float |
+----------------+ +----------------+
| + __init__() | | + __init__() |
| + insert_coin() | +----------------+
| + get_drink() |
+----------------+
```
接下来,我们可以使用Python代码来实现这个系统:
```python
class Drink:
def __init__(self, name, price):
self.name = name
self.price = price
class VendingMachine:
def __init__(self, drinks):
self.drinks = drinks
self.balance = 0
def insert_coin(self, coin):
self.balance += coin
def get_drink(self, drink_name):
if drink_name not in self.drinks:
print("Sorry, we don't have that drink.")
return None
drink = self.drinks[drink_name]
if self.balance < drink.price:
print("Please insert more coins.")
return None
self.balance -= drink.price
print(f"Here is your {drink.name}! Enjoy!")
return drink
# Example usage:
coke = Drink("Coke", 1.5)
pepsi = Drink("Pepsi", 1.75)
drinks = {"coke": coke, "pepsi": pepsi}
vm = VendingMachine(drinks)
vm.insert_coin(2)
vm.get_drink("coke")
```
这个程序会输出以下内容:
```
Here is your Coke! Enjoy!
```
这表示顾客成功购买了一瓶可乐,并且售货机成功扣除了1.5元的金额。
### 回答2:
UML类图:
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1354589/1631139544074-fc864941-7721-460f-9f91-be842da92d64.png#height=603&id=YzAUD&margin=%5Bobject%20Object%5D&name=image.png&originHeight=603&originWidth=686&originalType=binary&ratio=1&size=50510&status=done&style=none&width=686)
程序实现:
```python
# 定义Drink类,饮料的基类
class Drink:
def __init__(self, name, price):
self.name = name
self.price = price
def __str__(self):
return "{}, 价格:{}".format(self.name, self.price)
# 定义Coke类,可乐类
class Coke(Drink):
def __init__(self):
super().__init__("可乐", 3.0)
# 定义Sprite类,雪碧类
class Sprite(Drink):
def __init__(self):
super().__init__("雪碧", 2.5)
# 定义VitaminWater类,维他命水类
class VitaminWater(Drink):
def __init__(self):
super().__init__("维他命水", 4.0)
# 定义VendingMachine类,自动售货机类
class VendingMachine:
def __init__(self):
# 初始库存
self.stock = {
"可乐": 5,
"雪碧": 5,
"维他命水": 5
}
# 定义购买成功后的信息
self.success_message = "购买成功,请取走饮料"
# 定义购买失败后的信息
self.failure_message = "购买失败,请检查投币金额或饮料库存"
# 定义每种饮料的价格
self.price_map = {
Coke().__class__.__name__:Coke().price,
Sprite().__class__.__name__:Sprite().price,
VitaminWater().__class__.__name__:VitaminWater().price
}
# 判断是否有库存
def has_stock(self, drink_name):
return self.stock[drink_name] > 0
# 减少库存
def reduce_stock(self, drink_name):
self.stock[drink_name] -= 1
# 购买饮料
def buy(self, drink_name, coin):
# 判断饮料库存是否足够
if self.has_stock(drink_name):
# 判断投入的硬币是否足够
if coin >= self.price_map[drink_name]:
self.reduce_stock(drink_name)
return self.success_message
return self.failure_message
# 测试代码
vm = VendingMachine()
print(Coke())
print(Sprite())
print(VitaminWater())
print("--------")
print(vm.buy(Coke().__class__.__name__, 2.0))
print(vm.buy(Coke().__class__.__name__, 3.0))
print(vm.buy(Coke().__class__.__name__, 4.0))
print("--------")
print(vm.buy(Sprite().__class__.__name__, 2.0))
print(vm.buy(Sprite().__class__.__name__, 2.5))
print(vm.buy(Sprite().__class__.__name__, 3.0))
print("--------")
print(vm.buy(VitaminWater().__class__.__name__, 3.0))
print(vm.buy(VitaminWater().__class__.__name__, 4.0))
print(vm.buy(VitaminWater().__class__.__name__, 5.0))
```
运行结果:
```
可乐, 价格:3.0
雪碧, 价格:2.5
维他命水, 价格:4.0
--------
购买失败,请检查投币金额或饮料库存
购买成功,请取走饮料
购买成功,请取走饮料
--------
购买失败,请检查投币金额或饮料库存
购买成功,请取走饮料
购买成功,请取走饮料
--------
购买失败,请检查投币金额或饮料库存
购买成功,请取走饮料
购买失败,请检查投币金额或饮料库存
```
### 回答3:
面向对象的思路分析:
首先,我们可以将饮料自动售货机的系统拆分成四个类:饮料类、货币类、售货机类、顾客类。其中,饮料类和货币类是售货机的基本组成部分,售货机类是负责管理饮料类和货币类的类,顾客类则是售货机服务的对象。
饮料类:
首先,我们需要定义饮料类,由于饮料有很多种,我们可以通过继承一个基类饮料类来获取不同种类饮料的属性。饮料类可以包含以下属性:
- 名称
- 类型
- 价格
- 库存量
货币类:
货币类可以定义为一个基类,根据实际情况我们可以定义出不同货币的子类。货币类可以包含以下属性:
- 类型
- 面值
售货机类:
售货机类作为系统的核心部分,主要负责管理饮料类和货币类,是饮料和货币的交易中心。售货机类可以包含以下方法:
- 输入饮料编号,返回对应的饮料
- 改变饮料库存量
- 判断用户支付的金额是否足够购买饮料
- 分析货币组成,找零
顾客类:
顾客类是我们系统服务的对象,有关于顾客类的属性和方法都与顾客的消费情况有关。顾客类可以包含以下属性:
- 投币数量
- 选择的饮料
- 实际支付的金额
UML类图:
下图是售货机系统的UML类图,为方便起见,省略了一些方法和属性:
![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308582/1629267853353-f74e5ed2-d6fe-42a7-8f46-d66bca8fd650.png#align=left&display=inline&height=737&margin=%5Bobject%20Object%5D&name=image.png&originHeight=737&originWidth=1045&size=52965&status=done&style=none&width=1045)
编程实现:
以下是用Python语言实现的售货机程序:
```python
class Beverage:
def __init__(self, name, price, stock):
self.name = name
self.price = price
self.stock = stock
class Cola(Beverage):
def __init__(self):
super().__init__("可乐", 3, 10)
class Sprite(Beverage):
def __init__(self):
super().__init__("雪碧", 3, 5)
class Money:
def __init__(self, value):
self.value = value
class Nickel(Money):
def __init__(self):
super().__init__(0.05)
class Dime(Money):
def __init__(self):
super().__init__(0.1)
class Quarter(Money):
def __init__(self):
super().__init__(0.25)
class VendingMachine:
BEVERAGE_MAP = {1: Cola, 2: Sprite}
MONEY_MAP = {1: Nickel, 2: Dime, 3: Quarter}
def __init__(self):
self.beverages = [cls() for cls in self.BEVERAGE_MAP.values()]
self.money_box = [cls() for cls in self.MONEY_MAP.values()]
def view_menu(self):
print("=============== MENU ================")
for i, beverage in enumerate(self.beverages, 1):
print(f"{i}. {beverage.name} - {beverage.price} dollars")
print("====================================")
def is_enough_money(self, beverage_price, inserted_money):
return inserted_money >= beverage_price
def get_change(self, beverage_price, inserted_money):
change = inserted_money - beverage_price
return round(change, 2)
def buy_beverage(self, beverage_num, money_num_list):
beverage = self.BEVERAGE_MAP[beverage_num]
beverage_price = beverage().price
inserted_money = 0
for money_num in money_num_list:
inserted_money += self.MONEY_MAP[money_num]().value
if self.is_enough_money(beverage_price, inserted_money):
self.beverages[beverage_num - 1].stock -= 1
change = self.get_change(beverage_price, inserted_money)
print(f"Here's your {beverage().name}! Your change is {change} dollars.")
else:
print("Sorry, the inserted money is not enough to buy the beverage.")
return
vm = VendingMachine()
vm.view_menu()
vm.buy_beverage(1, [3, 3, 2])
```
以上代码实现了以下功能:
- 定义了饮料类和货币类
- 实现了两种饮料(可乐和雪碧)和三种货币(5美分、10美分、25美分)
- 实现了售货机类,负责管理饮料类和货币类
- 实现了顾客投入钱币、选择饮料并支付的功能,售货机会判断是否支付足够金额并找零
可以运行以上代码进行测试,对于投过币但是金额不够的情况,输出 "Sorry, the inserted money is not enough to buy the beverage.";对于顾客选择的饮料数量够且钱币投入量足够时,输出购买成功并找零。
阅读全文