华中科技大学复试上机打印日期C语言编程解答

描述

给出年分m和一年中的第n天,算出第n天是几月几号。

输入描述:

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:

可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

示例1

输入:

2000 3
2000 31
2000 40
2000 60
2000 61
2001 60

复制输出:

2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01

答案1

#include <stdio.h>

// 判断闰年
int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 计算日期
void calculateDate(int year, int day, int *month, int *date) {
    *month = 1;
    while (1) {
        switch (*month) {
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                if (day > 31) {
                    day -= 31;
                    (*month)++;
                } else {
                    *date = day;//有31天的月份
                    return;
                }
                break;
            case 4: case 6: case 9: case 11:
                if (day > 30) {
                    day -= 30;
                    (*month)++;
                } else {
                    *date = day;//有30天的月份
                    return;
                }
                break;
            case 2://2月
                if (isLeapYear(year)) {//是闰年2月有29天
                    if (day > 29) {
                        day -= 29;
                        (*month)++;
                    } else {
                        *date = day;//2月
                        return;
                    }
                } else {//不是闰年,2月有28天
                    if (day > 28) {
                        day -= 28;
                        (*month)++;
                    } else {
                        *date = day;
                        return;
                    }
                }
                break;
        }
    }
}

int main() {
    int year, day;
    while (scanf("%d %d", &year, &day) == 2) {
        int month, date;
        calculateDate(year, day, &month, &date);
        printf("%04d-%02d-%02d\n", year, month, date);
    }
    return 0;
}

详解1

在C语言中,使用&符号表示取地址操作符。当我们在函数中使用指针参数时,我们通常会将变量的地址传递给函数,以便函数可以直接修改该变量的值。在这种情况下,&用于获取变量的地址。

在函数调用中,如果我们想要修改一个变量的值,并且该变量是通过指针参数传递给函数的,我们就需要将该变量的地址传递给函数。因此,&符号用于获取该变量的地址。

例如,在函数调用中使用&符号时,&month&date表示取得monthdate变量的地址,然后将这些地址传递给函数,使函数能够通过指针参数来修改这些变量的值。

在C语言中,switch语句后面的case标签通常是一个具体的值,但也可以是一个常量表达式。这意味着case后面可以是一个常量、变量、宏或者是一个常量表达式但不可以是一个范围。

如果case后面是一个常量表达式,编译器会在编译时计算它的值。这使得我们可以在case标签中使用常量之外的值,例如枚举常量、宏定义或者是计算得到的值。

%04d-%02d-%02d 是 C 语言中的格式控制字符串,用于在 printf 函数中格式化输出。在这个格式控制字符串中:

  • %04d 表示打印一个整数,最少占据4位,不足的地方用0填充。这通常用于年份的输出,确保年份以4位数字的形式打印出来。
  • %02d 表示打印一个整数,最少占据2位,不足的地方用0填充。这通常用于月份和日期的输出,确保月份和日期以两位数字的形式打印出来。

因此,%04d-%02d-%02d 用于打印一个日期,其格式为"yyyy-mm-dd",其中年份以4位数字形式打印,月份和日期都以两位数字形式打印。

这个程序实现了根据给定的年份和一年中的第n天来计算日期,并以"yyyy-mm-dd"的格式输出结果。

        1.首先,程序包含一个函数 isLeapYear(),用于判断给定的年份是否是闰年。这个函数返回1表示是闰年,返回0表示不是。

        2.然后,calculateDate() 函数负责计算日期。它接受四个参数:年份、第n天、月份和日期。在这个函数中,我们使用了 switchcase 语句来根据月份计算日期。每个 case 表示一个月份,根据月份的天数来判断日期是否超出当前月份,如果超出了,则减去当前月份的天数并进入下一个月份的判断。在每个 case 中,如果日期未超出当前月份的天数,就将日期设置为当前天数,并返回结果。

        3.在 main() 函数中,程序不断从标准输入中读取年份和第n天,然后调用 calculateDate() 函数计算日期,并使用 printf() 函数按照要求的格式输出结果。这个过程在一个循环中不断进行,直到输入结束。

答案2

#include <stdio.h>

// 判断闰年
int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 计算月份和日期
void calculateDate(int year, int day, int *month, int *date) {
    int daysPerMonth[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    *month = 1;
    *date = day;
    while (*date > daysPerMonth[*month - 1]) {
        *date -= daysPerMonth[*month - 1];
        (*month)++;
    }
}

int main() {
    int year, day;
    while (scanf("%d %d", &year, &day) == 2) {
        int month, date;
        calculateDate(year, day, &month, &date);
        printf("%04d-%02d-%02d\n", year, month, date);
    }
    return 0;
}

详解2

将每月天数封装在daysPerMonth[ ]数组中,二月通过判断是否为闰年来确定二月的天数是否+1。代码较为简洁,建议采用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多宝气泡水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值