如何用嵌套循环打印日历 实现月份首日对应星期位置偏移
问题
需要实现命令行日历生成程序,流程为:
- 提示用户输入目标月份的总天数
- 提示用户输入该月1号对应的星期值
- 输出排版对齐正确的月历
当前已完成日期遍历打印的逻辑,但无法实现首日位置偏移,1号始终从第一列开始输出,无法对齐到周二、周四等非周日的起始星期,现有代码如下:
days = int(input('Enter number of days: ')) day_of_week = input('The first day of the week: ') print('S M T W TH F S') if days == 31: for x in range(1, 32): print(x, end = ' ') if x%7==0: print('\n') else: for x in range(1, 31): print(x, end = ' ') if x%7==0: print('\n')
现有代码除了偏移逻辑缺失,还存在三个明显问题:
- 天数判断逻辑不全,仅处理了30、31天的月份,2月28/29天的场景会多打印无效日期
- 换行逻辑仅判断日期是否为7的倍数,加入偏移后排版会完全错乱
- 输入的首日星期值没有做数值转换,无法参与排版计算
解决方法
核心偏移逻辑非常直接:按照表头S M T W TH F S的列顺序,给每个星期值分配0-6的偏移量,打印日期前先输出对应数量的空白占位,把1号推到正确的列位置,之后正常遍历打印日期即可,每累计打印7个内容(包含前置空白占位)就换行,就能保证排版正确。
修正后的完整可运行代码:
# 星期值到列偏移量的映射,和表头顺序一一对应 # SU=周日, M=周一, T=周二, W=周三, TH=周四, F=周五, SA=周六 offset_map = { 'SU': 0, 'M': 1, 'T': 2, 'W': 3, 'TH': 4, 'F': 5, 'SA': 6 } # 获取用户输入 total_days = int(input('Enter number of days: ')) first_weekday = input('Enter first weekday (SU/M/T/W/TH/F/SA): ').strip().upper() leading_space = offset_map[first_weekday] # 打印日历表头,每列固定3字符宽度保证对齐 print('S M T W TH F S') # 打印前置偏移空白,把1号推到对应列 print(' ' * leading_space, end='') # 遍历打印所有日期,记录当前所在列数 current_col = leading_space for day in range(1, total_days + 1): # 日期固定占3字符宽度,避免个位数/两位数长度错位 print(f'{day:<3}', end='') current_col += 1 # 每打印满7列就换行 if current_col % 7 == 0: print() # 日历最后一行未满7列时补换行,优化输出格式 if current_col % 7 != 0: print()
逻辑说明
- 偏移实现:不需要修改日期遍历逻辑,只要在打印1号前输出对应数量的3字符宽空白,就能实现首日位置对齐,逻辑简单不易出错
- 对齐处理:所有空白占位、日期输出统一使用3字符宽度,和表头列宽匹配,不会出现列错位
- 通用性:直接使用用户输入的总天数作为遍历终止条件,不需要单独判断28/29/30/31天的月份,适配所有月份场景
- 换行逻辑:从偏移量开始累计列数,每满7列就换行,不管当前日期是不是7的倍数,偏移场景下也能保证每行严格7列的排版
内容的提问来源于stack exchange,提问作者user19198861
相关产品推荐
相关产品推荐

