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 : Afficher la date du lendemain !


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Debutant : Afficher la date du lendemain !
    Bonjour !,
    "Ecrire un programme en c, qui saisit une date quelqonque, et affiche la date du lendemain.
    Exemples:
    08/01/2006 => 09/01/2006
    28/02/2006 => 01/03/2006
    31/12/2005 => 01/01/2006"
    Voila l'enoncé de mon exercice !
    et voila mon travail :
    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
    #include <cstdlib>
    #include <iostream>
     
    int main()
    {
        int j, m, a;
        /* Demande de saisie de données avec un test pour chaqu'une */
        do
        {
            printf("Veillez entrez le MOIS\n");
            scanf("%d",&m);
        }
     
        while ( m<1 || m>12 );
         /*On demande le mois en 1er, car suivant m on va tester j */
     do
        { 
            printf("Veillez entrez le JOUR (attention au nombre max des jours de chaque mois)\n");
            scanf("%d",&j);
        }
        while (( j<1 || j>31 )||((m == 2 || m == 4 || m == 7 || m == 9 || m == 11 ) && j == 31 )||(m==2 && j>=29));
     
      /*la boucle précedente reaffiche le message si on entre un nombre
       de jours 31 pour un mois de 30 jours 
       ou plus que 28 pour fevrier... */
        do
        {
        printf("Veillez entrez l'ANNEE\n");
        scanf("%d",&a);
        }
        while ( a<0 ) ;
     
        /* Si c'est le dernier jours du dernier mois, on change d'année */
        if ( j == 31 && m == 12 )  
        { 
             j=1 ;
             m=1 ;
             a++ ;
             printf("Youpi ! c'est le reveillant !!! \n");
        }
        else
        /* on teste si c'est le dernier jour des mois qui contiennent 31 jours.
        Pas la peine de verifier si c'est un  mois de 31 jours ... 
        car si on a passer la boucle while de saisie de j avec j = 31 c'est que
        m est obligatoirement un mois de 31 jours*/
        if (j == 31 )
        {
                j = 1 ;
                m++ ; 
        }
            else
        /*On teste s'il s'agit du mois Fevrier*/
            if ( m == 2 && j==28 )
            {   
                   j = 1 ;
                    m++; 
                }           
            else 
        /* Le prochain if conserne que les mois qui contiennent 30 jours */    
        if ( (j == 30) && ( m==2 || m==4 || m==7 || m==9 || m==11) )
        {
            j = 1 ;
            m++ ;
        }
        else 
        /* Si on est dans aucun cas spécial, on incremente tout simplement j */
        j++ ;
        printf("la date du lendemain est %d/%d/%d\n",j,m,a);
        system("PAUSE");
    }
    Je me suis bien cassé la tete a faire ce bout de code ! La seulle "erreur" que j'ai pas traité volontairement c'est le cas des année bissextiles ou fevrier a 29 jours ... s'il y a quelqu'un pour me donner le fil chui preneur !
    Merci d'avance !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par tunisianoaymen Voir le message
    Bonjour !,
    "Ecrire un programme en c, qui saisit une date quelqonque, et affiche la date du lendemain.
    Exemples:
    08/01/2006 => 09/01/2006
    28/02/2006 => 01/03/2006
    31/12/2005 => 01/01/2006"
    Voila l'enoncé de mon exercice !
    <...>
    Je me suis bien cassé la tete a faire ce bout de code ! La seulle "erreur" que j'ai pas traité volontairement c'est le cas des année bissextiles ou fevrier a 29 jours ... s'il y a quelqu'un pour me donner le fil chui preneur !
    Bah, à moins qu'on te demande de réinventer la roue, il suffit d'utiliser correctement time(), mktime() etc. Quelques pistes :

    http://emmanuel-delahaye.developpez....s.htm#difftime

    bien lire la doc des fonctions...

    http://man.developpez.com/

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tunisianoaymen Voir le message
    Bonjour !,
    "Ecrire un programme en c, qui saisit une date quelqonque, et affiche la date du lendemain.
    Exemples:
    08/01/2006 => 09/01/2006
    28/02/2006 => 01/03/2006
    31/12/2005 => 01/01/2006"
    Voila l'enoncé de mon exercice !
    et voila mon travail :
    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
    #include <cstdlib>
    #include <iostream>
     
    int main()
    {
        int j, m, a;
        /* Demande de saisie de données avec un test pour chaqu'une */
        do
        {
            printf("Veillez entrez le MOIS\n");
            scanf("%d",&m);
        }
     
        while ( m<1 || m>12 );
         /*On demande le mois en 1er, car suivant m on va tester j */
     do
        { 
            printf("Veillez entrez le JOUR (attention au nombre max des jours de chaque mois)\n");
            scanf("%d",&j);
        }
        while (( j<1 || j>31 )||((m == 2 || m == 4 || m == 7 || m == 9 || m == 11 ) && j == 31 )||(m==2 && j>=29));
     
      /*la boucle précedente reaffiche le message si on entre un nombre
       de jours 31 pour un mois de 30 jours 
       ou plus que 28 pour fevrier... */
        do
        {
        printf("Veillez entrez l'ANNEE\n");
        scanf("%d",&a);
        }
        while ( a<0 ) ;
     
        /* Si c'est le dernier jours du dernier mois, on change d'année */
        if ( j == 31 && m == 12 )  
        { 
             j=1 ;
             m=1 ;
             a++ ;
             printf("Youpi ! c'est le reveillant !!! \n");
        }
        else
        /* on teste si c'est le dernier jour des mois qui contiennent 31 jours.
        Pas la peine de verifier si c'est un  mois de 31 jours ... 
        car si on a passer la boucle while de saisie de j avec j = 31 c'est que
        m est obligatoirement un mois de 31 jours*/
        if (j == 31 )
        {
                j = 1 ;
                m++ ; 
        }
            else
        /*On teste s'il s'agit du mois Fevrier*/
            if ( m == 2 && j==28 )
            {   
                   j = 1 ;
                    m++; 
                }           
            else 
        /* Le prochain if conserne que les mois qui contiennent 30 jours */    
        if ( (j == 30) && ( m==2 || m==4 || m==7 || m==9 || m==11) )
        {
            j = 1 ;
            m++ ;
        }
        else 
        /* Si on est dans aucun cas spécial, on incremente tout simplement j */
        j++ ;
        printf("la date du lendemain est %d/%d/%d\n",j,m,a);
        system("PAUSE");
    }
    Je me suis bien cassé la tete a faire ce bout de code ! La seulle "erreur" que j'ai pas traité volontairement c'est le cas des année bissextiles ou fevrier a 29 jours ... s'il y a quelqu'un pour me donner le fil chui preneur !
    Merci d'avance !
    Emmanuel t'as donné une bonne base de recherche. Mais même sans ça moi j'aurais évité ce super paté absolument imbitable dans le main où t'es obligé de réécrire tes instructions et tes contrôles.
    Déjà j'aurais déjà commencé par poser de bonnes bases de travail. Par exemple une structure pour pouvoir manipuler la date.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
         unsigned char jj;
         unsigned char mm;
         unsigned short aa;
    } t_date;
    Une fois cette structure posée, je peux créer des fonctions dédiées à la gestion de mon problème. Par exemple tu testes à divers endroit si ta date est valide. Ben autant faire une fonction dédiée à ce contrôle
    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
    int dateOk(t_date *d)
    {
         // Déjà un premier test basique sur le jour, le mois et l'année
         if (d->jj == 0 || d->jj > 31) return 0;
         if (d->mm == 0 || d->mm > 12) return 0;
         if (d->aa == 0) return 0;
     
        // La date est dans la norme - Gestion des jours spéciaux
        if (d->jj == 31 && (d->mm == 4 || d->mm == 6 || d->mm == 9 || d->mm == 11)) return 0;
     
        // Le mois de février
        if (d->jj > 29 && d->mm == 2) return 0;
     
        // Le mois de février des années non bissextile
        if (d->jj == 29 && d->mm == 2 && bissextile(d->aa) == 0) return 0;
     
        // La date est ok
        return 1;
    }
    Ensuite l'incrément. On te demande aujourd'hui un incrément de un mais peut-être que demain le besoin changera. Répondre à un besoin c'est aussi essayer d'aller au devant des besoins futurs (ou de faire au mieux pour éviter de devoir tout refaire). Donc autant faire une fonction qui incrémente de "n" et on l'appelle en lui passant "1" (et demain s'il faut 2 ben on changera l'appel mais pas la fonction)

    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
    void incrementDate(t_date *d, unsigned short n)
    {
        // Tant qu'il faut incrémenter
        while (n > 0)
        {
            // On incrémente le jour
            d->jj++;
     
            // Si la date n'est pas valide
            if (dateOk(d) == 0)
            {
                // Le jour a dépassé => On le remet au départ et on incrémente le mois
               d->jj=1;
               d->mm++;
     
               // Si la date n'est toujours pas valide
               if (dateOk(d) == 0)
               {
                   // Le mois a dépassé => On le remet au début et on incrémente l'année
                  d->mm=1;
                  d->aa++;
               }
           }
     
           // Le nombre à incrémenter diminue
           n--;
        }
    }
    Ensuite ben toutes les autres fonctions dont tu peux avoir besoin. Le but d'un exercice ce n'est pas seulement de faire le travail demandé, c'est aussi de montrer que t'es capable de bien réfléchir sur la façon de découper un problème en tâches simples. Par exemple pour la saisie ben tu peux écrire une fonction qui boucle tant que dateOk != 1. Tu peux aussi rajouter une fonction qui teste si la date est spéciale (par exemple si c'est un jour de réveillon, un jour de réveillant (???), la date de l'armistice, etc).

    Et enfin dans le main, ben tu rassemble les morceaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
        t_date d;
     
        saisieDate(&d);
        incrementDate(&d, 1);
        affichDate(&d);
        if (reveillon(d))
            printf("Youpi c'est le réveillon\n");
        if (reveillant(d))
            printf("Youpi c'est le réveillant\n");
        etc...
    }

    Vaut-mieux de petits modules bien clairs et solides qu'un gros paté où tout est permis et qui ouvre la porte aux bugs d'innatention...

Discussions similaires

  1. Afficher la date du lendemain
    Par amak4ever dans le forum Pascal
    Réponses: 2
    Dernier message: 11/06/2011, 10h33
  2. [Debutant] Afficher une date avec un format short
    Par lilou77 dans le forum BIRT
    Réponses: 12
    Dernier message: 11/01/2007, 09h25
  3. [debutant] Date du lendemain
    Par hunter69fr2002 dans le forum C
    Réponses: 8
    Dernier message: 04/12/2005, 19h14
  4. [DEBUTANT] affiche une page web en plein écran
    Par mamouna dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/06/2005, 11h43
  5. [débutant]Affiché un message dans l'émulateur.
    Par rvfranck dans le forum Java ME
    Réponses: 3
    Dernier message: 02/04/2005, 15h41

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