Inverser un tableau sans une variable intermédiaire

maha1987 Messages postés 101 Date d'inscription samedi 4 juin 2011 Statut Membre Dernière intervention 29 avril 2013 - 12 avril 2012 à 16:44
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 13 avril 2012 à 18:38
Bonjour à tous ,
je veux savoir comment peut on inverser un tableau sans une variable intermédiaire.
merci

9 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
12 avril 2012 à 17:03
Bonjour.

Si c'est un exercice qui t'es donné, c'est tout de même mieux si tu réfléchis par toi même, non ?
Pour inverser un tableau sans variable intérmédiaire, le type de donné qu'il y a dans ton tableau est une information importante !
Ce n'est pas faisable pour tous les types de données.

Si ce sont des entiers (des valeurs numériques), je te donne un indice: Comment ferais-tu pour inverser deux entiers a et b, sans utiliser de variables intermédiaires ?

Essaies de me faire le raisonnement pour a 5 et b 7. Il y a plusieurs manière de le faire. Essaie déjà de réfléchir à ceci. Une fois que tu auras posté ta reflexion sur le sujet, je t'aiderais pour la suite.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
maha1987 Messages postés 101 Date d'inscription samedi 4 juin 2011 Statut Membre Dernière intervention 29 avril 2013
13 avril 2012 à 05:00
Bonjour,
Inversion de 2 variables x et y sans variable intermediare:
x=x+y
y=x-y
x=x-y

je veux juste savoir comment faire les parcours du tableau c ça mon pb
merci
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 avril 2012 à 11:24
Maintenant que tu as ceci, tu peux parcourir ton tableau et inverser tes éléments.

Pour "inverser" un tableau, il te suffit d'échanger la 1ère case avec la dernière. Puis la deuxième case, avec l'avant dernière, etc...
Tu t'arrêtes quand tu arrives au milieu du tableau. Il te suffit donc d'une seul boucle. Avec ce que je viens de t'expliquer, tu peux normalement en déduire: la borne d'arrivé, la borne de fin, et comment savoir quel case échanger.

PS: À noter que pour échanger deux variables, tu pouvais aussi faire:
x ^= y
y ^= x
x ^= y

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 avril 2012 à 14:39
A noter que hors exercice scolaire, l'emploi d'une variable intermédiaire est à privilégier.
tmp = A
A = B
B = tmp
Le compilo traduira cela en 3 MOV, incomparablr.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 avril 2012 à 15:27
Salut,
Il est à noter aussi qu'en C/C++, puisque les variables sont typées, il est préférable d'utiliser une variable intermédiaire pour éviter le risque de dépassement. Si nos deux variables sont des entiers 32 bits par exemple, il est possible que leur somme dépasse la capacité d'un entier. Ce qui est valable pour l'addition l'est pour les autres opérations.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 avril 2012 à 15:40
@BruNews: C'est tellement évident, que j'ai oublié de le dire :) La précision était importante.

@racpp: Ça ne change rien pour le cas particuliers de l'inversion de variable, présenté ici. Si tu dépasses la plage, ça fait "un tour" et au final, ça fonctionne quand même.

Ex:
#include 

int main()
{
  char x = 125;
  char y = 50;

  std::cout << (int)x << " " << (int)y << std::endl;
  x=x+y;
  y=x-y;
  x=x-y;
  // x ^= y;
  // y ^= x;
  // x ^= y;
  std::cout << (int)x << " " << (int)y << std::endl;

  return 0;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 avril 2012 à 16:32
@CptPingu: pour les variables non signées ça ne passera pas:
unsigned char x=200;
unsigned char y=200;
La valeur maximale pour ce type étant de 255 donc 400 dépasse largement.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 avril 2012 à 16:37
@racpp: Signé ou non, ça ne change rien et ça fonctionnera, puisque ça fait un "tour".

Ex pour le démontrer:
nclude 

int main()
{
  unsigned char x = 201;
  unsigned char y = 203;

  std::cout << (unsigned int)x << " " << (unsigned int)y << std::endl;
  x=x+y;
  y=x-y;
  x=x-y;
  // x ^= y;
  // y ^= x;
  // x ^= y;
  std::cout << (unsigned int)x << " " << (unsigned int)y << std::endl;

  return 0;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 avril 2012 à 18:38
@CptPingu: Ah ok tu as raison. Je fais toujours très attention aux risques de dépassement de tous genres. C'est vrai qu'ici puisque la somme ne sera utilisée que pour l'échange des variables, le dépassement ne pose pas de problème. Etant un inconditionnel de l'utilisation de variable intermédiaire, je n'y avais jamais pensé.
Merci pour la précision.
0
Rejoignez-nous