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 :

Tri chaine de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Tri chaine de caractères
    Oyé oyé!

    Me voici confronté à un problème que je n'arrive pas à résoudre.
    Je dois tout simplement trier un tableau rempli de chaines de caractères, que je remplis moi-même.

    Après je dois la trier par ordre alphabétique, mais il plante toujours lors de ce tri.

    Voici mon code :

    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
    #include<stdio.h>
     
    #define NBRMOTS 3
    #define LGMOT 20
     
    void tri_chaine_caract(char tableau[],int tabLength, int wordLength);
     
    main()
    {
       char tab[NBRMOTS][LGMOT];
       int i;
       char choix;
     
       printf("encodez une série de 3 mots! \n");
     
       for(i=0;i<NBRMOTS;i++)
       {
          printf("Mot %d : ", i);
          scanf("%s", tab[i]);
       }
       do
       {
          printf("appuyez sur 'r' pour effectuer le tri \n");
          printf("appuyez sur 'q' pour quitter \n\n");
          choix=getch();
          if(choix=='q')
          abort();
          else if(choix=='r')
          {
             tri_chaine_caract(tab,NBRMOTS,LGMOT);
          }
       }
       while(choix!='q' && choix!='r');
    }
     
    void tri_chaine_caract(char tableau[],int tabLength, int wordLength)
    {
       int i,k;
       char temp[wordLength];
     
       for(i=0;i<tabLength;i++)
       {
          k=i;
          while((k>=0) || (strcmp(tableau[k],tableau[k-1]<0)))
          {
             temp=tableau[k];
             tableau[k]=tableau[k-1];
             tableau[k-1]=temp;
             k=k-1;
          }
       }
    }
    Alors, si je laisse le code comme ca, il me dit "16a.c:48: error: incompatible types in assignment". ceci est pour la ligne "temp=tableau[k];"

    Maintenant si je la mets en commentaire, il compile bien, mais au moment de faire le tri, il plante...


    Et je ne comprends pas pq Sad

    qqn saurait m'aider en cette période d'examens? ^^

    Merci à vous

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Par défaut
    salut,

    tout d'aord bon courage pour tes examens.

    En ce qui concerne ton probleme c'est tout simplement pour copier une chaine de caractere tu ne peux pas le faire pas un simple "=". Tu peux soit te faire ta propre fonction de copie caractere par caractere, ou soit utiliser :
    strcpy(), strncpy() disponible dans string.h.

    Bon courage!!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Par défaut
    Petit soucis dans ton code :
    * tu utilises strcmp() sans inclure string.h (pô bien!! lol)
    Je ne comprends pas d'ailleurs comment ca compile et ca fait les liens....

    * Petit soucis je pense egalement dans les conditions de ta boucle while de ta fonction : probleme de parenthesage.?????

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    tout d'abord, merci pour ton encouragement

    pour ce qui est du code, j'ai modifié en mettant des strcmp, mais cela plante toujours.
    après plusieurs tests, j'ai compris que cela venait de mon "while" qui se trouve dans ma fonction de tri.

    cad celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(k>0 && (strcmp(tableau[k],tableau[k-1])>0))
    Mais alors la, ca me laisse encore plus perplexe !

    EDIT : oui j'ai vu mon probleme de parenthèses, je l'ai reglé^^

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Par défaut
    Je pense que tu voulais dire strcpy()
    j'ai modifié en mettant des strcmp
    Perso je te conseillerais plus strncpy()!!! vu que tu es en possession de la taille du mot que tu veux copier....


    Apres as tu bien rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <string.h>
    ??

    De plus tu passes a ta fonction un tableau de chaine de char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            tri_chaine_caract(tab,NBRMOTS,LGMOT);
    or ta fonction a un prototype qui prend une chaine de caractere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void tri_chaine_caract(char tableau[],int tabLength, int wordLength);
    Et ça c'est pas bon du tout !!!

    Pour comprendre ce qui cloche dans ton algo une fois que toute la synthaxe est bonne, je t'encourage a afficher toutes les etapes intermediares... en regle generale sur ce type de probleme l'erreur algorithmique va te sauter aux yeux...

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    error: incompatible types in assignment". ceci est pour la ligne "temp=tableau[k];"
    temp est un tableau. On ne peut jamais écrire tableau = quelque chose !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(k>0 && (strcmp(tableau[k],tableau[k-1])>0))
    tableau est un tableau de char, donc tableau [k] est un char. Pour comparer deux char, il suffit d'utiliser les opérateurs habituels (> , <, == , <=, ....).
    strcmp sert à comparer des chaînes de caractères, pas des caractères.

    Le problème vient d'une mauvaise définition du premier paramètre de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void tri_chaine_caract(char tableau[],int tabLength, int wordLength);
    qui n'est pas en accord avec l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       char tab[NBRMOTS][LGMOT];
     ...
             tri_chaine_caract(tab,NBRMOTS,LGMOT);
    Le type de l'argument n'est pas char[] , qui correspondrait à une définition de tab par char tab[NBRMOTS] , mais du type char tab[][LGMOT]
    On doit avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void tri_chaine_caract(char tableau[][LGMOT],int tabLength, int wordLength)
    Dans ce cas, tableau[k] est bien une chaîne de caractères, la comparaison se fait par strcmp et la copie par strcpy.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    oui je commence à comprendre qu'après un an de labos en c, j'suis toujours un débutant^^

    je vois mes erreurs, je les comprends, je vais essayer de corriger ça, je reviendrai vous remercier si ca marche

    (merci d'avance^^)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    Bon, après avoir corrigé pas mal d'erreurs, le programme fonctionne... presque.

    En effet, il ne plante plus, je n'ai plus d'erreur de compilation.

    Mais il n'effectue pas le tri correctement.

    Voici ce qu'il fait
    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
    N:\ISIMs\LBPR\Partie 2>16a
    encodez une serie de 3 mots!
    Mot 0 : test
    Mot 1 : adg
    Mot 2 : chien
    Tableau non trie:
    Mot 0 : test
    Mot 1 : adg
    Mot 2 : chien
     
    appuyez sur 'r' pour effectuer le tri
    appuyez sur 'q' pour quitter
     
    Tableau trie :
    Mot 0 : º
    Mot 1 : º
    Mot 2 : º
    Voici mon nouveau code (je ne mets que 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
    void tri_chaine_caract(char tableau[][NBRCOLONNES])
    {
    	int i,k;
    	char temp[NBRCOLONNES];
    	for(i=0;i<NBRLIGNES;i++)
    	{
    		k=i;
    		while((k>0) && (strcmp(tableau[k],tableau[k-1])<0))
    		{
    			strcpy(tableau[k],temp); 
    			strcpy(tableau[k-1],tableau[k]);
    			strcpy(temp,tableau[k]);
    			k=k-1;
    		}
    	}
    	printf("Tableau trie :\n");
    	for(i=0;i<NBRLIGNES;i++)
    	{
    		printf("Mot %d : %s\n", i, tableau[i]);
    	}
     
    }

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

Discussions similaires

  1. Tri chaine de caractères
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2008, 16h06
  2. Tri chaine de caractères
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 5
    Dernier message: 29/10/2008, 16h48
  3. Tri chaine caractère et insertion
    Par Maillon dans le forum Linux
    Réponses: 1
    Dernier message: 16/11/2007, 12h41
  4. Réponses: 4
    Dernier message: 18/07/2007, 14h10
  5. Réponses: 17
    Dernier message: 16/12/2005, 09h45

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