鱼C论坛

 找回密码
 立即注册
查看: 6517|回复: 25

[已解决]C语言

[复制链接]
发表于 2022-5-22 12:55:25 | 显示全部楼层 |阅读模式
10鱼币
(1) 输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
(2) 输入年月,输出该月的日历。  
(3) 输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
求大佬帮帮忙
最佳答案
2022-5-22 12:55:26
本帖最后由 zhangjinxuan 于 2022-9-11 21:44 编辑

楼主!我写好了!求给最佳!!!
注:请用C99
  1. #include <stdio.h>
  2. #include <time.h>

  3. const int _months[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  4. #define run_year(year) (year % 400 == 0 || (year % 4 == 0 && year % 100))

  5. int get_month_day(int year, int month) {
  6.         if ((month == 2) && run_year(year))
  7.                 return 29;
  8.         else if (month == 2)
  9.                 return 28;
  10.         return _months[month];
  11. }

  12. void _show_month(int year, int month) {
  13.         printf("%d年%d月:\n", year, month);
  14.         printf("一\t二\t三\t四\t五\t六\t日\n");
  15.         int offset = 0;
  16.         for (int y = 1940; y < year; ++y)
  17.                 offset = (offset + 365 + run_year(y)) % 7;
  18.         for (int m = 1; m < month; ++m)
  19.                 offset = (offset + get_month_day(year, m)) % 7;
  20.         for (int i = 1; i <= offset; ++i)
  21.                 printf("\t");
  22.         int days = get_month_day(year, month);
  23.         for (int i = 1; i <= days; ++i) {
  24.                 printf("%d", i);
  25.                 if (i == days || (offset + i) % 7 == 0)
  26.                         printf("\n");
  27.                 else
  28.                         printf("\t");
  29.         }
  30. }
  31. void show_month() {
  32.         int year, month;
  33.         printf("输入年月:");
  34.         scanf("%d%d", &year, &month);
  35.         _show_month(year, month);
  36.         puts("");
  37.         puts("");
  38. }
  39. void show_year() {
  40.         int year;
  41.         printf("输入年份:");
  42.         scanf("%d", &year);
  43.         for (int i = 1; i <= 12; ++i)
  44.                 _show_month(year, i);
  45. }
  46. void get_day(int year, int month, int day) {
  47.         #define days(y,m) (m==2?(run_year(y)?29:28):_months[m])
  48.         #define addone(y,m,d) {if (d==days(y,m)){d=1;++m;}else{++d;}if(m==13){m=1;++y;}}
  49.         int cnt = 0, y = year, m = month, d = day;
  50.         struct tm *local;
  51.         time_t t = time(NULL);
  52.         local = localtime(&t);
  53.         int eyear = local->tm_year + 1900;
  54.         int emonth = local->tm_mon + 1;
  55.         int eday = local->tm_mday;
  56.         #define checkin(y,m,d) (y>eyear?0:y<eyear?1:m>emonth?0:m<emonth?1:d<=eday)
  57.         if (!checkin(y, m, d)) {
  58.                 printf("输入日期晚于今日日期,无法求值!\n");
  59.                 return;
  60.         }
  61.         while (checkin(y, m ,d)) {
  62.                 ++cnt;
  63.                 addone(y, m ,d);
  64.         }
  65.         printf("距离今天是:%d天\n", cnt - 1);
  66.         #undef checkin
  67.         #undef addone
  68.         #undef days
  69. }
  70. char* _chday(int day) {
  71.         switch (day) {
  72.                 case 1:return "一";
  73.                 case 2:return "二";
  74.                 case 3:return "三";
  75.                 case 4:return "四";
  76.                 case 5:return "五";
  77.                 case 6:return "六";
  78.         }
  79. }
  80. void get_week() {
  81.         int year, month, day;
  82.         printf("输入年、月、日:");
  83.         scanf("%d%d%d", &year, &month, &day);
  84.         int offset = 0;
  85.         for (int y = 1940; y < year; ++y)
  86.                 offset = (offset + 365 + run_year(y)) % 7;
  87.         for (int m = 1; m < month; ++m)
  88.                 offset = (offset + get_month_day(year, m)) % 7;
  89.         if ((offset + day) % 7 == 0)
  90.                 printf("那一天是 星期日\n");
  91.         else
  92.                 printf("那一天是 星期%s\n", _chday((offset + day) % 7));
  93.         get_day(year, month, day);
  94. }

  95.        
  96. int main(void) {
  97.         int opt;
  98.         while (1) {
  99.                 printf("输入操作:(输入0结束程序)");
  100.                 scanf("%d", &opt);
  101.                 switch (opt) {
  102.                         case 1:
  103.                                 show_year();
  104.                                 break;
  105.                         case 2:
  106.                                 show_month();
  107.                                 break;
  108.                         case 3:
  109.                                 get_week();
  110.                                 break;
  111.                         default:
  112.                                 printf("感谢您的使用!");
  113.                                 return 0;
  114.                 }
  115.         }
  116.         return 0;
  117. }
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zhangjinxuan + 1 + 1 楼主啊!我给你一点鱼币,你设置个最佳答案.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-23 03:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表