2017-10-12 173 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

相關問題