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 :

Trier des tableaux horaire avec un tri à bulle ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut Trier des tableaux horaire avec un tri à bulle ?
    Bonjour,

    Je cherche à trier des tableaux contenant des evenements horaires par ordre chronologique, je ne sais pas comment m'y prendre.

    Je dispose de 12 tableaux, tous remplis de façon identique :

    tableX [0] = dizaine du jour
    tableX [1] = unité du jour
    tableX [2] = caractère : /
    tableX [3] = dizaine du mois
    tableX [4] = unité du mois
    tableX [5] = caractère : /
    tableX [6] = dizaine de l'année
    tableX [7] = unité de l'année
    tableX [8] = caractère ESPACE
    tableX [9] = dizaine du jour
    tableX [10] = unité du jour
    tableX [11] = caractère :
    tableX [12] = dizaine des minutes
    tableX [13] = unité des minutes
    tableX [14] = caractère ESPACE
    tableX [15] = dizaine des secondes
    tableX [16] = unité des secondes
    tableX [17] = Le n° du jour dans la semaine (1 à 7)
    tableX [18] = caractère ESPACE
    tableX [19] = code evenement (A à F)
    tableX [20] = caractère de fin "\0"

    Donc mes tableaux se présentent comme ceci :

    table1 [] = "26/01/11 14:15 55 1 A"
    table2 [] = "27/02/11 23:05 00 7 F"
    table3 [] = "01/01/11 12:40 22 5 C"
    ... etc ...

    Mon but final serait d'obtenir un tableau 2D avec à l'interrieur les évenements de mes tableaux précédent, triés par ordre chronologique ( en fonction du jour / mois / année et heure / minutes / secondes )

    Résultat final avec tri effectué :

    table_tri[0] = "01/01/11 12:40 22 5 C"
    table_tri[1] = "26/01/11 14:15 55 1 A"
    table_tri[2] = "27/02/11 23:05 00 7 F"
    ... etc ...


    Si vous pouviez m'aider je vous en serai bien reconnaissant car je ne vois vraiment pas comment faire.

    Merci à vous,

  2. #2
    Membre éprouvé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    Bonjour,

    Le tri à bulles consiste à faire monter dans le tableau les éléments les plus anciens, l'algorithme peut être facilement retrouvé avec une recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     procédure tri_bulle(tableau T, entier n)
         répéter
             aucun_échange = vrai
             pour j de 0 à n - 2
                 si T[j] > T[j + 1], alors
                     échanger T[j] et T[j + 1]
                     aucun_échange = faux
         tant que aucun_échange = faux
    Dans ce pseudo-code, T peut très bien être un tableau de tableaux d'entiers pour coller à ton exemple.

    La difficulté de ton cas, c'est que tu n'as pas des entiers mais des dates stockées dans des tableaux. La seule chose qui change finalement, c'est de définir comment on détermine qu'une date est plus grande qu'une autre. Et là, c'est plus une question de logique, on trie selon les critères suivants :

    1. Année : éléments 6 et 7 du tableau
    2. Mois : éléments 3 et 4 du tableau
    3. Jour : éléments 0 et 1 du tableau
    4. Heure : éléments 9 et 10 du tableau
    5. Minutes : éléments 12 et 13 du tableau
    6. Secondes : éléments 15 et 16 du tableau

    A partir de là, il te faut une fonction de test qui remplace "si T[j] > T[j + 1], alors" et qui prend en compte les critères de tri ci dessus. Cette fonction doit pouvoir dire si une date est antérieure ou non à une autre.

    Il ne reste plus qu'à faire une fonction "échanger T[j] et T[j + 1]" qui au lieu d'échanger les entiers d'un tableau, échange des tableaux d'un tableau.

    Bonne journée,

    Aldiemus

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci de votre réponse, cependant mon niveau en C ne me permet pas encore de réaliser tout cela.

    Faudrait il que je modifie mes tableaux de dates afin de pouvoir parvenir à un tri de façon plus aisée ?

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Aldiemus Voir le message
    La difficulté de ton cas, c'est que tu n'as pas des entiers mais des dates stockées dans des tableaux.
    il est courant de transformer des dates en entiers pour trier par exemple. Ces entiers représentent des nombres de secondes écoulées depuis le 1er janvier 1970, ou quelque chose comme ça. La fonction inverse, créer une chaine représentant une date à partir d'un entier existe aussi. Elles sont toutes les 2 dans la bibliothèque time.

    mktime pour passer de date à entier
    strftime pour passer d'entier à date.

    A+

    Pfeuh

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    l'ordre du tri demandé est assez étrange...

    trier par jour/mois/année va donner


    15/02/2009
    15/03/2009
    15/04/2010
    22/01/2010
    22/01/2011
    ...


    Est-ce vraiment ça ?

    ou bien ne serait-ce oas plutôt :

    2009/02/15
    2009/03/15
    2010/01/22
    2010/04/15
    2011/01/22
    ...
    ?

    @pfeuh : pour le tri des date en ASCII, suivant e résultlat voulu et la chaîne initiale, pas forcément besoin de passer en time_t..

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    L'idéal serait que tes données soient stockées sous cette forme YYYY-MM-DDThh:mm:ss dans un seul tableau. Dans ce cas là, la comparaison pourrait se faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #define FORMAT_DATETIME    "YYYY-MM-DDThh:mm:ss"
    ...
     
    size_t length = strlen(FORMAT_DATETIME);
    ...
     
    /* Comparer les deux dates */
    if (memcmp(&tab[j], &tab[j + 1], length) > 0)
    {
          /* Permuter les deux éléments du tableau */
          ...
    }

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Il m'est tout à fait possible d'organiser les tableaux d'évènements ainsi, puis est possible de rajouter en fin de chaque table d'autres informations qui n'influeront pas le tri ?

    "YYYY-MM-DDThh:mm:ss 1 A"

    Dans ce cas, comment le tri à bulle va t-il traiter cela ?

  8. #8
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    pour le tri des date en ASCII, suivant e résultlat voulu et la chaîne initiale, pas forcément besoin de passer en time_t..
    C'est vrai, personnellement j'utilise souvent YYYYMMDD (pour lister les dates de concerts triées en javascript par exemple), mais j'ai constaté que les français aiment les dates en JJ/MM/AAAA, donc il m'a paru moins perturbant de montrer cette fonction qui peut effectivement ralentir un peu.

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Bonjour

    J'essai de comprendre l'algo proposé par Aldiemus, mais j'ai quelques difficultés.

    Mes tableaux d'evenements sont arrangés ainsi : ( année, mois, jours en premiers puis des informations tierces associées à l'evenement )

    table1 [] = "2011/01/26 14:15 55 1 A"
    table2 [] = "2011/02/27 23:05 00 7 F"
    table3 [] = "2011/01/01 12:40 22 5 C"
    ... etc ...

    Comment puis obtenir un tableau final trié, se présentant ainsi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat [] = "2011/01/01 12:40 22 5 C2011/01/26 14:15 55 1 A2011/02/27 23:05 00 7 F"
    J'imagine que la fonction de trie doit renvoyer un tableau de resultat, n'est ce pas, par exemple un tableau appelé "resultat"

    Serait il plus aisé, que mes evenements soient tous stockés " à la suite" dans 1 seul tableau comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    evevements [] = "2011/01/26 14:15 55 1 A2011/02/27 23:05 00 7 F2011/01/01 12:40 22 5 C"
    Mon probleme est d'effectuer un trie sur les n x 19 caractères mais de déplacer à chaque fois les 23 caracteres composants l'evenement .

    n = nb d'evenements dans le tableau evenements


    Je vous remercie de votre aide, je ne m'en sort pas vraiment

Discussions similaires

  1. Manipuler des tableaux / Array avec VBA
    Par funtim78 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2012, 15h02
  2. Trier des nombres entiers avec emu8086
    Par killerbee dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 20/03/2010, 00h29
  3. Trier une liste doublement chainee pr tri bulle
    Par saturn1 dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/12/2009, 23h14
  4. Requete sur des données horaires avec des trous..
    Par edmc73 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 11/09/2007, 21h02

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