IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Date de Pâques par la méthode Oudin


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut Date de Pâques par la méthode Oudin
    Bonjour !

    Je vous propose un programme qui calcule la date de Pâques pour une année donnée du calendrier grégorien.

    Un code similaire a déjà été proposé ici mais l'algorithme utilisé n'est pas le même.

    NDLM : Supprimé à la demande de l'auteur
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Pour améliorer mon programme, j'ai pensé y inclure une table qui permettrait une vérification automatique du résultat fourni par l'algorithme. Voici ce que j'ai fait à partir de ce document. Ce sont les dates de Pâques de 1900 à 2199.

    NDLM : Supprimé à la demande de l'auteur

    Vos observations ou vos suggestions sont les bienvenues.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    J'ai remanié mon programme, qui calcule la date de Pâques pour une année donnée du calendrier grégorien. Qu'en pensez-vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    /* table.c */
     
    /* Date de Pâques 1900-2199 */
     
    const int table[300] = {
    46,38,30,43,34,54,46,31,50,42,
    27,47,38,23,43,35,54,39,31,51,
    35,27,47,32,51,43,35,48,39,31,
    51,36,27,47,32,52,43,28,48,40,
    24,44,36,56,40,32,52,37,28,48,
    40,25,44,36,49,41,32,52,37,29,
    48,33,53,45,29,49,41,26,45,37,
    29,42,33,53,45,30,49,41,26,46,
    37,50,42,34,53,38,30,50,34,26,
    46,31,50,42,34,47,38,30,43,35,
    54,46,31,51,42,27,47,39,23,43,
    35,55,39,31,51,36,27,47,32,52,
    43,35,48,40,31,51,36,28,47,32,
    52,44,28,48,40,25,44,36,56,41,
    32,52,37,29,48,40,25,45,36,49,
    41,33,52,37,29,49,33,53,45,30,
    49,41,26,46,37,29,42,34,53,45,
    30,50,41,26,46,38,50,42,34,54,
    38,30,50,35,26,46,31,51,42,34,
    47,39,30,43,35,55,46,31,51,43,
    28,48,40,25,44,36,49,41,32,52,
    37,29,48,33,53,45,29,49,41,26,
    45,37,29,42,33,53,45,30,49,41,
    26,46,37,50,42,34,53,38,30,50,
    34,26,46,31,50,42,34,47,38,30,
    43,35,54,46,31,51,42,27,47,39,
    23,43,35,55,39,31,51,36,27,47,
    32,52,43,35,48,40,31,51,36,28,
    47,32,52,44,28,48,40,25,44,36,
    56,41,32,52,37,29,48,40,25,45};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* paques.h */
     
    extern const int table[300];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    /* paques.c */
     
    /*
      Date du dimanche de Pâques
      Algorithme d'Oudin :
      http://www.fil.univ-lille1.fr/~wegrzyno/portail/InitProg/Doc/TP/TP6/tp6.pdf
      Table des dates de Pâques de 1900 à 2199 :
      http://www.merlyn.demon.co.uk/estr-tbl.txt
    */
     
    #include <stdio.h>
    #include "table.c"
    #include "paques.h"
    #define GREGORIEN 1583
     
    const char *nom[] = {"mars", "avril"};
     
    int resultat(int annee){
     
      /* Algorithme d'Oudin */
     
      int G, C, C4, E, H, K, P, Q, I, B, J1, J2, R;
     
      G = annee % 19;
      C = annee / 100;
      C4 = C / 4;
      E = (8 * C + 13) / 25;
      H = (19 * G + C - C4 - E + 15) % 30;
      K = H / 28;
      P = 29 /(H + 1);
      Q = (21 - G) / 11;
      I = (K * P * Q - 1) * K + H;
      B = (annee / 4) + annee;
      J1 = B + I + 2 + C4 - C;
      J2 = J1 % 7;
      R = 28 + I - J2;
     
      return R;
     
    }
     
    int main(void){
     
      int annee, mois, jour;
      int paques;
     
      printf("Date du dimanche de Pƒques dans le calendrier gr‚gorien\n");
     
      annee = 0;
      while(annee < GREGORIEN){
        printf("Veuillez entrer une ann‚e post‚rieure … 1582 : ");
        scanf("%d", &annee);
      }
     
      paques = resultat(annee);
     
      if(paques > 31){
        mois = 4;
        jour = paques - 31;
      }else{
        mois = 3;
        jour = paques;
      }
     
      if ((annee > 1899) && (annee < 2200)){
        if (paques != table[annee - 1900]){
          printf("Le r‚sultat ne concorde pas avec le contenu de la table.\n");
        }
      }
     
      printf("En %d, le dimanche de Pƒques est le %d %s.\n", annee, jour, nom[mois - 3]);
     
      return 0;
     
    }
    Au modérateur : Auriez-vous l'amabilité de supprimer mes deux premiers messages (si toutefois vous n'y voyez pas d'inconvénient) ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Au modérateur : Auriez-vous l'amabilité de supprimer mes deux premiers messages (si toutefois vous n'y voyez pas d'inconvénient) ?
    Salut
    Tu fais "éditer" et dans la page qui s'affiche tu as une case "supprimer"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu fais "éditer" et dans la page qui s'affiche tu as une case "supprimer"...
    Merci pour la réponse. Malheureusement je n'ai plus la possibilité d'éditer ces messages.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Au modérateur : Auriez-vous l'amabilité de supprimer mes deux premiers messages (si toutefois vous n'y voyez pas d'inconvénient) ?
    En principe, nous ne supprimons pas les messages sauf motif sérieux (les gens s'y réfèrent). J'ai toutefois et quand même retiré les blocs de codes précédents pour des raisons de clarté.

    Merci pour ta participation au site !

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    En principe, nous ne supprimons pas les messages sauf motif sérieux (les gens s'y réfèrent). J'ai toutefois et quand même retiré les blocs de codes précédents pour des raisons de clarté.
    C'est parfait comme ça. Merci bien !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour !

    J'ai remanié mon programme, qui calcule la date de Pâques pour une année donnée du calendrier grégorien. Qu'en pensez-vous ?
    Au risque d’être (trop) critique, j'ai pas mal de remarques a faire sur le code...

    Je prends le code "au fur et a mesure" :
    #include "table.c" Pas fan de l'include du .c... Surtout que ce "code" qui n'en est pas pourrait tout a fait être dans un fichier d'include. Mais bon, comme c'est juste pour la vérification, on peut passer

    int Resultat(int a){ Pourquoi mettre une majuscule au nom de la fonction ? Je sais que ce n'est pas faux, mais en général on ne le fait pas (la norme définit d'ailleurs que E suivi d'une lettre majuscule ou d'un chiffre peut être utilise comme macro par l’implémentation pour les erreurs (norme C99, 7.5 et 7.26.3)

    int G, C, C4, E, H, K, P, Q, I, B, J1, J2, R; Je vais être méchant, mais tu n'as pas trouvé plus illisible ? Je pense que A1, A2, ... serait mieux... Ou pas. Par contre, de vrais noms de variable, en minuscules, ça serait vraiment bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      G = a % 19;
      C = a / 100;
      C4 = C / 4;
      E = (8 * C + 13) / 25;
      H = (19 * G + C - C4 - E + 15) % 30;
    [...]
    Un petit commentaire sur ces magnifiques nombres magiques sortis de null part ? S'il faut le PDF décrivant l'algorithme pour pouvoir comprendre le code, je crains que ce ne soit pas très pratique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      int a, m, j; /* annee, mois, jour */
      int paques;
    a, m, j --> annee, mois, jour, comme tu le mets dans le commentaire, et comme paques. Il ne faut pas avoir peur d'user les touches de son clavier, elles sont la pour ca !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      while(a < GREGORIEN){
        printf("Veuillez entrer une annee post‚rieure … 1582 : ");
        scanf("%d", &a);
      }
    Il est plus que fortement déconseillé de lire les entrées clavier avec scanf, qui devrait être réservé aux entrées formatées. Un exemple d’entrées/sorties solides en C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      if ((a > 1899) && (a < 2200)){
        if (paques != table[a - 1900]){
          printf("Le resultat ne concorde pas avec le contenu de la table.\n");
    Je pense qu'on aurait apprécié d'avoir les deux dates dans ce cas d'erreur


    Désolé, c'est peut-être un peu violent comme commentaire, mais trouve que ce code est vraiment "limite".
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Merci pour ces observations, dont je prends bonne note.

    Pour le fichier inclus, je n'ai pas compris quelle est la solution que tu préconises.

    Autrement, pour remplacer ces noms de variables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int G, C, C4, E, H, K, P, Q, I, B, J1, J2, R;
    par des noms plus explicites, il faudrait des connaissances que je n'ai pas. J'avoue que j'ai utilisé la formule sans la comprendre. C'est pourquoi j'ai préféré me tenir aux noms de variables qui sont dans le document auquel je me suis référé.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Pour le fichier inclus, je n'ai pas compris quelle est la solution que tu préconises.
    En fait, on n'inclue pas de fichier .c (meme si techniquement il est possible de le faire).

    Un fichier .c est un fichier qui contient du code, qui doit etre compilable tout seul, obtenant en sortie (au moins) un fichier objet (.o), qui pourra etre linke plus tard si besoin.

    Dans ton cas, le seul code que tu mets est un tableau, pas de code. Donc tu peux tout a fait faire de ce fichier un fichier d'en-tete (.h), et dans ce cas tu pourras l'inclure. C'est ce que je ferai (ou ce que je recommande, mais qui suis-je pour recommander ? )
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Il y a le problème du extern.
    En fait, c'est bien un .c, parce que le tableau ne saurait être défini plusieurs fois.
    Par contre, il manque un en-tête contenant un extern const int table[300];
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Dans ton cas, le seul code que tu mets est un tableau, pas de code
    Je ne suis pas d'accord : si tu inclues plusieurs fois ton fichier d'en-tête dans des unités de compilation différentes, tu auras une erreur d'édition des liens car le symbole sera défini plusieurs fois ! Une déclaration avec initialisation de tableau, c'est déjà du code.

    EDIT : j'ai mis très longtemps à poster donc leternel m'a grillé ^^

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Merci pour vos conseils. J'ai édité mon message et fait une partie des modifications suggérées.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. Date de Pâques par l'algorithme d'Oudin
    Par Roland Chastain dans le forum Lua
    Réponses: 5
    Dernier message: 23/03/2016, 07h27
  2. [Flash Pascal] Oudin - Détermination de la date de Pâques
    Par Roland Chastain dans le forum Flash Pascal
    Réponses: 3
    Dernier message: 19/06/2012, 09h19
  3. Réponses: 4
    Dernier message: 28/09/2005, 09h19
  4. Mettre la date du jour par défaut
    Par Oberown dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/03/2005, 15h35
  5. PL/SQL TROUVER DATES DE PÂQUES, ASCENSION et PENTECôTE
    Par mimi_été dans le forum PL/SQL
    Réponses: 4
    Dernier message: 21/10/2004, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo