C语言每日一题——第六天

第六天

小明想了想,发现他已经写过数个用于计算日期的程序了。今天他决定更进一步,要实现一个可以计算两个日期实际相差天数的代码。另外,为了方便,不考虑闰年情况。

运行:main.exe B B A A

输出:

1-1 to 2-2 :
1?32

解释:前两个参数B B 表示目标日期为 2 月 2 日, A A表示起始日期为 1 月 1日,1月与2月相隔1个月,1月 1日距离2月 2日相隔32天。

运行:main.exe B A A B

输出:

1-2 to 2-1 :
1?30

解释:前两个参数B A 表示目标日期为 2 月 1 日, A B表示起始日期为 1 月 2日,1月与2月相隔1个月,2月 1日距离2月 1日相隔30天。

运行:main.exe A A B B

输出:

2-2 to 1-1 :
11?333

解释:前两个参数A A 表示目标日期为 1 月 1 日, B B表示起始日期为 2 月 2日,2月与来年1月相隔11个月,2月 1日距离来年1月 1日相隔333天。

输入

程序通过命令行参数输入获取参数,参数格式为目标月 目标日 起始月 起始日

为了方便输入,将数字统一移动64个,即 ASSCII 码表为 65 的符号(即A)代表数字1。

输出

程序第一行输出用于计算的起始月-起始日 to 目标月-目标日 :,,第二行以问号?为分隔,输出相隔月数相隔日数

关键

函数的使用,代码能力


解答

#include <stdio.h>
#include <iso646.h>


int get_day_number_of_month(int month) {
    if (month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12) {
        // "本"月有31天
        return 31;
    } else if (month == 2) {
        // 2月28天
        return 28;
    } else {
        // "本"月有30天
        return 30;
    }
}


int main(int cnt, char **argv) {
    int target_month, target_day, start_month, start_day, pnt_month, day = 0;

    if (cnt != 5) {
        printf("Input value error!\n");
        return -1;
    }

    // 获取输入
    target_month = (int) (*argv[1] - 'A') + 1;
    target_day = (int) (*argv[2] - 'A') + 1;
    start_month = pnt_month = (int) (*argv[3] - 'A') + 1;
    start_day = (int) (*argv[4] - 'A') + 1;

    printf("%d-%d to %d-%d :\n", start_month, start_day, target_month, target_day);

    // Month
    if (target_month >= start_month) {
        printf("%d?", target_month - start_month);
    } else {
        printf("%d?", 12 + target_month - start_month);
    }

    // Day
    if (target_day > start_day) {
        day += target_day - start_day;
    } else {
        day += get_day_number_of_month(start_month) - start_day + target_day;
        pnt_month += 1;
    }
    while (pnt_month != target_month) {
        day += get_day_number_of_month(pnt_month);
        pnt_month += 1;
        if (pnt_month > 12) {
            pnt_month = 1;
        }
    }
    printf("%d\n", day);

    return 0;
}
posted @ 2022-10-02 14:38  风吹云动  阅读(145)  评论(0编辑  收藏  举报