Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1955 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Tableau : inverser deux valeurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tableau : inverser deux valeurs

n°1501267
Nichlas
Posté le 10-01-2007 à 14:51:28  profilanswer
 

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:

mood
Publicité
Posté le 10-01-2007 à 14:51:28  profilanswer
 

n°1501276
IrmatDen
Posté le 10-01-2007 à 14:59:06  profilanswer
 

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
n°1501278
Nichlas
Posté le 10-01-2007 à 14:59:33  profilanswer
 

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

n°1501280
IrmatDen
Posté le 10-01-2007 à 15:01:02  profilanswer
 

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.

n°1501282
Nichlas
Posté le 10-01-2007 à 15:02:41  profilanswer
 

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...

n°1501286
Nichlas
Posté le 10-01-2007 à 15:07:16  profilanswer
 

IrmatDen a écrit :

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


Exact, très juste.

n°1501288
Taz
bisounours-codeur
Posté le 10-01-2007 à 15:09:29  profilanswer
 

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

n°1501289
IrmatDen
Posté le 10-01-2007 à 15:09:36  profilanswer
 

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

n°1501291
Nichlas
Posté le 10-01-2007 à 15:10:34  profilanswer
 

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

n°1501292
boulgakov
Posté le 10-01-2007 à 15:12:34  profilanswer
 

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

mood
Publicité
Posté le 10-01-2007 à 15:12:34  profilanswer
 

n°1501294
Nichlas
Posté le 10-01-2007 à 15:16:00  profilanswer
 

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:

n°1501298
Nichlas
Posté le 10-01-2007 à 15:18:47  profilanswer
 

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  :)

n°1501433
Ace17
Posté le 10-01-2007 à 17:45:50  profilanswer
 

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 ?

n°1501435
Ace17
Posté le 10-01-2007 à 17:47:23  profilanswer
 

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 <.

n°1501487
did-54
Posté le 10-01-2007 à 19:40:42  profilanswer
 

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
n°1501547
Sve@r
Posté le 10-01-2007 à 22:24:22  profilanswer
 

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.
n°1501549
Joel F
Real men use unique_ptr
Posté le 10-01-2007 à 22:27:19  profilanswer
 

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.

n°1501553
Sve@r
Posté le 10-01-2007 à 22:46:59  profilanswer
 

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.
n°1501699
did-54
Posté le 11-01-2007 à 13:37:32  profilanswer
 

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 !

n°1501707
Taz
bisounours-codeur
Posté le 11-01-2007 à 14:03:17  profilanswer
 

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

n°1501738
boulgakov
Posté le 11-01-2007 à 14:58:40  profilanswer
 

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.
 
 

n°1501900
Joel F
Real men use unique_ptr
Posté le 11-01-2007 à 21:33:37  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Tableau : inverser deux valeurs

 

Sujets relatifs
Détecter et supprimer valeur d'un tableau[CSS] Center Un Tableau
Constructeur par recopie pour Tableau[C++] Lecture d'un .txt & enregistrement dans un tableau (devc++)?
Probleme basic pour lister un tableau !Tableau dynamique sous ASP.net (C# et SQL Server)
[HTML / JS] Tableau triable[RESOLU]Trier un tableau a deux dimensions
Conseil : map ou tableau ? 
Plus de sujets relatifs à : Tableau : inverser deux valeurs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR