Partage
  • Partager sur Facebook
  • Partager sur Twitter

zChance

19 Juin - 15 Juillet

    19 juin 2010 à 18:49:15

    Bonjour,

    Vous pouvez vos questions (en cas de problème) et vos solutions en rapport avec l'exercice zChance ici.

    Bonne chance.
    • Partager sur Facebook
    • Partager sur Twitter
      19 juin 2010 à 19:25:32

      Bonjour,

      Oui j'aurais une petite question, que veut dire ce bout de code:

      char const * const mois[]
      


      Plus précisement le
      const * const
      
      • Partager sur Facebook
      • Partager sur Twitter
        19 juin 2010 à 19:34:42

        Citation : realmagma

        Bonjour,

        Oui j'aurais une petite question, que veut dire ce bout de code:

        char const * const mois[]
        



        Plus précisement le

        const * const
        


        Je déclare mois comme un tableau de pointeurs constants sur chaîne de caractères constantes.
        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2010 à 19:45:00

          Je sais pas si ça vient de moi mais j'ai toujours pas compris :'( .

          Citation : Lithrein

          Je déclare mois comme un pointeur constant sur un tableau constant de chaînes de carctères.

          C'est plutôt un tableau de pointeurs constant sur chaînes constantes.
          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2010 à 19:48:05

            @meteor2 : En effet, je mettais trompé.

            Autrement, pour l'énoncé :
            Tu dois trouver le timestamp du prochain Vendredi 13 (Le timestamp actuel est donné par time(NULL) ).
            Puis une fois que tu as trouvé ce timestamp au moyen de la fonction vendredi_13 tu affiche la date à laquelle il correspond.
            • Partager sur Facebook
            • Partager sur Twitter
              19 juin 2010 à 20:13:15

              Citation : Lithrein

              Autrement, pour l'énoncé :
              Tu dois trouver le timestamp du prochain Vendredi 13 (Le timestamp actuel est donné par time(NULL) ).
              Puis une fois que tu as trouvé ce timestamp au moyen de la fonction vendredi_13 tu affiche la date à laquelle il correspond.

              Ce qui m'a perturbé surtout c'est le fait que :
              char const * const jours[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
              
              je me demandais à quoi ça pouvait servir vu que en général les Vendredi 13 ça tombe...un vendredi, pas besoin d'avoir les autres jours donc !

              En général on s'attends à ce que le programme soit "dynamique" c'est à dire qu'il ne donne pas toujours la même réponse. J'aurai trouvé plus logique de dire : trouvez la date du N ème prochain vendredi 13.
              • Partager sur Facebook
              • Partager sur Twitter
                19 juin 2010 à 20:38:02

                Pourquoi j'ai mis tout les jours de la semaine ?
                Parce que que pendant les phases de tests, il se peut que l'on se soit trompé dans la fonction et que la date renvoyée n'est pas un Vendredi.

                Autrement, je suis d'accord que le programme est un peu statique (la sortie ne change pas tout les jours) mais il faut bien voir que l'exercice est pour des débutants donc j'évite de compliquer les choses. Déjà que les fonctions manipulant le temps ne sont pas forcément intuitives.
                • Partager sur Facebook
                • Partager sur Twitter
                  19 juin 2010 à 20:48:50


                  #include <stdio.h>
                  #include <time.h>
                  
                  int date_en_jour_julien(int j, int m, int a)
                  {
                    return (1461 * (a + 4800 + (m - 14) / 12)) / 4 + (367 * (m - 2 - 12 * ((m - 14) / 12))) / 12 - (3 * ((a + 4900 + (m - 14) / 12) / 100)) / 4 + j - 32075;
                  }
                  
                  void jour_julien_en_date(int n, int *j, int *m, int *a)
                  {
                    int t0, t1, t2, t3;
                  
                    t0 = n + 68569;
                    t1 = (4 * t0) / 146097;
                    t0 = t0 - (146097 * t1 + 3) / 4;
                    t2 = (4000 * (t0 + 1)) / 1461001;
                    t0 = t0 - (1461 * t2) / 4 + 31;
                    t3 = (80 * t0) / 2447;
                    *j = t0 - (2447 * t3) / 80;
                    *m = t3 + 2 - (12 * (t3 / 11));
                    *a = 100 * (t1 - 49) + t2 + (t3 / 11);
                  }
                  
                  int main(void)
                  {
                    time_t t = time(0);
                    struct tm *tm = localtime(&t);
                    int i, j, m, a, aujourdhui = date_en_jour_julien(tm->tm_mday, tm->tm_mon + 1, tm->tm_year + 1900);
                  
                    for(i = aujourdhui; i < date_en_jour_julien(31, 12, 2100); i++)
                    {
                      jour_julien_en_date(i, &j, &m, &a);
                      if(j == 13 && ((date_en_jour_julien(j, m, a) % 7) == 4))
                        printf("Vendredi %02d/%02d/%d\n", j, m, a);
                    }
                  
                    return 0;
                  }
                  




                  Vendredi 13/08/2010
                  Vendredi 13/05/2011
                  Vendredi 13/01/2012
                  Vendredi 13/04/2012
                  Vendredi 13/07/2012
                  Vendredi 13/09/2013
                  Vendredi 13/12/2013
                  Vendredi 13/06/2014
                  Vendredi 13/02/2015
                  Vendredi 13/03/2015
                  Vendredi 13/11/2015
                  Vendredi 13/05/2016
                  Vendredi 13/01/2017
                  Vendredi 13/10/2017
                  Vendredi 13/04/2018
                  Vendredi 13/07/2018
                  Vendredi 13/09/2019
                  Vendredi 13/12/2019
                  Vendredi 13/03/2020
                  Vendredi 13/11/2020
                  Vendredi 13/08/2021
                  Vendredi 13/05/2022
                  Vendredi 13/01/2023
                  Vendredi 13/10/2023
                  Vendredi 13/09/2024
                  Vendredi 13/12/2024
                  Vendredi 13/06/2025
                  Vendredi 13/02/2026
                  Vendredi 13/03/2026
                  Vendredi 13/11/2026
                  Vendredi 13/08/2027
                  Vendredi 13/10/2028
                  Vendredi 13/04/2029
                  Vendredi 13/07/2029
                  Vendredi 13/09/2030
                  Vendredi 13/12/2030
                  Vendredi 13/06/2031
                  Vendredi 13/02/2032
                  Vendredi 13/08/2032
                  Vendredi 13/05/2033
                  Vendredi 13/01/2034
                  Vendredi 13/10/2034
                  Vendredi 13/04/2035
                  Vendredi 13/07/2035
                  Vendredi 13/06/2036
                  Vendredi 13/02/2037
                  Vendredi 13/03/2037
                  Vendredi 13/11/2037
                  Vendredi 13/08/2038
                  Vendredi 13/05/2039
                  Vendredi 13/01/2040
                  Vendredi 13/04/2040
                  Vendredi 13/07/2040
                  Vendredi 13/09/2041
                  Vendredi 13/12/2041
                  Vendredi 13/06/2042
                  Vendredi 13/02/2043
                  Vendredi 13/03/2043
                  Vendredi 13/11/2043
                  Vendredi 13/05/2044
                  Vendredi 13/01/2045
                  Vendredi 13/10/2045
                  Vendredi 13/04/2046
                  Vendredi 13/07/2046
                  Vendredi 13/09/2047
                  Vendredi 13/12/2047
                  Vendredi 13/03/2048
                  Vendredi 13/11/2048
                  Vendredi 13/08/2049
                  Vendredi 13/05/2050
                  Vendredi 13/01/2051
                  Vendredi 13/10/2051
                  Vendredi 13/09/2052
                  Vendredi 13/12/2052
                  Vendredi 13/06/2053
                  Vendredi 13/02/2054
                  Vendredi 13/03/2054
                  Vendredi 13/11/2054
                  Vendredi 13/08/2055
                  Vendredi 13/10/2056
                  Vendredi 13/04/2057
                  Vendredi 13/07/2057
                  Vendredi 13/09/2058
                  Vendredi 13/12/2058
                  Vendredi 13/06/2059
                  Vendredi 13/02/2060
                  Vendredi 13/08/2060
                  Vendredi 13/05/2061
                  Vendredi 13/01/2062
                  Vendredi 13/10/2062
                  Vendredi 13/04/2063
                  Vendredi 13/07/2063
                  Vendredi 13/06/2064
                  Vendredi 13/02/2065
                  Vendredi 13/03/2065
                  Vendredi 13/11/2065
                  Vendredi 13/08/2066
                  Vendredi 13/05/2067
                  Vendredi 13/01/2068
                  Vendredi 13/04/2068
                  Vendredi 13/07/2068
                  Vendredi 13/09/2069
                  Vendredi 13/12/2069
                  Vendredi 13/06/2070
                  Vendredi 13/02/2071
                  Vendredi 13/03/2071
                  Vendredi 13/11/2071
                  Vendredi 13/05/2072
                  Vendredi 13/01/2073
                  Vendredi 13/10/2073
                  Vendredi 13/04/2074
                  Vendredi 13/07/2074
                  Vendredi 13/09/2075
                  Vendredi 13/12/2075
                  Vendredi 13/03/2076
                  Vendredi 13/11/2076
                  Vendredi 13/08/2077
                  Vendredi 13/05/2078
                  Vendredi 13/01/2079
                  Vendredi 13/10/2079
                  Vendredi 13/09/2080
                  Vendredi 13/12/2080
                  Vendredi 13/06/2081
                  Vendredi 13/02/2082
                  Vendredi 13/03/2082
                  Vendredi 13/11/2082
                  Vendredi 13/08/2083
                  Vendredi 13/10/2084
                  Vendredi 13/04/2085
                  Vendredi 13/07/2085
                  Vendredi 13/09/2086
                  Vendredi 13/12/2086
                  Vendredi 13/06/2087
                  Vendredi 13/02/2088
                  Vendredi 13/08/2088
                  Vendredi 13/05/2089
                  Vendredi 13/01/2090
                  Vendredi 13/10/2090
                  Vendredi 13/04/2091
                  Vendredi 13/07/2091
                  Vendredi 13/06/2092
                  Vendredi 13/02/2093
                  Vendredi 13/03/2093
                  Vendredi 13/11/2093
                  Vendredi 13/08/2094
                  Vendredi 13/05/2095
                  Vendredi 13/01/2096
                  Vendredi 13/04/2096
                  Vendredi 13/07/2096
                  Vendredi 13/09/2097
                  Vendredi 13/12/2097
                  Vendredi 13/06/2098
                  Vendredi 13/02/2099
                  Vendredi 13/03/2099
                  Vendredi 13/11/2099
                  Vendredi 13/08/2100

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 juin 2010 à 21:15:39

                    Citation : magma





                    On peut faire plus simple pour le même résultat :

                    #include <stdio.h>
                    
                    int MikeKeith(int d, int m, int y)
                    {
                      return (d += m < 3 ? y-- : y - 2, 23 * m / 9 + d + 4 + y / 4 - y / 100 + y / 400) % 7;
                    }
                    
                    int main(void)
                    {
                      int m , a;
                    
                      for (a = 2010; a <= 2100; a++)
                        for (m = 1; m <= 12; m++)
                          if (MikeKeith(13, m, a) == 5)
                            printf("Vendredi %02d/%02d/%d\n", 13, m, a);
                    
                      return 0;
                    }
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 juin 2010 à 21:28:33

                      Et vous croyez que les débutants vont, même juste penser à, résoudre cet exercice? o_O
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                        19 juin 2010 à 21:32:14

                        Citation : GurneyH

                        Et vous croyez que les débutants vont, même juste penser à, résoudre cet exercice? o_O




                        Ben c'est un exo facile (mise-à-part le timesmachin), je l'ai fait un mois après avoir commencé le C, j'ai encore le code source d'ailleurs ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 juin 2010 à 21:35:15

                          Citation : candide


                          Ben c'est un exo facile (mise-à-part le timesmachin), je l'ai fait un mois après avoir commencé le C, j'ai encore le code source d'ailleurs ;)


                          Je ne dis pas le contraire sauf que les précédent étaient bien plus faciles, et pas un vrai débutant n'a posté de code! Alors pour celui-ci, on sera combien.
                          Lorsque je vois que les premiers posteurs sont magma et toi, j'ai un doute. :-°
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            19 juin 2010 à 21:49:03

                            Ensuite, les codes de candide et de magma sont certes très performants en utilisant les propriété du calendrier grégorien mais il y a des manières beaucoup plus simples pour trouver le prochain vendredi 13.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 juin 2010 à 21:50:49

                              Citation : GurneyH


                              Lorsque je vois que les premiers posteurs sont magma et toi, j'ai un doute. :-°




                              Bah non, faut pas que les débutants s'effraient, c'est un exo très adapté à la programmation. Il suffit de connaître les boucles et les if pour le faire. L'idée de base est complètement primaire : on parcourt le calendrier comme on le ferait avec un vrai sauf que la machine parcourra beaucoup plus vite. Autrement dit, je compte

                              samedi 19 juin 2010
                              dimanche 20 juin 2010
                              lundi 21 juin 2010
                              etc

                              jusqu'au 13 juillet 2010. Si c'est un vendredi, c'est bon j'ai fini sinon je recommence à compter jusqu'au 13 août 2010 et ainsi de suite.

                              Bon, pour faire ça, il suffit de connaître
                              -- la succesion des jours de semaine (lundi, mardi, etc)
                              -- le nombre de jours par mois (31 pour le mois en 01, 28 ou 29 pour le mois en 02).


                              Je pense surtout que
                              1°) les débutants ne savent pas que zChance leur est destiné,
                              2°) les débutants imaginent l'exo trop difficile, ils savent pas par quel bout le prendre.

                              Je l'ai déjà testé en TP et je sais que les étudiants ont du mal mais c'est largement psychologique parce que si on leur donne quelques explications, on les met en confiance et on leur laisse un peu de temps, ils y arrivent. Mais c'est vrai qu'il faut un peu de patience pour arriver jusqu'au bout et chasser tous les mini-bugs.


                              Citation : Lithrein

                              Ensuite, les codes de candide et de magma sont certes très performants en utilisant les propriété du calendrier grégorien mais il y a des manières beaucoup plus simples pour trouver le prochain vendredi 13.



                              Celle dont je parle ci-dessus ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 juin 2010 à 23:07:40

                                Citation : candide

                                Celle dont je parle ci-dessus ?



                                Tout à fait.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 juin 2010 à 2:57:58

                                  De manière bateau, en utilsant mktime

                                  #include <stdio.h>
                                  #include <stdlib.h>
                                  #include <time.h>
                                  
                                  struct tm* vendredi13(struct tm *t)
                                  {
                                      do
                                      {
                                          t->tm_mday++;
                                          mktime(t);
                                      }while(t->tm_wday != 5 || t->tm_mday != 13);
                                  
                                      return t;
                                  }
                                  
                                  int main (void)
                                  {
                                      int i;
                                      static char const *s_mois[] =
                                      {
                                          "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout",
                                          "Septembre", "Octobre", "Novembre", "Decembre"
                                      };
                                  
                                      time_t current = time(NULL);
                                      struct tm *date = localtime(&current);
                                  
                                      for(i = 0; i < 10; i++)
                                      {
                                          vendredi13(date);
                                          printf("vendredi 13 %s %d\n", s_mois[date->tm_mon], 1900 + date->tm_year);
                                      }
                                  
                                      return EXIT_SUCCESS;
                                  }
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Zeste de Savoir, le site qui en a dans le citron !
                                    20 juin 2010 à 17:51:16

                                    J'ai trouvé quelque chose mais vu que je ne connaissais pas grand chose aux fonctions de time.h, j'ai découpé le temps moi-même (je referai peut-être le code ensuite):


                                    #include <stdio.h>
                                    #include <stdlib.h>
                                    #include <time.h>
                                    
                                    typedef struct{
                                        const char *nom;
                                        int jours;
                                    } Mois;
                                    
                                    int bissextile(int annee)
                                    {
                                        return ((annee%4 == 0 && annee%100 != 0) || (annee%400 == 0));
                                    }
                                    
                                    int main()
                                    {
                                        const char *week[] = {"Jeudi", "Vendredi", "Samedi", "Dimanche", "Lundi", "Mardi", "Mercredi"};
                                        time_t current = time(NULL);
                                        int day_of_week = (current/(3600*24))%7;
                                        int day = (current/(3600*24))%30;
                                        int year = (current/(3600*24*365));
                                        int month = 5;
                                        int found = 0;
                                        Mois months[] =
                                        {
                                            {"Janvier", 31},    {"Fevrier", 28+bissextile(1970+year)},
                                            {"Mars", 31},       {"Avril", 30},
                                            {"Mai", 31},        {"Juin", 30},
                                            {"Juillet", 31},    {"Aout", 31},
                                            {"Septembre", 30},  {"Octobre", 31},
                                            {"Novembre", 30},   {"Decembre", 31}
                                        };
                                        while(found < 150){
                                            if(day == 1 && month == 0){
                                                year++;
                                                months[1].jours = 28+bissextile(1970+year);
                                            }
                                            if(day_of_week == 1 && day == 13){
                                                found++;
                                                printf("%s %d %s %d\n", week[day_of_week], day, months[month].nom, 1970+year);
                                            }
                                            day_of_week = (day_of_week+1)%7;
                                            day = (day+1)%months[month].jours + (day+1 > months[month].jours);
                                            month = (month+(day == 1))%12;
                                        }
                                        return 0;
                                    }
                                    

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 juin 2010 à 18:00:34

                                      @simpsonmaniac :
                                      Ta fonction bissextile est fausse (il devrait y avoir plus de critères), et pour le traitement des fonctions déjà faites dans time.h tel que localtime le fond déjà en mieux.
                                      Dernièrement ta fonction n'est pas générique, après le 13 Août elle ne marchera plus si j'ai bien compris ton code.
                                      Pourrais-tu mettre ton code entre balises <secret></secret>

                                      @GurneyH:
                                      Rien à redire si ce n'est que la méthode est vraiment la plus naïve qui soit.
                                      Par contre, je ne vois pas l'utilité de mktime.C'est bon, j'ai compris. Je n'avais pas vu que mktime recalcule les membres de la structure.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        20 juin 2010 à 18:06:50

                                        Citation : Lithrein


                                        @GurneyH:
                                        Rien à redire si ce n'est que la méthode est vraiment la plus naïve qui soit.


                                        J'admet. :p

                                        Je ne voulais pas utiliser l'algo de magma ou candide(déjà fait), et je voulais faire quelque chose de très simple.
                                        Mais du coup, faut savoir à quoi sert mktime...
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Zeste de Savoir, le site qui en a dans le citron !
                                          20 juin 2010 à 18:17:49

                                          Citation : Lithrein

                                          @simpsonmaniac :
                                          Ta fonction bissextile est fausse (il devrait y avoir plus de critères), et pour le traitement des fonctions déjà faites dans time.h tel que localtime le fond déjà en mieux.
                                          Dernièrement ta fonction n'est pas générique, après le 13 Août elle ne marchera plus si j'ai bien compris ton code.



                                          Effectivement, je m'étais mal renseigné sur les années bissextiles, je corrige.
                                          En revanche, je ne vois pas pourquoi tu dis qu'elle ne fonctionnera plus après le 13 août, elle me sort des résultats qui correspondent à ceux de Magma plus haut:


                                          Vendredi 13 Aout 2010
                                          Vendredi 13 Mai 2011
                                          Vendredi 13 Janvier 2012
                                          Vendredi 13 Avril 2012
                                          Vendredi 13 Juillet 2012
                                          Vendredi 13 Septembre 2013
                                          Vendredi 13 Decembre 2013
                                          Vendredi 13 Juin 2014
                                          Vendredi 13 Fevrier 2015
                                          Vendredi 13 Mars 2015
                                          Vendredi 13 Novembre 2015
                                          Vendredi 13 Mai 2016
                                          Vendredi 13 Janvier 2017
                                          Vendredi 13 Octobre 2017
                                          Vendredi 13 Avril 2018
                                          Vendredi 13 Juillet 2018
                                          Vendredi 13 Septembre 2019
                                          Vendredi 13 Decembre 2019
                                          Vendredi 13 Mars 2020
                                          Vendredi 13 Novembre 2020
                                          Vendredi 13 Aout 2021
                                          Vendredi 13 Mai 2022
                                          Vendredi 13 Janvier 2023
                                          Vendredi 13 Octobre 2023
                                          Vendredi 13 Septembre 2024
                                          Vendredi 13 Decembre 2024
                                          Vendredi 13 Juin 2025
                                          Vendredi 13 Fevrier 2026
                                          Vendredi 13 Mars 2026
                                          Vendredi 13 Novembre 2026
                                          Vendredi 13 Aout 2027
                                          Vendredi 13 Octobre 2028
                                          Vendredi 13 Avril 2029
                                          Vendredi 13 Juillet 2029
                                          Vendredi 13 Septembre 2030
                                          Vendredi 13 Decembre 2030
                                          Vendredi 13 Juin 2031
                                          Vendredi 13 Fevrier 2032
                                          Vendredi 13 Aout 2032
                                          Vendredi 13 Mai 2033
                                          Vendredi 13 Janvier 2034
                                          Vendredi 13 Octobre 2034
                                          Vendredi 13 Avril 2035
                                          Vendredi 13 Juillet 2035
                                          Vendredi 13 Juin 2036
                                          Vendredi 13 Fevrier 2037
                                          Vendredi 13 Mars 2037
                                          Vendredi 13 Novembre 2037
                                          Vendredi 13 Aout 2038
                                          Vendredi 13 Mai 2039
                                          Vendredi 13 Janvier 2040
                                          Vendredi 13 Avril 2040
                                          Vendredi 13 Juillet 2040
                                          Vendredi 13 Septembre 2041
                                          Vendredi 13 Decembre 2041
                                          Vendredi 13 Juin 2042
                                          Vendredi 13 Fevrier 2043
                                          Vendredi 13 Mars 2043
                                          Vendredi 13 Novembre 2043
                                          Vendredi 13 Mai 2044
                                          Vendredi 13 Janvier 2045
                                          Vendredi 13 Octobre 2045
                                          Vendredi 13 Avril 2046
                                          Vendredi 13 Juillet 2046
                                          Vendredi 13 Septembre 2047
                                          Vendredi 13 Decembre 2047
                                          Vendredi 13 Mars 2048
                                          Vendredi 13 Novembre 2048
                                          Vendredi 13 Aout 2049
                                          Vendredi 13 Mai 2050
                                          Vendredi 13 Janvier 2051
                                          Vendredi 13 Octobre 2051
                                          Vendredi 13 Septembre 2052
                                          Vendredi 13 Decembre 2052
                                          Vendredi 13 Juin 2053
                                          Vendredi 13 Fevrier 2054
                                          Vendredi 13 Mars 2054
                                          Vendredi 13 Novembre 2054
                                          Vendredi 13 Aout 2055
                                          Vendredi 13 Octobre 2056
                                          Vendredi 13 Avril 2057
                                          Vendredi 13 Juillet 2057
                                          Vendredi 13 Septembre 2058
                                          Vendredi 13 Decembre 2058
                                          Vendredi 13 Juin 2059
                                          Vendredi 13 Fevrier 2060
                                          Vendredi 13 Aout 2060
                                          Vendredi 13 Mai 2061
                                          Vendredi 13 Janvier 2062
                                          Vendredi 13 Octobre 2062
                                          Vendredi 13 Avril 2063
                                          Vendredi 13 Juillet 2063
                                          Vendredi 13 Juin 2064
                                          Vendredi 13 Fevrier 2065
                                          Vendredi 13 Mars 2065
                                          Vendredi 13 Novembre 2065
                                          Vendredi 13 Aout 2066
                                          Vendredi 13 Mai 2067
                                          Vendredi 13 Janvier 2068
                                          Vendredi 13 Avril 2068
                                          Vendredi 13 Juillet 2068
                                          Vendredi 13 Septembre 2069
                                          Vendredi 13 Decembre 2069
                                          Vendredi 13 Juin 2070
                                          Vendredi 13 Fevrier 2071
                                          Vendredi 13 Mars 2071
                                          Vendredi 13 Novembre 2071
                                          Vendredi 13 Mai 2072
                                          Vendredi 13 Janvier 2073
                                          Vendredi 13 Octobre 2073
                                          Vendredi 13 Avril 2074
                                          Vendredi 13 Juillet 2074
                                          Vendredi 13 Septembre 2075
                                          Vendredi 13 Decembre 2075
                                          Vendredi 13 Mars 2076
                                          Vendredi 13 Novembre 2076
                                          Vendredi 13 Aout 2077
                                          Vendredi 13 Mai 2078
                                          Vendredi 13 Janvier 2079
                                          Vendredi 13 Octobre 2079
                                          Vendredi 13 Septembre 2080
                                          Vendredi 13 Decembre 2080
                                          Vendredi 13 Juin 2081
                                          Vendredi 13 Fevrier 2082
                                          Vendredi 13 Mars 2082
                                          Vendredi 13 Novembre 2082
                                          Vendredi 13 Aout 2083
                                          Vendredi 13 Octobre 2084
                                          Vendredi 13 Avril 2085
                                          Vendredi 13 Juillet 2085
                                          Vendredi 13 Septembre 2086
                                          Vendredi 13 Decembre 2086
                                          Vendredi 13 Juin 2087
                                          Vendredi 13 Fevrier 2088
                                          Vendredi 13 Aout 2088
                                          Vendredi 13 Mai 2089
                                          Vendredi 13 Janvier 2090
                                          Vendredi 13 Octobre 2090
                                          Vendredi 13 Avril 2091
                                          Vendredi 13 Juillet 2091
                                          Vendredi 13 Juin 2092
                                          Vendredi 13 Fevrier 2093
                                          Vendredi 13 Mars 2093
                                          Vendredi 13 Novembre 2093
                                          Vendredi 13 Aout 2094
                                          Vendredi 13 Mai 2095
                                          Vendredi 13 Janvier 2096
                                          Vendredi 13 Avril 2096
                                          Vendredi 13 Juillet 2096
                                          Vendredi 13 Septembre 2097

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            20 juin 2010 à 18:25:49

                                            Citation : simpsonmaniac

                                            En revanche, je ne vois pas pourquoi tu dis qu'elle ne fonctionnera plus après le 13 août, elle me sort des résultats qui correspondent à ceux de Magma plus haut:



                                            J'ai du mal lire le code, ce qui me faisais dire ça sont les nombres magiques que tu as utilisé :
                                            month = 5
                                            day = ...%30
                                            Ensuite, n'ayant pas testé, ce n'était qu'une supposition.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              20 juin 2010 à 18:36:11

                                              Citation : Lithrein

                                              Citation : simpsonmaniac

                                              En revanche, je ne vois pas pourquoi tu dis qu'elle ne fonctionnera plus après le 13 août, elle me sort des résultats qui correspondent à ceux de Magma plus haut:
                                              </secret>



                                              J'ai du mal lire le code, ce qui me faisais dire ça sont les nombres magiques que tu as utilisé :
                                              month = 5
                                              day = ...%30
                                              Ensuite, n'ayant pas testé, ce n'était qu'une supposition.



                                              Ah, oui c'est vrai, pardon :honte: , en fait les mois étaient difficiles à gérer comme ça alors j'ai un peu hack pour que ça marche mais ça ne marchera pas après ce mois-ci.
                                              Je pense que je vais refaire un code en utilisant les fonctions de time.h, ce sera sûrement moins prise de tête.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 juin 2010 à 16:45:24

                                                Les topics d'exercices pour débutants, ... j'en ai marre de les voir couler. De plus, l'exercice est simple, la seule difficulté serait qu'il n'y a pas de cours sur le temps en C sur le site du zér0.
                                                Mais les pages décrivant ces fonctions sont claires, non ?

                                                Je vous (les débutants en C) recommande donc d'essayer cet exercice, il est à votre porté !
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  23 juin 2010 à 19:04:21

                                                  J'ai un peu du mal a comprendre ce que doit renvoyer la fonction vendredi_13()

                                                  Un time_t représente-t-il un nombre de seconde ou de minutes ?

                                                  J'ai aussi du mal a comprendre les variables du main (surtout la variable "vendredi"mais c'est normal vu qu'elle prend le retour de vendredi_13() )
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 juin 2010 à 19:22:22

                                                    Citation : Lithrein

                                                    Les topics d'exercices pour débutants, ... j'en ai marre de les voir couler. De plus, l'exercice est simple, la seule difficulté serait qu'il n'y a pas de cours sur le temps en C sur le site du zér0.

                                                    C'est vrai qu'on ne voit pas beaucoup de débutants participer aux exercices, mais ce n'est pas parce-qu'ils sont mal expliqués ou trop compliqués. Je pense que les raisons sont:
                                                    1)Ils ont pas envie de quitter le cadre du cours de Mateo (en gros ils ne feront que les exercices qui lui il propose)
                                                    2)Vu qu'ils sont débutants ils ne savent pas que pour progresser il faut faire ce genre d'exo.
                                                    3)Les membres qui sont plutôt actifs ont un niveau un peu plus avancés.

                                                    Donc en conclusion je dirai qu'il y aurait plus de participants si les exos étaient d'un niveau intermédiaire/avancé (mais ce n'est peut-être pas l'objectif de ces exercices, je ne sais pas!).
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      23 juin 2010 à 19:23:46

                                                      La fonction vendredi_13 renvoie un nombre de secondes (time_t). Plus précisément elle renvoie le timestamp du prochain vendredi 13.

                                                      Pour les variables du main :
                                                      * vendredi : le timestamp du prochain vendredi 13
                                                      * date : La date au format calendaire
                                                      * mois et jours : la liste des mois et des jours.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        23 juin 2010 à 19:28:53

                                                        J'ai pas regardé les autres codes, je poste ici ma solution plus que naïve, codé en 5 minute :

                                                        #include <stdio.h>
                                                        #include <stdlib.h>
                                                        #include <time.h>
                                                        
                                                        time_t
                                                        vendredi_13 (void) {
                                                            time_t ret = time(NULL);
                                                            struct tm *s_tm;
                                                            while(1)
                                                            {
                                                            	s_tm = localtime(&ret);
                                                            	//Si c'est un vendredi (5ème jour de la semaine) 13, on arrête.
                                                            	if(s_tm->tm_mday == 13 && s_tm->tm_wday == 5)
                                                            		break;
                                                            	
                                                            	//On avance d'un jour	
                                                            	ret += 24*60*60;	
                                                            }
                                                            
                                                            return ret;
                                                        }
                                                        
                                                        int
                                                        main (void) {
                                                            
                                                            time_t vendredi = vendredi_13();
                                                            struct tm date = *localtime(&vendredi);
                                                            char const * const jours[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
                                                            char const * const mois[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
                                                            
                                                            printf("%s %d %s %d\n", jours[date.tm_wday], date.tm_mday, mois[date.tm_mon], 1900+date.tm_year);
                                                            
                                                            return EXIT_SUCCESS;
                                                        }
                                                        
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          23 juin 2010 à 21:59:24

                                                          Ma version actuelle :

                                                          #include <stdio.h>
                                                          #include <stdlib.h>
                                                          #include <time.h>
                                                          
                                                          #define VENDREDI 5 // Vendredi est le 5ème jour de la semaine (en Angleterre of course et en partant de 0)
                                                          
                                                          struct tm* jour_suivant (time_t* sec) // Renvoie la structure tm* du jour suivant
                                                          {
                                                              *sec += 60 * 60 * 24; // 60 sec font 1 min, 60 min font 1 h, 24 h font 1 jour
                                                          
                                                              return localtime(sec);
                                                          }
                                                          
                                                          time_t vendredi_13 (void)
                                                          {
                                                              time_t tmp_sec = time(NULL);
                                                              struct tm* tmp = localtime(&tmp_sec);
                                                          
                                                              while ((tmp->tm_mday != 13) || (tmp->tm_wday != VENDREDI)) // On sort de la boucle si le jours est le 13 et que c'est un vendredi
                                                              {
                                                                  tmp = jour_suivant(&tmp_sec); // On passe au jour suivant
                                                                  tmp_sec = mktime(tmp); // On met le time_t à jour
                                                              }
                                                          
                                                              return mktime(tmp);
                                                          }
                                                          
                                                          int main (void)
                                                          {
                                                              time_t vendredi = vendredi_13();
                                                              struct tm date = *localtime(&vendredi);
                                                              char const * const jours[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
                                                              char const * const mois[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
                                                          
                                                                  printf("%s %d %s %d\n", jours[date.tm_wday], date.tm_mday, mois[date.tm_mon], 1900+date.tm_year);
                                                          
                                                              return EXIT_SUCCESS;
                                                          }
                                                          


                                                          Perso, j'ai pas utilisé mktime de la même façon que GurneyH, mais j'ai utilisé la partie "retourne l'équivalent en time_t".
                                                          Maintenant, je cherche une méthode qui me permette d'afficher une liste des 10 prochains jours. Pour l'instant, j'arrive que à afficher 10 fois "vendredi 13 Août 2010". Fin bon, il est tard et la nuit porte conseil.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            23 juin 2010 à 22:31:09

                                                            @nasta et @tosh : Vos solutions naïves sont bien et réponde au problème posé.

                                                            Cependant nasta, les ¾ de tes commentaires ne servent à rien. Les commentaires ne sont pas la pour décrire le code. Ils servent plutôt (à mon avis) à décrire les passages obscures du code source.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              23 juin 2010 à 23:08:19

                                                              Ma petite soluce. J'ai bien suivi l'énoncé, sauf que j'ai corrigé l'orthographe des noms de mois (ajouter les accents, supprimer les capitales).
                                                              #include <stdio.h>
                                                              #include <stdlib.h>
                                                              #include <time.h>
                                                              
                                                              int est_vendredi_13(time_t t) {
                                                              	struct tm *tm = localtime(&t);
                                                              	return tm->tm_wday == 5 && tm->tm_mday == 13;
                                                              }
                                                              
                                                              time_t vendredi_13(void) {
                                                              	time_t t;
                                                              	for (t = time(0); !est_vendredi_13(t); t += 60*60*24);
                                                              	return t;
                                                              }
                                                              
                                                              int main(void) {
                                                              	time_t vendredi = vendredi_13();
                                                              	struct tm date = *localtime(&vendredi);
                                                              	char const * const jours[] = { "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" };
                                                              	char const * const mois[] = { "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre" };
                                                                  
                                                              	printf("%s %d %s %d\n", jours[date.tm_wday], date.tm_mday, mois[date.tm_mon], 1900+date.tm_year);
                                                                  
                                                              	return EXIT_SUCCESS;
                                                              }
                                                              


                                                              @Tosh: Il me semble que ta solution ne marche pas bien pour les personnes hors du fuseau GMT, car ton programme mélange localtime et gmtime.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              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