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

Algorithmes et structures de données Discussion :

Formule de zeller invalidée ?


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 185
    Points : 97
    Points
    97
    Par défaut Formule de zeller invalidée ?
    Bonjour à tous j'aimerai avoir une réponse à ma question...

    j'utilise une formule mathématique dite de Zeller (du nom de son inventeur) qui permet de calculer le jour de la semaine en fonction de la date.

    Cette fonction tournai sans probleme jusqu'au jour fatidique du 01/05/2008

    en effet avant cette date la formule détermine bien le jour de la semaine sans se tromper

    mais passé le 30/04/2008 la formule semble éronnée... il y à un jour de décallage

    il semblerai que la formule tiens compte du fait qu'il existe un 31/04/2008

    je vous passe le code (en JAVA) :

    Code java : 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
     
    public class zeller
    {
     
    	public static void main(String args[])
    	{
    		zeller z = new zeller();
    		int jour = z.zellerFormula(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));
    		switch(jour)
    		{
    			case 0:
    				System.out.println("Samedi\n");
    				break;
    			case 1:
    				System.out.println("Dimanche\n");
    				break;
    			case 2:
    				System.out.println("Lundi\n");
    				break;
    			case 3:
    				System.out.println("Mardi\n");
    				break;
    			case 4:
    				System.out.println("Mercredi\n");
    				break;
    			case 5:
    				System.out.println("Jeudi\n");
    				break;
    			case 6:
    				System.out.println(" Vendredi\n");
    				break;
    		}
    	}
     
    	public zeller()
    	{
    	}
     
    	public static int zellerFormula (int dd, int mm, int yyyy) 
    	{
    		if (mm == 1 || mm == 2) 
    		{
    			mm += 12;
    			yyyy--;
    		}
     
    		int cc = yyyy/100;
    		int yy = yyyy%100;
     
    		int k = (int)(dd + Math.round(2.6d*(mm + 1)) + Math.round(cc/4) - 2*cc + yy + Math.round(yy/4));
     
    		if (k<0) 
    		{
    			k = (-k)%7;
    			k = 7 - k;
    		}
    		//return days [k%7];
    		return (k%7);
    	}
     
    }

    faites des tests svp et dites moi si vous obtenez comme moi ?

    existe-t-il d'autres algorithmes permettant de faire ce prodige ? lol

  2. #2
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par MortDansLAme Voir le message
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		if (k<0) 
    		{
    			k = (-k)%7;
    			k = 7 - k;
    		}
    Tu es sûr de ça ? Ca ne correspond pas à ce que je lis sur le net concernant la formule de Zeller. Et d'ailleurs, en faisant le test, avec les formules donnée, je tombe bien sur 3 pour aujourd'hui, soit le mardi. Le soucis vient donc de ton implémentation

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 185
    Points : 97
    Points
    97
    Par défaut
    oui effectivement c'était faux

    donc avec ce code ca fonctionne :

    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
     
    public static int zellerFormula (int day, int month, int year) 
    	{
    		//On utilise la congruence de Zeller
        if (month <= 2)
        {
            month += 12; //pour janvier = 13, février = 14
            year --;
        }
        int K = year % 100;
        int J = year / 100;
     
        //calcul via la congruence de Zeller
        int h = (day + (26*(month + 1))/10 + K + K/4 + J/4 + 5*J) % 7;
     
     
        return h%7;
    	}

  4. #4
    alex_pi
    Invité(e)
    Par défaut
    J'espère que ça t'apprendra à ne pas repomper du code sans le comprendre...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 185
    Points : 97
    Points
    97
    Par défaut
    je l'avai bien compris mais n'étant pas mathématicien je ne pouvai pas vérifier l'exactitude de la fonction mathématique...

    et puis je croyai être sur un forum d'entraide et non sur un forum pour prendre les autres de haut...

  6. #6
    alex_pi
    Invité(e)
    Par défaut
    Jusqu'à nouvel ordre, pour comprendre ce qu'est une oppération modulo, et donc savoir que k mod n n'est pas égal à -k mod n, il ne faut pas être "mathématicien". Si tu ne comprend pas ça, ça ne sert à rien de vouloir faire de l'informatique, désolé.

    De plus, "aider", ce n'est pas juste corriger les erreurs, mais aussi inciter la personne à ne pas les reproduire. Repomper du code sans le vérifier est une erreur, je la souligne, et t'incite à ne pas la reproduire. Ce n'est pas te prendre de haut. Et tu auras j'espère remarqué que j'avais commencé par te dire où se situait l'erreur d'implémentation.

    Maintenant si tu veux rester dans cette magnifique mouvance de la googlisation du code, fais toi plaisir, mais ne t'étonnes pas le jour où ton patron te virera pour faute professionelle grave.

    Bonne continuation

  7. #7
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Et j'ajouterai qu'avant d'incriminer la formule, on incrimine son propre code...

    Mais quand ce n'est pas le sien, c'est moins simple il est vrai...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  8. #8
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Navré de te contredire alex mais c'est ton patron qui va te virer si il apprend que tu perd un temps fou à réinventer la roue à chaque développement.
    La triste réalité c'est qu'il faut faire vite et si il y a des bugs ca permettra de facturer la maintenance.

    Cette remarque passé, il ne faudrait pas oublier que la formule de Zeller à de nombreuse exceptions comme par exemple pour les années supérieur à 4200...

    Mais aucun théorème mathématique n'est absolument exacte (même Pythagore).

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Remarque, ça tombe bien : on n'y est pas à cette année 4200 .
    On va pas partir dans le débat de facturation, etc. Mais juste une remarque : réinventer la roue coûte du temps de développement. Facturé plus cher que la maintenance généralement. Donc, si c'est prévu (moins sûr ;-) ), ça peut être une bonne façon de facturer du temps. Sur des développements simples, ça ne se justifie pas. Sur de la haute performance, non plus (il y a des solutions éprouvées). Mais dans les autres cas... A voir ! :p
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  10. #10
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Citation Envoyé par WWilson Voir le message
    Mais aucun théorème mathématique n'est absolument exacte (même Pythagore).
    Ne disons pas n'importe quoi non plus.
    Un théorème comporte des hypothèse, il convient de les vérifier avant d'en appliquer le résultat.
    Mais il ne devient pas faux sous prétexte qu'il est mal utilisé.

    Citation Envoyé par WWilson Voir le message
    Cette remarque passé, il ne faudrait pas oublier que la formule de Zeller à de nombreuse exceptions comme par exemple pour les années supérieur à 4200...
    Tu parles là d'une autre formule de Zeller, celle qui sert à déterminer la date du dimanche de Pâques (et qui admet par ailleurs une correction pour prendre en compte les années supérieures à 4200).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2013, 20h04
  2. [Crystal] Formules ...
    Par Antichoc dans le forum Formules
    Réponses: 3
    Dernier message: 25/11/2003, 10h52
  3. [XMLRAD] invalid character type
    Par Sylvain James dans le forum XMLRAD
    Réponses: 4
    Dernier message: 10/12/2002, 07h47
  4. [Formule] Lever et coucher du soleil
    Par psl dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/10/2002, 16h37
  5. [reseaux] Comment creer un compte user à partir d'un formul avec perl
    Par oulai_evado dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 01/10/2002, 19h54

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