如何在汽车租赁程序中实现库存为0时终止租赁操作?
问题描述
我开发了一款汽车租赁程序,用户租赁特定车辆时,该车辆的可用数量会递减。比如某车辆初始可用数量为2,用户租赁两次后可用数量变为0。我希望当用户尝试租赁可用数量已为0的车辆时,程序终止相关计算与操作,并打印提示“This car is not available.”。但当前程序在可用数量为0时仍会继续执行租赁操作,导致可用数量变成负数,找不到问题出在哪,以下是我的代码:
print("Please select one: \n\t\b\b\b\b\b1. Car Rental \n\t\b\b\b\b\b2. Car Return \n\t\b\b\b\b\b2. Print the totals") option_no = int(input("Option no.: ")) operation = 'y' or 'Y' camery_availability = 3 pajero_availability = 2 altima_availability = 2 while operation=='Y' or operation=='y': if option_no==1: print("Select one of the available cars: ") print("--------------------------------------------------------------------------------------------------------------") print("Model \t\tAvailable \tPrice/day \tLiability insurance/day \tComprehensive insurance/day") print("--------------------------------------------------------------------------------------------------------------") camery_price = 90 camery_liability_insurance = 20 camery_comprhensive_insurance = 50 print("1. Camery \t\t\b\b\b\b\b",camery_availability, "\t\t\t\b\b\b\b\bQR90 \t\tQR20 \t\t\t\t\t\b\b\b\bQR50") pajero_price = 150 pajero_liability_insurance = 30 pajero_comprhensive_insurance = 70 print("2. Pajero \t\t\b\b\b\b\b",pajero_availability, "\t\t\t\b\b\b\b\bQR150 \t\tQR30 \t\t\t\t\t\b\b\b\bQR70") altima_price = 70 altima_liability_insurance = 20 altima_comprhensive_insurance = 50 print("3. Altima \t\t\b\b\b\b\b",altima_availability, "\t\t\t\b\b\b\b\bQR70 \t\tQR20 \t\t\t\t\t\b\b\b\bQR50") car_type = int(input("Enter car type: ")) No_of_days = int(input("Enter how many days: ")) insurance_type = input("Enter 'L' for Liability insurance and 'F' for full insurance: ") #car type 1 (camery) if car_type==1: if insurance_type=='L' or insurance_type=='l': cost = No_of_days*camery_price insurance_cost = No_of_days*camery_liability_insurance tax = cost*0.05 total = cost+insurance_cost+tax print("Cost: QR", format(cost, '.2f')) print("Insurance: QR", format(insurance_cost, '.2f')) print("Tax: QR", format(tax, '.2f')) print("--------------------------------") print("Total: ", format(total, '.2f')) elif insurance_type=='F' or insurance_type=='f': cost = No_of_days*camery_price insurance_cost = No_of_days*camery_comprhensive_insurance tax = cost*0.05 total = cost+insurance_cost+tax print("Cost: QR", format(cost, '.2f')) print("Insurance: QR", format(insurance_cost, '.2f')) print("Tax: QR", format(tax, '.2f')) print("--------------------------------") print("Total: ", format(total, '.2f')) else: print("Error. Please enter the correct character") operation = input("More operation? [Y/N] ") if operation=='N' or operation=='n': break camery_availability = camery_availability - 1 #car type 2 (Pajero) if car_type==2: if insurance_type=='L' or insurance_type=='l': cost = No_of_days*pajero_price insurance_cost = No_of_days*pajero_liability_insurance tax = cost*0.05 total = cost+insurance_cost+tax print("Cost: QR", format(cost, '.2f')) print("Insurance: QR", format(insurance_cost, '.2f')) print("Tax: QR", format(tax, '.2f')) print("--------------------------------") print("Total: ", format(total, '.2f')) elif insurance_type=='F' or insurance_type=='f': cost = No_of_days*pajero_price insurance_cost = No_of_days*pajero_comprhensive_insurance tax = cost*0.05 total = cost+insurance_cost+tax print("Cost: QR", format(cost, '.2f')) print("Insurance: QR", format(insurance_cost, '.2f')) print("Tax: QR", format(tax, '.2f')) print("--------------------------------") print("Total: ", format(total, '.2f')) else: print("Error. Please enter the correct character") operation = input("More operation? [Y/N] ") if operation=='N' or operation=='n': break pajero_availability = pajero_availability - 1 #car type 3 (Altima) elif car_type==3: if insurance_type=='L' or insurance_type=='l': cost = No_of_days*altima_price insurance_cost = No_of_days*altima_liability_insurance tax = cost*0.05 total = cost+insurance_cost+tax print("Cost: QR", format(cost, '.2f')) print("Insurance: QR", format(insurance_cost, '.2f')) print("Tax: QR", format(tax, '.2f')) print("--------------------------------") print("Total: ", format(total, '.2f')) elif insurance_type=='F' or insurance_type=='f': cost = No_of_days*altima_price insurance_cost = No_of_days*altima_comprhensive_insurance tax = cost*0.05 total = cost+insurance_cost+tax print("Cost: QR", format(cost, '.2f')) print("Insurance: QR", format(insurance_cost, '.2f')) print("Tax: QR", format(tax, '.2f')) print("--------------------------------") print("Total: ", format(total, '.2f')) else: print("Error. Please enter the correct character") operation = input("More operation? [Y/N] ") if operation=='N' or operation=='n': break altima_availability = altima_availability - 1
问题根源
核心问题是没有在用户选择车辆后先检查可用数量,直接执行了计费计算和库存递减操作,导致车辆库存为0时仍能被租赁。此外代码还存在逻辑冗余、判断结构不严谨的问题。
修复后的代码
print("Please select one: \n\t1. Car Rental \n\t2. Car Return \n\t3. Print the totals") option_no = int(input("Option no.: ")) operation = 'y' camery_availability = 3 pajero_availability = 2 altima_availability = 2 while operation.lower() == 'y': if option_no == 1: print("Select one of the available cars: ") print("--------------------------------------------------------------------------------------------------------------") print("Model \t\tAvailable \tPrice/day \tLiability insurance/day \tComprehensive insurance/day") print("--------------------------------------------------------------------------------------------------------------") camery_price = 90 camery_liability_insurance = 20 camery_comprhensive_insurance = 50 print(f"1. Camery \t\t{camery_availability} \t\tQR90 \t\tQR20 \t\t\t\tQR50") pajero_price = 150 pajero_liability_insurance = 30 pajero_comprhensive_insurance = 70 print(f"2. Pajero \t\t{pajero_availability} \t\tQR150 \t\tQR30 \t\t\t\tQR70") altima_price = 70 altima_liability_insurance = 20 altima_comprhensive_insurance = 50 print(f"3. Altima \t\t{altima_availability} \t\tQR70 \t\tQR20 \t\t\t\tQR50") car_type = int(input("Enter car type: ")) # 先检查选中车辆的可用数量 car_available = False if car_type == 1: if camery_availability <= 0: print("This car is not available.") operation = input("More operation? [Y/N] ") continue car_available = True elif car_type == 2: if pajero_availability <= 0: print("This car is not available.") operation = input("More operation? [Y/N] ") continue car_available = True elif car_type == 3: if altima_availability <= 0: print("This car is not available.") operation = input("More operation? [Y/N] ") continue car_available = True else: print("Invalid car type.") operation = input("More operation? [Y/N] ") continue # 车辆可用时才继续后续流程 No_of_days = int(input("Enter how many days: ")) insurance_type = input("Enter 'L' for Liability insurance and 'F' for full insurance: ") total = 0 cost = 0 insurance_cost = 0 tax = 0 # 统一计算逻辑,减少冗余 if car_type == 1: cost = No_of_days * camery_price if insurance_type.lower() == 'l': insurance_cost = No_of_days * camery_liability_insurance elif insurance_type.lower() == 'f': insurance_cost = No_of_days * camery_comprhensive_insurance else: print("Error. Please enter the correct character") operation = input("More operation? [Y/N] ") continue elif car_type == 2: cost = No_of_days * pajero_price if insurance_type.lower() == 'l': insurance_cost = No_of_days * pajero_liability_insurance elif insurance_type.lower() == 'f': insurance_cost = No_of_days * pajero_comprhensive_insurance else: print("Error. Please enter the correct character") operation = input("More operation? [Y/N] ") continue elif car_type == 3: cost = No_of_days * altima_price if insurance_type.lower() == 'l': insurance_cost = No_of_days * altima_liability_insurance elif insurance_type.lower() == 'f': insurance_cost = No_of_days * altima_comprhensive_insurance else: print("Error. Please enter the correct character") operation = input("More operation? [Y/N] ") continue tax = cost * 0.05 total = cost + insurance_cost + tax print(f"Cost: QR {format(cost, '.2f')}") print(f"Insurance: QR {format(insurance_cost, '.2f')}") print(f"Tax: QR {format(tax, '.2f')}") print("--------------------------------") print(f"Total: QR {format(total, '.2f')}") # 只有成功完成租赁后才减少库存 if car_type == 1: camery_availability -= 1 elif car_type == 2: pajero_availability -= 1 elif car_type == 3: altima_availability -= 1 operation = input("More operation? [Y/N] ")
关键修改点
- 在用户选择车型后立即检查库存,如果库存为0则直接提示并跳过后续计费流程
- 将车型判断改为
if-elif-else结构,避免逻辑冲突 - 统一计费逻辑,减少代码冗余
- 修复了
operation的初始化错误,用lower()简化大小写判断 - 移除无效退格符
\b,改用f-string格式化输出,让表格更整洁 - 只有在租赁流程正常完成后才减少车辆库存,避免错误操作导致库存异常
内容的提问来源于stack exchange,提问作者Mathayel
相关产品推荐
相关产品推荐

