problème de compréhension pour ce code

problème de compréhension pour ce code - C - Programmation

Marsh Posté le 29-03-2010 à 17:25:40    

Bonjour a tous  :)  
 
J'ai un petit problème de compréhension pour ce code :
 
Le -1 de la boucle for (i = 0; i < tailleTableau-1; i++)  sert a ne sortir du tableau car cette boucle parcourt le tableau donc le -1 est indispensable... j'ai compris c'est ok!
 
Mais le -1 de la boucle for (j = 0; j < tailleTableau-1; j++) ne sert a rien car cette boucle ne parcourt pas le tableau met permet de répéter la 1ere boucle.. Alors pourquoi mettre le -1 dans cette boucle?  
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     long tableau[10] = {2, 4, 3, 1, 15, 6, 9, 16, 19, 12};
  4.     long i = 0;
  5.    
  6.     ordonnerTableau(tableau, 10);
  7.     for(i = 0; i < 10; i++)
  8.     {
  9.         printf("%ld\n", tableau[i]);
  10.     }
  11.     return 0;
  12. }
  13. void ordonnerTableau(long tableau[], long tailleTableau)
  14. {
  15.     long i = 0, j = 0, a = 0;
  16.     for(j = 0; j < tailleTableau-1; j++)
  17.     {
  18.         for(i = 0; i < tailleTableau-1; i++)
  19.         {
  20.             if(tableau[i] > tableau[i+1])
  21.             {
  22.                 a = tableau[i+1];
  23.                 tableau[i+1] = tableau[i];
  24.                 tableau[i] = a;
  25.             }
  26.         }
  27.     }
  28. }



Message édité par lassault1 le 29-03-2010 à 17:29:20
Reply

Marsh Posté le 29-03-2010 à 17:25:40   

Reply

Marsh Posté le 29-03-2010 à 18:14:27    

Je comprends pas ta question. En C, les indices de tableau partent de 0, donc si ton tableau a 10 cases (cf. déclaration), pour le parcourir, tu dois décrire les indices 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9. C'est à dire de 0 à (taille du tableau - 1).
 
Le gros problème du code que t'as collé, c'est que tu fais une première boucle for(j), mais que t'utilises jamais le j en question.

Reply

Marsh Posté le 29-03-2010 à 18:14:48    

Pour gagner une itération. De toute façon ce tri n'est pas optimisé, alors une boucle de plus ou de moins ...
 


Message édité par Trap D le 29-03-2010 à 18:17:53
Reply

Marsh Posté le 29-03-2010 à 18:20:19    

snafu8 >> C'est le tri bulle, version de base sans aucune optimisation, donc la première boucle est obligatoire.

Reply

Marsh Posté le 29-03-2010 à 20:06:12    

Trap D a écrit :

snafu8 >> C'est le tri bulle, version de base sans aucune optimisation, donc la première boucle est obligatoire.


 
Merci Trap..
 
Alors le -1 de la boucle for (j = 0; j < tailleTableau-1; j++) ne sert a rien car cette boucle ne parcourt pas le tableau met permet de répéter la 1ere boucle.. Alors pourquoi mettre le -1 dans cette boucle?

Reply

Marsh Posté le 29-03-2010 à 20:31:06    

Pour répéter la boucle tailleTableau-1 fois parce que ce n'est pas nécessaire de la répéter plus (la boucle intérieure place au moins un élément à sa place et dans un contexte tel qu'il ne sera plus déplacé)


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 29-03-2010 à 22:24:03    

Donc le fait de mettre -1 dans la 1ere boucle (j = 0; j < tailleTableau-1; j++) cela va permettre de faire une boucle en moins?
 
Par contre mettre -1 dans la 2eme boucle (i = 0; i < tailleTableau-1; i++) est indispensable pour ne pas sortit du tableau.
 
J'ai essayé de (j = 0; j < 1000; j++) et cela fonctionne parfaitement..  
 
Je comprend plus rien..

Reply

Marsh Posté le 01-04-2010 à 23:47:05    

lassault1 a écrit :

Donc le fait de mettre -1 dans la 1ere boucle (j = 0; j < tailleTableau-1; j++) cela va permettre de faire une boucle en moins?
 
Par contre mettre -1 dans la 2eme boucle (i = 0; i < tailleTableau-1; i++) est indispensable pour ne pas sortit du tableau.
 
J'ai essayé de (j = 0; j < 1000; j++) et cela fonctionne parfaitement..  
 
Je comprend plus rien..


 
dans ton exemple tu donnes un tableau d'entiers avec 10 elements, et si tu regardes dans la seconde boucle tu compares

Code :
  1. if(tableau > tableau[i+1])


donc si, i arrive a 9 , tu vas comparer tableau[i]<==>tableau[i+1] donc [i]tableau[9]<==>tableau[10] et tu risque d'avoir un joli SEGFAULT ^^ ou bien valgrind va te gueuler dessus car la dernière case de ton tableau est tableau[9].
dans un algo pareil, un tour de boucle en plus ou en moins ne se verra pas du tout, c'est juste pour eviter que tu ailles trop loin dans ta memoire.
Lance valgrind et il me semble qu'il va te dire "invalid read [...]".
 
Je peux te proposer autre chose:

Code :
  1. i = 0;
  2. while (i < (tailleTableau-1)) // comme ca on ne comparera que tableau[8] et tableau[9] si le reste est en ordre
  3. {
  4.   if(tableau[i] > tableau[i+1])
  5.     {
  6.        a = tableau[i+1];
  7.        tableau[i+1] = tableau[i];
  8.        tableau[i] = a;
  9.        i = 0; // on recalcule tout le tableau car on a modifie des elements
  10.      }
  11.    else
  12.        i++;
  13. }


 
Dite moi si vous voyez une faute dans mon algo.


Message édité par darkiller666 le 01-04-2010 à 23:48:33
Reply

Marsh Posté le 02-04-2010 à 09:49:05    

Lassault1, t'es un peu gonflé d'ouvrir un 2ième topic pour le même code qu'on t'as déjà expliqué dans l'autre en long, en large et en travers, surtout pour un algo aussi simple :/
http://forum.hardware.fr/hfr/Progr [...] 8344_1.htm


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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