Tableau : inverser deux valeurs

Tableau : inverser deux valeurs - C++ - Programmation

Marsh Posté le 10-01-2007 à 14:51:28    

Bonjour,
 
j'ai un tableau (1 dimension, taille 6) avec différentes valeurs. Pour réorganiser ces valeurs de la plus petite à la plus grande, je veux utiliser une comparaison.
 
Si le contenu de la case N et plus grand que celui de la case N+1, alors on inverse ces deux valeurs.
 
J'avais utilisé ça, mais ça ne marche pas : (deux variables sont déclarées initialement, save1 et save2)
 

Code :
  1. for (n=0; n<=6; n++)
  2.   {
  3.    if(tableau2[n]>tableau2[n+1])
  4.     {
  5.      save1=tableau2[n];
  6.      save2=tableau2[n+1];
  7.      tableau2[n]=save2;
  8.      tableau2[n+1]=save1;
  9.     }
  10.   }


Je suppose que l'erreur se situe à ce niveau, car ailleurs, je ne vois vraiment pas ce qui peut clocher...
 
Merci de votre aide  :jap:

Reply

Marsh Posté le 10-01-2007 à 14:51:28   

Reply

Marsh Posté le 10-01-2007 à 14:59:06    

Salut,

 

D'après la taille de ton tableau que tu annonces, tu fais 2 fois un dépassement:
* for de 0 à 6 inclus,
* et inversion de 6 avec 7 (qui sont tous les 2 hors limites)

 

J'imagines que l'erreur vient de là? Par contre, si tu expliquais le "ne marche pas", ça nous aiderait un peu plus.

 

Edit: pas besoin non plus de faire 2 valeurs temporaires, 1 seule suffit.

Message cité 1 fois
Message édité par IrmatDen le 10-01-2007 à 14:59:44
Reply

Marsh Posté le 10-01-2007 à 14:59:33    

Exemple :
 
j'ai cette série :
 
20004 - 20003 - 20008 - 20006 - 20007 - 20001
 
et une fois classé j'obtiens :
 
20003 - 20004 - 20006 - 20007 - 20001 - 20001

Reply

Marsh Posté le 10-01-2007 à 15:01:02    

Ca c'est parce que tu n'obtiens pas un tableau trié de cette façon en une seule passe, puisque tu n'inverses que 2 valeurs à la fois sans vérifier les précédentes.

Reply

Marsh Posté le 10-01-2007 à 15:02:41    

20003 - 20004 - 20006 - 20007 - 20001 - 20001
 
Ce 20001 n'est pas un problème en soit, c'est normal qu'il soit là, car il faudrait que je recommence le tri plusieurs fois pour que toi soit ordonné correctement.
 
C'est le dernier 20001 qui me gène...

Reply

Marsh Posté le 10-01-2007 à 15:07:16    

IrmatDen a écrit :

Salut,Edit: pas besoin non plus de faire 2 valeurs temporaires, 1 seule suffit.


Exact, très juste.

Reply

Marsh Posté le 10-01-2007 à 15:09:29    

std::sort(tableau, tableau + N) ou N est la taille de ton tableau.

Reply

Marsh Posté le 10-01-2007 à 15:09:36    

Et si tu enlèves le dépassement de capacité et fait autant de passes que nécessaire?

Reply

Marsh Posté le 10-01-2007 à 15:10:34    

Taz a écrit :

std::sort(tableau, tableau + N) ou N est la taille de ton tableau.


C'est la solution rapide ça, mais notre professeur a voulu nous compliquer la tache...  :pt1cable:  :non:  :D

Reply

Marsh Posté le 10-01-2007 à 15:12:34    

Nichlas a écrit :

Bonjour,
 
j'ai un tableau (1 dimension, taille 6) avec différentes valeurs. Pour réorganiser ces valeurs de la plus petite à la plus grande, je veux utiliser une comparaison.
 
Si le contenu de la case N et plus grand que celui de la case N+1, alors on inverse ces deux valeurs.
 
J'avais utilisé ça, mais ça ne marche pas : (deux variables sont déclarées initialement, save1 et save2)
 

Code :
  1. for (n=0; n<=6; n++)
  2.   {
  3.    if(tableau2[n]>tableau2[n+1])
  4.     {
  5.      save1=tableau2[n];
  6.      save2=tableau2[n+1];
  7.      tableau2[n]=save2;
  8.      tableau2[n+1]=save1;
  9.     }
  10.   }


Je suppose que l'erreur se situe à ce niveau, car ailleurs, je ne vois vraiment pas ce qui peut clocher...
 
Merci de votre aide  :jap:


 
C'est pas un tri à bulles, que tu veux faire ?
 
http://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles

Reply

Marsh Posté le 10-01-2007 à 15:12:34   

Reply

Marsh Posté le 10-01-2007 à 15:16:00    

boulgakov a écrit :

C'est pas un tri à bulles, que tu veux faire ?
 
http://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles


Si dans l'esprit c'est ça, mais il y a certains trucs que je ne peux pas utiliser, on est strictement limité par notre professeur. Bool, true, false... pas le droit.  
 
 :(  :pfff:

Reply

Marsh Posté le 10-01-2007 à 15:18:47    

IrmatDen a écrit :

Et si tu enlèves le dépassement de capacité et fait autant de passes que nécessaire?


Bon, j'ai mis mon "for" de 0 à 4 et maintenant ça marche  :)

Reply

Marsh Posté le 10-01-2007 à 17:45:50    

Nichlas a écrit :

Si dans l'esprit c'est ça, mais il y a certains trucs que je ne peux pas utiliser, on est strictement limité par notre professeur. Bool, true, false... pas le droit.  
 
 :(  :pfff:


C'est moi ou de nombreux soi-disant profs d'infos se croient malins en imposant ce genre de limitations stupides ?

Reply

Marsh Posté le 10-01-2007 à 17:47:23    

Quand on parcourt un tableau de N cases, la bonne facon de le faire est :

Code :
  1. for(int i=0;i < N;++i)
  2. {
  3.    // traitement sur tab[i]
  4. }


 
Juste pour dire de ne pas utiliser le <= mais le <.

Reply

Marsh Posté le 10-01-2007 à 19:40:42    

Si tu veux inverser deux valeurs, tu peux aussi le faire au niveau binaire sans redéclarer de variable temporaire :
exemple :
 
int a =1;
int b =2;
 
a ^= b;
b ^= a;
a ^= b;
 
C'est illisible, mais ca marche :D

Message cité 1 fois
Message édité par did-54 le 10-01-2007 à 19:41:13
Reply

Marsh Posté le 10-01-2007 à 22:24:22    

did-54 a écrit :

Si tu veux inverser deux valeurs, tu peux aussi le faire au niveau binaire sans redéclarer de variable temporaire :
exemple :
 
int a =1;
int b =2;
 
a ^= b;
b ^= a;
a ^= b;
 
C'est illisible, mais ca marche :D


Absolument pas illisible ! Ca se démontre d'ailleurs très simplement
Posons

  • "a1 = a xor b" sous entendu "le résultat du calcul modifie "a" qu'on peut voir maintenant comme "a1" pour montrer qu'il est différent de l'ancien. Cela donne ensuite :
  • "b1 = b xor a1". Comme "a1 = a xor b", ça fait qu'on a "b1 = b xor a xor b" donc "b1 = a" (pusique b xor b = 0)
  • "a2= a1 xor b1". Comme "a1 = a xor b" et "b1 = a", ça fait qu'on a "a2 = a xor b xor a" donc "a2 = b"

Mais comme on a utilisé les notations "a1", "a2" et "b1" pour montrer que les variables changaient de contenu mais que ce sont quand-même les mêmes variables, cela revient à dire qu'au final, on a "a" qui a pris le contenu de "b" et "b" qui a pris le contenu de "a".
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 10-01-2007 à 22:27:19    

Nichlas a écrit :

Si dans l'esprit c'est ça, mais il y a certains trucs que je ne peux pas utiliser, on est strictement limité par notre professeur. Bool, true, false... pas le droit.  
 
 :(  :pfff:


 
Change d'école et demande un remboursement. Ton prof est manifestement un con fini.

Reply

Marsh Posté le 10-01-2007 à 22:46:59    

Joel F a écrit :

Change d'école et demande un remboursement. Ton prof est manifestement un con fini.


Pas forcément. Il peut avoir envie de forcer les élèves à réfléchir par eux-même pour trouver un algo simple qui résoudra un problème simple sans passer par un truc tout fait ; ce qui les aidera ensuite à trouver des algo plus complexes pour résoudre des problèmes plus complexes (évidemment je dis ça pour le coup du "sort" qui est interdit car je ne vois vraiment pas en quoi le fait d'interdire "bool" ou "false/true" va plus affuter l'esprit des élèves)...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 11-01-2007 à 13:37:32    

Sve@r a écrit :

Absolument pas illisible ! Ca se démontre d'ailleurs très simplement
Posons

  • "a1 = a xor b" sous entendu "le résultat du calcul modifie "a" qu'on peut voir maintenant comme "a1" pour montrer qu'il est différent de l'ancien. Cela donne ensuite :
  • "b1 = b xor a1". Comme "a1 = a xor b", ça fait qu'on a "b1 = b xor a xor b" donc "b1 = a" (pusique b xor b = 0)
  • "a2= a1 xor b1". Comme "a1 = a xor b" et "b1 = a", ça fait qu'on a "a2 = a xor b xor a" donc "a2 = b"

Mais comme on a utilisé les notations "a1", "a2" et "b1" pour montrer que les variables changaient de contenu mais que ce sont quand-même les mêmes variables, cela revient à dire qu'au final, on a "a" qui a pris le contenu de "b" et "b" qui a pris le contenu de "a".


 
J'suis d'accord, mais c'est quand même moins intuitif :)
Sauf quand tu as l'habitude évidemment !

Reply

Marsh Posté le 11-01-2007 à 14:03:17    

did-54 a écrit :

J'suis d'accord, mais c'est quand même moins intuitif :)
Sauf quand tu as l'habitude évidemment !


sauf que ça sert à rien sauf si tu veux échanger deux registres sur une controlleur à 2 registres

Reply

Marsh Posté le 11-01-2007 à 14:58:40    

Nichlas a écrit :

Si dans l'esprit c'est ça, mais il y a certains trucs que je ne peux pas utiliser, on est strictement limité par notre professeur. Bool, true, false... pas le droit.  
 
 :(  :pfff:


 
L'implémentation en Pascal proposée sur la page Wikipedia n'utilise pas de variables booléennes. L'adaptation en n'importe quel langage que tu utilises ne devrait pas poser de problème. Par contre il faut tout de même vérifier que l'algo est OK, ça reste Wikipedia.
 
 

Reply

Marsh Posté le 11-01-2007 à 21:33:37    

Sve@r a écrit :


évidemment je dis ça pour le coup du "sort" qui est interdit car je ne vois vraiment pas en quoi le fait d'interdire "bool" ou "false/true" va plus affuter l'esprit des élèves)...


 
le sort ok, mais le bool interdit excuse moi :o

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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