|
发表于 2022-5-22 12:55:26
|
显示全部楼层
本楼为最佳答案
本帖最后由 zhangjinxuan 于 2022-9-11 21:44 编辑
楼主!我写好了!求给最佳!!!
注:请用C99
- #include <stdio.h>
- #include <time.h>
- const int _months[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- #define run_year(year) (year % 400 == 0 || (year % 4 == 0 && year % 100))
- int get_month_day(int year, int month) {
- if ((month == 2) && run_year(year))
- return 29;
- else if (month == 2)
- return 28;
- return _months[month];
- }
- void _show_month(int year, int month) {
- printf("%d年%d月:\n", year, month);
- printf("一\t二\t三\t四\t五\t六\t日\n");
- int offset = 0;
- for (int y = 1940; y < year; ++y)
- offset = (offset + 365 + run_year(y)) % 7;
- for (int m = 1; m < month; ++m)
- offset = (offset + get_month_day(year, m)) % 7;
- for (int i = 1; i <= offset; ++i)
- printf("\t");
- int days = get_month_day(year, month);
- for (int i = 1; i <= days; ++i) {
- printf("%d", i);
- if (i == days || (offset + i) % 7 == 0)
- printf("\n");
- else
- printf("\t");
- }
- }
- void show_month() {
- int year, month;
- printf("输入年月:");
- scanf("%d%d", &year, &month);
- _show_month(year, month);
- puts("");
- puts("");
- }
- void show_year() {
- int year;
- printf("输入年份:");
- scanf("%d", &year);
- for (int i = 1; i <= 12; ++i)
- _show_month(year, i);
- }
- void get_day(int year, int month, int day) {
- #define days(y,m) (m==2?(run_year(y)?29:28):_months[m])
- #define addone(y,m,d) {if (d==days(y,m)){d=1;++m;}else{++d;}if(m==13){m=1;++y;}}
- int cnt = 0, y = year, m = month, d = day;
- struct tm *local;
- time_t t = time(NULL);
- local = localtime(&t);
- int eyear = local->tm_year + 1900;
- int emonth = local->tm_mon + 1;
- int eday = local->tm_mday;
- #define checkin(y,m,d) (y>eyear?0:y<eyear?1:m>emonth?0:m<emonth?1:d<=eday)
- if (!checkin(y, m, d)) {
- printf("输入日期晚于今日日期,无法求值!\n");
- return;
- }
- while (checkin(y, m ,d)) {
- ++cnt;
- addone(y, m ,d);
- }
- printf("距离今天是:%d天\n", cnt - 1);
- #undef checkin
- #undef addone
- #undef days
- }
- char* _chday(int day) {
- switch (day) {
- case 1:return "一";
- case 2:return "二";
- case 3:return "三";
- case 4:return "四";
- case 5:return "五";
- case 6:return "六";
- }
- }
- void get_week() {
- int year, month, day;
- printf("输入年、月、日:");
- scanf("%d%d%d", &year, &month, &day);
- int offset = 0;
- for (int y = 1940; y < year; ++y)
- offset = (offset + 365 + run_year(y)) % 7;
- for (int m = 1; m < month; ++m)
- offset = (offset + get_month_day(year, m)) % 7;
- if ((offset + day) % 7 == 0)
- printf("那一天是 星期日\n");
- else
- printf("那一天是 星期%s\n", _chday((offset + day) % 7));
- get_day(year, month, day);
- }
-
- int main(void) {
- int opt;
- while (1) {
- printf("输入操作:(输入0结束程序)");
- scanf("%d", &opt);
- switch (opt) {
- case 1:
- show_year();
- break;
- case 2:
- show_month();
- break;
- case 3:
- get_week();
- break;
- default:
- printf("感谢您的使用!");
- return 0;
- }
- }
- return 0;
- }
复制代码 |
|