Algorithme Zeller

Résolu
bonsoir je sais ou est mon probléme ,ca tourne mais ne me donne pas l resultat correcte aparament la formule nai pas correcte donné par lexercice
merciii de m'aiderrr etmerci bk

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int j,m,a,r,q,jo,f;
     do {
        printf("\n donner le nbre de jour svp: \n");
        scanf("%d",&j);

    }while ((j<=1)&&(j>=31));
     do {
        printf("\n donner le mois svp: \n");
        scanf("%d",&m);

    }while ((m<=1)&&(m>=12));
     do {
        printf("\n donner l'annee svp: \n");
        scanf("%d",&a);

    }while (a<=1900);
    if(m>3){
        m=m-2;
}        else
  {
            m=m+10;
        a=a-1;
r=a%100;
q=a/100;
}

  f= ((j + r) - (2*q) + (q/4) + (r/4)) + (((26 * m) - 2) / 10);
   printf("\n%d",f);
   jo=f%7;
   switch (jo){
   case 1:printf(" c est lundi"); break;
   case 2:printf("c est mardi"); break;
   case 3:printf("c est mercredi"); break;
   case 4:printf("c est jeudi"); break;
   case 5:printf("c est vendredi"); break;
   case 6:printf("c est samedi"); break;
   case 7:printf("c est dimanche"); break;
   default :printf("erreur");
   }



    return 0;
}

2 réponses

  1. Contributeur
    Une petite erreur de code :

    }while ((j<=1)&&(j>=31));
    Ce n'est pas un && qu'il faut mettre mais un ||.
    Je te laisse corriger les autres while.

    N'oublie pas d'afficher un '\n' avant la fin de ton programme pour forcer l'affichage.

    Sinon au niveau de l'algorithme, il est correct. Juste que la convention est :
    Mars=1, ..., Janvier=11, Février=12.

    Cdlt,
    1. #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {
          int j,m,a,r,q,jo,f;
           do {
              printf("\n donner le nbre de jour svp: \n");
              scanf("%d",&j);
      
          }while ((j<=1)||(j>=31));
           do {
              printf("\n donner le mois svp: \n");
              scanf("%d",&m);
      
          }while ((m<=1)||(m>=12));
           do {
              printf("\n donner l'annee svp: \n");
              scanf("%d",&a);
      
          }while (a<=1900);
          if(m>3){
              m=m-2;
      }        else
        {
                  m=m+10;
              a=a-1;
      r=a%100;
      q=a/100;
      }
      
        f= ((j + r) - (2*q) + (q/4) + (r/4)) + (((26 * m) - 2) / 10);
         printf("\n%d",f);
         jo=f%7;
         switch (jo){
         case 1:printf(" c est lundi"); break;
         case 2:printf("c est mardi"); break;
         case 3:printf("c est mercredi"); break;
         case 4:printf("c est jeudi"); break;
         case 5:printf("c est vendredi"); break;
         case 6:printf("c est samedi"); break;
         case 7:printf("c est dimanche"); break;
         default :printf("erreur");
         }
      
      
      
          return 0;
      }

      encore un probléme j lai affiché deja le f pour e tester il é d trés grand valeur comme 136 :/ et resultat est fausse de mm
    2. EDIT : Ajout des balises de code (la coloration syntaxique).
      Explications disponibles ICI

      Merci d'y penser dans tes prochains messages.
    3. Bonjour

      Je n'ai pas étudié l'algorithme et je ne sais pas s'il est correct, mais il y a un problème avec le switch final.
      Si jo=f%7, jo vaut 0,1...6 et non pas 1,2,...7
    4. @ikamJe n'ai pas dit le contraire.
      J'ai simplement dit qu'il y avait une erreur, puisque ton nombre vaut de 0 à 6 et que tu fais un switch avec des case de 1 à 7. C'est illogique, peu importe qu'il s'agisse de C ou d'autre chose.