Perfect-鹿 发表于 2022-5-22 12:55:25

C语言

(1) 输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
(2) 输入年月,输出该月的日历。
(3) 输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
求大佬帮帮忙

zhangjinxuan 发表于 2022-5-22 12:55:26

本帖最后由 zhangjinxuan 于 2022-9-11 21:44 编辑

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

const int _months = {-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;
}

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)
        #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;
}

豆嘉木 发表于 2022-5-22 13:29:18

如此庞大的程序,10鱼币显然太少了

顶级太阳 发表于 2022-5-22 14:10:51

本帖最后由 顶级太阳 于 2022-5-22 14:12 编辑

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

豆嘉木 发表于 2022-5-22 16:29:29

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

况且只给10鱼币,谁高兴做啊哈哈哈{:10_243:}

顶级太阳 发表于 2022-5-22 21:01:12

豆嘉木 发表于 2022-5-22 16:29
况且只给10鱼币,谁高兴做啊哈哈哈

还有一个人悬赏了60鱼币,那个都是很简单的数组操作。我还没学到数组呢,稍微有点困难,有时间过去看看。思路我有,就是写出来的细节有点吃力。等于白给的。

豆嘉木 发表于 2022-5-22 21:56:59

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

不,那个特别难,我看过,绝对不是你所想的那样

zhangjinxuan 发表于 2022-9-10 10:21:16

这个周末,我会挑战一下

桃花飞舞 发表于 2022-9-10 10:53:41

本帖最后由 桃花飞舞 于 2022-9-10 11:18 编辑

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

zhangjinxuan 发表于 2022-9-10 11:45:08

公历节日不知道是啥意思,不会是看这天是不是端午节,中秋节之类的吧{:10_245:}

zhangjinxuan 发表于 2022-9-10 11:58:32

本帖最后由 zhangjinxuan 于 2022-9-10 17:44 编辑

楼主!我做出来了!请收下代码

zhangjinxuan 发表于 2022-9-10 12:12:15

豆嘉木 发表于 2022-5-22 16:29
况且只给10鱼币,谁高兴做啊哈哈哈

我高兴做

传说中的暗暗 发表于 2022-9-11 12:58:14

zhangjinxuan 发表于 2022-9-10 11:42
楼主!我写好了!求给最佳!!!
注:请用C99

反正好牛逼,我还看不懂

人造人 发表于 2022-9-11 21:39:51

zhangjinxuan 发表于 2022-9-10 12:12
我高兴做

楼主早就不在了,你看一下他的最后访问时间 2022-6-14 22:20

zhangjinxuan 发表于 2022-9-11 21:43:44

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

啊!!!!!!!!!!

不————!!!!!

雪花~啊啊飘~飘,北风啸~啸~

zhangjinxuan 发表于 2022-9-11 21:44:19

本帖最后由 zhangjinxuan 于 2022-9-11 21:46 编辑

{:10_266:}

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

白做了啊!

雪~花~飘~飘~

人造人 发表于 2022-9-11 21:47:03

zhangjinxuan 发表于 2022-9-11 21:43
啊!!!!!!!!!!

不————!!!!!


所以,现在还高兴做吗?
给别人写程序之前,先去他的空间看一看,看一看他是不是真心的提问
看一看他发了多少贴子,选了多少最佳,然后再考虑要不要帮他写

zhangjinxuan 发表于 2022-9-11 21:48:23

本帖最后由 zhangjinxuan 于 2022-9-11 21:55 编辑

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

不错,吃一堑,长一智

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

举报早就想点了

豆嘉木 发表于 2022-9-17 08:41:29

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

现实给这位善良的朋友心理上造成巨大的打击

howzyao 发表于 2022-9-17 11:57:34

const int _months = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

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

我也想做一个.
页: [1] 2
查看完整版本: C语言