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 :

probléme programme date


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut probléme dans un programme
    Bonjour , voila je ne c'est pas comment faire pour commencer mon programme

    je vous explique :

    l'utilisateur encode en une seule fois une date sous la forme AAAAMMJJ supposé corecte(donc ne pas valider la date).
    Donc il faudrait afficher la date correpondant au jour precedent


    par exemple on introduit :

    20041212 on devrait avoir 20041211
    20040101 on devrait avoir 20031231

    merci de votre aide si quelqu'un a une idée merci d'avance

  2. #2
    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 conceicao
    Bonjour , voila je ne c'est pas comment faire pour commencer mon programme

    je vous explique :

    l'utilisateur encode en une seule fois une date sous la forme AAAAMMJJ supposé corecte(donc ne pas valider la date).
    Donc il faudrait afficher la date correpondant au jour precedent


    par exemple on introduit :

    20041212 on devrait avoir 20041211
    20040101 on devrait avoir 20031231

    merci de votre aide si quelqu'un a une idée merci d'avance
    1. convertir les champs de la date en valeurs numériques. (sscanf(), par exemple)
    2. remplir correctement une structure standard struct tm avec ces valeurs
    3. convertir en epoch avec mktime()
    4. retirer une journée (24 * 60 * 60 secondes)
    5. reconvertir l'epoch en date avec gmtime()
    6. reformer la chaine avec sprintf() et les champs de struct tm.

    Fait de ton mieux et poste ton code si tu as un problème.

    (pendant ce temps, je vérifie une solution plus simple...)

    Hé hé : ça marche :
    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
     
    #include <stdio.h>
    #include <time.h>
     
    int main (void)
    {
     
       struct tm date = {0};
     
       date.tm_mday=1;
       date.tm_mon=1 - 1;
       date.tm_year=2007 - 1900;
     
       mktime (&date);
       printf("%s", asctime(&date));
     
    /* jour precedant */
       date.tm_mday--;
     
       mktime (&date);
       printf("%s", asctime(&date));
     
          return 0;
    }

  3. #3
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut
    Citation Envoyé par conceicao
    Bonjour , voila je ne c'est pas comment faire pour commencer mon programme

    je vous explique :

    l'utilisateur encode en une seule fois une date sous la forme AAAAMMJJ supposé corecte(donc ne pas valider la date).
    Donc il faudrait afficher la date correpondant au jour precedent


    par exemple on introduit :

    20041212 on devrait avoir 20041211
    20040101 on devrait avoir 20031231

    merci de votre aide si quelqu'un a une idée merci d'avance
    ou est ton probleme
    puis il n y a rien là qui parle de C

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    en fait je doit réaliser ce programme avec des condition (if , else ect...)

    mais je n'arrive pas a comprendre comment je pourait faire pour faire passer la date 20040101 à 20031231 par exemple .....


    tous les solution que je voix , se sont des instruction que je n'ai pas encore vue , car je commence seuleument le C depuis 2 mois.....

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Très simle! Tu sépares en trois compteurs, puis tu répercutes:
    Code algo : 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
     
    annee :=  date       /10000
    mois  := (date%10000)/  100
    jour  := (date%  100)
     
    DECR jour
    SI jour = 0
    	DECR mois
    SI mois = 0
    	DECR annee
    	mois = 12
     
    SI jour = 0
    	jour = maxjours[mois]
     
    newdate := (annee*10000) + (mois*100) + (jour)
    Reste à implémenter ça en C...

    Edit: hegros!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    C'est un probléme algorithimque.

    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
    LaDate est une chaine 
    SI JOUR=1 ALORS
       MOIS_PRECEDENT est un entier =RenvoiMoisPrecedent(MOIS)
       SI MOIS_PRECEDENT > MOIS
          ANNEE=ANNEE-1
       FIN SI
        nb_Jour est un entier = RenvoiNbJour(MOIS_PRECEDENT)
        LaDate = ANNEE + MOIS_PRECEDENT + nb_Jour
    SINON
       LaDate = ANNEE+ MOIS + JOUR - 1
    FIN SI
     
    FONCTION RenvoiMoisPrecedent(MOIS est un entier)
    SI MOIS =1 ALORS
      renvoyer 12
    SINON
      renvoyer MOIS-1
    FIN SI
     
    FONCTION RenvoiNbJour(MOIS est un entier)
     
    SELON MOIS
      CAS 1 : //janvier renvoyer 31
      CAS 2 : //fevrier voir pour calculer le nombre de jour
      cas 3 : //mars renvoyer 31
      cas 4 : renvoyer 30
    FIN SELON
    Quelque chose comme cela.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    annee := date /10000
    mois := (date%10000)/ 100
    jour := (date% 100)

    DECR jour
    SI jour = 0
    DECR mois
    SI mois = 0
    DECR annee
    mois = 12

    SI jour = 0
    jour = maxjours[mois]

    newdate := (annee*10000) + (mois*100) + (jour)


    qu'est que j'obtien en appliquant -->mois := (date%10000)/ 100
    merci d'avance

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Exemple: Si la date est 20061114
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    annee:
    	date/10000 = 20061114/10000 = 2006
    mois:
    	date%10000 = 20061114%10000 = 1114
    	1114/100 = 11
    joue:
    	date%100 = 20061114%100 = 14
    % est l'opérateur de "reste de la division"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    a oui donc % c'est le modulo en fait???

  10. #10
    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 conceicao
    a oui donc % c'est le modulo en fait???
    D'après la norme, c'est l'opérateur qui retourne le reste de la division entière. Il peut être signé. Ce n'est donc pas la modulo au sens arithmétique qui est non signé si mes renseignements sont exacts. Le mot 'modulo' n'apparait pas dans la norme.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    annee := date /10000
    mois := (date%10000)/ 100
    jour := (date% 100)

    DECR jour
    SI jour = 0
    DECR mois
    SI mois = 0
    DECR annee
    mois = 12

    SI jour = 0
    jour = maxjours[mois]


    newdate := (annee*10000) + (mois*100) + (jour)

    Comment je pourais interpreter "SI jour = 0
    jour = maxjours[mois]
    " En langage C?

    et aussi dans ce raissonement on prend pas en compte le mois de fevrier avec ses 28 ou 29 jour?

    Merci d'avance

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ben, soit tu te fais un bête tableau qui ne prend pas en compte le 29 février, soit tu te fais une fonction complexe qui prend le mois et l'année en paramètres et qui calcule si l'année est bissextile ou non si le mois est février...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    Bon voila j'ai réaliser le programme ca a l'air de fonctionner, qu'est que vous en pensez?

    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
    #include <mylib.h>
    #include <stdio.h>
     
    long int date = 0;
    long int annee ;
    long int mois ;
    long int jour ;
    long int newdate ;
     
     
              int main ()
     
    {
        cls (BLEU);
        gotoxy (1, 1); printf ("%45s", "DEVOIR 2");
    	gotoxy (2, 1); printf ("%45s", "=====================");
    	gotoxy (4, 1); printf ("  Date :        :");
    	lire_long_int (&date, 4, 28, 8, 1, 99999999);
        annee = date / 10000;
    	mois = (date % 10000) / 100;
    	jour = (date % 100) - 1;
     
     
       if (jour == 0 )  { 
           if (mois ==12){
                    jour = 30;
                    mois = mois - 1 ;
           }
           }
     
     
       if (jour == 0 )  { 
           if (mois == 1){
                    jour = 31;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois == 2){
                    jour = 31;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois == 3){
                    jour = 28;
                    mois = mois - 1 ;
     
           }
           }
     
     
       if (jour == 0 )  { 
           if (mois == 4){
                    jour = 31;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois == 5){
                    jour = 30;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois == 6){
                    jour = 31;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois == 7){
                    jour = 30;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois == 8){
                    jour = 31;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois == 9){
                    jour = 30;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois ==10){
                    jour = 31;
                    mois = mois - 1 ;
     
           }
           }
     
       if (jour == 0 )  { 
           if (mois ==11){
                    jour = 30;
                    mois = mois - 1 ;
     
           }
           }
     
     
       if (mois == 0) {
               annee = annee - 1;
               mois = 12;
     
               }
     
     
        date = (annee * 10000 ) + (mois * 100) + jour ;
        gotoxy (8, 1); printf ("dateprec: %ld    \n\n\n",  date);
        system ("pause");
    	return 0;

    j'aimerais savoir si vous n'auriez pas un autre moyen , plus optimal et moins long avec les if? et aussi comment implenter le moi de fevrier avec soit 28 ou 29 jour? Merci d'avance

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut


    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
    #include <mylib.h>
    #include <stdio.h>
     
    int est_annee_bissextile(int annee)
    {
    int bRet = 0;
     
    /* ... */
     
    return bRet;
    }
     
     
    int maxjours(int annee, int mois)
    {
    int ret = 0; /* Une valeur impossible */
    switch(mois)
    	{
    	case 1:
    	case 3:
    	case 5:
    	case 7:
    	case 8:
    	case 10:
    	case 12:
    		ret = 31;
    		break;
     
    	case 2:
    		if(est_annee_bissextile(annee))
    			ret = 29;
    		else
    			ret = 28;
    		break;
     
    	case 4:
    	case 6:
    	case 9:
    	case 11:
    		ret = 30;
    		break;
     
    	default: /* Mois impossibles */
    		ret = 0;
    		break;
    	}
    return ret;
    }
     
     
    int main(void)
    {
    long int date = 0;
    long int annee ;
    long int mois ;
    long int jour ;
    long int newdate ;
     
    cls (BLEU);
    gotoxy (1, 1); printf ("%45s", "DEVOIR 2");
    gotoxy (2, 1); printf ("%45s", "=====================");
    gotoxy (4, 1); printf (" Date : :");
    lire_long_int (&date, 4, 28, 8, 1, 99999999);
    annee = date / 10000;
    mois = (date % 10000) / 100;
    jour = (date % 100);
     
    /* Calcul */
    jour--;
    if(jour == 0)
    	mois--;
    if(mois == 0)
    	{
    	annee--;
    	mois = 12;
    	}
     
    if(jour == 0)
    	jour = maxjours(annee, mois);
     
    date = (annee * 10000 ) + (mois * 100) + jour ;
    gotoxy (8, 1); printf ("dateprec: %ld \n\n\n", date);
    system ("pause");
    return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Par défaut
    ton code doit etre correct , mais je ne comprend pas tous ton code car je viens de commencer le language C , et pour le moment on a vu les simple condition si , else , ect....

    donc si tu aurait ou quelqu'un d'autre aurait une autre solution , mais si c pas optimiser.Merci d'avance

Discussions similaires

  1. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34
  2. problème de date
    Par baboune dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 10/06/2004, 10h52
  3. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 11h21
  4. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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