Partage
  • Partager sur Facebook
  • Partager sur Twitter

zChance

19 Juin - 15 Juillet

    24 juin 2010 à 1:18:14

    Citation : Marc Mongenet

    Ma petite soluce. J'ai bien suivi l'énoncé, sauf que j'ai corrigé l'orthographe des noms de mois (ajouter les accents,



    Pour les accents, je pense qu'il faut prendre des précautions, cf. Accents en C


    Citation : Marc Mongenet


    time_t vendredi_13(void) {
    	time_t t;
    	for (t = time(0); !est_vendredi_13(t); t += 60*60*24);
    	return t;
    }
    


    À mon avis, c'est complètement faux, tu as l'air de croire que time() retourne des secondes, absolument pas. time_t peut par exemple être un type flottant. la Norme est très claire :

    Citation : C 99


    The time function determines the current calendar time. The encoding of the value is
    unspecified



    time_t est un type opaque, on ne peut quasiment rien faire directement avec lui.

    Par ailleurs, time() peut échouer donc ...

    La Norme donne un exemple

    Citation : C99

    What day of the week is July 4, 2001?



    dont l'adaptation permet de répondre comme il faut à la question posée.


    Citation : Marc Mongenet

    char const * const jours[] = { "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" };
    




    const embrouille le débutant et même le débutant avancé, encore pire quand on en met deux et surtout que pour la question posée ça ne sert vraiment à rien.
    • Partager sur Facebook
    • Partager sur Twitter
      24 juin 2010 à 9:36:19

      Citation

      @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.



      J'ai donc édité mon message pour remplacer gmtime() par localtime().

      (Je suis pas bien habitué à manipuler ces fonctions :) )

      @Candide : j'ai moi aussi suivis le même raisonnement que Marc Mongenet, car il est spécifié dans le man :

      Citation


      time renvoie l'heure actuelle sous forme du nombre de secondes écoulées depuis le 1er Janvier 1970 à 00h 00m 00s GMT, le début de l'Epoque (Epoch en anglais).



      Je n'ai donc pas cherché plus loin :)
      • Partager sur Facebook
      • Partager sur Twitter
        24 juin 2010 à 10:04:41

        Citation : candide

        À mon avis, c'est complètement faux, tu as l'air de croire que time() retourne des secondes.


        Effectivement, j'ai toujours travaillé avec le time de Unix, pour lequel c'est le cas: http://www.opengroup.org/onlinepubs/00 [...] xsh/time.html
        Je ne savais pas que ce type était laissé opaque par le standard et ma solution ne vaut rien dans le cas général.
        • Partager sur Facebook
        • Partager sur Twitter
          25 juin 2010 à 23:08:39

          Je me permet de UP.

          C'est le week-end, peut-être qu'il y a des gens qui sont passés à coté de cet exercice. :)
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            26 juin 2010 à 0:57:07

            Citation : GurneyH

            Je me permet de UP.

            C'est le week-end, peut-être qu'il y a des gens qui sont passés à coté de cet exercice. :)



            Surtout que la solution vraiment naïve n'a pas été proposée (je trouve la solution de simpsonmaniac pas encore assez naïve).
            • Partager sur Facebook
            • Partager sur Twitter
              26 juin 2010 à 9:09:29

              Pour peut-être donner l'inspiration. :-°
              Une solution simple sans <time.h>.
              On parcourt le calendrier en tenant compte du nombre de jours dans la semaines, du nombre de jours dans le mois et en prenant garde aux années bissextiles pour le nombre de jours du mois de février.

              voir en dessous...
              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
                26 juin 2010 à 10:20:00

                Citation : GurneyH

                Pour peut-être donner l'inspiration. :-°
                Une solution simple sans <time.h>.
                On parcourt le calendrier en tenant compte du nombre de jours dans la semaines, du nombre de jours dans le mois et en prenant garde aux années bissextiles pour le nombre de jours du mois de février.



                Oui mais plutôt que de donner un code, je crois que tu aurais dû laisser une occasion au débutant de proposer le sien. De toute façon, ta solution, pour un débutant, accumule les difficultés, en vrac : macros, structure, usage de l'anglais, tableau incomplet, pointeurs, opérateur ->, do/while, usage d'expressions logiques, initialisation de structure.
                • Partager sur Facebook
                • Partager sur Twitter
                  26 juin 2010 à 10:23:50

                  ok, je me posais la question, et tu as raison.
                  mais j'enlève pour l'instant. :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                    26 juin 2010 à 10:46:32

                    Citation : GurneyH

                    ok, je me posais la question, et tu as raison.
                    mais j'enlève pour l'instant. :)



                    Bon de toutes façons, je pense qu'aucun débutant ne vas venir poster son code. Pour plusieurs raisons :

                    -- déjà, le débutant ne saura que par hasard l'existence de cet exercice
                    -- des solutions trop élaborées ont déjà été postées dans la discussion et cela intimide voire dissuade le débutant
                    -- l'exercice est trop abrupt par rapport au cours de matéo21 autrement dit le débutant n'aura pas été préparé à faire ce genre d'exercice qui demande à la fois des connaissances en C, de maîtriser un algorithme à caractère technique (plein de cas à considérer) et de faire preuve de pas mal d'initiative.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 juin 2010 à 10:51:53

                      A propos de la fonction time je vois pas vraiment pourquoi la norme et les pages de manuel se contredisent.


                      La page de man donne :

                      Citation : htpp://www.manpagez.com/man/3/time/

                      The time() function returns the value of time in seconds since 0 hours, 0
                      minutes, 0 seconds, January 1, 1970, Coordinated Universal Time, without
                      including leap seconds. If an error occurs, time() returns the value
                      (time_t)-1.



                      Or d'après la norme la fonction time ne retourne pas forcément un nombre de secondes mais seulement l'heure calendaire dans un format indéfini.

                      Donc, Peut-on être assuré de récupérer un nombre de secondes via la fonction time de l'entête time.h ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 juin 2010 à 11:23:35

                        la fonction time décrite dans les pages de man est conforme POSIX mais pas ISO C.

                        Regarde conformité dans la page de man.


                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                          26 juin 2010 à 14:26:43

                          Après ma solution Posix, voici une solution portable (enfin j'espère) et naïve à base de fonctions de time.h.

                          #include <stdio.h>
                          #include <stdlib.h>
                          #include <time.h>
                          
                          time_t vendredi_13(void) {
                          	time_t t = time(0);
                          	struct tm *tm = localtime(&t);
                          	
                          	while (tm->tm_wday != 5 || tm->tm_mday != 13) {
                          		++tm->tm_mday;
                          		t = mktime(tm);
                          		tm = localtime(&t);
                          	}
                          
                          	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;
                          }
                          


                          Une optimisation élémentaire serait de ne tester que les 13 du mois.

                          Je rêve où c'est la première solution portable à base de fonctions de time.h qui est présentée?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 juin 2010 à 14:46:06

                            Citation : Marc Mongenet


                            Je rêve où c'est la première solution portable à base de fonctions de time.h qui est présentée?


                            hum, ce n'est pas portable? -> ici
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Zeste de Savoir, le site qui en a dans le citron !
                              26 juin 2010 à 15:52:24

                              Solution naïve, lente (et portable ! :p ) :
                              #include <stdio.h>
                              
                              int bissextile(int y)
                              {
                                  //Si multiple de 4 mais pas de 100
                                  if (y%4 == 0 && y%100 != 0)
                              	return 1;
                                  //Sinon si multiple de 400
                                  else if (y%400 == 0)
                              	return 1;
                                  //Sinon pas bissextile
                                  else
                              	return 0;
                              }
                              
                              void vendredi(int y, int m, int d, int jour, int last_year)
                              {
                                  // Les mois commencent à 1 mais le tableau à 0, il faudra donc faire -1 pour obtenir le nombre de jour du mois voulu
                                  int jours_mois[12] = {31,28,31,30,31,30,31,31,30,31,30,31} ;
                              
                                  while (y <= last_year) // tant qu'on est pas arrivé à l'année souhaitée (dans l'exemple 2100)
                                  {
                                      if (d == 13 && jour == 5) // Si on est un vendredi 13
                                          fprintf(stderr,"Vendredi 13/%d/%d\n",m,y);
                              
                              
                              	if (bissextile(y)) // Si l'année est bissextile, il y a 29 jours en février
                              	    jours_mois[1] = 29; 
                              	else
                              	    jours_mois[1] = 28;
                              
                                      jour ++; // A chaque boucle on avance d'un jour
                                      d ++;
                              
                              	if (d > jours_mois[m-1]) // Si on a dépassé le nombre de jour du mois (par exemple 31 juin), on incrément le mois et on met le jour à 1 (31 juin => 1er juillet)
                              	{
                              	    d = 1;
                              	    m ++;
                              	}
                              
                              	if (jour > 7) // Si on a dépassé le 7ème jour de la semaine, on recommence (jour 1 = Lundi)
                              	    jour = 1;
                              
                              	if (m > 12) // Si on a plus de 13 mois, on change d'année et on se met en janvier
                              	{
                              	    m = 1;
                              	    y ++;
                              	}
                              
                                  }
                              }
                              
                              int main()
                              {
                                  // Il faut donner un jour correct à la fonction, ici le 27/6/2010 avec comme jour 7 (= dimanche), on s'arrêtera en 2100
                                  vendredi(2010,6,27,7,2100);
                                  return 0;
                              }
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juin 2010 à 18:07:30

                                Bon j'ai refait une solution en utilisant les fonctions de time.h (c'est vrai que c'est plus efficace :D ) mais le programme bloque quand j'essaie d'afficher les dates après 2037 (je suppose qu'il s'agit du bug de l'an 2038 mais dans ce cas qu'est-ce que je peux faire pour éviter ceci ?)


                                #include <stdio.h>
                                #include <stdlib.h>
                                #include <time.h>
                                
                                int bissextile(int annee)
                                {
                                    return ((annee%4 == 0 && annee%100 != 0) || (annee%400 == 0));
                                }
                                
                                time_t vendredi_13(void)
                                {
                                    time_t t_now = time(NULL);
                                    struct tm *now = localtime(&t_now);
                                    int mois[] = {31,28+bissextile(1900+now->tm_year),31,30,31,30,31,31,30,31,30,31};
                                    do
                                    {
                                        if(now->tm_mon == 0){
                                            mois[1] = 28+bissextile(1900+now->tm_year);
                                        }
                                        now->tm_mday += 13 + (mois[now->tm_mon] - now->tm_mday);
                                        mktime(now);
                                    } while(now->tm_wday != 5);
                                    return mktime(now);
                                }
                                
                                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
                                  26 juin 2010 à 20:08:37

                                  Citation : Marc Mongenet


                                  ++tm->tm_mday;
                                  		t = mktime(tm);
                                  





                                  Qu'est-ce qui te prouve que le 31 juin sera nécessairement interprété comme le 1er juillet ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 juin 2010 à 21:49:35

                                    mktime sert à ça, non?... o_O
                                    Si ce n'est pas le cas tu pouvais le faire remarquer avant... :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Zeste de Savoir, le site qui en a dans le citron !
                                      27 juin 2010 à 0:09:50

                                      Citation : GurneyH

                                      mktime sert à ça, non?... o_O



                                      Pas vraiment, c'est un effet de bord de mktime puisque mktime sert à convertir du format struct tm au format time_t. D'autre part, la Norme dit bien que des champs de la structure tm ayant des valeurs autres que les valeurs normales peuvent être passées à mktime(). Mais la Norme ne dit pas comment ces valeurs sont converties et si les conversions correspondent à des dates valides. Pour moi, le 31 juin ça n'existe pas ou alors faut qu'on me donne la règle précise de transformation en date valide même s'il parait logique d'imaginer que ça pourrait raisonnablement être le 1er juillet. De même, mktime semble accepter des valeurs de dates complètement farfelues (un jour négatif voire un mois négatif).


                                      Citation : GurneyH


                                      Si ce n'est pas le cas tu pouvais le faire remarquer avant... :)



                                      Oui, désolé, je n'avais pas regardé ton code en détail.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        27 juin 2010 à 15:27:57

                                        Salut,

                                        J'ai décidé de me lancer dans mon premier exo :D Je suis débutant dans la mesure où j'ai encore beaucoup de mal à réaliser mes implémentations. Voici ma solution de zChance et la question qui vient avec :

                                        #include <stdio.h>
                                        #include <time.h>
                                        
                                        int main (int argc, const char * argv[]) 
                                        {
                                        
                                        	time_t timestampActuel;
                                        	struct tm  *heureLocale;
                                        	
                                        	timestampActuel = time(NULL);
                                        	
                                        	heureLocale = localtime(&timestampActuel);
                                        	
                                        	int jour = heureLocale->tm_mday;
                                        	int jourComplet = heureLocale->tm_wday;
                                        	int mois = heureLocale->tm_mon + 1;
                                        	int annee = heureLocale->tm_year + 1900;
                                        	
                                        	for(annee = 2010 ; annee <=2011 ; annee++)
                                        	{
                                        		for(mois = 0 ; mois <= 11 ; mois++)
                                        		{
                                        		
                                        			for(jour = 0 ; jour <= 31 ; jour++)
                                        			{
                                        			if(jour == 31)
                                        			{
                                        				jour = 0;
                                        			}
                                        			if(jour == 13 && jourComplet == 5)
                                        			{
                                        				printf("Vendredi 13 !");
                                        			}
                                        		
                                        	                }
                                        	        }
                                        	}
                                        		
                                        	
                                        	
                                            return 0;
                                        }
                                        


                                        Avant de me lancer dans l'affichage au format français, je cherche à ce que la console m'affiche "Vendredi 13 !" à chaque fois que le programme trouve un vendredi 13 sur 2010 et 2011. Tout compile bien mais quand j'ouvre la console, l'ordi met très longtemps à tout calculer, ce qui fait que je ne vois pas mon résultat, même après 2 minutes d'attente. Est-ce normal ? Merci.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          27 juin 2010 à 15:37:55

                                          Oui, en général une boucle infinie ça dure plus de deux minutes :p .

                                          Le bout de code incriminé :
                                          for(jour = 0 ; jour <= 31 ; jour++)
                                          			{
                                          			if(jour == 31)
                                          			{
                                          				jour = 0;
                                          			}
                                          
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            27 juin 2010 à 15:39:21

                                            Tu fais une boucle infinie, tu remet ta variable jour à 0 avant qu'elle finisse. :)
                                            Fais attention aussi, tu considères qu'un mois fait 31 jours, ce qui n'est pas forcement le cas. Ensuite tu ne modifies pas ta variable jourComplet donc le jour de la semaine ne change pas. :)

                                            grilled :(
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              27 juin 2010 à 16:10:29

                                              Oula :-°
                                              Le problème de la boucle infinie est réglé. Voici le nouveau code :

                                              #include <stdio.h>
                                              #include <time.h>
                                              
                                              int main (int argc, const char * argv[]) 
                                              {
                                              
                                              	time_t timestampActuel;
                                              	struct tm  *heureLocale;
                                              	
                                              	timestampActuel = time(NULL);
                                              	
                                              	heureLocale = localtime(&timestampActuel);
                                              	
                                              	int jour = heureLocale->tm_mday;
                                              	int jourComplet = heureLocale->tm_wday;
                                              	int mois = heureLocale->tm_mon;
                                              	int annee = heureLocale->tm_year + 1900;
                                              	char const * const TableauMois[12] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
                                              	
                                              	for(annee = 2010 ; annee <=2010 ; annee++)
                                              	{
                                              		for(mois = 0 ; mois <= 11 ; mois++)
                                              		{
                                              		
                                              			for(jour = 1 ; jour <= 31 ; jour++)
                                              			{
                                              		
                                              				for(jourComplet = 0 ; jourComplet <= 6 ; jourComplet++)
                                              				{	
                                              					if(jourComplet == 5 && jour == 13)
                                              					{
                                              						printf("Vendredi 13 %s %d\n", TableauMois[mois], annee);
                                              					}
                                              			        } 
                                              	                }
                                              		}
                                              	}	
                                              	
                                              	
                                                  return 0;
                                              }
                                              


                                              Et voici ce qu'il affiche :

                                              Vendredi 13 Janvier 2010
                                              Vendredi 13 Fevrier 2010
                                              Vendredi 13 Mars 2010
                                              Vendredi 13 Avril 2010
                                              Vendredi 13 Mai 2010
                                              Vendredi 13 Juin 2010
                                              Vendredi 13 Juillet 2010
                                              Vendredi 13 Aout 2010
                                              Vendredi 13 Septembre 2010
                                              Vendredi 13 Octobre 2010
                                              Vendredi 13 Novembre 2010
                                              Vendredi 13 Decembre 2010


                                              Pourquoi ? Pour le coup du mois de 31 jours, je préfère commencer petit, sinon je ne vais pas m'y retrouver.
                                              Help please :(
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 juin 2010 à 16:52:13

                                                Citation : Marc Mongenet


                                                Une optimisation élémentaire serait de ne tester que les 13 du mois.



                                                Bien sûr, c'est ce qu'il fallait faire tout de suite, franchement, si tu as sous les yeux le calendrier 2010 et que tu cherches les vendredi 13, tu vas immédiatement regarder le 13 janvier, puis le 13 février et ainsi de suite jusqu'au 13 décembre. Or justement c'est ce que mktime permet de faire, et semble-t-il donc de façon assez élémentaire. Sinon, toujours pas vu l'intérêt de passer par une conversion des dates en time_t, c'est une contrainte artificielle de l'énoncé.



                                                Citation : Holt

                                                Solution naïve, lente (et portable ! :p ) :



                                                Pas mal mais pas encore assez naïve pour le vrai débutant :

                                                -- tu utilises des pointeurs, on peut s'en passez ici
                                                -- "static, c'est quoi ?"
                                                -- "tiens un tableau qui a pas de taille !"
                                                -- "(y%4 == 0 && (y%100 != 0 || y%400 == 0)) : bon je vais prendre un doliprane" ;)
                                                -- "pourquoi il met #include <stdlib.h> ?"
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  27 juin 2010 à 17:31:55

                                                  Citation : candide

                                                  Citation : Holt

                                                  Solution naïve, lente (et portable ! :p ) :



                                                  Pas mal mais pas encore assez naïve pour le vrai débutant :

                                                  -- tu utilises des pointeurs, on peut s'en passez ici
                                                  -- "static, c'est quoi ?"
                                                  -- "tiens un tableau qui a pas de taille !"
                                                  -- "(y%4 == 0 && (y%100 != 0 || y%400 == 0)) : bon je vais prendre un doliprane" ;)
                                                  -- "pourquoi il met #include <stdlib.h> ?"


                                                  J'ai modifié, après je pense qu'il ne faut pas non plus les "couver", les pointeurs c'est vrai que c'est pas forcément utile ici, mais ils ne sont pas utilisés de façon complexe, le static... c'est vrai que tous les cours ne l'expliquent pas forcément au début, le tableau sans taille je pense que c'est expliqué à peu près partout, et c'est une règle qu'il faut connaitre donc pourquoi pas l'apprendre maintenant, bissextile oui c'est vrai... je l'ai découpé pour bien montrer, après le include... Vieille habitude :p
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    27 juin 2010 à 20:40:51

                                                    Citation : candide

                                                    Citation : Marc Mongenet


                                                    Une optimisation élémentaire serait de ne tester que les 13 du mois.


                                                    Bien sûr, c'est ce qu'il fallait faire tout de suite []. Or justement c'est ce que mktime permet de faire, et semble-t-il donc de façon assez élémentaire.


                                                    Oui mais la solution que je vois allonge le code de ma fonction d'environ 50%. Mais peut-être existe-t-il une solution plus brève?
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      28 juin 2010 à 2:51:34

                                                      Citation : Marc Mongenet


                                                      Oui mais la solution que je vois allonge le code de ma fonction d'environ 50%.



                                                      Ce n'est pas une bonne solution que de donner un mauvais algorithme sous prétexte que ça rallonge le code.


                                                      Sinon, je trouve ton code assez compliqué en particulier l'obligation de passer par localtime() pour avoir une structure tm correcte. Il semble en effet qu'il faille procéder comme tu fais. Par exemple Plauger dit :

                                                      Citation : Plauger

                                                      Thus the only reliable way to modify a calendar time is to convert it to a broken-down time by calling localtime, modify the appropriate members, then convert the result back to a calendar time by calling mktime.





                                                      Ainsi, le code de GurneyH, bien que plus simple et semblant marcher, n'est pas forcément correct. Sinon, je trouve la spécification de mktime() dans la Norme totalement floue et je crois que je vais renoncer à comprendre exactement comment elle fonctionne.

                                                      En me basant sur l'exemple donné dans la Norme, voici une fonction qui détermine le premier vendredi 13 postérieur ou égal à une date donnée. Je crois que ça marche mais en fait, je ne comprends pas vraiment pourquoi.

                                                      #include <time.h>
                                                      
                                                      void v13(struct tm *t)
                                                      {
                                                        if (t->tm_mday > 13)
                                                          t->tm_mon++;
                                                        t->tm_mday = 13;
                                                      mktime(t);// <-- ligne oubliée
                                                      
                                                        while (t->tm_wday != 5)
                                                          {
                                                            t->tm_mon++;
                                                            t->tm_isdst = -1;
                                                            mktime(t);
                                                          }
                                                      }
                                                      
                                                      void ma_date(int j, int m, int a, struct tm *t)
                                                      {
                                                        t->tm_year = a - 1900;
                                                        t->tm_mon = m - 1;
                                                        t->tm_mday = j;
                                                        t->tm_hour = 0;
                                                        t->tm_min = 0;
                                                        t->tm_sec = 1;
                                                        t->tm_isdst = -1;
                                                      }
                                                      
                                                      int main(void)
                                                      {
                                                        struct tm t;
                                                      
                                                        ma_date(19, 9, 2020, &t);
                                                        v13(&t);
                                                        printf("vendredi %d/%d/%d\n", t.tm_mday, 1 + t.tm_mon, 1900 + t.tm_year);
                                                        return 0;
                                                      }
                                                      


                                                      vendredi 13/8/2021


                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        28 juin 2010 à 7:59:19

                                                        Citation : candide

                                                        Je crois que ça marche mais en fait, je ne comprends pas vraiment pourquoi.


                                                        Sympa comme démarche pour un exercice pour débutant...
                                                        Note que tu as fait la remarque à Marc mais tu fais la même chose. Qu'est-ce qui te garanti que t->tm_mon++; te donnera bien 0 quand il sera supérieur à 11 ?
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          28 juin 2010 à 10:53:25

                                                          Citation : Pouet_forever

                                                          Citation : candide

                                                          Je crois que ça marche mais en fait, je ne comprends pas vraiment pourquoi.


                                                          Sympa comme démarche pour un exercice pour débutant...



                                                          Et bien oui justement : la remarque que j'ai faite contient une composante d'honnêteté et de doute nécessaires à la découverte de la vérité. Je n'ai pas fait comme certains qui utilisent la fonction mktime et ne l'ont visiblement pas comprise et n'ont pas cherché à la comprendre.


                                                          Citation : Pouet_forever


                                                          Note que tu as fait la remarque à Marc mais tu fais la même chose. Qu'est-ce qui te garanti que t->tm_mon++; te donnera bien 0 quand il sera supérieur à 11 ?



                                                          Mais rien de tangible dans la Norme car comme je l'ai déjà dit la spécification de mktime est très confuse. Ma réponse est une réponse à ma Marc (et à Gurney) et qui sous-entend : si vous vous autorisez à faire ceci, alors autant faire ce que je propose (*) puisque la fonction mktime semble normaliser les dates. Au demeurant, le problème que tu soulèves et auquel Marc n'a pas répondu est assez simple à résoudre : il suffit juste de contrôler que les valeurs des champs sont dans le rang normal défini par la Norme (en faisant un modulo par exemple). De mon côté, je n'aurais jamais proposé de faire ce type d'arithmétique avec les dates : pour moi, le 31 juin n'existe pas et je considère que la Norme ne me dit pas comment cette date est normalisée.

                                                          (*) franchement parcourir toutes 365 jours de l'année comme le proposent Marc et Gurney à la recherche d'un vendredi 13 alors qu'il suffit de parcourir 12 dates (les 13 de chaque mois), c'est absurde.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Anonyme
                                                            28 juin 2010 à 11:06:51

                                                            Je reposte des fois que mon message précédent ai été noyé dans vos savantes discussions.
                                                            Pourquoi mon code :

                                                            #include <stdio.h>
                                                            #include <time.h>
                                                            
                                                            int main (int argc, const char * argv[]) 
                                                            {
                                                            
                                                            	time_t timestampActuel;
                                                            	struct tm  *heureLocale;
                                                            	
                                                            	timestampActuel = time(NULL);
                                                            	
                                                            	heureLocale = localtime(&timestampActuel);
                                                            	
                                                            	int jour = heureLocale->tm_mday;
                                                            	int jourComplet = heureLocale->tm_wday;
                                                            	int mois = heureLocale->tm_mon;
                                                            	int annee = heureLocale->tm_year + 1900;
                                                            	char const * const TableauMois[12] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
                                                            	
                                                            	for(annee = 2010 ; annee <=2010 ; annee++)
                                                            	{
                                                            		for(mois = 0 ; mois <= 11 ; mois++)
                                                            		{
                                                            		
                                                            			for(jour = 1 ; jour <= 31 ; jour++)
                                                            			{
                                                            		
                                                            				for(jourComplet = 0 ; jourComplet <= 6 ; jourComplet++)
                                                            				{	
                                                            					if(jourComplet == 5 && jour == 13)
                                                            					{
                                                            						printf("Vendredi 13 %s %d\n", TableauMois[mois], annee);
                                                            					}
                                                            			        } 
                                                            	                }
                                                            		}
                                                            	}	
                                                            	
                                                            	
                                                                return 0;
                                                            }
                                                            


                                                            M'affiche ceci ?

                                                            Vendredi 13 Janvier 2010
                                                            Vendredi 13 Fevrier 2010
                                                            Vendredi 13 Mars 2010
                                                            Vendredi 13 Avril 2010
                                                            Vendredi 13 Mai 2010
                                                            Vendredi 13 Juin 2010
                                                            Vendredi 13 Juillet 2010
                                                            Vendredi 13 Aout 2010
                                                            Vendredi 13 Septembre 2010
                                                            Vendredi 13 Octobre 2010
                                                            Vendredi 13 Novembre 2010
                                                            Vendredi 13 Decembre 2010


                                                            Merci de vos lumières parce que je tourne en rond depuis pas mal de temps sur cet exercice.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              28 juin 2010 à 11:19:20

                                                              @Etienne-02 : Tout d'abord, merci de participer ;) .
                                                              Deuxièmement, j'avoue que le bug de ton code est assez sympa surtout que l'erreur comme toutes les erreurs est assez stupide.

                                                              Ligne 28 :
                                                              Soit Jour = 13
                                                              Itération 1 : * le 13 est un dimanche
                                                              Itération 2 : * le 13 est un mardi
                                                              ...
                                                              Itération 2 : * le 13 est un lundi

                                                              Bilan : N'importe quel jour (selon son numéro) correspond à tous les jours de la semaine :D .
                                                              • 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