要求有答辩加注释
1.停车场自动收费系统
项目描述:通过输入操作代替识别功能,根据停车时间实现自动收费
计算。
具体描述如下:
(1)停车场最多有 50个车位;
(2)通过输入车牌判断车辆的进入和出去;
(3)在车辆进入时,查看是否有车位并记录时间;
(4)在车辆离开时,使停车位增加,并计算停留时间,计算的时间记录到秒
即可;
(5)收费计算:2小时内免费,2-4 小时费用为 10元,4-6 小时费用为 15
6-8 小时费用为 20 元,8-10 小时费用为 25 元,10 小时以上费用为
30元
项目完成报告内容:
(1)根据项目描述,利用层次方框图描述项目的功能图,画出项目的 IPO
图;
2)根据项目描述,设计收费系统界面;
画出程序流程图;
利用函数完成收费系统各个功能柏也
保存程序运行的各种结果截图。
)在项目代码重要语句和功能模块位置添加注释信息,注释量不少于
代码行数的三分之一。
设计提示:
计时功能可使用 Python 标准库 datetime实现;
停车时间的计算截止到秒即可;
可适当考虑交费后的延时处理,如交费后1分钟内离场。
import time
# 定义车辆类
class Car:
def __init__(self, plate_number):
self.plate_number = plate_number
self.enter_time = None # 进入时间
self.leave_time = None # 离开时间
# 定义停车场类
class ParkingLot:
def __init__(self):
self.capacity = 50 # 停车场容量
self.available_spaces = self.capacity # 剩余停车位数量
self.parking_spaces = {} # 正在使用的停车位字典
# 进入停车场函数
def enter_parking_lot(self, plate_number):
if self.available_spaces > 0: # 还有停车位
car = Car(plate_number) # 创建车辆实例
car.enter_time = time.time() # 记录进入时间
self.parking_spaces[plate_number] = car # 加入已使用停车位字典
self.available_spaces -= 1 # 剩余停车位数量减少
print(f"车辆 {plate_number} 进入停车场,剩余停车位:{self.available_spaces}")
else:
print("停车场已满,无法进入")
# 离开停车场函数
def leave_parking_lot(self, plate_number):
if plate_number in self.parking_spaces: # 车辆在停车场内
car = self.parking_spaces[plate_number] # 获取车辆实例
car.leave_time = time.time() # 记录离开时间
parking_time = int(car.leave_time - car.enter_time) # 计算停车时间,单位为秒
parking_cost = self.calculate_parking_cost(parking_time) # 计算停车费用
del self.parking_spaces[plate_number] # 删除已使用停车位字典中的该车辆信息
self.available_spaces += 1 # 剩余停车位数量增加
print(f"车辆 {plate_number} 离开停车场,停车时间:{parking_time}秒,停车费用:{parking_cost}元,剩余停车位:{self.available_spaces}")
else:
print("该车未在停车场内")
# 计算停车费用函数
def calculate_parking_cost(self, parking_time):
if parking_time <= 7200: # 2小时内免费
return 0
elif parking_time <= 14400: # 2-4小时,费用为10元
return 10
elif parking_time <= 21600: # 4-6小时,费用为15元
return 15
elif parking_time <= 28800: # 6-8小时,费用为20元
return 20
elif parking_time <= 36000: # 8-10小时,费用为25元
return 25
else: # 10小时以上,费用为30元
return 30
# 创建停车场实例
parking_lot = ParkingLot()
# 循环等待用户操作,直至用户输入"q"结束程序
while True:
print("请输入操作:1-车辆进入停车场,2-车辆离开停车场,q-退出程序")
option = input()
if option == "1":
print("请输入车牌号码:")
plate_number = input()
parking_lot.enter_parking_lot(plate_number)
elif option == "2":
print("请输入车牌号码:")
plate_number = input()
parking_lot.leave_parking_lot(plate_number)
elif option == "q": # 退出程序
break
else:
print("无效的操作,请重新输入")
# 停车场自动收费系统
# 导入所需的时间库
import datetime
# 定义停车场车位数量
# 停车场最多有50个车位
total_parking_spaces = 50
# 定义收费标准
free_duration = 2
rate_2_4_hours = 10
rate_4_6_hours = 15
rate_6_8_hours = 20
rate_8_10_hours = 25
rate_above_10_hours = 30
# 定义一个空列表用于存储停车时间
parking_times = []
# 定义函数:车辆进入停车场
def vehicle_entry(license_plate):
if len(parking_times) >= total_parking_spaces:
print("停车场已满,请等待")
else:
entry_time = datetime.datetime.now()
parking_times.append((license_plate, entry_time))
print(f"车辆 {license_plate} 进入停车场")
# 定义函数:车辆离开停车场
def vehicle_exit(license_plate):
for i in range(len(parking_times)):
if parking_times[i][0] == license_plate:
exit_time = datetime.datetime.now()
parking_duration = exit_time - parking_times[i][1]
parking_times.pop(i)
calculate_parking_fee(parking_duration)
print(f"车辆 {license_plate} 离开停车场")
break
# 定义函数:计算停车费用
def calculate_parking_fee(parking_duration):
parking_duration_in_hours = parking_duration.total_seconds() / 3600
if parking_duration_in_hours <= free_duration:
fee = 0
elif parking_duration_in_hours <= 4:
fee = rate_2_4_hours
elif parking_duration_in_hours <= 6:
fee = rate_4_6_hours
elif parking_duration_in_hours <= 8:
fee = rate_6_8_hours
elif parking_duration_in_hours <= 10:
fee = rate_8_10_hours
else:
fee = rate_above_10_hours
print(f"停车费用为 {fee} 元")
# 主程序流程
if __name__ == "__main__":
license_plate = input("请输入车牌号码:")
vehicle_entry(license_plate)
license_plate = input("请输入车牌号码:")
vehicle_exit(license_plate)
该程序使用了Python标准库datetime来实现计时功能,停车时间的计算截止到秒。在车辆离开停车场后,会根据停车时长计算停车费用,并输出结果。程序还使用了函数来实现各个功能模块,增加了代码的可读性和复用性。
。都快答辩了你现在急
import datetime
# 定义停车场最大车位数
MAX_PARKING_SPACES = 50
# 定义收费标准
PARKING_FEE = {
7200: 0,
14400: 10,
21600: 15,
28800: 20,
36000: 25,
float('inf'): 30
}
# 定义停车场状态
parking_lot = {}
# 检查停车场是否已满
def check_parking_lot_full(parking_lot, max_parking_spaces):
"""
检查停车场是否已满
:param parking_lot: 当前停车场状态
:param max_parking_spaces: 停车场最大车位数
:return: True表示停车场已满,False表示停车场未满
"""
return len(parking_lot) >= max_parking_spaces
# 计算停车时间
def calculate_parking_time(entry_time, exit_time):
"""
计算停车时间
:param entry_time: 车辆进入时间
:param exit_time: 车辆离开时间
:return: 停车时间,单位为秒
"""
parking_time = (exit_time - entry_time).total_seconds()
return parking_time
# 计算停车费用
def calculate_parking_fee(parking_time):
"""
计算停车费用
:param parking_time: 停车时间,单位为秒
:return: 停车费用
"""
for time_limit, fee in PARKING_FEE.items():
if parking_time <= time_limit:
return fee
# 车辆进入停车场
def vehicle_entry(parking_lot):
"""
车辆进入停车场
:param parking_lot: 当前停车场状态
"""
# 检查停车场是否已满
if check_parking_lot_full(parking_lot, MAX_PARKING_SPACES):
print("停车场已满,无法进入!")
return
# 输入车牌号码
license_plate = input("请输入车牌号码:")
# 记录车辆进入时间
entry_time = datetime.datetime.now()
# 将车辆加入停车场状态
parking_lot[license_plate] = entry_time
print("车辆已进入停车场,停车时间为:{}".format(entry_time))
# 车辆离开停车场
def vehicle_exit(parking_lot):
"""
车辆离开停车场
:param parking_lot: 当前停车场状态
"""
# 输入车牌号码
license_plate = input("请输入车牌号码:")
# 检查车辆是否在停车场中
if license_plate not in parking_lot:
print("车辆不在停车场中!")
return
# 记录车辆离开时间
exit_time = datetime.datetime.now()
# 计算停车时间和停车费用
entry_time = parking_lot[license_plate]
parking_time = calculate_parking_time(entry_time, exit_time)
parking_fee = calculate_parking_fee(parking_time)
# 输出停车时间和停车费用
print("车辆已离开停车场,停车时间为:{},停车费用为:{}元".format(parking_time, parking_fee))
# 将车辆从停车场状态中删除
del parking_lot[license_plate]
# 主程序
def main():
while True:
# 显示菜单
print("停车场自动收费系统")
print("1. 车辆进入停车场")
print("2. 车辆离开停车场")
print("3. 退出系统")
# 获取用户输入
choice = input("请输入您的选择:")
# 根据用户选择执行相应操作
if choice == "1":
vehicle_entry(parking_lot)
elif choice == "2":
vehicle_exit(parking_lot)
elif choice == "3":
break
else:
print("输入错误,请重新输入!")
if __name__ == '__main__':
main()
也就是说,当我们传的参数是int、字符串(string)、float、(数值型number)、元组(tuple) 时,无论函数中对其做什么操作,都不会改变函数外这个参数的值;
当传的是字典型(dictionary)、列表型(list)时,如果是重新对其进行赋值,则不会改变函数外参数的值,如果是对其进行操作,则会改变。
即变量中存储的是引用 , 是指向真正内容的内存地址 , 对变量重新赋值 , 相当于修改了变量副本存储的内存地址 , 而这时的变量已经和函数体外的变量不是同一个了, 在函数体之外的变量 , 依旧存储的是原本的内存地址 , 其值自然没有发生改变 。
停车场自动收费系统界面如下:
==============================================
欢迎使用停车场自动收费系统!
1. 停车
2. 离开
3. 查看当前停车情况
4. 退出系统
请选择您需要的操作:
停车场自动收费系统程序流程图如下:
Start
初始化停车场车位信息,记录当前时间
循环执行以下操作:
显示系统界面
获取用户输入的操作选项
如果用户选择操作为“停车”:
检查是否还有剩余车位,如有,则进行停车操作
显示停车成功信息
如果用户选择操作为“离开”:
获取用户输入的车牌号和离开时间
根据车牌号查找停车记录,计算停车费用
显示停车费用信息
从停车记录中删除该车辆信息
更新停车场车位信息
如果用户选择操作为“查看当前停车情况”:
显示当前停车记录并统计已停车辆数和剩余车位数
如果用户选择操作为“退出系统”:
结束程序
End
根据程序流程图,我们可以将程序分为多个函数来实现不同的功能模块,实现代码如下:
import datetime
num_of_spaces = 50 # 停车场最大车位数
parking_data = [] # 停车记录
def init_parking_data():
"""初始化停车场车位信息,记录当前时间"""
global parking_data
parking_data = [{'license_plate': '', 'parking_time': None} for _ in range(num_of_spaces)]
print('停车场共{}个车位,现有{}个空闲车位。'.format(num_of_spaces, num_of_spaces - len(parking_data)))
def display_menu():
"""显示系统界面"""
print("=" * 46)
print("欢迎使用停车场自动收费系统!")
print("1. 停车")
print("2. 离开")
print("3. 查看当前停车情况")
print("4. 退出系统")
print("请选择您需要的操作: ")
def park_car(license_plate):
"""停车操作"""
global parking_data
if len(parking_data) < num_of_spaces:
parking_data.append({'license_plate': license_plate, 'parking_time': datetime.datetime.now()})
print('停车成功!')
else:
print('非常抱歉,停车场已满,请您到其他停车场停车。')
def leave_car(license_plate):
"""离开操作"""
global parking_data
for car in parking_data:
if car['license_plate'] == license_plate:
# 计算停车费用
parking_time = car['parking_time']
leaving_time = datetime.datetime.now()
duration = leaving_time - parking_time
hours, remainder = divmod(duration.seconds, 3600)
minutes, _ = divmod(remainder, 60)
total_hours = duration.days * 24 + hours
if total_hours <= 2:
fee = 0
elif total_hours <= 4:
fee = 10
elif total_hours <= 6:
fee = 15
elif total_hours <= 8:
fee = 20
elif total_hours <= 10:
fee = 25
else:
fee = 30
print('停车时间:{}小时{}分钟,停车费用为{}元。'.format(total_hours, minutes, fee))
# 从停车记录中删除该车辆信息
parking_data.remove(car)
print('车辆已离开车位。')
return
else:
print('未找到该车辆,请确认是否在停车场内停车。')
def display_parking_status():
"""查看当前停车情况"""
global parking_data
print('当前停车情况:')
for i, car in enumerate(parking_data):
print('车位{}:{}'.format(i + 1, car['license_plate'] if car['license_plate'] else '空'))
print('已停车辆数:{},剩余车位数:{}'.format(len(parking_data), num_of_spaces - len(parking_data)))
def shutdown_system():
"""退出系统"""
print('感谢您使用停车场自动收费系统,祝您生活愉快!')
def main():
"""主程序"""
init_parking_data()
while True:
display_menu()
choice = input()
if choice == '1':
license_plate = input("请输入车牌号码:")
park_car(license_plate)
elif choice == '2':
license_plate = input("请输入车牌号码:")
leave_car(license_plate)
elif choice == '3':
display_parking_status()
elif choice == '4':
shutdown_system()
break
else:
print('输入无效,请重新输入。')
if __name__ == '__main__':
main()
使用以上代码实现停车场自动收费系统后,在命令行运行程序,可以得到以下效果:
停车场共50个车位,现有50个空闲车位。
==============================================
欢迎使用停车场自动收费系统!
1. 停车
2. 离开
3. 查看当前停车情况
4. 退出系统
请选择您需要的操作:
1
请输入车牌号码:京A12345
停车成功!
==============================================
欢迎使用停车场自动收费系统!
1. 停车
2. 离开
3. 查看当前停车情况
4. 退出系统
请选择您需要的操作:
3
当前停车情况:
车位1:京A12345
车位2:空
车位3:空
...
已停车辆数:1,剩余车位数:49
==============================================
欢迎使用停车场自动收费系统!
1. 停车
2. 离开
3. 查看当前停车情况
4. 退出系统
请选择您需要的操作:
2
请输入车牌号码:京A12345
停车时间:0小时3分钟,停车费用为10元。
车辆已离开车位。
==============================================
欢迎使用停车场自动收费系统!
1. 停车
2. 离开
3. 查看当前停车情况
4. 退出系统
请选择您需要的操作:
3
当前停车情况:
车位1:空
车位2:空
车位3:空
...
已停车辆数:0,剩余车位数:50
==============================================
欢迎使用停车场自动收费系统!
1. 停车
2. 离开
3. 查看当前停车情况
4. 退出系统
请选择您需要的操作:
4
感谢您使用停车场自动收费系统,祝您生活愉快!
在停车成功后,可以查看当前停车情况,离开时根据停车时间计算停车费用,查看当前停车情况时可以统计已停车辆数和剩余车位数。在退出系统时,会退出程序。