今天不加班

随着项目交付日期的临近,作者投入大量时间解决不断出现的bug。虽然过程充满挑战,但每次解决问题都能带来成就感。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    终于忙完手头的工作,老大下周出差,要把我们这个项目带到客户那里演示,所以在下班前要调试好。揉揉酸痛的眼睛,长长地舒了口气,窗外,仍是灰蒙蒙的天。过完春节回深上班已经一个多月了,似乎都没有闲暇好好回味过年的喜悦,以及好好规划一下新的一年的生活。整天忙着写代码,调试程序,偶尔也加加班 。

    离项目交付的日期越来越近了,程序中的bug却层出不穷。从早上到公司直至顶着夜暮拖着一身疲惫回家,整个人都沉浸在解决问题的繁杂与痛苦中,与那些隐藏着玄机的代码作着顽强的斗争,当然,还有随之带来的成就感和喜悦。痛苦和快乐,付出和收获从来都不是孤立存在的。

<think>我们将创建一个更完整的加班费计算程序,允许用户输入加班小时数、加班类型(平日、周末、节假日)和计算基数(小时工资)。功能:1.输入:加班小时数、加班类型、小时工资基数2.计算:根据加班类型乘以相应的倍数(平日1.5,周末2,节假日3)3.输出:显示计算的加班费4.扩展:支持多段输入,并可以保存记录我们将使用Python编写,并考虑使用命令行交互界面。后续可以扩展为GUI或Web应用。代码结构:1.定义加班类型与倍数的映射2.获取用户输入(可以多段输入,直到用户选择退出)3.计算每一段的加班费4.显示每一段的结果和总结果5.保存记录到文件注意:输入验证(例如负数、非数字等)以下是代码实现:</think>### 加班费计算软件实现方案 下面是一个完整的加班费计算软件实现,支持输入加班小时数、加班类型和计算基数(小时工资)。该程序使用Python编写,具有命令行界面、输入验证和结果导出功能。 ```python import csv from datetime import datetime import os # 加班类型配置(可扩展) OVERTIME_TYPES = { "1": {"name": "平日加班", "multiplier": 1.5}, "2": {"name": "周末加班", "multiplier": 2.0}, "3": {"name": "法定节假日", "multiplier": 3.0}, "4": {"name": "深夜加班", "multiplier": 1.8} # 示例扩展类型 } def validate_input(value, value_type="float", min_value=0): """通用输入验证函数""" try: if value_type == "float": num = float(value) if num < min_value: raise ValueError(f"能小于{min_value}") return num elif value_type == "int": num = int(value) if num < min_value: raise ValueError(f"能小于{min_value}") return num elif value_type == "choice": if value not in OVERTIME_TYPES: raise ValueError("无效的加班类型") return value except ValueError as e: print(f"输入错误: {e}") return None def calculate_overtime_pay(base_wage, hours, multiplier): """计算加班费""" return base_wage * hours * multiplier def save_record(records): """保存加班记录到CSV文件""" filename = "overtime_records.csv" file_exists = os.path.isfile(filename) with open(filename, 'a', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 如果文件存在,写入表头 if not file_exists: writer.writerow(["日期", "基数(时薪)", "加班类型", "小时数", "倍数", "加班费", "计算时间"]) # 写入记录 for record in records: writer.writerow([ record['date'], record['base_wage'], OVERTIME_TYPES[record['ot_type']]['name'], record['hours'], record['multiplier'], record['pay'], record['calc_time'] ]) print(f"\n记录已保存到 {filename}") def display_summary(records): """显示计算结果汇总""" total_pay = sum(record['pay'] for record in records) print("\n===== 计算结果汇总 =====") print(f"记录条目数: {len(records)}") print(f"总加班费: {total_pay:.2f}元") # 按加班类型分类统计 type_summary = {} for record in records: type_name = OVERTIME_TYPES[record['ot_type']]['name'] type_summary.setdefault(type_name, {"hours": 0, "pay": 0}) type_summary[type_name]["hours"] += record['hours'] type_summary[type_name]["pay"] += record['pay'] print("\n===== 按类型统计 =====") for type_name, data in type_summary.items(): print(f"{type_name}: {data['hours']}小时, {data['pay']:.2f}元") def main(): """主程序""" records = [] print("===== 加班费计算软件 =====") print("支持以下加班类型:") for code, data in OVERTIME_TYPES.items(): print(f" {code}: {data['name']} ({data['multiplier']}倍)") while True: try: print("\n=== 输入加班信息 (输入q退出) ===") # 获取日期 date_str = input("加班日期(YYYY-MM-DD, 默认今天): ").strip() if date_str.lower() == 'q': break date = datetime.now().date() if not date_str else datetime.strptime(date_str, '%Y-%m-%d').date() # 获取基数(小时工资) base_wage = None while base_wage is None: wage_input = input("小时工资基数(元/小时): ").strip() if wage_input.lower() == 'q': break base_wage = validate_input(wage_input, "float", 0.01) # 获取加班类型 ot_type = None while ot_type is None: type_input = input("加班类型(输入代码): ").strip() if type_input.lower() == 'q': break ot_type = validate_input(type_input, "choice") # 获取加班小时数 hours = None while hours is None: hours_input = input("加班小时数: ").strip() if hours_input.lower() == 'q': break hours = validate_input(hours_input, "float", 0.01) # 计算加班费 multiplier = OVERTIME_TYPES[ot_type]['multiplier'] pay = calculate_overtime_pay(base_wage, hours, multiplier) calc_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 存储记录 record = { 'date': date.strftime('%Y-%m-%d'), 'base_wage': base_wage, 'ot_type': ot_type, 'hours': hours, 'multiplier': multiplier, 'pay': pay, 'calc_time': calc_time } records.append(record) # 显示当前结果 print(f"\n本次加班费: {pay:.2f}元") print(f"计算详情: {base_wage}元 × {hours}小时 × {multiplier}倍") except KeyboardInterrupt: print("\n操作已取消") break except Exception as e: print(f"发生错误: {e}") # 显示汇总并保存结果 if records: display_summary(records) save_record(records) else: print("未输入有效数据,程序退出") if __name__ == "__main__": main() ``` ### 代码详解 #### 1. 加班类型配置系统 ```python OVERTIME_TYPES = { "1": {"name": "平日加班", "multiplier": 1.5}, "2": {"name": "周末加班", "multiplier": 2.0}, "3": {"name": "法定节假日", "multiplier": 3.0}, "4": {"name": "深夜加班", "multiplier": 1.8} } ``` - 使用字典存储加班类型配置,便于扩展 - 每个类型包含名称和倍数,支持灵活添加新类型 #### 2. 输入验证函数 ```python def validate_input(value, value_type="float", min_value=0): # 验证逻辑... ``` - 支持多种数据类型验证(浮点数、整数、选项) - 检查最小值限制 - 提供清晰的错误反馈 #### 3. 核心计算逻辑 ```python def calculate_overtime_pay(base_wage, hours, multiplier): return base_wage * hours * multiplier ``` - 简洁的计算公式:基数 × 小时数 × 倍数 - 可扩展为更复杂的计算规则(如分段计算) #### 4. 数据持久化 ```python def save_record(records): # 保存到CSV文件... ``` - 使用CSV格式存储记录 - 自动检测文件是否存在并添加表头 - 支持UTF-8编码,确保中文兼容 #### 5. 用户界面设计 ```python def main(): # 主循环... ``` - 清晰的命令行交互界面 - 支持连续输入多条记录 - 输入过程中可随时退出(输入q) - 提供实时计算结果反馈 ### 使用示例 ``` ===== 加班费计算软件 ===== 支持以下加班类型: 1: 平日加班 (1.5倍) 2: 周末加班 (2.0倍) 3: 法定节假日 (3.0倍) 4: 深夜加班 (1.8倍) === 输入加班信息 (输入q退出) === 加班日期(YYYY-MM-DD, 默认今天): 2023-08-15 小时工资基数(元/小时): 50 加班类型(输入代码): 1 加班小时数: 3 本次加班费: 225.00元 计算详情: 50.0元 × 3.0小时 × 1.5倍 === 输入加班信息 (输入q退出) === 加班日期(YYYY-MM-DD, 默认今天): 2023-08-19 小时工资基数(元/小时): 50 加班类型(输入代码): 2 加班小时数: 8 本次加班费: 800.00元 计算详情: 50.0元 × 8.0小时 × 2.0倍 === 输入加班信息 (输入q退出) === 加班日期(YYYY-MM-DD, 默认今天): q ===== 计算结果汇总 ===== 记录条目数: 2 总加班费: 1025.00元 ===== 按类型统计 ===== 平日加班: 3.0小时, 225.00元 周末加班: 8.0小时, 800.00元 记录已保存到 overtime_records.csv ``` ### 功能扩展建议 1. **图形用户界面(GUI)** - 使用PyQt或Tkinter创建桌面应用 - 添加日历控件选择日期 - 实现表格显示历史记录 2. **规则自定义系统** - 从配置文件加载加班规则 - 支持同地区/公司的特殊计算规则 - 添加自定义加班类型功能 3. **高级计算功能** - 支持分段加班计算(同时间段同倍数) - 添加最低工资标准验证 - 实现加班费税收计算 4. **数据导入导出** - 支持Excel格式导入导出 - 添加数据库存储功能 - 实现PDF报告生成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值