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 :

determiner les dates du changements d'heure


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut determiner les dates du changements d'heure
    Bonjour,

    je voudrais faire une fonction qui retourne, pour une date donnée, la date du dernier changement d'heure, et la date du prochain changement d'heure.

    exemples:

    si 02/07/2007 alors on doit obtenir d1 =25/03/2007(dernier dimanche de mars 2007) et d2 = 28/10/2007 (dernier dimanche d'octobre 2007)

    si 02/11/2007 alors on doit obtenir d1= 28/10/2007 (dernier dimanche d'octobre 2007) et d2 = 30/03/2008(dernier dimanche de mars 2008)

    j'ai vu sur ce forum, le code suivant :
    La variable j doit être renseignée: 31 pour ce qui nous interresse
    la variable m est le mois
    a est l'année.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m = m - 2: If m < 1 Then m = m + 12: a = a - 1
    siecle = Int(a / 100)
    a = a - (siecle * 100)
    b = Int(2.6 * m - 0.19) + j + a + Int(a / 4) + Int(siecle / 4) - siecle * 2
    jour = Int((b / 7 - Int(b / 7)) * 7 + 0.1)
    .
    Mais je n'arrive pas à l'adapter à mes besoins.

    Pouvez-vous m'aider svp ?

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 097
    Par défaut
    Moi j'essayerais de résonner de par toi même sans essayer de reprendre du code :

    1 : saisie de la date
    2 : vérifier quel changement d'heure ca concerne (Octobre ou Mars).
    3 : partir de la fin du mois correspondant
    4 : reculer d'un jour jusqu'a rencontrer un dimanche

    cas particulier : si c'est au mois octobre ou Mars, partir de la fin du mois et dès que tu trouves date du changement
    1 : ta date se trouve apres le changement > tu l'as trouvé
    2 : ta date se trouve avant le changement > refait le traitement du dessus, sachant qu'il se trouve lors du mois du changement precedent.

    Ex :
    1 : 02/07/2008
    2 : on est en Juillet donc ton changement précédent est en Mars.
    3 : 31/03/08=Lundi
    4 : 30/03/08 = Dimanche

    La date se trouve le 30/03/08

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut !

    J'ai fait ce code, ça a l'air de fonctionner après plusieurs tests. Il y a peut-être moyen d'optimiser voire de faire plus propre.

    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
    #include <stdio.h>
     
    struct struct_date
    {
        int jour;
        int mois;
        int annee;
    };
     
    int Trouve_jour_dernier_dimanche(struct struct_date date)
    {
        int annee, mois, jour, siecle,b;
     
        mois=date.mois-2;
        annee=date.annee;
     
        if (mois<1)
        {
            mois+=12;
            annee--;
        }
        siecle=annee/100;
        annee-=siecle*100;
        b=(int)(2.6*mois-0.19)+31+annee+annee/4+siecle/4-siecle*2;
        jour=(double)((double)b/7.0-b/7)*7.0+0.1;
        return 31-jour;
    }
     
    void Trouve_date_precedent_changement_heure(struct struct_date date_courante, struct struct_date *precedente_date)
    {
        int dernier_dimanche;
     
        if (date_courante.mois==3 || date_courante.mois==10)
        {
            dernier_dimanche=Trouve_jour_dernier_dimanche(date_courante);
            if (dernier_dimanche<=date_courante.jour)
            {
                precedente_date->jour=dernier_dimanche;
                precedente_date->mois=date_courante.mois;
                precedente_date->annee=date_courante.annee;
                return;
            } else
            {
                if (date_courante.mois==10) date_courante.mois=3;
                else
                {
                    date_courante.mois=10;
                    date_courante.annee--;
                }
            }
        }
        if (date_courante.mois<3)
        {
            date_courante.mois=10;
            date_courante.annee--;
        }
        if (date_courante.mois>10) date_courante.mois=10;
        if (date_courante.mois>3 && date_courante.mois<10) date_courante.mois=3;
     
        precedente_date->jour=Trouve_jour_dernier_dimanche(date_courante);
        precedente_date->mois=date_courante.mois;
        precedente_date->annee=date_courante.annee;
    }
     
    void Trouve_date_prochain_changement_heure(struct struct_date date_courante, struct struct_date *prochaine_date)
    {
        int dernier_dimanche;
     
        if (date_courante.mois==3 || date_courante.mois==10)
        {
            dernier_dimanche=Trouve_jour_dernier_dimanche(date_courante);
            if (dernier_dimanche>date_courante.jour)
            {
                prochaine_date->jour=dernier_dimanche;
                prochaine_date->mois=date_courante.mois;
                prochaine_date->annee=date_courante.annee;
                return;
            } else
            {
                if (date_courante.mois==10)
                {
                    date_courante.mois=3;
                    date_courante.annee++;
                }
                else date_courante.mois=10;
            }
        }
        if (date_courante.mois<3) date_courante.mois=3;
        if (date_courante.mois>10)
        {
            date_courante.mois=3;
            date_courante.annee++;
        }
        if (date_courante.mois>3 && date_courante.mois<10) date_courante.mois=10;
     
        prochaine_date->jour=Trouve_jour_dernier_dimanche(date_courante);
        prochaine_date->mois=date_courante.mois;
        prochaine_date->annee=date_courante.annee;
    }
     
    int main()
    {
        struct struct_date date_actuelle, date_precedent_changement_heure, date_prochain_changement_heure;
     
    // Valeurs à modifier :
        date_actuelle.jour=1;
        date_actuelle.mois=12;
        date_actuelle.annee=2008;
     
        Trouve_date_precedent_changement_heure(date_actuelle,&date_precedent_changement_heure);
        Trouve_date_prochain_changement_heure(date_actuelle,&date_prochain_changement_heure);
     
        printf("Nous sommes le %d/%d/%d\n",date_actuelle.jour, date_actuelle.mois, date_actuelle.annee);
        printf("Le precedent changement d'heure s'est produit le : %d/%d/%d\n", date_precedent_changement_heure.jour, date_precedent_changement_heure.mois, date_precedent_changement_heure.annee);
        printf("Le prochain changement d'heure se produira le : %d/%d/%d\n", date_prochain_changement_heure.jour, date_prochain_changement_heure.mois, date_prochain_changement_heure.annee);
     
        getchar();
        return 0;
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    Effectivement, dans ma tete j'avais un raisonnement semblable au tiens flob91.
    c'est vrai que je ne l'ai pas exposé. Mai je n'arrive pas a trouver le dernier jour du mois. je vais essayer le code de Jérôme (surtout de le comprendre) et je vous tiens au courant.

    en tous cas Merci beaucoup

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    j'ai compris le fonctionnement du programme, par contre, je ne sais pas encore pourquoi, il ne marche pas pour le 04/07/2007

    Le precedent changement d'heure s'est produit le : 28/10/2007
    Le prochain changement d'heure se produira le : 30/3/2008 << le 30/3/08 est un vendredi.

    je suis en train dessayer de comprendre pourquoi il y a une erreur pour cette date (a mon avis pour toute les dates entre 28/10/2007 et le 30/3/2008)

    est-ce que le 29/02/2008 est pour quelque chose ??.....

    à suivre , je vous tiens informé

  6. #6
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 097
    Par défaut
    le 30/3/08 C'est bien un dimanche....

    Edit : pour information le 04/07 (Juillet)/ 07 n'est pas situé entre le 28 octobre 07 et le 30 mars 08
    Edit2 : pour le 4/7/07 ca me donne : le 25/3/07 et le 28/10/2007 (tous les deux des dimanches).

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    j'ai compris le fonctionnement du programme, par contre, je ne sais pas encore pourquoi, il ne marche pas pour le 04/07/2007

    Le precedent changement d'heure s'est produit le : 28/10/2007
    Le prochain changement d'heure se produira le : 30/3/2008 << le 30/3/08 est un vendredi.
    C'est bizarre, car chez moi ça fonctionne impec pour cette date, et pour les autres aussi.
    Es-tu sûr qu'il s'agit bien du 4/7/2007 ? Car les résultats sont pas cohérents (dans cet exemple, le précédent changement d'heure est situé après cette date et non avant...)
    Lorsque la date courante est au moins de Juillet (comme dans ton exemple), seules ces instructions sont executées dans la fonction Trouve_date_precedent_changement_heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if (date_courante.mois>3 && date_courante.mois<10) date_courante.mois=3;
     
        precedente_date->jour=Trouve_jour_dernier_dimanche(date_courante);
        precedente_date->mois=date_courante.mois;
        precedente_date->annee=date_courante.annee;
    puisque toutes les conditions des "if" précédents sont fausses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (date_courante.mois==3 || date_courante.mois==10) ...
    if (date_courante.mois<3) ...
    if (date_courante.mois>10) ...
    Seule la condition du dernier "if" est vraie dans ce cas. Donc, le précédent changement d'heure doit donc donner le mois de Mars précédent la date courante et non Octobre qui est situé après.

    Est-ce que tu n'aurais pas fait de modifications dans le code ?

    Ou alors ton compilateur a merdouillé quelque part ? Lequel utilises-tu ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    Bonjour,

    En fait j'enleve juste un an a la date du jour, simplement je me suis trompé car j'enlevais 1 an apres l'appel de la fonction. donc juste a l'affichage.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Trouve_date_precedent_changement_heure(date_actuelle,&date_precedent_changement_heure);
    Trouve_date_prochain_changement_heure(date_actuelle,&date_prochain_changement_heure);
        
    printf("Nous sommes le %d/%d/%d\n",date_actuelle.jour, date_actuelle.mois, date_actuelle.annee);
    printf("date de reference le %d/%d/%d\n",date_actuelle.jour, date_actuelle.mois, date_actuelle.annee -1);
    printf("Borne Inf le : %d/%d/%d\n", date_precedent_changement_heure.jour, date_precedent_changement_heure.mois, date_precedent_changement_heure.annee-1);
    printf("Borne Sup le : %d/%d/%d\n", date_prochain_changement_heure.jour, date_prochain_changement_heure.mois, date_prochain_changement_heure.annee-1);
    Maintenant je l'enleve avant et ça marche forcement. Je suis desolé de vous avoir fait perdre du temps à tous les 2. Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tracer les dates de changements de données dans une table
    Par NewDpr dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/02/2015, 22h11
  2. Calcule sur les dates en elévant certaine heures
    Par kfmystik dans le forum Requêtes
    Réponses: 17
    Dernier message: 26/09/2012, 22h01
  3. opération sur les dates et les heures
    Par beb1982 dans le forum C
    Réponses: 15
    Dernier message: 03/09/2007, 20h47
  4. Selectionner les date qui ont minimum une heure d'ecart
    Par uraxyd dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/07/2005, 13h39

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