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

  FORUM HardWare.fr
  Programmation
  C

  problème de compréhension pour ce code

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème de compréhension pour ce code

n°1978549
lassault1
Posté le 29-03-2010 à 17:25:40  profilanswer
 

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
mood
Publicité
Posté le 29-03-2010 à 17:25:40  profilanswer
 

n°1978589
snafu8
Posté le 29-03-2010 à 18:14:27  profilanswer
 

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.

n°1978590
Trap D
Posté le 29-03-2010 à 18:14:48  profilanswer
 

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
n°1978593
Trap D
Posté le 29-03-2010 à 18:20:19  profilanswer
 

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

n°1978631
lassault1
Posté le 29-03-2010 à 20:06:12  profilanswer
 

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?

n°1978650
Un Program​meur
Posté le 29-03-2010 à 20:31:06  profilanswer
 

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)
n°1978682
lassault1
Posté le 29-03-2010 à 22:24:03  profilanswer
 

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

n°1980227
darkiller6​66
Posté le 01-04-2010 à 23:47:05  profilanswer
 

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
n°1980252
rufo
Pas me confondre avec Lycos!
Posté le 02-04-2010 à 09:49:05  profilanswer
 

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

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

  problème de compréhension pour ce code

 

Sujets relatifs
Auto-completion Code::Blocks pour la SDLProblème de rotation d'un clip en AS3
commande sed problème[fpdf] Probleme d'encodage
Menu CSS déroulant, problème IE8problème dans une boucle (masquer les lignes vides)
Problème avec preg_match et expressions régulières[resolu] Problème API Google maps / file_get_contents disabled
Problème de copie d'image avec curlProbleme récursivité XSLT
Plus de sujets relatifs à : problème de compréhension pour ce code


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