probleme tri alphabetique

probleme tri alphabetique - C - Programmation

Marsh Posté le 17-11-2007 à 16:04:19    

Bonjour, j'ai fait un petit programme mais il y a une derniere fonction qui me resiste, je voudrais trier la designation d'un article par ordre alphabétique:
 
reference: 001  
designation: Casettes
prix: 32.00  
quantite: 200  
 
reference: 002  
designation: DVD
prix: 12.45  
quantite: 12  
 
en fait qu'il me ré-affiche chaque article danc l'ordre alphabétique
 
 
voici ce que j'ai fait:
 

Code :
  1. // Definition de la structure
  2. struct article
  3. {
  4. int reference;
  5. char designation[50];
  6. float prix;
  7. int quantite;
  8. };
  9. struct article solde[100];
  10. void tri_tableau_designation (struct article solde[],int n)
  11. {
  12. int i;
  13. struct article temp;
  14. int compareDesignation(const void* solde[i].designation, const void* solde[i+1].designation) {                //ligne 165
  15. return strcmp(((struct article*)solde.designation)->designation , ((struct article*)solde.designation)->designation);
  16. }
  17. for (i=0; i<n; i++)
  18.     {if (qsort(solde, n, sizeof(solde[0]), compareDesignation))>0)
  19.         {temp=solde[i];                             // echange l'odre des 2 struct article comparées
  20.          solde[i]=solde[i+1];
  21.          solde[i+1]=temp;
  22.          i=0;
  23.          printf("/n%d",i);
  24.         }
  25.     }
  26. printf("Voici le stock du magasin avec les articles soldes et tries alphabetiquement:\n\n" );         // affiche le resulstat trié
  27. affiche_tableau_article(solde,n);
  28. }


 
il y a plein d'erreur de compilation:

Citation :

In function `main':
 
28: warning: return type of 'main' is not `int'
 
In function `tri_tableau_designation':
165: error: syntax error before '.' token
In function `compareDesignation':
167: error: request for member `designation' in something not a structure or union
167: error: request for member `designation' in something not a structure or union
In function `tri_tableau_designation':
172: error: syntax error before '>' token
At top level:
180: error: syntax error before string constant
180: error: conflicting types for 'printf'
180: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
180: error: conflicting types for 'printf'
180: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
180: warning: data definition has no type or storage class
181: warning: parameter names (without types) in function declaration
181: error: conflicting types for 'affiche_tableau_article'
78: error: previous definition of 'affiche_tableau_article' was here
181: warning: data definition has no type or storage class
182: error: syntax error before '}' token


 
Je ne souhaite pas que l'on corrige mes erreur ni que l'ont me fasse toute la fonction,mais juste m'expliquer comment marche le qsort et strcmp car je n'est pas vraiment compris la Definition de la fonction de comparaison ...
 
merci de votre aide, ca fait des heures que je suis dessus et je bloque; si vous avez besoin d'autres elements du programme demandez moi.
 
PS: je dois rester en C (pas de C++) et je souhaiterais garder cette methode aparement c'est le plus simple

Message cité 1 fois
Message édité par javo le 17-11-2007 à 16:06:26
Reply

Marsh Posté le 17-11-2007 à 16:04:19   

Reply

Marsh Posté le 17-11-2007 à 16:20:23    

javo a écrit :

Je ne souhaite pas que l'on corrige mes erreur ni que l'ont me fasse toute la fonction,mais juste m'expliquer comment marche le qsort et strcmp car je n'est pas vraiment compris la Definition de la fonction de comparaison ...

 

Le plus simple lorsque tu cherches de la documentation sur une fonction, c'est de taper "man lafonction" si tu es sur un unix quelconque, ou bien dans google ça marche aussi.

 

Pour strcmp(), c'est facile : ça compare deux char*. La fonction retourne 0 si les deux chaînes sont identiques, sinon ça retourne un nombre négatif ou positif selon que la chaîne 1 est "inférieure" ou "supérieure" à la chaîne 2.

 

qsort() est une fonction de tri générique, c'est-à-dire qu'elle trie une liste de n'importe quel type d'objets. Mais ce n'est pas magique, il faut tout de même lui donner des indices sur la manière de comparer les éléments, quel genre d'objets c'est, etc.
Pour ça, la fonction prend 4 arguments :

  • la liste d'objets à trier ;
  • le nombre d'éléments que contient la liste
  • la taille d'un élément. Par exemple s'il s'agit d'un tableau d'entiers à trier (un int*), tu donneras la taille d'un int : sizeof int
  • un pointeur vers une fonction de comparaison


Les trois premiers arguments ne posent pas de problème. Pour le quatrième, ça semble ardu mais c'est en fait tout bête : de base, qsort() ne peut pas savoir comment trier tes éléments. S'il s'agit d'un tableau de structures par exemple, jamais qsort() ne le trierait correctement si on ne lui disait pas comment comparer deux éléments entre eux. Normal.
La fonction qsort() appellera cette fonction autant de fois que nécessaire pour pouvoir déterminer si un élément est "inférieur" ou "supérieur" à un autre, c'est pour ça que cette fonction accepte deux arguments : les deux éléments que qsort() voudra comparer.
Cette fonction doit simplement retourner un entier : 0, les deux éléments sont égaux, <0 le premier élément est inférieur au second, >0 le premier élément est supérieur au second.

 

Tout comme strcmp() finalement, qu'on peut de fait utiliser avec qsort() pour trier des char** :)


Message édité par Elmoricq le 17-11-2007 à 16:21:44
Reply

Marsh Posté le 17-11-2007 à 16:23:43    

Hum, ne le prends pas mal, mais tu devrais commencer par les bases du C. Ta fonction compareDesignation c'est n'importe quoi (elle n'a pas à se trouver là déjà). Accessoirement qsort va traiter tout ton tableau, pas besoin de faire une boucle dessus. Ton callback va juste recevoir deux struct article * en paramètre, à toi de les comparer.

Reply

Marsh Posté le 17-11-2007 à 16:25:03    

(j'avoue que je n'ai pas regardé le code, trop la flemme [:dawao])

 

edit : (ok trop la flemme mais j'ai pondu un pâté... au point où j'en suis, je peux regarder le code, j'imagine [:dawao])

 


edit2 : ok ouais, effectivement : qsort() sert à trier une liste d'objets. Pas besoin donc de coder l'échange lui-même, tu as juste à coder la fonction de comparaison, et à appeler qsort(). Il s'occupera de faire tout le boulot pour toi. Pour le reste, voir le message de tpierron


Message édité par Elmoricq le 17-11-2007 à 16:27:19
Reply

Marsh Posté le 17-11-2007 à 16:54:34    

oua!! j'ai reussi! ca marche a premiere vu, voila ce que j'ai mis:
 
int compare (struct article *A,struct article *B)
{int i=0;
struct article solde[100];
strcmp(solde[i].designation,solde[i+1].designation);}
 
void tri_tableau_designation (struct article solde[],int n)
{int i;
struct article temp;
qsort(solde, n, sizeof(solde[0]),compare);
printf("Voici le stock du magasin avec les articles soldes et tries alphabetiquement:\n\n" );
affiche_tableau_article(solde,n);}
 
merci a tous pour vos conseils!!

Reply

Marsh Posté le 17-11-2007 à 17:03:32    

Ta fonction compare() fait n'importe quoi.
C'est le contenu de A et de B que tu dois comparer, pas un tableau de structures que tu viens juste de définir et qui contient n'importe quoi (la variable "solde" des fonctions compare() et tri_tableau_designation() sont deux entités différentes). En plus il manque un return dans ta fonction.


Message édité par Elmoricq le 17-11-2007 à 17:04:18
Reply

Marsh Posté le 18-11-2007 à 14:41:52    

salut, si je ne met pas struct article solde[100]; il me dit que solde n'est pas déclaré
Si je travail avec les pointeurs je n'ai pas besoin de mettre le retunr normalement si?
 
ce qui est bizzare c'est que tout marche correctement comme ca.  :pt1cable:

Reply

Marsh Posté le 18-11-2007 à 15:04:36    

[:pingouino]

 

Et ça m'étonnerait énormément que ton truc fonctionne correctement, tu ne tries rien de la manière dont tu travailles, là. [:mlc]

 

1. Quand tu déclares une variable dans une fonction, cette variable n'existe QUE dans cette fonction.

 

Exemple :

void foo(void)
{
   int truc;

 

  /* blabla */
}

 

void bar(void)
{
   int truc;

 

  /* blabla */
}

 

Dans les fonctions "foo" et "bar", les variables "truc" sont deux entités distinctes, qui n'ont rien en commun à part le nom donné par le développeur, et c'est tout. Si dans foo, tu mets 1 dans truc, dans bar ta variable truc n'est pas affectée.

 

Donc, ta variable solde là, dans compare(), n'appartient qu'à compare(), et à rien d'autre. Et n'a donc rien en commun avec la variable solde passée en paramètre de ta fonction tri_tableau_designation.
Cadeau bonus : comme ta variable vient d'être déclarée et n'a pas été initialisée, alors son contenu n'est pas prévisible, et ta fonction compare() fait n'importe quoi.

 

2. ta fonction compare reçoit deux arguments : *A et *B. Tu t'es pas dit que c'était ces variables qu'il fallait utiliser pour la comparaison ?

 


3. Qu'est-ce que tu appelles "travailler avec des pointeurs" ? Donc pour toi, définir une fonction qui retourne une valeur et ne pas mettre de return, c'est normal ? Je crois qu'il est temps pour toi de lire un bouquin de C. [:dawao]

 


4. Normalement, rien qu'avec le bout de code que tu nous as montré, ton compilateur devrait hurler à l'agonie. Il te file pas des messages d'avertissement ou autre ? Si ce n'est pas le cas, t'as une ou deux options à rajouter je pense. [:dawa]


Message édité par Elmoricq le 18-11-2007 à 15:08:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed