上班打卡:早于9:00早到,9:00–9:15正常,晚于9:15迟到;下班打卡:早于18:00早退,晚于18:00正常;每人每日限打2次卡,需先上班后下班,输入quit退出。

用流程控制写一个简易员工考勤打卡器,核心是用 if/elif/else 判断时间、状态和输入,配合循环实现重复操作,不需要数据库或界面,命令行就能跑通。重点不是功能多全,而是把条件分支、循环、变量更新这些基础逻辑串起来,练清楚“程序怎么根据不同情况做不同事”。
设定清晰的打卡规则(先想清楚再写)
初学者容易跳过这步,直接写代码,结果逻辑一团乱。建议先白纸写清楚规则,比如:
- 上班打卡:早于 9:00 算“早到”,9:00–9:15 算“正常”,晚于 9:15 算“迟到”
- 下班打卡:晚于 18:00 算“正常下班”,早于 18:00 算“早退”
- 每人每天最多打 2 次卡(上、下班各一次),重复打卡提示“今日已打卡完毕”
- 输入 "quit" 可退出程序
用变量记录状态,让流程“记得住”
流程控制不是孤立判断,得靠变量记住当前进度。例如定义:
- is_checked_in = False —— 记录是否已上班打卡
- is_checked_out = False —— 记录是否已下班打卡
- current_time = input("请输入时间(如 8:45):") —— 每次打卡都重新输入
后续所有 if 判断都围绕这两个布尔变量展开,比如 if not is_checked_in: 才允许上班打卡,否则提示“已打过上班卡”。这样流程就有“顺序感”了。
用 while 循环驱动主流程,用 if 分支处理各种情况
整个打卡器运行在一个 while True: 循环里,每次循环做一件事:提示输入 → 解析时间 → 判断当前可执行的操作。典型结构如下:
while True:
action = input("请选择:[in] 上班 [out] 下班 [status] 查看 [quit] 退出 > ").strip()
<pre class="brush:php;toolbar:false;">if action == "quit":
print("已退出")
break
elif action == "status":
print(f"上班打卡:{'已完成' if is_checked_in else '未完成'}")
print(f"下班打卡:{'已完成' if is_checked_out else '未完成'}")
elif action == "in" and not is_checked_in:
# 处理上班打卡逻辑(解析时间、判断早到/正常/迟到)
is_checked_in = True
elif action == "in" and is_checked_in:
print("❌ 今日已上班打卡,不可重复操作")
elif action == "out" and is_checked_in and not is_checked_out:
# 处理下班打卡逻辑(判断早退/正常)
is_checked_out = True
elif action == "out" and not is_checked_in:
print("⚠️ 请先上班打卡,再下班打卡")
else:
print("❓ 输入无效,请重试")
时间判断别硬比字符串,简单转成分钟更可靠
用户输入 "8:50" 或 "17:30",直接用字符串比较容易出错(比如 "10:00"
h, m = map(int, current_time.split(":"))total_minutes = h * 60 + m- 然后用数字比较:
if total_minutes (540 = 9×60,即 9:00)
这样逻辑干净,也方便调试。比如判断迟到:if total_minutes > 555:(555 = 9×60+15)

















