鱼C论坛

 找回密码
 立即注册
查看: 4622|回复: 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
#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;
}

最佳答案

查看完整内容

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 13:29:18 | 显示全部楼层
如此庞大的程序,10鱼币显然太少了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

况且只给10鱼币,谁高兴做啊哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

还有一个人悬赏了60鱼币,那个都是很简单的数组操作。我还没学到数组呢,稍微有点困难,有时间过去看看。思路我有,就是写出来的细节有点吃力。等于白给的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

不,那个特别难,我看过,绝对不是你所想的那样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-10 10:21:16 | 显示全部楼层
这个周末,我会挑战一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

楼主!我做出来了!请收下代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我高兴做
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

反正好牛逼,我还看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

楼主早就不在了,你看一下他的最后访问时间 2022-6-14 22:20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


啊!!!!!!!!!!

不————!!!!!

雪花~啊啊飘~飘,北风啸~啸~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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



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

白做了啊!

雪~花~飘~飘~

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

不————!!!!!

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

使用道具 举报

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


不错,吃一堑,长一智

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

举报早就想点了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

现实给这位善良的朋友心理上造成巨大的打击
想知道小甲鱼最近在做啥?请访问 -> 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};

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

我也想做一个.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 05:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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