2017-10-12 3 views
0

J'ai un problème que je ne trouve pas de solution. Ou au moins un "bon". Je veux trouver le dernier jour du mois donné un mois et un an en C.Dernier jour d'un mois

Par exemple:

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 est le mois, l'année Y

Voici mon idée: Obtenez le jour sur le mois X + 1, de l'année Y. Retirer 1 jour à partir de cette date.

Je voudrais savoir s'il y a une meilleure solution que cela, puisque cela rendra un "lot" de fonctionnement pour une chose "simple".

Merci.

Edit: 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; 
} 

Je l'ai testé à l'aide d'tm struct et jour = 0, afin d'obtenir la veille, mais n'a pas fonctionné

+0

Afficher les entrées, les sorties montrent souhaitées. – tilz0R

+3

Pour chaque mois autre que février, ceci est très simple grâce à une recherche de table. Pour février, vous devez calculer s'il y a 28 ou 29 jours pour l'année donnée. – MrSmith42

+2

Que voulez-vous dire par "last * day *"? La * date * du dernier jour? Ou le jour de la semaine (comme "lundi" ou "vendredi")? –

Répondre

0

Demandez remarquer dans le commentaire, J'ai complexifié le problème de beaucoup.

J'ai été inspiré par ce que @Agnishom Chattopadhyay a dit dans le commentaire, qui est d'obtenir la date d'une table de recherche.

Mais j'ai fait une fonction qui a fait que

#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

Ce n'est pas une table, c'est le code. Mais tout de même, il semble à peu près juste, sauf pour utiliser 'long', c'est un choix plutôt bizarre. Plain 'int' est certainement assez, et ce que je m'attendrais. – unwind

+0

J'ai édité ma réponse pour utiliser 'int' au lieu de' long'. Merci – kaldoran

+1

Nice. De plus, je ne comprendrai jamais le style qui utilise '()' avec 'return', ce n'est pas une fonction et faire en sorte que ça ressemble plutôt au contraire de ce qu'il fait (" descendre plutôt que monter ") la callstack ", pour ainsi dire), que je trouve super-confus. Mais à chacun leur, je suppose. – unwind