3 - Tu dis que tu n'as aucun warning mais ton compilo doit être en mode "taiseux". Avec gcc, sans option sous Ubuntu ou avec l'option "Wall" (Warining all) sous MacOSX, tu as un tas de warnings pour la plupart de tes printf et scanf + d'autres choses :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ~ $ gcc -Wall -c echap.c
echap.c: In function lecture:
echap.c:27: warning: format %s expects type char *, but argument 2 has type char (*)[9u]
echap.c:29: warning: format %s expects type char *, but argument 2 has type char (*)[19u]
echap.c:40: warning: format %s expects type char *, but argument 2 has type char (*)[14u]
echap.c:42: warning: format %s expects type char *, but argument 2 has type char (*)[19u]
echap.c: In function affichage:
echap.c:124: warning: format %s expects type char *, but argument 2 has type char (*)[9u]
echap.c:125: warning: format %s expects type char *, but argument 2 has type char (*)[19u]
echap.c:126: warning: format %s expects type char *, but argument 2 has type int *
echap.c:127: warning: format %d expects type int, but argument 2 has type int *
echap.c:127: warning: format %d expects type int, but argument 3 has type int *
echap.c:127: warning: format %d expects type int, but argument 4 has type int *
echap.c:128: warning: format %d expects type int, but argument 2 has type int *
echap.c:129: warning: format %s expects type char *, but argument 2 has type char (*)[14u]
echap.c:130: warning: format %s expects type char *, but argument 2 has type char (*)[19u]
echap.c:131: warning: format %d expects type int, but argument 2 has type int *
echap.c: In function main:
echap.c:141: warning: implicit declaration of function getch
echap.c:137: warning: unused variable pos |
As-tu bien saisi l'emploi, ou non, du '&' pour passer l'adresse d'une variable ? et le cas particulier où tu passes un tableau/une chaine et que ce '&' est inutile ?
4 - quand un tableau est déclaré comme, par exemple, "int tab[NB]", une boucle sur l'ensemble des éléments se fera via "for (i=0;i<NB;i++)" : ne mets pas de "<=" car sinon tu vas trop loin (de 1) dans les indices
5 - tu as choisi, dans un premier temps, de ne pas utiliser qsort pour faire ton tri, Ok.
Dans ton code, là où tu fais le tri, l'algo de tri et la comparaison de deux structures s'entremêlent joyeusement et tu n'y gagnes pas en lisibilité.
Dans ton tri, tu as besoin (comme qsort ...) de savoir dire, entre 2 éléments, quel est celui qui est "avant" pour les inverser, ou non. Décompose un peu plus ton code et crée une fonction "compare" qui peut avoir le prototype suivant :
int compare(const cit *s1, const cit *s2)
qui te renvoie -1 (ou une valeur négative) si s1 est "plus petit" que s2, +1 (ou une valeur positive) si s1 est "plus grand" et 0 s'ils sont égaux.
L'écriture de ton algo de tri, qui appellera cette fonction (plutôt que de dérouler la suite de tests) n'en sera que plus lisible.
Ca te permettra aussi, si besoin, de tester ta fonction de comparaison, ce qui n'est pas possible ici (imbriquée dans l'algo de tri).
Dernier avantage : tu seras à 2 doigts d'avoir ta fonction de comparaison pour utiliser qsort.
6 - pour faire tes tests, je te conseille de mettre de côté, pour le moment, la saisie manuelle de tes éléments et de remplir ton tableau "en dur". Ca te permettra de faire des tests sur plus que 2 éléments (c'est un peu juste comme validation ...) car tu n'auras pas à te taper la saisie à chaque fois ...
7 - évite d'utiliser max comme nom de constante, ou même de variable (fonction ou macro, je ne sais plus, de même nom). Ca non plus ça n'améliore pas la lisiblité.
Partager