2017-10-12 87 views
0

我遇到了一个问题,我找不到解决方案。或者至少是一个“好”的。 我想找到每月给予该月的最后一天,在C.给定月份的最后一天

例如一年:

last_day(10, 2017) > 31 
last_day(02, 2017) > 28 
last_day(02, 2016) > 29 
last_day(01, 2017) > 31 
last_day(12, 2010) > 31 

LAST_DAY(X,Y)> X是一个月,Y年

这里是我的想法:获取Y年的X + 1月份的一天。从此日期删除1天。

我想知道是否有比这更好的解决方案,因为这将为“简单”的事情做出“大量”操作。

谢谢。

编辑:https://ideone.com/sIISO1

#include <stdio.h> 
#include <time.h> 
#include <string.h> 

int main(void) { 
    struct tm tm; 
    char out[256]; 

    memset(&tm, 0, sizeof(struct tm)); 

    tm.tm_mon = 1; 
    tm.tm_mday = 0; 

    strftime(out, 256, "%d-%m-%Y", &tm); 

    printf("%s", out); 

    return 0; 
} 

我已经用结构TM,和天= 0,为了得到前一天的测试,但没有奏效

+0

显示输入,显示所需的输出。 – tilz0R

+3

除了二月份以外的每个月,通过表格查找都非常简单。对于2月份,您需要计算给定年份是否有28天或29天。 – MrSmith42

+2

“last * day *”是什么意思?最后一天的*日期*还是周日(如“星期一”或“星期五”)? –

回答

0

在评论中询问指出,我已经将问题的方式复杂化了很多。

我受到@Agnishom Chattopadhyay在评论中所说的启发,从评论表中得到日期。

但我没有做一个函数,这样做

#include <stdio.h> 

int days_in_month(int month, int year) { 
    if (year < 1582) return 0; /* Before this year the Gregorian Calendar was not define */ 
    if (month > 12 || month < 1) return 0; 

    if (month == 4 || month == 6 || month == 9 || month == 11) return 30; 
    else if (month == 2) return (((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) ? 29 : 28); 
    return 31; 
} 

int main() { 
    printf("%d\n", days_in_month(10, 2017));  
    printf("%d\n", days_in_month(2, 2000)); 
    printf("%d\n", days_in_month(2, 1300)); // Does not work ! 
    printf("%d\n", days_in_month(2, 2018)); 
    printf("%d\n", days_in_month(2, 2016)); 
} 

https://ideone.com/5OZ3pZ

+1

这不是一张表,那是代码。但是,它仍然看起来是正确的,除了使用“长”,这是一个相当奇怪的选择。普通的'int'肯定够用了,而且我期望的是。 – unwind

+0

我编辑了我的答案,以便使用'int'而不是'long'。谢谢 – kaldoran

+1

不错。另外,我永远不会理解使用'()'和'return'的风格,它不是一个函数,它使得它看起来更像是它正在做的事情的反面(“可以这么说),这让我感到非常困惑。但是,对于他们自己,我想。 – unwind

相关问题