un peu d'aide pour faire des tris - C - Programmation
Marsh Posté le 18-01-2006 à 22:34:37
dodo a écrit : j'essaye de comprendre les tris, |
http://www.cs.ubc.ca/spider/harris [...] -demo.html
et forum "algo"
Citation : |
Qu'est-ce qui est 'correct' ?
De quelles erreurs parles-tu ? Celles-ci ?
|
Commentaires (-ed-) :
|
Marsh Posté le 18-01-2006 à 22:37:04
je vois mal les codes (d'ailleurs je sais pas pourquoi ...bref )
Mais est ce qu'il ne devrait pas (en plsu du reste ) fermer la boucle de for du tri avant celle de l'affichage?
oula j'avais pas vu le reste.
Effectivement, forum "algo".
Indic : pour ton tri tu fais ca avec la variable i et non avec ton tableau...c'est dommage
Marsh Posté le 18-01-2006 à 22:46:12
salut,
j'ai pas trop compris ce que fait le */ sans le /* qui va avec, mais ça doit être une erreur de copier coller ...
sinon, je te conseille FORTEMENT de mettre un commentaire associé à chaque accolade, pour dire à quel début ou quelle fin de boucle elle correspond !!! tu verras que ce que tu fais est un peu bizarre
Sinon, pour déclarer un ponteur, * correspond au déférencement Il ne faut donc pas mattre le & devant i, sauf si tu veux un pointeur de pointeur
tu peux faire plutôt :
int *p;
p = &i;
ou :
int *p = i;
je ne comprend pas très bien le scanf avec le &tableau... il vaut mieux je pense mettre * ou rien
je crois de plus que tu confond l'adresse de i et l'addresse de tableau[i]...
mais te prend surtout pas la tête avec les pointeur pour un simple tableau !!!
non seulement c'est inutile en soit, mais en plus, pour les tableaux toujours, le C travaille automatiquement avec les adresses des éléments
Marsh Posté le 18-01-2006 à 22:48:43
jimipage a écrit : |
T'as fini de raconter n'importe quoi...
Marsh Posté le 18-01-2006 à 22:52:00
Emmanuel Delahaye a écrit : http://www.cs.ubc.ca/spider/harris [...] -demo.html
|
oups!!! mon compilateur me donne pas ces erreurs!!!
Marsh Posté le 18-01-2006 à 22:55:05
Emmanuel Delahaye a écrit : T'as fini de raconter n'importe quoi... |
A ce point ? ?
Marsh Posté le 18-01-2006 à 22:55:39
gocho a écrit : je vois mal les codes (d'ailleurs je sais pas pourquoi ...bref ) |
En faite, c'était ma première idée de travailler le trie avec les tableaux.
Marsh Posté le 18-01-2006 à 23:01:59
ouai bon désolé pour le scanf j'suis fatigué
mais pour le int *p = i; je vois pas trop le pb
à moins de vouloir faire un pointeur de pointeur avec *p = &i;
Marsh Posté le 18-01-2006 à 23:28:23
dodo a écrit : oups!!! mon compilateur me donne pas ces erreurs!!! |
Avec gcc j'utilise au moins ceci :
-Wall -Wextra (ou -W si trop vieux) -O2 |
et si je fais du standard pur, j'ajoute :
-ansi -pedantic |
Marsh Posté le 18-01-2006 à 23:30:02
jimipage a écrit : mais pour le int *p = i; je vois pas trop le pb |
Si i est un int comme son nom le laisse supposer ?
Marsh Posté le 18-01-2006 à 23:30:45
Sinon, pour le tri en général ya une page très bien sur la wikipedia
Marsh Posté le 19-01-2006 à 08:10:40
jimipage a écrit : mais pour le int *p = i; je vois pas trop le pb |
"i" est de type "int". Tu peux pas le mettre dans "p" qui est de type "int étoile".
"&i" est de type "int étoile" donc tu peux le mettre dans "p" => "int *p=&i".
Marsh Posté le 19-01-2006 à 21:49:28
ça a l'air de marcher comme ça
(pour les commentaires, je préfère m'abstenir que de dire des âneries)
Code :
|
Marsh Posté le 19-01-2006 à 22:04:43
rem : k ne sert à rien, et on peut faire un for (i = 0 ; i < 4 ; i++)
Marsh Posté le 20-01-2006 à 22:59:58
jimipage a écrit : ça a l'air de marcher comme ça
|
Moi, je crois au contraire que tu devrais mettre des commentaires justement pour qu'on voit si tu comprends bien ce que tu fais. Mais sinon, effectivement, il n'y a aucune erreur de C (j'ai pas regardé l'algo mais lui-aussi semble correct). Et utiliser deux pointeurs est une bonne idée, ça te permet de t'habituer à travailler avec.
Petit truc amusant: on peut très bien permuter deux valeurs "a" et "b" sans passer par "temp" en utilisant juste le XOR
a=a^b;
b=a^b;
a=a^b;
Et voilà... ça marche sauf si "a" ou "b" sont des pointeurs qui pointent tous deux vers la même variable.
Marsh Posté le 21-01-2006 à 01:05:58
Sve@r a écrit : Moi, je crois au contraire que tu devrais mettre des commentaires justement pour qu'on voit si tu comprends bien ce que tu fais. |
Bon bé allons-y, je vais essayer de me concentrer... ce qui commence à être quelque peu laborieux
Code :
|
Marsh Posté le 21-01-2006 à 01:21:43
Sve@r a écrit : Moi, je crois au contraire que tu devrais mettre des commentaires justement pour qu'on voit si tu comprends bien ce que tu fais. |
Une bonne idée les commentaires, vu qu'on voit qu'il n'est pas nécessaire d'aller jusqu'au bout à chaque fois :
quand le 5 est bien placé, ça ne sert à rien de refaire le test
idem quand le 4 est bien placé...
d'où la solution suivante, plus rapide car n'effectuant pas tous ces tests forcément inutiles :
for (i = 3 ; i >= 0 ; i--) {
for (j = 0 ; j <= i ; j++) {
// traitement
}}
du coup i nous dit jusqu'où il faut encore aller
Marsh Posté le 21-01-2006 à 08:12:17
jimipage a écrit : Une bonne idée les commentaires |
Oui... mais pas forcément un par ligne
jimipage a écrit : vu qu'on voit qu'il n'est pas nécessaire d'aller jusqu'au bout à chaque fois : |
Tu es en train de nous réinventer l'algo du tri à bulle optimisé où on mémorise la position du 1er élément mal placé pour ne recommencer qu'à partir de ce point lors de la boucle suivante
Début=2° position // L'indice "1" est celui de la 2° position
Fin=dernière position
Faire
Flag=0
Pour i partant du début jusqu'à la Fin
Faire
Si elem[i - 1] > elem[i]
alors
permuter elem[i - 1] et elem[i]
si flag = 0
alors
debut=i // Mémorise la position du 1er élément incorrect
flag=1
fin si
fin si
fin faire
Fin=Fin - 1 // Le dernier élément est forcément bien placé
tant que flag = 1 // on recommence tant que un élément incorrect
Dans le pire des cas, cet algo fait autant de boucles que le tien. Dans le meilleur, il n'en fait qu'une seule
Marsh Posté le 18-01-2006 à 21:51:17
Bonjour,
j'essaye de comprendre les tris, voilà j'ai fais un petit code afin de manipuler un peu mais apparament c'est correct, si quelqu'un pouvais m'aider a comprendre mes erreurs.