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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 9
    Points
    9
    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 du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Points : 52
    Points
    52
    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 du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Points : 52
    Points
    52
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 9
    Points
    9
    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 du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Points : 52
    Points
    52
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 9
    Points
    9
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 9
    Points
    9
    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]);
    	}
     
    }

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define NBRMOTS 3
    #define LGMOT 20
     
    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 + 1);
          fgets(tab[i], LGMOT, stdin);
       }
       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')
          {
             qsort(tab, NBRMOTS, LGMOT, strcmp);
    	for(i=0;i<NBRMOTS;i++)
    	{
    		printf("Mot %d : %s\n", i + 1, tab[i]);
    	}
          }
       }
       while(choix!='q' && choix!='r');
    }
    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]

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    oui, ton code fonctionne nickel, mais le but justement, c'était de créer une fonction qui permette de faire ça, sans en utiliser une déjà toute faite.

    j'avais entendu parler du qsort, mais c'est trop facile alors^^

    mais merci quand meme...

  11. #11
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strcpy(tableau[k],temp); 
    strcpy(tableau[k-1],tableau[k]);
    strcpy(temp,tableau[k]);
    Attention, strcpy(dest,src) copie src dans dest et non pas dest dans src !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strcpy(temp,tableau[k]); 
    strcpy(tableau[k],tableau[k-1]);
    strcpy(tableau[k-1],temp);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Mouahahaha
    Ca marche

    merci pour votre aide

    bonne soirée

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par leomat1988 Voir le message
    oui, ton code fonctionne nickel, mais le but justement, c'était de créer une fonction qui permette de faire ça, sans en utiliser une déjà toute faite.

    j'avais entendu parler du qsort, mais c'est trop facile alors^^
    Ben faut le dire alors !!! Comment veux-tu qu'on fasse la différence entre quelqu'un qui a besoin de trier ses chaines (et de le faire vite) et quelqu'un qui a envie de se faire plaisir à recréer un algo ???

    Maintenant, petite remarque perso, au lieu de trier les chaînes tu pourrais trier les adresses pointant sur ces chaînes. Ca irait plus vite
    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]

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    mouais, mais j'ai déjà du mal avec le c, et pour ce qui est des pointeurs, je galère un peu, j'arrive pas du tout à comprendre le truc.

    j'ai beau relire toute la théorie possible dessus, j'ai pas ce feeling comme j'avais avec le java.

    enfin c'était une parenthèse^^

    thx encore

+ 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, 17h06
  2. Tri chaine de caractères
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 5
    Dernier message: 29/10/2008, 17h48
  3. Tri chaine caractère et insertion
    Par Maillon dans le forum Linux
    Réponses: 1
    Dernier message: 16/11/2007, 13h41
  4. Réponses: 4
    Dernier message: 18/07/2007, 15h10
  5. Réponses: 17
    Dernier message: 16/12/2005, 10h45

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