IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[debutant] Affichage d'un calendrier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut [debutant] Affichage d'un calendrier
    Bonjour, tous d'abord voila de quoi je vais parler.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    /*Pour ne pas compiler avec un compilateur C++*/
    #ifdef __cplusplus
    #error Be sure you are using a C compiler...
    #endif
     
    /* Include ============================================================= */
    #include <stdio.h>     /* printf ...*/
    #include <stdlib.h>    /* define ...*/
    #include <string.h>
    #include <time.h>
     
    /* macros ============================================================== */
    int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    char monthnames [12] [10] = {"Janvier", "Fevrier", "Mars", "Avril", "Mais", "Juin",
    "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Decembre"};
    char daynames[7] [3]= {"Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"};
    /* constants =========================================================== */
    /* types =============================================================== */
    /* structures ========================================================== */
    /* private variables =================================================== */
    /* private functions =================================================== */
     
    /* Regle d'usage du programme */
    int use (char name[])
    {
      printf ("Utilisation : %s\n", name);
      printf ("Utilisation : %s [day] [month] [year]\n", name);
      printf ("L'année ne doit pas être en dessous de 1970\n");
      return 0;
    }
     
    /* Test si l'année est bissextile */
    int isbissextil (int y)
    {
      int out = 0;
      if(!((y % 4 && y % 100 && y % 400) || (y % 4 && !(y % 100))))
      {
        days[2] = 29;
        out = 1;
      }
      return out;
    }
     
    /* Affiche la date d'aujourd'hui
    par Emmanuel Delahaye */
    int showtime (void)
    {
      time_t now = time (NULL);
      struct tm tm_now = *localtime (&now);
      char s[64];
     
      strftime (s, sizeof s, "%d/%m/%Y", &tm_now);
      printf ("Aujourd'hui : %s\n", s);
      return 0;
    }
     
    /* Quel jour correspond à la date */
    int mydays(int d, int m, int y)
    {
      int jour;
      jour = 367*y-7*(y+(m+9)/12)/4-3*((y+(m-9)/7)/100+1)/4+275*m/9+d+1721029;
      jour++;
      printf ("La date est %s %d %s %d\n", daynames[jour % 7], d, monthnames[m-1], y);
      return 0;
    }
     
    /* affichage du calendrier en console */
    /* Todo actuellement incomplete */
    int affichage (int d, int m, int y)
    {
      int j;
      printf ("Le jour J est %d\n", d);
      printf ("--- %s %d ---\n", monthnames[m-1], y);
      for (j=0; j<8; j++)
      {
        printf ("%s ", daynames[j]);
      }
      printf ("\n");
      for (j = 1; j <= days[m]; j++)
      {
        printf ("%d ", j);
        if(!(j%7))
        {
          printf("\n");
        }
      }
      return 0;
    }
     
    /* internal public functions =========================================== */
    /* entry points ======================================================== */
    /* public variables ==================================================== */
     
    /* ---------------------------------------------------------------------
       --------------------------------------------------------------------- */
     
    int main(int argc, char *argv[])
    {
      unsigned int year, month, day;
      int err = 0;
     
      /* Test si il y a le bon nombre d'argument */
      if (argc > 4 || argc == 2)
      {
        err = 1;
      }
     
      if (argc == 1)
      {
        showtime();
        return 0;
      }
     
      year = atoi (argv[3]);
      month = atoi (argv[2]);
      day = atoi (argv[1]);
     
      /* Test si mois est bien compris entre 1 et 12
      et si l'année est strictement supérieur a 1971*/
      if (month > 12 || month < 1 || year < 1971 || day > 31 || day < 1)
      {
        err = 1;
      }
     
      if (!err)
      {
        #if 0
        /* L'année est-elle bissextile */
        if(isbissextil (year))
        {
          printf ("L'année est bissextile\n");
        }
        else
        {
          printf ("L'année n'est pas bissextile\n");
        }
        #endif
        isbissextil (year);
        mydays(day, month, year);
        affichage (day, month, year);
      }
     
      if (err)
      {
        use(argv[0]);
      }
     
      return 0;
    }
    J'ai pris différentes aides sur internet pour en arriver là, j'espère ne pas avoir fait trop de connerie lors de la programmation. En tous cas il compile bien sans erreur ni warning chez moi. Pour la gestion des paramètres, j'ai vu dans la faq comment les gérer, je rectifierais mes erreurs dessus après avoir résolu mon problème d'affichage. Je n'ai pas utilisé gmtime pour la conception par pur curiosité.
    Bref, mon problème vient de la fonction affichage, je n'arrive pas à voir comment je pourrais faire pour faire concorder les jours et avoir une indentation correcte pour arriver à l'affichage d'un calendrier classique comme l'on peut le constater dans la fonction cal sous linux.

    Merci, pour toutes aides apportées

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Voici quelques remarques sur ton code :

    - Déclare ceux-ci au moins static et pour les noms tu pourrais ajouter un const

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    char monthnames [12] [10] = {"Janvier", "Fevrier", "Mars", "Avril", "Mais", "Juin",
    "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Decembre"};
    char daynames[7] [3]= {"Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"};
    - Ta fonction use pourrait avoir comme type de retour void

    - Ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      for (j = 1; j <= days[m]; j++)
      {
        printf ("%d ", j);
        if(!(j%7))
        {
          printf("\n");
        }
      }
    Modifie ton printf comme ceci :

    - Dans ton main, ta gestion de l'erreur est fausse puisque si je lance avec 2 arguments il plante.

    - Ne pas utiliser atoi mais strtol

    Jc

  3. #3
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    ...(y % 4 && !(y % 100))
    Etes-vous sûr de ce test pour déterminer si une année est bissextile? Cette partie s'avérera vraie si y n'est pas divisible par 4 mais est divisible par 100, ce qui ne doit pas arriver souvent!

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut
    Citation Envoyé par fearyourself
    Voici quelques remarques sur ton code :

    - Déclare ceux-ci au moins static et pour les noms tu pourrais ajouter un const

    - Ta fonction use pourrait avoir comme type de retour void

    - Ici

    Modifie ton printf comme ceci :

    C'est corrigé

    Citation Envoyé par fearyourself
    - Dans ton main, ta gestion de l'erreur est fausse puisque si je lance avec 2 arguments il plante.
    J'avais remarqué c'est prévu que ce soit modifié avec la gestion des arguments passé en paramètres merci
    Citation Envoyé par fearyourself
    - Ne pas utiliser atoi mais strtol

    Jc
    Correction faite, je suppose qu'il vaut mieux utiliser strtol pour la gestion d'erreur non?
    Citation Envoyé par stephl
    Etes-vous sûr de ce test pour déterminer si une année est bissextile? Cette partie s'avérera vraie si y n'est pas divisible par 4 mais est divisible par 100, ce qui ne doit pas arriver souvent!
    D'après ce que j'ai lu une année est bissextile si elle est divisible par 4 par 100 et par 400 donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (y % 4 && y % 100 && y % 400)
    ou alors si elle est divisible par 4 mais pas par 100, donc Si je transforme ma fonction comme ça est ce que ça va mieux??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int test (int y)
    {
      int out = 1;
      if((y % 4 && y % 100 && y % 400) || (y % 4 && !(y % 100)))
      {
        out = 0;
      }
      return out;
    }
    Je n'avais pas la bonne valeur en sortie, je pense donc m'être trompé au niveau du paramètre de sortie je pense que là ça irait mieux.

    Merci pour vos compléments d'infos, j'avance doucement mais surement, par contre, je ne vois toujours pas comment faire pour démarrer mon calendrier au premier jour du mois. Si on prend en exemple le premier jour de février qui est un jeudi, je dois faire commencer mon décompte des jours à jeudi. Pour ça il me faut des espaces sur la première ligne puis commencer la numérotation à partir de jeudi jusque samedi et ensuite revenir à la ligne pour reprendre à dimanche etc...

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut
    Personnes n'auraient d'idées pour faire commencer l'affichage au bon endroit avec la bonne découpe ? Si je dois revoir complètement ma fonction d'affichage ça ne me dérange pas

    Merci encore à ceux qui m'ont déjà aider sur ce petit projet

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ashgenesis
    Merci, pour toutes aides apportées
    Je recommande la plus grande simplicité dans l'écriture des algorithmes. On ne gagne rien à écrire du code inutilement complexe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    int main (int argc, char *argv[])
    {
       int err = 0;
     
       if (argc == 1)
       {
          showtime ();
       }
       else if (argc == 4)
       {
          int year = atoi (argv[3]);
          int month = atoi (argv[2]);
          int day = atoi (argv[1]);
     
          /* Test si mois est bien compris entre 1 et 12
             et si l'année est strictement supérieur a 1971 */
          if (month > 12 || month < 1 || year < 1971 || day > 31 || day < 1)
          {
             err = 1;
          }
          else
          {
    #if 0
             /* L'année est-elle bissextile */
             if (isbissextil (year))
             {
                printf ("L'année est bissextile\n");
             }
             else
             {
                printf ("L'année n'est pas bissextile\n");
             }
    #endif
             isbissextil (year);
             mydays (day, month, year);
             affichage (day, month, year);
          }
       }
       else
       {
          use (argv[0]);
       }
     
       return 0;
    }

  7. #7
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    y%4 est le reste de la division euclidienne de y par 4, donc y est divisible par 4 si y%4==0, d'où vos tests dans isbissextile() sont faux. Le test correct est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!(y%4) && y%100 || !(y%400))
     return 1;
    else return 0;
    Ce qui se traduit en français par: l'année est bissextile si elle est divisible par 4 mais pas par 100, ou bien si elle est divisible par 400.

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par stephl
    y%4 est le reste de la division euclidienne de y par 4, donc y est divisible par 4 si y%4==0, d'où vos tests dans isbissextile() sont faux. Le test correct est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!(y%4) && y%100 || !(y%400))
     return 1;
    else return 0;
    Ce qui se traduit en français par: l'année est bissextile si elle est divisible par 4 mais pas par 100, ou bien si elle est divisible par 400.
    Pourquoi se compliquer la vie ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return (( y % 4 == 0) && ( y % 100 != 0)) || (y % 400 == 0);

  9. #9
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par fearyourself
    Pourquoi se compliquer la vie ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return (( y % 4 == 0) && ( y % 100 != 0)) || (y % 400 == 0);
    Si vous ne voulez pas vous compliquer la vie du tout, alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return !(y%4) && y%100 || !(y%400);
    J'ai utilisé un if pour faire ressortir le résultat, étant donné que le test dans la fonction isbissextile() était faux.

  10. #10
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par stephl
    Si vous ne voulez pas vous compliquer la vie du tout, alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return !(y%4) && y%100 || !(y%400);
    J'ai utilisé un if pour faire ressortir le résultat, étant donné que le test dans la fonction isbissextile() était faux.
    Oui mais je préfère mettre plus de parenthèses et mettre ==0 et !=0, je trouve que cela est plus clair

    Du coup, j'ai changé ton code...

    Jc

  11. #11
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je recommande la plus grande simplicité dans l'écriture des algorithmes. On ne gagne rien à écrire du code inutilement complexe.
    Merci, code corrigé
    Citation Envoyé par fearyourself
    Pourquoi se compliquer la vie ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (( y % 4 == 0) && ( y % 100 != 0)) || (y % 400 == 0);
    Citation Envoyé par stephl
    Si vous ne voulez pas vous compliquer la vie du tout, alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return !(y%4) && y%100 || !(y%400);
    J'ai utilisé un if pour faire ressortir le résultat, étant donné que le test dans la fonction isbissextile() était faux.
    J'avoue que j'ai toujours eu du mal avec ces tables de vérités

    Donc si j'ai bien compris les deux tests ci-dessus sont identiques. Ce qui doit donner en prenant y = 1904 pour
    1904 % 4 = 0 donc 0 == 0 ce qui renvois 1
    1904 % 100 = 4 donc 4 != 0 ce qui renvois 1
    1904 % 400 = 304 donc 304 == 0 ce qui renvois 0
    Ce qui nous donne un test 1 & 1 | 0 ce qui renvois 1
    Donc 1904 est bissextile !

    Pour l'autre test j'ai un peu plus de difficulté à le saisir mais si je reprend le raisonnement ci dessus toujours pour l'année 1904
    1904 % 4 = 0 donc !(0) ce qui renvois 1
    1904 % 100 = 4 donc quelquechose qui je pense on peut assimiler à 1
    1904 % 400 = 304 donc pareil ici on doit pouvoir l'assimiler à 1
    donc !(1) nous donnera 0
    Ce qui nous donne un test 1 & 1 | 0 ce qui renvois 1
    Donc 1904 est bissextile !
    Mon raisonnement est-il correct??

  12. #12
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Ashgenesis
    Mon raisonnement est-il correct??
    Oui; en C, une expression logique est une expression entière; elle est considérée comme vraie si elle est différente de zéro, sinon elle est considérée comme fausse. ! change 0 en 1 et tout autre nombre en 0.

  13. #13
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut
    Merci, pour ces précisions, je pense qu'on à fait le tour du programme Je pensais avoir fait moins d'erreur que ça quand même.

    - Modification du main pour etre moins complexe inutilement.
    - Correction du test pour la bissextilité d'une année.
    - Modification des déclarations des variables (ajout de static et const)
    - Modification de l'affichage pour une indentation correcte (%2d)
    - Remplacement de atoi par strtol
    - Remplacement du type de la fonction use par un type void

    Une fois tout ça remplacer voila le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    /*Pour ne pas compiler avec un compilateur C++*/
    #ifdef __cplusplus
    #error Be sure you are using a C compiler...
    #endif
     
    /* Include ============================================================= */
    #include <stdio.h>     /* printf ...*/
    #include <stdlib.h>    /* define ...*/
    #include <string.h>
    #include <time.h>
    #include <limits.h> /* LONG_MIN et LONG_MAX */
    #include <errno.h> /* gestion d'erreur strtol */
     
    /* macros ============================================================== */
    static int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static char const monthnames [12] [10] = {"Janvier", "Fevrier", "Mars", "Avril", "Mais", "Juin",
    "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Decembre"};
    static char const daynames[7] [3]= {"Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"};
    /* constants =========================================================== */
    /* types =============================================================== */
    /* structures ========================================================== */
    /* private variables =================================================== */
    /* private functions =================================================== */
     
    /* Regle d'usage du programme */
    void use (char name[])
    {
      printf ("Utilisation : %s\n", name);
      printf ("Utilisation : %s [day] [month] [year]\n", name);
      printf ("L'année ne doit pas être en dessous de 1970\n");
    }
     
    /* Test si l'année est bissextile */
    int isbissextil (int y)
    {
      int out = 0;
      if ((( y % 4 == 0) && ( y % 100 != 0)) || (y % 400 == 0))
      {
        days[2] = 29;
        out = 1;
      }
      return out;
    }
     
    /* Affiche la date d'aujourd'hui
    par Emmanuel Delahaye */
    int showtime (void)
    {
      time_t now = time (NULL);
      struct tm tm_now = *localtime (&now);
      char s[64];
     
      strftime (s, sizeof s, "%d/%m/%Y", &tm_now);
      printf ("Aujourd'hui : %s\n", s);
      return 0;
    }
     
    /* Quel jour correspond à la date */
    int mydays(int d, int m, int y)
    {
      int jour;
      jour = 367*y-7*(y+(m+9)/12)/4-3*((y+(m-9)/7)/100+1)/4+275*m/9+d+1721029;
      jour++;
      printf ("La date est %s %d %s %d\n", daynames[jour % 7], d, monthnames[m-1], y);
      return 0;
    }
     
    /* affichage du calendrier en console */
    /* Todo actuellement incomplete */
    int affichage (int d, int m, int y)
    {
      int j;
      printf ("Le jour J est %d\n", d);
      printf ("--- %s %d ---\n", monthnames[m-1], y);
      for (j=0; j<8; j++)
      {
        printf ("%s ", daynames[j]);
      }
      printf ("\n");
      for (j = 1; j <= days[m]; j++)
      {
        printf ("%2d ", j);
        if(!(j%7))
        {
          printf("\n");
        }
      }
      printf("\n");
      return 0;
    }
     
    int changeparam (char *str)
    {
      int val;
      int base = 10;
      char *end;
      errno = 0;
      val = strtol (str, &end, base);
     
      if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0))
      {
        perror ("strtol");
        exit (EXIT_FAILURE);
      }
     
      if (end == str)
      {
        fprintf(stderr, "Pas de chiffre trouvé\n");
        exit(EXIT_FAILURE);
      }
      return val;
    }
    /* internal public functions =========================================== */
    /* entry points ======================================================== */
    /* public variables ==================================================== */
     
    /* ---------------------------------------------------------------------
       --------------------------------------------------------------------- */
     
    int main(int argc, char *argv[])
    {
      int err = 0;
      if (argc == 1)
      {
        showtime ();
      }
      else if (argc == 4)
      {
        int year = changeparam (argv[3]);
        int month = changeparam (argv[2]);
        int day = changeparam (argv[1]);
     
        /* Test si mois est bien compris entre 1 et 12
        et si l'année est strictement supérieur a 1971 */
        if (month > 12 || month < 1 || year < 1971 || day > 31 || day < 1)
        {
          err = 1;
        }
        else
        {
    #if 0
          /* L'année est-elle bissextile */
          if (isbissextil (year))
          {
            printf ("L'année est bissextile\n");
          }
          else
          {
            printf ("L'année n'est pas bissextile\n");
          }
    #endif
          isbissextil (year);
          mydays (day, month, year);
          affichage (day, month, year);
        }
      }
      else
      {
        use (argv[0]);
      }
      return 0;
    }
    Il ne manque plus qu'une chose maintenant, c'est au niveau de l'affichage. Si vous le compilez vous verrez que le premier jour de chaque mois est un dimanche alors que dans la réalité c'est loin d'être le cas Le problème, c'est que je n'arrive pas à voir comment je pourrais dire au programme d'afficher le premier du mois au jour lui correspondant (lundi pour le mois de janvier 2007, jeudi pour le mois de fevrier 2007, jeudi aussi pour le mois de mars 2007, dimanche pour le mois d'avril 2007 etc ....)

    Toutes suggestions seraient la bienvenue

  14. #14
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Juste pour info, d'où vient la formule ci-dessous?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jour = 367*y-7*(y+(m+9)/12)/4-3*((y+(m-9)/7)/100+1)/4+275*m/9+d+1721029;
    jour++;

Discussions similaires

  1. [Debutant]Affichage de menu
    Par Beleim dans le forum Windows
    Réponses: 5
    Dernier message: 19/07/2005, 11h26
  2. [debutant]affichage sur le meme niveau
    Par christophebmx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/02/2005, 15h34
  3. [DEBUTANT] Affichage de jpanel
    Par cosmos38240 dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 25/05/2004, 00h48
  4. [VGL][debutant] Affichage d'un volume en couleur
    Par Faft dans le forum OpenGL
    Réponses: 2
    Dernier message: 04/05/2004, 16h13
  5. Réponses: 3
    Dernier message: 09/02/2003, 01h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo