Tri alphabétique
Résolu
Ola_J
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
Ola_J Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Ola_J Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous. J'aimerais écrire un algorithme qui trie des chaines de caractères par ordre alphabétique mais après exécution j'obtient des caractères anormaux. Merci d'avance pour votre aide.
================================Mon code =================================
================================Mon code =================================
#include <stdio.h> #include <stdlib.h> #include <string.h> void echange(char *mot1, char *mot2); int main() { int pos,len,i,j,k; char tmp; char liste [5][30]; printf("Nous allons ranger des noms par ordre alphabetique par ordre alphabetique\n"); printf("Veuillez entrer les noms\n"); for(len=0;len<5;len++) { printf("Entrer le %de nom\n",len+1); scanf("%s",&liste[len]); } printf("L'ordre actuel des noms est:\n"); for(i=0;i<5;i++) { printf("%s\n",liste[i]); } for (j=0;j<5;j++) { for(pos=0;pos<5;pos++) { if ((strcmp(liste[i], liste[pos]))>0) { echange(&liste[i],&liste[pos]); } } } printf("Maintenant les noms sont ordonnes \n"); for(k=0;k<5;k++) { printf("%s\n",liste[i]); } return 0; } void echange(char *mot1,char *mot2) { char *tmp; *tmp= *mot1; *mot1=*mot2; *mot2=tmp; }
A voir également:
- Tri alphabétique
- Comment trier par ordre alphabétique sur excel - Guide
- Logiciel tri photo - Guide
- Triez ce tableau par ordre alphabétique des prénoms. ✓ - Forum Excel
- Ajoutez à la liste de contacts ana le goff, inscrite le 27 novembre 2015, dans la catégorie i. puis triez les contacts en les classant : par ordre alphabétique de leur nom de famille (critère principal), puis par date du plus récent au plus ancien (critère secondaire). quel mot apparaît à la verticale dans la colonne "catégorie" entre les lignes 200 et 209 (en-tête compris) ? ✓ - Forum Word
- Peut on récupérer un colis au centre de tri chronopost - Forum Consommation & Internet
4 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, n'as-tu pas oublié de préciser quelle ligne de code générait les caractères anormaux?
as-tu testé ta fonction echange()?
as-tu testé ta fonction echange()?
Au fait il me semble que c'est la fonction échange qui est défaillante. Lorsque je la teste j'ai une erreur au niveau des pointeurs
Salut Ola_J,
Tu devrais aussi te pencher sur les avertissements du compilateur.
Chez moi, lorsque je tente de compiler ton programme, il produit un exécutable mais avec une multitude d'avertissements que tu devrais traiter un par un, en commençant par le premier.
Comme tes données sont supposées être dans un tableau
La chose serait différente si tu avais déclaré un tableau de 5 pointeurs sur char, alloué 5 espaces mémoire avec malloc pour un espace de stockage de 30 char chacun et mis les adresses mémoire vers chaque espace dans ton tableau de pointeurs. Dans ce cas tu aurais pu procéder en permutant les adresses mémoires contenues dans chaque pointeur.
Dal
Tu devrais aussi te pencher sur les avertissements du compilateur.
Chez moi, lorsque je tente de compiler ton programme, il produit un exécutable mais avec une multitude d'avertissements que tu devrais traiter un par un, en commençant par le premier.
$ gcc -Wall 36465943.c 36465943.c: In function ‘main’: 36465943.c:16:11: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=] scanf("%s",&liste[len]); ~^ ~~~~~~~~~~~ 36465943.c:29:13: warning: passing argument 1 of ‘echange’ from incompatible pointer type [-Wincompatible-pointer-types] echange(&liste[i],&liste[pos]); ^~~~~~~~~ 36465943.c:5:20: note: expected ‘char *’ but argument is of type ‘char (*)[30]’ void echange(char *mot1, char *mot2); ~~~~~~^~~~ 36465943.c:29:23: warning: passing argument 2 of ‘echange’ from incompatible pointer type [-Wincompatible-pointer-types] echange(&liste[i],&liste[pos]); ^~~~~~~~~~~ 36465943.c:5:32: note: expected ‘char *’ but argument is of type ‘char (*)[30]’ void echange(char *mot1, char *mot2); ~~~~~~^~~~ 36465943.c:9:7: warning: unused variable ‘tmp’ [-Wunused-variable] char tmp; ^~~ 36465943.c: In function ‘echange’: 36465943.c:50:7: warning: assignment to ‘char’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion] *mot2=tmp; ^ 36465943.c:46:6: warning: ‘tmp’ is used uninitialized in this function [-Wuninitialized] *tmp= *mot1; ~~~~^~~~~~~
Comme tes données sont supposées être dans un tableau
char liste [5][30];pour permuter deux chaînes, tu devrais utiliser
strcpy()ou
strncpy()en passant par un tableau de char d'une capacité de 30 chars pour le stockage de la chaîne temporaire.
La chose serait différente si tu avais déclaré un tableau de 5 pointeurs sur char, alloué 5 espaces mémoire avec malloc pour un espace de stockage de 30 char chacun et mis les adresses mémoire vers chaque espace dans ton tableau de pointeurs. Dans ce cas tu aurais pu procéder en permutant les adresses mémoires contenues dans chaque pointeur.
Dal
Merci beaucoup pour vos conseils. J'ai corrigé le programme et il est fonctionnel
=======================================Prog=================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char tab[5][30];
char tmp[30];
int i,j,value;
printf("Veuillez entrer cinq mots. Nous allons les classer par ordre alphabetique\n");
for(i=0;i<5;i++)
{
printf("Veuillez entrer le %de nom\n",i+1);
scanf("%s",tab[i]);
}
printf("L'ordre actuel des noms est :\n");
for(i=0;i<5;i++)
{
printf("%s\n",tab[i]);
}
printf("Nous allons maintenant trier les noms\n");
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
value= strcmp(tab[i],tab[j]);
if(value<0)
{
strcpy(tmp,tab[i]);
strcpy(tab[i],tab[j]);
strcpy(tab[j],tmp) ;
}
}
}
printf("Tri termine\n");
printf("L'ordre actuel des noms est :\n");
for(i=0;i<5;i++)
{
printf("%s\n",tab[i]);
}
return 0;
}
=======================================Prog=================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char tab[5][30];
char tmp[30];
int i,j,value;
printf("Veuillez entrer cinq mots. Nous allons les classer par ordre alphabetique\n");
for(i=0;i<5;i++)
{
printf("Veuillez entrer le %de nom\n",i+1);
scanf("%s",tab[i]);
}
printf("L'ordre actuel des noms est :\n");
for(i=0;i<5;i++)
{
printf("%s\n",tab[i]);
}
printf("Nous allons maintenant trier les noms\n");
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
value= strcmp(tab[i],tab[j]);
if(value<0)
{
strcpy(tmp,tab[i]);
strcpy(tab[i],tab[j]);
strcpy(tab[j],tmp) ;
}
}
}
printf("Tri termine\n");
printf("L'ordre actuel des noms est :\n");
for(i=0;i<5;i++)
{
printf("%s\n",tab[i]);
}
return 0;
}