ATM + 购物商城程序

模拟实现一个ATM + 购物商城程序

  1. 额度 15000或自定义

  2. 实现购物商城,买东西加入 购物车,调用信用卡接口结账

  3. 可以提现,手续费5%

  4. 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息

  5. 支持多账户登录

  6. 支持账户间转账

  7. 记录每月日常消费流水

  8. 提供还款接口

  9. ATM记录操作日志 

  10. 提供管理接口,包括添加账户、用户额度,冻结账户等。。。

  11. 用户认证用装饰器


# import time
import datetime
# time.time() # 当前时间戳
# datetime.datetime.now() # 本地之间


# 数据处理=====================================
# 全部用户数据
user_data = []
# 加载数据到内存
def load_data():
f = open("DB/user_db.txt","rt",encoding="utf-8")
for line in f:
line = line.strip("\n")
if line == "\n":continue
ls = line.split("|")
usr_dic = {"name":ls[0],
"pwd":ls[1],
"max": ls[2],
"money": ls[3],
"lock": ls[4]}
user_data.append(usr_dic)
f.close()

# 根据账户名获取一个用户
def get_usr(name):
for usr in user_data:
if usr["name"] == name:
return usr

# 将内存中的数据持久存储到文件中
def save_to_file():
f = open("DB/user_db.txt","wt",encoding="utf-8")
for usr in user_data:
text = "|".join(usr.values())
text += "\n"
f.write(text)
f.close()


# 数据处理=====================================

# 登录验证装饰器(闭包函数) (再不改变源代码的调用方式基础上 为这个函数添加新功能)
def login_auth(func):
def wrapper(*args,**kwargs):
# 验证是否登陆过了
if current_usr == None:
print("请先登录!")
atm_login()
if current_usr:
return func(*args,**kwargs)
else:
return func(*args,**kwargs)
return wrapper



# 购物中心========================================
# 商品信息
products = [{"name":"挨粪叉","price":6888},
{"name":"锤子TNT","price":10888},
{"name":"小米mix2","price":2888}]

# 购物车
car = {}

# 购物
def shopping():
while True:
# 打印出所有商品信息
count = 1
for p in products:
print("序号:%-3s 名称:%-10s 价格:%-6s" % (count,p["name"],p["price"]))
count += 1
select = input("亲输入商品的序号q退出:\n")
if select == "q":
return
if select.isdigit() and int(select) >= 1 and int(select) <= len(products):
pd = products[int(select)-1]
print("%s已成功加入购物车!" % pd["name"])
# 判断商品是否已经存在于购物车
if pd["name"] in car:
car[pd["name"]]["count"] += 1
else:
car[pd["name"]] = {"price":pd["price"],"count":1}
else:
print("输入有误请重新输入!")


# 查看购物车
def show_cars():
if not car:
s = input("你的购物车是空的! 你要买点什么吗? y/n")
if s == "y":
shopping()
return
else:
return
print("您的购物车信息:")
for p in car:
print("名称:%-10s 价格:%-8s 数量:%-3s 总价:%-10s" % (p,
car[p]["price"],
car[p]["count"],
car[p]["price"] * car[p]["count"]))
select = input("输入y调整商品数量!(数量为0则删除商品!) 输入其他退出!")
if select == "y":
modify_count()


# 调整购物车中的商品数量
def modify_count():
while True:
name = input("请输入商品名称q退出:\n")
if name == "q":
return
if name not in car:
print("输入不正确请重试!")
continue

while True:
count = input("输入调整后数量:\n")
if not count.isdigit():
print("数量不正确 必须是整数!")
continue
count = int(count)
if count == 0:
car.pop(name)
print("%s已删除" % name)
return
else:
car[name]["count"] = count
print("修改成功!")
return


# 结算
@login_auth
def pay_cars():
# 计算商品总价格
sum = 0
for p in car:
sum += car[p]["price"] * car[p]["count"]
print("您的订单总价为:%s元" % sum)
if paymoney(sum):
print("剁手成功! 回家等着吧!")
clear_cars()


# 清空购物车
def clear_cars():
car.clear()
print("购物车已清空!")


def shop_center():
shopfuncs = {"1":shopping,"2":show_cars,"3":pay_cars,"4":clear_cars}
while True:
print("""
1.购物
2.查看购物车
3.结算
4.清空
q.退出""")
index = input("请选择:\n").strip()
if index == "q":
return
if index in shopfuncs:
shopfuncs[index]()
else:
print("输入不正确!请重试!")


# 购物中心========================================

# ATM====================================================
# 用于保存登录成功的用户信息
current_usr = None

# 日志装饰器.
# 日志文件
atmlog_file = open("DB/log.txt","at",encoding="utf-8")

# 用户流水文件
moneyflow = None

def atm_logger(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
# 记录日志
atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(),current_usr["name"],func.__name__))
atmlog_file.flush() # 立即刷出缓存区的数据到硬盘 如果每次write都操作一次硬盘
# 效率非常低 所以python内置了缓冲区 只有当缓冲区满了才会写入硬盘 一次来降低硬盘操作次数
return wrapper


# 登录
def atm_login():
while True:
name = input("请输入账户名:(q退出)\n").strip()
# 手动记录日志 因为用户还没有登陆
atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(), name, atm_login.__name__))
atmlog_file.flush()
if name == "q":
return
if not name:
print("用户名不能为空!")
continue
usr = get_usr(name)
if not usr:
print("用户名不存在!")
continue

pwd = input("请输入密码:\n").strip()
if not pwd:
print("密码不能为空!")
continue
if name == usr["name"] and pwd == usr["pwd"]:
print("登录成功")

global current_usr,moneyflow
# 打开流水文件
moneyflow = open("DB/%s.txt" % name,"at",encoding="utf-8")
# 记录当前登录用户信息
current_usr = usr
return
else:
print("账户名或密码不正确!请重试!")


# 提现
@login_auth
@atm_logger
def withdraw():
while True:
print("当前余额:%s元" % current_usr["money"])
money = input("请输入提款金额:(整数 q退出)\n")
if money == "q":return
if not money.isdigit():
print("输入有误!请重试!")
continue
money = int(money)
# 手续费
opt = money * 0.05
print("需要手续费%s元" % opt)
usr_moeny = float(current_usr["money"])
if money+opt > usr_moeny:
print("余额不足!很尴尬")
continue
current_usr["money"] = str(usr_moeny - money - opt)
save_to_file()
print("请提取你的钞票!")
moneyflow.write("[%s] 账户:%s 提现%s元 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
money,
current_usr["money"]))
moneyflow.flush()
return

# 转账
@login_auth
@atm_logger
def transfer():
while True:
account = input("请输入对方的账户名:\n")
to_usr = get_usr(account)
if not to_usr:
print("账户不存在 请重新输入!")
continue
print("当前余额:%s元" % current_usr["money"])
money = input("请输入转账金额:(整数 q退出)\n")
if money == "q": return
money = str_to_num(money)
if not money:
print("输入有误!请重试!")
continue
usr_moeny = float(current_usr["money"])
if money > usr_moeny:
print("余额不足!很尴尬")
continue
# 原始账户减去
current_usr["money"] = str(usr_moeny - money)
# 目标账户加上
to_usr["money"] = str(float(to_usr["money"]) + money)
save_to_file()
print("转账成功!")
moneyflow.write("[%s] 账户:%s 转账%s元 给%s 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
money,
account,
current_usr["money"]))
moneyflow.flush()
return


# 将字符串转成数字 "11212101.s"
def str_to_num(text):
if text.isdigit():
return int(text)
if "." in text:
ts = text.split(".")
if len(ts) == 2:
if ts[0].isdigit() and ts[1].isdigit():
return float(text)

# 还款
@login_auth
@atm_logger
def repayment():
print("您当前欠款:%s" % (str_to_num(current_usr["max"]) - str_to_num(current_usr["money"])))
while True:
print("repayment")
money = input("请输入还款金额!q退出:\n")
if money == "q":return
money = str_to_num(money)
if not money:
print("输入有误 请重试!")
continue
current_usr["money"] = str(str_to_num(current_usr["money"]) + money)
save_to_file()
print("还款成功!")
moneyflow.write("[%s] 账户:%s 还款%s元 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
money,
current_usr["money"]))
moneyflow.flush()
return

# 结算 需要传入订单总价格
@login_auth
@atm_logger
def paymoney(price):
if price > str_to_num(current_usr["money"]):
print("额度不足!又尴尬了")
else:
current_usr["money"] = str(str_to_num(current_usr["money"]) - price)
save_to_file()
print("结算成功!")
moneyflow.write("[%s] 账户:%s 购物消费%s元 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
price,
current_usr["money"]))
moneyflow.flush()
return True


def atm():
atm_funcs = {"1": atm_login, "2": withdraw, "3": transfer, "4": repayment}
while True:
print("""
1.登录
2.提现
3.转账
4.还款
(q.退出!)""")
index = input("请选择:\n")
if index == "q":
# 清空当前用户信息 关闭流水文件
global current_usr
if current_usr:
current_usr = None
moneyflow.close()

return
if index in atm_funcs:
atm_funcs[index]()
else:
print("输入有误请重试!")

# ATM====================================================

# 管理员接口=============================================

# 显示所有的用户信息 并从中选择一个用户
def show_users_and_select():
while True:
for usr in user_data:
print("%-10s %-10s %-10s %-2s" % (usr["name"],usr["max"],usr["money"],usr["lock"]))
select = input("请选择一个用户(输入用户名:q退出)\n")
if select == "q":
return
for u in user_data:
if select == u["name"]:
return u
else:
print("输入不正确 请重新输入!")


# 管理员登录
def admin_login():
while True:
name = input("请输入管理员账户名:(q退出)\n").strip()
if name == "q":
return
if not name:
print("用户名不能为空!")
continue
pwd = input("请输入管理员密码:\n").strip()
if not pwd:
print("密码不能为空!")
continue
if name == "admin" and pwd == "123":
print("登录成功")
return True
else:
print("账户名或密码不正确!请重试!")


#添加账户
def create_user():
while True:
name = input("请输入账户名:(q退出)\n").strip()
if name == "q":
return
if not name:
print("用户名不能为空!")
continue
# 获取用户 通过账户名
usr = get_usr(name)
if usr:
print("用户名已经存在,请重试!")
continue
pwd = input("请输入密码:\n").strip()
if not pwd:
print("密码不能为空!")
continue
if pwd != input("请再次输入密码:").strip():
print("两次密码不相同请重试!")
continue
# 将用户输入的信息打包成字典 存到列表中
new_usr = {"name":name,"pwd":pwd,"max":"15000","money":"500","lock":"0"}
user_data.append(new_usr)
print("创建成功!")
# 持久化存储......
save_to_file()
return


#调整额度
def modify_amount():
# 先选择一个用户
usr = show_users_and_select()
if not usr:
return
while True:
# 输入新的额度
new_max = input("请输入新的额度:(q退出)\n").strip()
if new_max == "q":
return
if not new_max.isdigit():
print("输入不正确 请重新输入!")
continue
usr["max"] = new_max
save_to_file()
print("修改成功!")
return

#冻结账户
def lock_user():
# 先选择一个用户
usr = show_users_and_select()
if not usr:
print("取消操作!")
return
usr["lock"] = "1"
save_to_file()
print("冻结成功!")

#解冻账户
def unlock_user():
# 先选择一个用户
usr = show_users_and_select()
if not usr:
print("取消操作!")
return
usr["lock"] = "0"
save_to_file()
print("解冻成功!")

# 管理员接口界面
def admin_view():
# 调用登录功能验证是否有权限执行操作
if not admin_login():
return
admin_funcs = {"1":create_user,"2":modify_amount,"3":lock_user,"4":unlock_user}
while True:
print("""
1.添加账户
2.修改额度
3.冻结账户
4.解冻账户
(q.退出!)""")
index = input("请选择:\n")
if index == "q":
return
if index in admin_funcs:
admin_funcs[index]()
else:
print("输入有误请重试!")
# 管理员接口=============================================

# 程序的入口函数
def run():
print("welcome to oldboy ATM system!")
# 将函数装到字典中 用序号作为key 方便判断
funcs = {"1": shop_center, "2": atm, "3": admin_view}
while True:
print("""
1.购物中心
2.ATM
3.管理员接口
(q.退出!)""")
index = input("请选择:\n")
if index == "q":
print("下次再见!")
return
if index in funcs:
funcs[index]()
else:
print("输入有误请重试!")

# 启动系统
load_data()
run()
atmlog_file.close()

# print(user_data)
# print(str_to_num("100.s"))
























# import time
import datetime
# time.time() # 当前时间戳
# datetime.datetime.now() # 本地之间


# 数据处理=====================================
# 全部用户数据
user_data = []
# 加载数据到内存
def load_data():
f = open("DB/user_db.txt","rt",encoding="utf-8")
for line in f:
line = line.strip("\n")
if line == "\n":continue
ls = line.split("|")
usr_dic = {"name":ls[0],
"pwd":ls[1],
"max": ls[2],
"money": ls[3],
"lock": ls[4]}
user_data.append(usr_dic)
f.close()

# 根据账户名获取一个用户
def get_usr(name):
for usr in user_data:
if usr["name"] == name:
return usr

# 将内存中的数据持久存储到文件中
def save_to_file():
f = open("DB/user_db.txt","wt",encoding="utf-8")
for usr in user_data:
text = "|".join(usr.values())
text += "\n"
f.write(text)
f.close()


# 数据处理=====================================

# 登录验证装饰器(闭包函数) (再不改变源代码的调用方式基础上 为这个函数添加新功能)
def login_auth(func):
def wrapper(*args,**kwargs):
# 验证是否登陆过了
if current_usr == None:
print("请先登录!")
atm_login()
if current_usr:
return func(*args,**kwargs)
else:
return func(*args,**kwargs)
return wrapper



# 购物中心========================================
# 商品信息
products = [{"name":"挨粪叉","price":6888},
{"name":"锤子TNT","price":10888},
{"name":"小米mix2","price":2888}]

# 购物车
car = {}

# 购物
def shopping():
while True:
# 打印出所有商品信息
count = 1
for p in products:
print("序号:%-3s 名称:%-10s 价格:%-6s" % (count,p["name"],p["price"]))
count += 1
select = input("亲输入商品的序号q退出:\n")
if select == "q":
return
if select.isdigit() and int(select) >= 1 and int(select) <= len(products):
pd = products[int(select)-1]
print("%s已成功加入购物车!" % pd["name"])
# 判断商品是否已经存在于购物车
if pd["name"] in car:
car[pd["name"]]["count"] += 1
else:
car[pd["name"]] = {"price":pd["price"],"count":1}
else:
print("输入有误请重新输入!")


# 查看购物车
def show_cars():
if not car:
s = input("你的购物车是空的! 你要买点什么吗? y/n")
if s == "y":
shopping()
return
else:
return
print("您的购物车信息:")
for p in car:
print("名称:%-10s 价格:%-8s 数量:%-3s 总价:%-10s" % (p,
car[p]["price"],
car[p]["count"],
car[p]["price"] * car[p]["count"]))
select = input("输入y调整商品数量!(数量为0则删除商品!) 输入其他退出!")
if select == "y":
modify_count()


# 调整购物车中的商品数量
def modify_count():
while True:
name = input("请输入商品名称q退出:\n")
if name == "q":
return
if name not in car:
print("输入不正确请重试!")
continue

while True:
count = input("输入调整后数量:\n")
if not count.isdigit():
print("数量不正确 必须是整数!")
continue
count = int(count)
if count == 0:
car.pop(name)
print("%s已删除" % name)
return
else:
car[name]["count"] = count
print("修改成功!")
return


# 结算
@login_auth
def pay_cars():
# 计算商品总价格
sum = 0
for p in car:
sum += car[p]["price"] * car[p]["count"]
print("您的订单总价为:%s元" % sum)
if paymoney(sum):
print("剁手成功! 回家等着吧!")
clear_cars()


# 清空购物车
def clear_cars():
car.clear()
print("购物车已清空!")


def shop_center():
shopfuncs = {"1":shopping,"2":show_cars,"3":pay_cars,"4":clear_cars}
while True:
print("""
1.购物
2.查看购物车
3.结算
4.清空
q.退出""")
index = input("请选择:\n").strip()
if index == "q":
return
if index in shopfuncs:
shopfuncs[index]()
else:
print("输入不正确!请重试!")


# 购物中心========================================

# ATM====================================================
# 用于保存登录成功的用户信息
current_usr = None

# 日志装饰器.
# 日志文件
atmlog_file = open("DB/log.txt","at",encoding="utf-8")

# 用户流水文件
moneyflow = None

def atm_logger(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
# 记录日志
atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(),current_usr["name"],func.__name__))
atmlog_file.flush() # 立即刷出缓存区的数据到硬盘 如果每次write都操作一次硬盘
# 效率非常低 所以python内置了缓冲区 只有当缓冲区满了才会写入硬盘 一次来降低硬盘操作次数
return wrapper


# 登录
def atm_login():
while True:
name = input("请输入账户名:(q退出)\n").strip()
# 手动记录日志 因为用户还没有登陆
atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(), name, atm_login.__name__))
atmlog_file.flush()
if name == "q":
return
if not name:
print("用户名不能为空!")
continue
usr = get_usr(name)
if not usr:
print("用户名不存在!")
continue

pwd = input("请输入密码:\n").strip()
if not pwd:
print("密码不能为空!")
continue
if name == usr["name"] and pwd == usr["pwd"]:
print("登录成功")

global current_usr,moneyflow
# 打开流水文件
moneyflow = open("DB/%s.txt" % name,"at",encoding="utf-8")
# 记录当前登录用户信息
current_usr = usr
return
else:
print("账户名或密码不正确!请重试!")


# 提现
@login_auth
@atm_logger
def withdraw():
while True:
print("当前余额:%s元" % current_usr["money"])
money = input("请输入提款金额:(整数 q退出)\n")
if money == "q":return
if not money.isdigit():
print("输入有误!请重试!")
continue
money = int(money)
# 手续费
opt = money * 0.05
print("需要手续费%s元" % opt)
usr_moeny = float(current_usr["money"])
if money+opt > usr_moeny:
print("余额不足!很尴尬")
continue
current_usr["money"] = str(usr_moeny - money - opt)
save_to_file()
print("请提取你的钞票!")
moneyflow.write("[%s] 账户:%s 提现%s元 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
money,
current_usr["money"]))
moneyflow.flush()
return

# 转账
@login_auth
@atm_logger
def transfer():
while True:
account = input("请输入对方的账户名:\n")
to_usr = get_usr(account)
if not to_usr:
print("账户不存在 请重新输入!")
continue
print("当前余额:%s元" % current_usr["money"])
money = input("请输入转账金额:(整数 q退出)\n")
if money == "q": return
money = str_to_num(money)
if not money:
print("输入有误!请重试!")
continue
usr_moeny = float(current_usr["money"])
if money > usr_moeny:
print("余额不足!很尴尬")
continue
# 原始账户减去
current_usr["money"] = str(usr_moeny - money)
# 目标账户加上
to_usr["money"] = str(float(to_usr["money"]) + money)
save_to_file()
print("转账成功!")
moneyflow.write("[%s] 账户:%s 转账%s元 给%s 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
money,
account,
current_usr["money"]))
moneyflow.flush()
return


# 将字符串转成数字 "11212101.s"
def str_to_num(text):
if text.isdigit():
return int(text)
if "." in text:
ts = text.split(".")
if len(ts) == 2:
if ts[0].isdigit() and ts[1].isdigit():
return float(text)

# 还款
@login_auth
@atm_logger
def repayment():
print("您当前欠款:%s" % (str_to_num(current_usr["max"]) - str_to_num(current_usr["money"])))
while True:
print("repayment")
money = input("请输入还款金额!q退出:\n")
if money == "q":return
money = str_to_num(money)
if not money:
print("输入有误 请重试!")
continue
current_usr["money"] = str(str_to_num(current_usr["money"]) + money)
save_to_file()
print("还款成功!")
moneyflow.write("[%s] 账户:%s 还款%s元 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
money,
current_usr["money"]))
moneyflow.flush()
return

# 结算 需要传入订单总价格
@login_auth
@atm_logger
def paymoney(price):
if price > str_to_num(current_usr["money"]):
print("额度不足!又尴尬了")
else:
current_usr["money"] = str(str_to_num(current_usr["money"]) - price)
save_to_file()
print("结算成功!")
moneyflow.write("[%s] 账户:%s 购物消费%s元 余额%s元\n" % (datetime.datetime.now(),
current_usr["name"],
price,
current_usr["money"]))
moneyflow.flush()
return True


def atm():
atm_funcs = {"1": atm_login, "2": withdraw, "3": transfer, "4": repayment}
while True:
print("""
1.登录
2.提现
3.转账
4.还款
(q.退出!)""")
index = input("请选择:\n")
if index == "q":
# 清空当前用户信息 关闭流水文件
global current_usr
if current_usr:
current_usr = None
moneyflow.close()

return
if index in atm_funcs:
atm_funcs[index]()
else:
print("输入有误请重试!")

# ATM====================================================

# 管理员接口=============================================

# 显示所有的用户信息 并从中选择一个用户
def show_users_and_select():
while True:
for usr in user_data:
print("%-10s %-10s %-10s %-2s" % (usr["name"],usr["max"],usr["money"],usr["lock"]))
select = input("请选择一个用户(输入用户名:q退出)\n")
if select == "q":
return
for u in user_data:
if select == u["name"]:
return u
else:
print("输入不正确 请重新输入!")


# 管理员登录
def admin_login():
while True:
name = input("请输入管理员账户名:(q退出)\n").strip()
if name == "q":
return
if not name:
print("用户名不能为空!")
continue
pwd = input("请输入管理员密码:\n").strip()
if not pwd:
print("密码不能为空!")
continue
if name == "admin" and pwd == "123":
print("登录成功")
return True
else:
print("账户名或密码不正确!请重试!")


#添加账户
def create_user():
while True:
name = input("请输入账户名:(q退出)\n").strip()
if name == "q":
return
if not name:
print("用户名不能为空!")
continue
# 获取用户 通过账户名
usr = get_usr(name)
if usr:
print("用户名已经存在,请重试!")
continue
pwd = input("请输入密码:\n").strip()
if not pwd:
print("密码不能为空!")
continue
if pwd != input("请再次输入密码:").strip():
print("两次密码不相同请重试!")
continue
# 将用户输入的信息打包成字典 存到列表中
new_usr = {"name":name,"pwd":pwd,"max":"15000","money":"500","lock":"0"}
user_data.append(new_usr)
print("创建成功!")
# 持久化存储......
save_to_file()
return


#调整额度
def modify_amount():
# 先选择一个用户
usr = show_users_and_select()
if not usr:
return
while True:
# 输入新的额度
new_max = input("请输入新的额度:(q退出)\n").strip()
if new_max == "q":
return
if not new_max.isdigit():
print("输入不正确 请重新输入!")
continue
usr["max"] = new_max
save_to_file()
print("修改成功!")
return

#冻结账户
def lock_user():
# 先选择一个用户
usr = show_users_and_select()
if not usr:
print("取消操作!")
return
usr["lock"] = "1"
save_to_file()
print("冻结成功!")

#解冻账户
def unlock_user():
# 先选择一个用户
usr = show_users_and_select()
if not usr:
print("取消操作!")
return
usr["lock"] = "0"
save_to_file()
print("解冻成功!")

# 管理员接口界面
def admin_view():
# 调用登录功能验证是否有权限执行操作
if not admin_login():
return
admin_funcs = {"1":create_user,"2":modify_amount,"3":lock_user,"4":unlock_user}
while True:
print("""
1.添加账户
2.修改额度
3.冻结账户
4.解冻账户
(q.退出!)""")
index = input("请选择:\n")
if index == "q":
return
if index in admin_funcs:
admin_funcs[index]()
else:
print("输入有误请重试!")
# 管理员接口=============================================

# 程序的入口函数
def run():
print("welcome to oldboy ATM system!")
# 将函数装到字典中 用序号作为key 方便判断
funcs = {"1": shop_center, "2": atm, "3": admin_view}
while True:
print("""
1.购物中心
2.ATM
3.管理员接口
(q.退出!)""")
index = input("请选择:\n")
if index == "q":
print("下次再见!")
return
if index in funcs:
funcs[index]()
else:
print("输入有误请重试!")

# 启动系统
load_data()
run()
atmlog_file.close()

# print(user_data)
# print(str_to_num("100.s"))









































# 只有程序时从当前文件开始运行时才进入if语句
# if __name__ == '__main__':



















# 只有程序时从当前文件开始运行时才进入if语句
# if __name__ == '__main__':

转载于:https://www.cnblogs.com/hua-zhong/p/9768905.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

esp8266 擦拭_【一起玩esp8266】flash的擦除方法——专治疑难杂症

出现新问题。。。COM口没法操作 拒绝访问C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\Scripts>esptool.py --port COM6 erase_flashesptool.py v2.3.1Traceback (most recent call last):File "C:\Users\Administrator\AppData\Local\Programs\…

诗人李白小评

李白其实一生都不得志&#xff0c;他从小学文习武&#xff0c;少年时开始“行路&#xff0c;读万卷书&#xff0c;拜万家师”&#xff0c;希望走一条由人推荐&#xff0c;而一举成名的道路。可惜他忌恶如仇的性格&#xff0c;开罪了小人&#xff0c;导致小人对他仕途之路的极力…

智能家居 (11) ——树莓派摄像头捕捉人脸并识别

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

centos上使用高版本gcc、g++

0x0 在centos7上gcc版本是4.85&#xff0c;在编译一些代码时需要使用g的一些新特性&#xff0c;而网上大多教程都是重新编译gcc&#xff0c;太麻烦了&#xff0c;在centos 7上默认是yum search不到高版本的gcc的 安装scl scl 是Software collections 的缩写&#xff0c;安装…

【Docker系列教程之一】docker入门

我们在理解 docker 之前&#xff0c;首先我们得先区分清楚两个概念&#xff0c;容器和虚拟机。 我们用的传统虚拟机如 VMware &#xff0c; VisualBox 之类的需要模拟整台机器包括硬件&#xff0c;每台虚拟机都需要有自己的操作系统&#xff0c;虚拟机一旦被开启&#xff0c;预…

jmeter聚个报告怎么看qps_【jmeter】jmeter测试网站QPS

上一节中&#xff0c;我们了解了jmeter的一此主要元件&#xff0c;那么这些元件如何使用到性能测试中呢。这一节创建一个简单的测试计划来使用这些元件。该计划对应的测试需求。1)测试目标网站是fnng.cnblogs.com2)测试目的是该网站在负载达到20 QPS 时的响应时间。QPS 解释QPS…

mysql升级5.5

对付Linux的问题&#xff0c;其实很多都是权限问题&#xff0c;细心想一下即可。 centos6.4默认装的是mysql5.1&#xff0c;使用 yum update 也update不了。google了一下&#xff0c;找到个yum安装的方法&#xff1a;http://www.webtatic.com/packages/mysql55/ 先备份一下&…

Java基础 —— 变量,选择,循环,数组,输入与输出等

目录嵌入式学JAVAJava安卓开发环境搭建并运行HelloWorld概念引入JavaSE,EE,ME的区别JREJDK编程实操&#xff1a;从C面向过程转变变量定义与输出数组的定义与遍历(循环、控制、选择和C完全一样)函数的调用&#xff1a;类比c语言结构体的使用输入数据&#xff1a;Scanner嵌入式学…

ubuntu20 编译dpdk错误 -Werror=address-of-packed-member

0x0 在ubuntu20上编译dpdk 18.11报错&#xff0c;gcc 版本为9.3.0&#xff0c;报错如下&#xff1a; error: converting a packed ‘const struct ether_addr’ pointer (alignment 1) to a ‘unaligned_uint16_t’ {aka ‘const short unsigned int’} pointer (alignment 2…

linux 火狐无法执行二进制文件_尝试在Linux上运行Shell脚本时“无法执行二进制文件”...

我对linux和shell编写非常陌生。我正在尝试使用以下命令从linux上的安全shell(ssh)运行shellscript&#xff1a;chmod x path/to/mynewshell.shsh path/to/mynewshell.sh我收到此错误&#xff1a;path/to/mynewshell.sh: path/to/mynewshell.sh: cannot execute binary file.尝…

Java 特性

Java有四大特性&#xff1a; 1.封装&#xff1a;隐藏对象的属性和实现细节&#xff0c;仅仅对外公开接口。 封装具有一下优点&#xff1a; 便于使用者正确、方便的使用系统&#xff0c;防止使用者错误修改系统属性&#xff1b;有助于建立各个系统之间的松耦合关系&#xff1b;…

MyBatis 传递多个参数

2019独角兽企业重金招聘Python工程师标准>>> 在MyBatis中可以用以下的方式来传递多个参数 1. 用java.util.Map来传递, Code 如下: public List<User> getAllUsersByUserName(String username, int start, int limit){Map<String,Object> params new H…

Linux stmac网卡代码分析----probe

probe 主要分析一下驱动的主要框架&#xff0c;必要地方细致分析下 文件位置&#xff1a; drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c 从文件的最后看起&#xff1a; module_pci_driver(stmmac_pci_driver); stmmac_pci_driver结构体如下&#xff0c;里面包含了id_…

Java面向对象(1) —— 封装

目录一、封装的概念二、类的封装以及使用三、访问修饰符四、属性封装的实现五、方法封装的实现六、UML类图七、类的构造方法与可重载八、this关键字九、static关键字十、方法重载&#xff1a;overload十一、包&#xff1a;package一、封装的概念 将字段&#xff08;C结构体中的…

太阳能板清洗机器人科沃斯_科沃斯推出水清洗扫地机器人 要把打扫做的更彻底...

传统的扫地机器人只能对家里的灰尘做简单清扫&#xff0c;要想打扫的更彻底&#xff0c;还是得靠周末自己拿上工具水洗一遍。现在科沃斯就推出了可以帮你用水清洗地面的扫地机器人&#xff0c;不用再担心地面清洁不干净。科沃斯扫地机器人的水清洁方式一共分为五步&#xff0c;…

linux下源码软件包的安装

我们在使用linux做服务器的时候&#xff0c;因为linux自带的软件包都有些老&#xff0c;不是最新的&#xff0c;但是有时候我们为了使用最新的软件&#xff0c;会使用最新的软件的源码来进行安装。所以我们需要用心去做了...在我们拿到一个软件的源码时&#xff0c;源码一般都是…

react-native 打包apk 并解决 图片 不出现问题

react-native官网打包apk方法&#xff1a;https://reactnative.cn/docs/signed-apk-android/ 解决办法&#xff1a; 找到项目 android目录下 gradle.properties文件 打开加入如下代码&#xff1a; android.enableAapt2false这段代码非常重要 官网缺少 。不然打包apk图片不出现。…

龙芯派2亚克力外壳

0x0 龙芯派自带的亚克力顶板没有风扇的孔位&#xff0c;在长时间运行时亚克力板很烫&#xff0c;因此我设计了个带风扇孔位的亚克力顶板 效果如下&#xff1a; 风扇规格 4X4风扇 供电由龙芯派的GPIO上的5V管脚供电 使用方法 1.某宝搜索亚克力板定制 2. 将本文件发送给店家…

Java面向对象(2) —— 继承

目录前言继承的概念和实现extends关键字super关键字继承过来的属性和方法的权限研究方法重写OverrideObject根类常见方法toString()常把toString()方法重写后应用equals()重写&#xff1a;判断两个对象p1和p2特征是否相同IDEA的重写模板&#xff1a;敲equals可选择的方案之一St…

linux下达梦数据库启动_linux 平台 达梦DM 7 数据库 启动与关闭

在之前的博客我们了解了Linux 平台下DM7的安装&#xff0c;如下&#xff1a;在本篇博客里我们了解一下DM7的启动和关闭。1 背景知识说明1.1 DM DB的启动过程DM的启动主要按如下三个步骤进行&#xff1a;1.读取配置文件(.ini)2.读取控制文件(dm.ctl)3.读取重做日志文件(.log) 和…