IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

help fonction tri bubble sort


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut help fonction tri bubble sort
    j'ai réalisé cette petite fonction de tri à bulle qui malheureusement ne classe pas les nombres aussi bien qu'elle le devrait...quelqu'un pourrait-il m'aider à trouver le problème? je ne vois vraiment pas.
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    void tribulle  (int *pdeb, int *psec)
    {
    	int i,j,tmp=0;
    	j=10;
    	while (j>0)
    	{
    		i=0;
    		while &#40;i<9&#41;
    		&#123;
    			if &#40;*pdeb > *psec&#41;
    			&#123;
    				tmp=*pdeb;
    				*pdeb=*psec;
    				*psec=tmp;
    			&#125;
    			pdeb++;
    			psec++;
    			i++;
     
    		&#125;
    		j--;
    	&#125;
    &#125;
    le main (même si je pense que le problème se situe bien dans la fonction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void main&#40;&#41;
    &#123;
    	int v&#91;10&#93;,nb=10, *pdeb, *pfin, *psec;
    	pdeb=&v&#91;0&#93;;
    	lirevec&#40;nb, pdeb&#41;;
    	pdeb=&v&#91;0&#93;;
    	psec=&v&#91;1&#93;;	
    	tribulle &#40;pdeb, psec&#41;;
    	pdeb=&v&#91;0&#93;;
    	pfin=&v&#91;9&#93;;
    	affichvec &#40;pdeb, pfin&#41;;
    &#125;

  2. #2
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Salut,

    Tout d'abord le prototype de la fonction main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main&#40;&#41;
    &#123;
       /* ... *.
       return 0;
    &#125;
    Tu utilises dans ta fonction 2 pointeurs sur entier (bien initialisés), mais par contre une fois dans la fonction, tu fais :
    Regarde avec printf les valeurs pointées par ces deux pointeurs apres ces deux instructions et tu verras ce qui cloche tout seul
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  3. #3
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut et bienvenue sur les forums de Developpez

    Effectivement, il y a un problème avec tes pointeurs. Il faut les remettre à leur position d'origine après le premier balayage (les 9 passages de la boucle interne). Pour faire plus simple, utilises la notation tableau plutôt que pointeur.

    Nas'

  4. #4
    Invité
    Invité(e)
    Par défaut
    bien en fait je l'avais déjà fait avant et je vois bien que quelque chose cloche puisque à partir du deuxième passage dans la boucle extérieure, les valeurs pointées deviennent complètement mais j'arrive pas à comprendre ce qu'il se passe

  5. #5
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    bien en fait je l'avais déjà fait avant et je vois bien que quelque chose cloche puisque à partir du deuxième passage dans la boucle extérieure, les valeurs pointées deviennent complètement mais j'arrive pas à comprendre ce qu'il se passe
    T'as eu le temps de lire mon message?

    Nas'

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Nasky
    Salut et bienvenue sur les forums de Developpez

    Effectivement, il y a un problème avec tes pointeurs. Il faut les remettre à leur position d'origine après le premier balayage (les 9 passages de la boucle interne). Pour faire plus simple, utilises la notation tableau plutôt que pointeur.

    Nas'
    Je vais essayer ce que tu me dis là...En espérant que j'aie bien compris et que j'arrive à la l'appliquer.

    Je sais que c'est plus facile sans les pointeurs, je l'ai fais sans et ca marche sans problème, mais c'est justement pour me perfectionner avec les pointeurs que je cherche à le faire ainsi

    Merci.

  7. #7
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Si tu n'as pas compris, n'hésites pas à demander. Tu as raison de t'entraîner avec la notation pointeur. Mais fait attention aux changements que ça implique.
    Quand tu fais "++" sur un pointeur, il avance et "perd" sa place d'origine. Donc à la fin des 9 passages internes, ton pointeur est à la fin du tableau. Donc quand tu repasses dans la boucle, le départ pour lui est la fin du tableau. Donc un nouvel avancement dans la mémoire le fait pointer.... n'importe où (et sûrement pas sur le tableau malheureusement). D'où l'utilité de le remettre à sa place d'origine. Il faut donc utiliser un pointeur temporaire qui se déplace et qui peut repointer là où il pointait au début.

    Nas'

  8. #8
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Nasky
    Salut et bienvenue sur les forums de Developpez

    Effectivement, il y a un problème avec tes pointeurs. Il faut les remettre à leur position d'origine après le premier balayage (les 9 passages de la boucle interne). Pour faire plus simple, utilises la notation tableau plutôt que pointeur.

    Nas'
    Je vais essayer ce que tu me dis là...En espérant que j'aie bien compris et que j'arrive à la l'appliquer.

    Je sais que c'est plus facile sans les pointeurs, je l'ai fais sans et ca marche sans problème, mais c'est justement pour me perfectionner avec les pointeurs que je cherche à le faire ainsi

    Merci.
    Ne pas chercher à faire compliquer quand on peut faire simple.
    Si tu veux d'exercer avec les pointeurs fais autre chose (listes chainées...)
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  9. #9
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Citation Envoyé par sorry60
    Ne pas chercher à faire compliquer quand on peut faire simple.
    Si tu veux d'exercer avec les pointeurs fais autre chose (listes chainées...)
    Hum, pas tout de suite quand même. Se familiariser avec l'arithmétique des pointeurs est très important. :o

    Nas'

  10. #10
    Invité
    Invité(e)
    Par défaut
    voilà après rectification, je n'ai plus de valeurs hasardeuses excepté pour chaque dernier passage dans la boucle interne et pour le pointeur "*psec"
    malgré cela l'algorithme semble ok puisque le tri marche...
    merci beaucoup pour votre aide.

    pour info j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    void tribulle  &#40;int *pdeb, int *psec&#41;
    &#123;
    	int i,j,tmp=0, *pdebtmp, *psectmp;
    	pdebtmp=pdeb;
    	psectmp=psec;
    	j=10;
    	while &#40;j>0&#41;
    	&#123;
    		i=0;
    		while &#40;i<9&#41;
    		&#123;
    			if &#40;*pdeb > *psec&#41;
    			&#123;
    				tmp=*pdeb;
    				*pdeb=*psec;
    				*psec=tmp;
     
    			&#125;
    			pdeb++;
    			psec++;
    			i++;
     
     
    		&#125;
    		j--;
    		pdeb=pdebtmp;
    		psec=psectmp;
    	&#125;
    &#125;

  11. #11
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Le "psec" débute un rang après (cf ton main()) c'est pourquoi il ne peut pas aller aussi "loin" que "pdeb" normalement mais toi tu le fais . D'où les petits problèmes rencontrés.
    Si tu estimes que le résultat te satisfait, clique sur le bouton [Résolu] en bas à gauche stp.

    Nas'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. aide fonction tri heapsort (création du tas)
    Par Invité dans le forum C
    Réponses: 6
    Dernier message: 24/11/2009, 01h27
  2. fonction tri "sort"
    Par Nako_lito dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/06/2009, 12h43
  3. Rech Fonction tri : String contenant lettre+chiffres[VB6]
    Par t'djinn dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/07/2006, 20h08
  4. Menus : fonction "tri" non disponible sur un autre PC
    Par niavlys77 dans le forum Access
    Réponses: 1
    Dernier message: 02/05/2006, 20h39
  5. Pb de tri avec "sort"
    Par blueice dans le forum Langage
    Réponses: 2
    Dernier message: 20/10/2005, 13h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo