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 un ensemble de chaine de caractere


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut trier un ensemble de chaine de caractere
    Bonsoir,

    j'ai codé ce bout de programme pour trier par ordre ascii une liste de chaine de caractère qu'on rentre en paramètre.
    Ce que je pensais c'etait parser, reparser, rereparser... mon char ** tant que tous les strcmp sont > 0
    est ce que quelqu'un pourrait m'aiguiller un peu?

    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
    void    swap(char **s1, char **s2)
    {
      char  *tmp;
     
      tmp = *s1;
      *s1 = *s2;
      *s2 = tmp;
    }
     
    int     main(int ac, char **av)
    {
      int   i;
      int   en_bordel;
      int   check;
     
      en_bordel = 1;
      while (en_bordel == 1)
        {
          i = 1;
          en_bordel = 0;
          while (i < ac)
            {
              if (av[i+1] == '\0')
                i = 1;
              else
                printf("[%d]\n", strcmp(av[i], av[i+1]));
              printf("Avant: av[i]: %s\n", av[i]);
              printf("Avant: av[i+1]: %s\n", av[i+1]);
              if (strcmp(av[i], av[i+1]) > 0)
                {
                  swap(&av[i], &av[i+1]);
                  en_bordel = 1;
                }
              printf("Apres: av[i]: %s\n", av[i]);
              printf("Apres: av[i+1]: %s\n", av[i+1]);
              i++;
            }
         }
      return (0);
    }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Points : 136
    Points
    136
    Par défaut
    Si ton objectif est exclusivement de trier les chaines de caractères
    il existe une fonction de tri qsort(...) dans stdlib.h

    Tu trouveras facilement des exemples et de la doc sur internet
    (spécifications ici http://www.elook.org/programming/c/qsort.html)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Tu devrais plutôt utiliser qsort combinée avec strcmp.

    http://man.developpez.com/man3/qsort.3.php

    EDIT: doublon désolé

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut
    le but est que je code ma propre fonction (je dois l'utiliser dans un autre programme)

    j'arrive à mes fins avec le bout de code du dessus mais il me manque une condition pour sortir de la boucle infinie mais je narrive pas a trouver laquelle

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par m0ul3sh0t Voir le message
    le but est que je code ma propre fonction (je dois l'utiliser dans un autre programme)

    j'arrive à mes fins avec le bout de code du dessus mais il me manque une condition pour sortir de la boucle infinie mais je narrive pas a trouver laquelle
    Elle n'est pas infinie ta boucle !!! Elle ne recommence que si t'as fait au-moins une permutation. Si pas de permutation alors plus de boucle (tri à bulle)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Elle n'est pas infinie ta boucle !!! Elle ne recommence que si t'as fait au-moins une permutation. Si pas de permutation alors plus de boucle (tri à bulle)
    j'ai fait un test et elle ne s'arrete pas
    je n'ai pas de condition d'arret ici parce que je ne trouve pas comment mettre ca en forme.
    est ce que si j'initialise un compteur a 0 a chaque rescanne de mon av et que je lincremente si je fait un swap, est ce que je peux dire que si i == ac et mon compteur = valeur initial alors en_bordel = 0?

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par m0ul3sh0t Voir le message
    j'ai fait un test et elle ne s'arrete pas
    C'est ton second while qui merde. Tu fais un "while (i < ac)" pour traiter tous les arguments, puis tu fais un test "si je suis sur le dernier argument je recommence" donc tu recommences toujours puisque t'atteindras toujours le dernier argument !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est ton second while qui merde. Tu fais un "while (i < ac)" pour traiter tous les arguments, puis tu fais un test "si je suis sur le dernier argument je recommence" donc tu recommences toujours puisque t'atteindras toujours le dernier argument !!!
    le probleme est que si je ne mets pas cette condition, je compare un nom avec un '\0'

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              if (av[i+1] == '\0')
                i = 1;
    Si tu mets ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
              if (av[i+1] == '\0')
                {i = ac;
                  en_bordel=0;
                }
    Alors le programme quitte les boucles quand tu tombes sur le dernier élément, c'est pas ce que tu veux?

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par m0ul3sh0t Voir le message
    le probleme est que si je ne mets pas cette condition, je compare un nom avec un '\0'
    Bien sûr puisque tu compares un élément avec le suivant (principe du tri à bulle).
    Si, au lieu de partir du premier jusqu'au dernier en essayant de bricoler pour détecter que t'es sur le dernier tu partais du 2° jusqu'au dernier et que tu compares l'élément avec le précédent alors
    1) ça ne changerait rien au résultat
    2) ça t'éviterait de comparer avec un élément incorrect
    3) ça t'éviterait ce bricolage foireux
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Alors le programme quitte les boucles quand tu tombes sur le dernier élément, c'est pas ce que tu veux?
    en fait je veux boucler sur mon char ** tant que je n'ai pas recuperer ce dernier classé dans l'ordre alphabetique

    Citation Envoyé par Sve@r Voir le message
    Bien sûr puisque tu compares un élément avec le suivant (principe du tri à bulle).
    Si, au lieu de partir du premier jusqu'au dernier en essayant de bricoler pour détecter que t'es sur le dernier tu partais du 2° jusqu'au dernier et que tu compares l'élément avec le précédent alors
    1) ça ne changerait rien au résultat
    2) ça t'éviterait de comparer avec un élément incorrect
    3) ça t'éviterait ce bricolage foireux
    ...
    je teste ca ce soir en rentrant chez moi et je te tiens au courant

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/12/2013, 22h14
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. ensemble de données vers une chaine de caractere.
    Par Delphieur dans le forum Oracle
    Réponses: 1
    Dernier message: 06/08/2007, 17h34
  4. Réponses: 3
    Dernier message: 29/01/2007, 15h10
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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