鱼C论坛

 找回密码
 立即注册
查看: 5428|回复: 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. }
复制代码

最佳答案

查看完整内容

楼主!我写好了!求给最佳!!! 注:请用C99

评分

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

查看全部评分

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

使用道具 举报

发表于 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. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 13:29:18 | 显示全部楼层
如此庞大的程序,10鱼币显然太少了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 14:10:51 | 显示全部楼层
本帖最后由 顶级太阳 于 2022-5-22 14:12 编辑

这要是python的话,还凑合,想办法给你找一个万年历的库调用一下也就解决了。抱歉,我刚开始学C,看了题目只是有点思路。提醒一下,你的要求太笼统了。第一步,显示该年的日历,这都要显示什么?日期、星期几、。。。。
第二步,你要显示一个月的日历,都显示什么内容?
第三步,要显示公历节日,这一条就比较麻烦,都包含那些?这就够做一个近百条的数组了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 16:29:29 | 显示全部楼层
顶级太阳 发表于 2022-5-22 14:10
这要是python的话,还凑合,想办法给你找一个万年历的库调用一下也就解决了。抱歉,我刚开始学C,看了题目 ...

况且只给10鱼币,谁高兴做啊哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 21:01:12 | 显示全部楼层
豆嘉木 发表于 2022-5-22 16:29
况且只给10鱼币,谁高兴做啊哈哈哈

还有一个人悬赏了60鱼币,那个都是很简单的数组操作。我还没学到数组呢,稍微有点困难,有时间过去看看。思路我有,就是写出来的细节有点吃力。等于白给的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 21:56:59 | 显示全部楼层
顶级太阳 发表于 2022-5-22 21:01
还有一个人悬赏了60鱼币,那个都是很简单的数组操作。我还没学到数组呢,稍微有点困难,有时间过去看看。 ...

不,那个特别难,我看过,绝对不是你所想的那样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-10 10:21:16 | 显示全部楼层
这个周末,我会挑战一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-10 10:53:41 | 显示全部楼层
本帖最后由 桃花飞舞 于 2022-9-10 11:18 编辑

(3) 输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
输入年月日,输出距离今天还有多少天,今天的日期也是要输入的吧?就是计算天数差 这题目超简单的 是否是公历节日,星期几,今天星期几,然后用天数差%7 再加上今天星期几    只要判断月日应该就可以了。
除了星期几我没判断过以外。
这题并不是不能做。我太懒不太想做,我又没有现成的代码给你。
实在不会做你可以看下C程序设计语言95页5.7多维数组,就是计算天数的例程
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-10 11:45:08 | 显示全部楼层
公历节日不知道是啥意思,不会是看这天是不是端午节,中秋节之类的吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-10 11:58:32 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-9-10 17:44 编辑

楼主!我做出来了!请收下代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-10 12:12:15 | 显示全部楼层
豆嘉木 发表于 2022-5-22 16:29
况且只给10鱼币,谁高兴做啊哈哈哈

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

使用道具 举报

发表于 2022-9-11 12:58:14 | 显示全部楼层
zhangjinxuan 发表于 2022-9-10 11:42
楼主!我写好了!求给最佳!!!
注:请用C99

反正好牛逼,我还看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-11 21:39:51 | 显示全部楼层

楼主早就不在了,你看一下他的最后访问时间 2022-6-14 22:20
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-11 21:43:44 | 显示全部楼层
人造人 发表于 2022-9-11 21:39
楼主早就不在了,你看一下他的最后访问时间 2022-6-14 22:20


啊!!!!!!!!!!

不————!!!!!

雪花~啊啊飘~飘,北风啸~啸~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-11 21:44:19 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-9-11 21:46 编辑



呜呜,我花了1个小时算来算去,写来写去,最后居然...

白做了啊!

雪~花~飘~飘~

评分

参与人数 1荣誉 +5 鱼币 +2 贡献 +1 收起 理由
高山 + 5 + 2 + 1

查看全部评分

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

使用道具 举报

发表于 2022-9-11 21:47:03 | 显示全部楼层
zhangjinxuan 发表于 2022-9-11 21:43
啊!!!!!!!!!!

不————!!!!!

所以,现在还高兴做吗?
给别人写程序之前,先去他的空间看一看,看一看他是不是真心的提问
看一看他发了多少贴子,选了多少最佳,然后再考虑要不要帮他写
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-11 21:48:23 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-9-11 21:55 编辑
人造人 发表于 2022-9-11 21:47
所以,现在还高兴做吗?
给别人写程序之前,先去他的空间看一看,看一看他是不是真心的提问
看一看他发 ...


不错,吃一堑,长一智

不过,也锻炼了自己,之前也为这个问题发愁呢

举报早就想点了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-17 08:41:29 | 显示全部楼层
人造人 发表于 2022-9-11 21:47
所以,现在还高兴做吗?
给别人写程序之前,先去他的空间看一看,看一看他是不是真心的提问
看一看他发 ...

现实给这位善良的朋友心理上造成巨大的打击
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-17 11:57:34 | 显示全部楼层
const int _months[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

这个办法,确实我没有想到.赞.
很棒的思路啊.

我也想做一个.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 16:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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