Partage
  • Partager sur Facebook
  • Partager sur Twitter

zChance

19 Juin - 15 Juillet

    1 juillet 2010 à 23:55:03

    Citation : Emmflo

    j'ai édité mon message en rajoutant une version commenté de mon code (peut-être un peu trop d'ailleurs...)



    Tes commentaires permettent d'y voir un peu plus clair. Donc si je résume ton algorithme sur un exemple :
    *) aujourd'hui on est le 1er juillet
    *) tu te déplaces au premier vendredi qui suit
    *) si c'est un 13 OK sinon tu continues vers le vendredi suivant.


    Bon c'est acceptable disons voire correct. Je trouve néanmoins ton code assez compliqué. Tant qu'à faire, je chercherais le premier 13 du mois qui suit le jour donné et je me déplacerais de 13 du mois en 13 du mois.


    Bon, finalement, j'ai tenté de mettre cette méthode au point et ça donne ceci :

    #include <stdio.h>
    #include <time.h> /* juste pour struct tm  */
    
    int estBissextile(int a)
    {
      return ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0);
    }
    
    /* 
       Renvoie le premier 13 du mois postérieur à ma_date qui doit être valide et 
       complet (jour entre 1 et 31, mois entre 1 et 12, dimanche =0). 
       Retourne  le jour de la semaine 
    */
    int prochain13(struct tm *ma_date)
    {
      int nbj[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
      int m = ma_date->tm_mon, j = ma_date->tm_mday;
    
      /* Nombre de jours du mois courant */
      int n = nbj[m - 1] + (m == 2 && estBissextile(ma_date->tm_year));
    
      /* Jour de la semaine du prochain 13 */
      ma_date->tm_wday = (ma_date->tm_wday + 13 + (j >= 13) * n - j) % 7;
      /* Mise à jour au prochain 13 */
      if (j >= 13)
        {
          if (m == 11)
            {
              ma_date->tm_year++;
              ma_date->tm_mon = 0;
            }
          else
            ma_date->tm_mon++;
        }
      ma_date->tm_mday = 13;
    
      return ma_date->tm_wday;
    }
    
    int main(void)
    {
      struct tm ma_date;
    
      ma_date.tm_wday = 4; /* dimanche = 0, vendredi = 5 */
      ma_date.tm_mday = 13; /*  1<= jour du mois <= 31 */
      ma_date.tm_mon = 1; /* 1<= mois <= 12*/
      ma_date.tm_year = 2028;
    
      while (prochain13(&ma_date) != 5)
        ;
    
      printf("Vendredi %d/%d/%d\n", ma_date.tm_mday, ma_date.tm_mon,
             ma_date.tm_year);
      return 0;
    }
    

    • Partager sur Facebook
    • Partager sur Twitter
      9 juillet 2010 à 10:47:08

      bonjour,
      bon voici ma cogitation sur le sujet, j'ai pas fait comme impose !
      Ayant eu du mal a dechiffrer, j'ai prefere reflechir naivement à comment faire et j'ai pondu cela :
      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      int Fonction_bissextile (int annee)
      {
          int resultat;
          if ((annee % 4) == 0 )
          {
              resultat = 1; // on ajoute + 1 jour a fevrier;
          }
          else
          {
              resultat = 0;
          }
          return resultat;
      }
      
      
      int main (void)
      {
      
          int Njour[12]={31,28,31,30,31,30,31,31,30,31,30,31};
          /*  point de depart jeudi 1 juillet
              jeudi   ---> jour=4
              juillet ---> mois =7
              annee   ---> annee=2010
          */
          int jour  = 5;
          int annee = 2010;
          int fin   = 2015;
          char *NomMois[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
          //char *NomJour[] = {"Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"};
      
          int i,j,k,bissextile;
          for (i=annee;i<fin;i++)
          {
              bissextile=Fonction_bissextile(j);
              for(j=0;j<12;j++)
              {
                  for(k=1;k<Njour[j]+bissextile;k++)
                  {
                      //printf("%s %d %s %d\n",NomJour[jour],k,NomMois[j],i);
      
                      if ((jour ==5) && (k==13))
                      {
                          printf("vendredi 13 %s %d \n",NomMois[j],i);
                      }
                      if (jour > 6) { jour = 0; }
      
                      jour++;
      
                  }
              }
      
      
          }
      
      
      
          return 0;
      }
      
      • Partager sur Facebook
      • Partager sur Twitter
        9 juillet 2010 à 11:36:07

        Citation : darkipod


        bonjour,
        bon voici ma cogitation sur le sujet, j'ai pas fait comme impose !


        Salut,

        Première chose, ton programme indique que le 13 avril 2011 tombe un vendredi, mais non, il y a un décalage. ;)
        calendrier 2011

        Ta fonction pour tester si une année est bissextile est incomplète.
        Une année est bissextile, si
        • elle est divisible par 400 ou
        • elle est divisible par 4 mais pas par 100-

        Annee bissextile

        Sinon, tu peux enlever les headers inutiles(stdlib.h, time.h).
        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !

        zChance

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown