Pb triage de chaine dans un tableau en C

im4d -  
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

voila j'ai un prob avec ma boucle de tri quand je lance le pgm les entrées,saisie etc marche correctement mais lors de l'affichage ,par exemple qd j entre 3nom,le premier nom qui est a l'indice 0 est vide et seulement ensuite il m'affiche les autres noms mais ils ne sont pas trier.C'est surement un pb de ma boucle de tri mais je trouve pas quoi aidez moi svp merci d'avance

/*saisir une liste de nom qu'il range dans un tableau de chaine 2dimension,si utilisateur
entre le mot fin on stop la saisie,puis afficher le contenue du tableau
trier les noms dans l'ordre alphabétique */

#include<stdio.h>

#include<string.h>
#define Nom_personne 100
#define Taille_nom 100


int main()
{
//-----------Sequence d'initialisation-----------
char Liste_personne[Nom_personne] [Taille_nom];
char nom[Taille_nom],tempnom[Taille_nom];
int i,j,k,terminer=0,c=0;
for(i=0,j=0;i<Nom_personne,j<Taille_nom;i++,j++)
Liste_personne[i]=="";
//------------------Corps du programme--------------
//---------Boucle de saisie de nom-----------
do
{
printf("Entrez un nom(fin pour terminer les saisies)\n");
scanf("%s",nom);
terminer=((strcmp(nom,"fin"))==0);/*compare le nom entré et le mot fin,si renvoi 0 alors le pgm est terminé*/
if(!terminer)//enregistre au fur et a mesure les nom dans le tableau Tant que client n entre pas fin
{
strcpy(Liste_personne[c],nom);
c++;
}
}while(!terminer);

//-------Boucle de tri du tableau------

for(i=0;i<c;i++);
{
k=i;
while( (k>0) && (strcmp(Liste_personne[k],Liste_personne[k-1])<0) )
{
strcpy(tempnom,Liste_personne[k-1]);
strcpy(Liste_personne[k-1],Liste_personne[k]);
strcpy(Liste_personne[k],tempnom);
k--;

}


}


//----------Boucle d'affichage du tableau-------------
for(i=0;i<c;i++)


printf("la personne numero %d est %s\n",i,Liste_personne[i]);



}
A voir également:

2 réponses

Brachior Messages postés 613 Date d'inscription   Statut Membre Dernière intervention   46
 
tu veux mettre le tableau vide ?
si tu marque Liste_personne[i]=="";
alors tu fais une comparaison
retire un = pour donner la valeur
et ton j semble inutile Oo
de plus il n'est pas utile de mettre a zero ton tableau car lorsque tu y rentre un string grace a %s,
le programme fini la chaine par \0

enfin bn c'est pas la le prob ^^

euh t'as essayé d'afficher le tableau avant le tri pour voir ce qu'il t'affiche ?
0
im4d
 
je veux que mon pgm affiche par ordre alphabetique les nom que l utilisateur saisie par ex:

entrez nom:
paul
entrez nom:
robert
entrez nom:
alane

les noms sont stocké dans un tableau et ensuite il affiche les nom par ordre alphabétique comme ceci:
alane
paul
robert


qd j affiche sans la boucle de tri sa marche ,evidemment c pas trié,mais qd j'essaye d'afficher ac un tri sa ne fctionne pas
0
Brachior Messages postés 613 Date d'inscription   Statut Membre Dernière intervention   46 > im4d
 
je me souviens que j'ai eut un probleme avec la commande strcpy ...
c'etait un probleme de taille de tableau
j'ai du mettre mon tableau tmp 10fois plus gd que le tableau contenant la chaine

je sais pas si c'est ca mais je sais que
soit il m'affichait "erreur de segmentation"
soit il plantait

( j'allume l'emulateur et j'essaye chez moi ^^ )
0
Brachior Messages postés 613 Date d'inscription   Statut Membre Dernière intervention   46 > im4d
 
euh Oo ..
j'test chez moi et ca fct Oo
( bn par contre j'ai du modifier les p'tites erreurs ^^ )

voila le code qui fct chez moi :

#include<stdio.h>
#include<string.h>
#define Nom_personne 100
#define Taille_nom 100

main(){
//-----------Sequence d'initialisation-----------
  char Liste_personne[Nom_personne] [Taille_nom];
  char nom[Taille_nom],tempnom[Taille_nom];
  int i,j,k,terminer=0,c=0;
  for(i=0,j=0;i<Nom_personne,j<Taille_nom;i++,j++)
    Liste_personne[i]=="";
//------------------Corps du programme--------------
//---------Boucle de saisie de nom-----------
  do{
    printf("Entrez un nom(fin pour terminer les saisies)\n");
    scanf("%s",nom);
    terminer=((strcmp(nom,"fin"))==0);
//compare le nom entré et le mot fin,si renvoi 0 alors le pgm est terminé
    if(!terminer){
//enregistre au fur et a mesure les nom dans le tableau Tant que client n entre pas fin
      strcpy(Liste_personne[c],nom);
      c++;}}
  while(!terminer);

//-------Boucle de tri du tableau------
  for(i=0;i<c;i++){
    k=i;
    while( (k>0) && (strcmp(Liste_personne[k],Liste_personne[k-1])<0) ){
      strcpy(tempnom,Liste_personne[k-1]);
      strcpy(Liste_personne[k-1],Liste_personne[k]);
      strcpy(Liste_personne[k],tempnom);
      k--;}}

//----------Boucle d'affichage du tableau-------------
  for(i=0;i<c;i++)
    printf("la personne numero %d est %s\n",i,Liste_personne[i]);}
0
im4d > Brachior Messages postés 613 Date d'inscription   Statut Membre Dernière intervention  
 
merci de ton aide mais pourrais tu m expliqué cmt t a fais ? c juste parce que j ai oublié les accolades au niveau de la boucle?
0
Brachior Messages postés 613 Date d'inscription   Statut Membre Dernière intervention   46 > im4d
 
for(i=0;i<c;i++);
{ 
j'crois que le ; etait aussi de trop ^^
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
et au passage,
for(i=0,j=0;i<Nom_personne,j<Taille_nom;i++,j++)
Liste_personne[i]=="";

ne sert à rien et n'a aucun sens ... un seul indice utilisé (i) et test d'égalité non interpréter et sans aucun sens


salut

tchû
0
Brachior Messages postés 613 Date d'inscription   Statut Membre Dernière intervention   46
 
je l'ai deja mentionné ds le 1er post ^^
mais tu as raison de repreciser qu'il est inutile de surcharger un programme inutilement ^^
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44 > Brachior Messages postés 613 Date d'inscription   Statut Membre Dernière intervention  
 
yep!!!
0