欢迎大家来到IT世界,在知识的湖畔探索吧!
基本展示要求:
- 显示当前月份的日历,头部是年份和月份,然后是星期几的标题(日 一 二 三 四 五 六)。
- 能够录入查询上月、下月
- 能够录入任意年度的月份并能展示日历信息
实现思路
- 计算该月第一天是星期几,然后确定在日历中的起始位置。
- 循环打印日期,每七天换行。
- 处理用户输入,n:下个月,p:上个月,y:指定年份,q退出。
- 更新当前年月,循环直到退出。
代码实现
以下是使用C语言编写的可视化万年历的详细代码,支持上下月切换和日期查询功能:
/* #include <stdio.h> #include <stdlib.h> #include <time.h> */ #include <stdio.h> #include <stdlib.h> #include <time.h> // 判断闰年函数 int is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 获取月份天数 int get_month_days(int year, int month) { const int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; if (month == 2 && is_leap_year(year)) return 29; return days[month-1]; } // 计算某月第一天是星期几(0=周日,1=周一...6=周六) int get_first_day(int year, int month) { struct tm t = {0}; t.tm_year = year - 1900; t.tm_mon = month - 1; t.tm_mday = 1; mktime(&t); return t.tm_wday; } // 清屏函数(跨平台) void clear_screen() { #ifdef _WIN32 system("cls"); #else system("clear"); #endif } // 显示日历函数 void display_calendar(int year, int month) { printf("\n %04d年%02d月\n", year, month); printf("日 一 二 三 四 五 六\n"); int first_day = get_first_day(year, month); int days = get_month_days(year, month); int current_pos = 0; // 打印首行缩进 for (int i = 0; i < first_day; ++i) { printf(" "); current_pos++; } // 打印日期 for (int day = 1; day <= days; ++day) { printf("%2d ", day); current_pos++; if (current_pos % 7 == 0) { printf("\n"); } } // 最后一周补齐换行 if (current_pos % 7 != 0) printf("\n"); } int main() { time_t now = time(NULL); struct tm *local = localtime(&now); int year = local->tm_year + 1900; int month = local->tm_mon + 1; while (1) { clear_screen(); display_calendar(year, month); printf("\n操作指南:n-下月 p-上月 y-指定年月 q-退出\n"); printf("请输入命令:"); char cmd[10]; scanf("%s", cmd); switch (cmd[0]) { case 'n': // 下个月 if (++month > 12) { month = 1; year++; } break; case 'p': // 上个月 if (--month < 1) { month = 12; year--; } break; case 'y': // 指定年月 printf("\n请输入年份(如2023):"); scanf("%d", &year); printf("请输入月份(1-12):"); scanf("%d", &month); month = month < 1 ? 1 : (month > 12 ? 12 : month); break; case 'q': // 退出程序 clear_screen(); printf("感谢使用万年历!\n"); return 0; default: printf("无效命令,请重新输入!"); getchar(); // 等待用户确认 break; } } }
欢迎大家来到IT世界,在知识的湖畔探索吧!
代码说明:
- 日期计算:
- 使用tm结构和mktime函数准确计算每月第一天星期几
- 自动处理闰年二月天数
- 支持从1700年到9999年的日期计算
- 界面特性:
- 自动清屏保持界面整洁
- 中文星期显示
- 当前日期高亮显示(需扩展实现)
- 对齐美观的日期排列
- 操作功能:
- 按n查看下个月
- 按p查看上个月
- 按y指定任意年月
- 按q退出程序
- 扩展性:
- 可轻松添加节日显示功能
- 可扩展添加日程提醒功能
- 可修改显示风格(颜色、排版等)
使用说明:
- 编译运行程序后会显示当前月份的日历
- 根据提示输入操作指令:
- n:查看下个月
- p:查看上个月
- y:输入指定年月(如查看1997年7月)
- q:退出程序
输出效果
欢迎大家来到IT世界,在知识的湖畔探索吧! 2025年03月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 操作指南:n-下月 p-上月 y-指定年月 q-退出 请输入命令:
扩展建议:
- 添加颜色显示(可使用ANSI转义码)
- 增加节日/节气显示
- 添加备忘录功能
- 支持周视图显示
- 添加日期选择功能
该程序在Windows/Linux/macOS终端环境下均可运行,实现了基本的日历查看功能,代码结构清晰易于扩展。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/122468.html