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 :

tri à bulles


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Par défaut tri à bulles
    slt
    j'essaye de faire un prog de tri a bulle .mais je suis bloqué ,j'arrive pas a trouvé les erreurs dans ce code:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
     
    void remplir(int*,int);
    void afficher(int*,int);
    void bull(int*,int);
     
     main()
    {
         int *p,n;
         p=(int*)malloc(100*sizeof(int));
         printf("entrer la taille du tableau :\n");
         scanf("%d",&n);
         remplir(p,n);
         bull(p,n);
         afficher(p,n);
     
              getch();
     
    }
     
    void remplir(int*p,int n)
    {
         int i;
         for(i=0;i<n;i++)
         {printf("entrer l`element numero %d : ",i);
         scanf("%d",p+i);}
    }
     
    void bull(int*p,int n)
    {
         int i,x;
         for(i=0;i<n;i++)
     
         if(*(p+i)>*(p+i-1))
         {x=*(p+i);
         *(p+i)=*(p+i-1);
         *(p+i-1)=x;
    }
     
    void afficher(int*p,int n)
    {
         int i;
         for(i=0;i<n;i++)
         printf("t[%d]=%d\n",i,*(p+i));
    }

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    Bonsoir,

    deja en survolant je vois different probleme dans ton code :

    1erement je t'invite a relire un cours/tutorial sur le bubblesort, en effet ton algo de base est faux (sans offense). Pour un bubblesort il faut au minimum 2 boucles imbrique (d'ou le probleme avec la lenteur de cette algorithme)
    va voir sur wikipedia c'est tres bien expliquer (tape tri a bulle).

    2ement autre gros soucis directe qui devait te faire seg fault ou pire ne rien dire mais faire n'importe quoi les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0;i<n;i++)
     
    if(*(p+i)>*(p+i-1))
    en effet tu initialises ton i a 0 et tu regarde en i -1 sur ton code ce n'est pas trop lisible mais si on utilise une notation (a mon sens plus logique pour utiliser les tableaux plutot que l'arithmetique des pointeurs ), ca se voit directe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0;i<n;i++)
     
    if(p[i] > p[i -1])
    soit au 1er tour : p[0] > p[-1] ? boum seg fault


    donc va jeter un coup d'oeil sur wikipedia (en essayant de comprendre pas de recopier c'est mal !) et utilise les tableaux dans ce cas la plutot que l'arithmetique enfin c'est mon avis, c'est bcp plus lisible

    Amicalement,

    Oniric

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    La réponse de Oniric est déjà superbe. Il reste juste quelques petits détails à ajouter
    1) main() est de type "int"

    2) si tu connais déjà la taille de ton tableau (qui est apparemment de 100) alors pas besoin de malloc. Ca alourdit le code pour rien => autant déclarer directement un tableau de 100 éléments.
    En revanche, si tu tiens à ton malloc() alors déjà t'as pas (plus) besoin de le caster car malloc() renvoie un pointeur universel (void*) qui peut être récupéré par tout pointeur (donc un "int *" sans soucis). En revanche, mettre un cast pourrait te masquer certains messages utiles. Et n'oublie pas le free() quand tu n'as plus besoin de ton tableau (ici ça ne sert pas car le programme s'arrête mais si tu prends pas l'habitude d'y penser systématiquement, tu risques un jour de l'oublier dans une boucle d'allocation et t'auras alors une fuite de mémoire)

    3) tu sembles avoir bien compris la relation entre p[i] et *(p + i) mais tu n'as pas su en tirer profit car dans tous tes balayages de boucle, tu utilises à chaque fois *(p + i) => l'opération "p + i" est répétée à chaque itération donc ça ne va pas plus vite que d'écrire directement "p[i]" (le compilo transforme automatiquement "p[i]" en "*(p + i)").
    Si tu veux optimiser "un peu" tes itérations dans tes petites fonctions diverses, ben rien ne t'interdit d'incrémenter directement "p" (puisque tu ne t'en sers qu'une fois).
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void afficher(int*p,int n)
    {
    int i;
    for(i=0; i<n; i++, p++)
        printf("t[%d]=%d\n",i,*p);
    }
    Et si jamais tu veux te servir plusieurs fois de "p", ben tu passes alors par un pointeur intermédiaire
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void afficher(int*p,int n)
    {
    int i;
    int *tmp;
    for(i=0, tmp=p; i<n; i++, tmp++)
        printf("t[%d]=%d\n",i,*tmp);
    }
    Bon, ceci ne résoud pas ton pb de tri mais Oniric l'a déjà bien ciblé...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Par défaut
    ca veut dire koi ce message d'erreur que m'affiche le compilateur:

    "57 C:\Documents and Settings\Administrateur\Mes documents\tri compare devoir.cpp a function-definition is not allowed here before '{' token "

    je suis perdu !!

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Par défaut
    Citation Envoyé par space-cowboy Voir le message
    ca veut dire koi ce message d'erreur que m'affiche le compilateur:

    "57 C:\Documents and Settings\Administrateur\Mes documents\tri compare devoir.cpp a function-definition is not allowed here before '{' token "

    je suis perdu !!
    en fait, cette erreur est dans la fonction "afficher"!!

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Par défaut
    j'ai fais quelk modification (remplacer les pointeur par un simple tableau..) mais hélas toujours ya kelk choses qui ne va pas bien . ???

    en fait voici le code:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include<stdio.h>
    #include<conio.h>
     
     
     
     
    void remplir(int[],int);
    void affich(int[],int);
    void bull(int[],int);
     
     
     main()
    {
         int t[100],n;
     
         printf("entrer la taille du tableau :\n");
         scanf("%d",&n);
         remplir(t,n);
         bull(t,n);
         affich(t,n);
     
     
         getch();
     
    }
     
    void remplir(int t[],int n)
    {
         int i;
         for(i=0;i<n;i++)
         {printf("entrer l`element numero %d : ",i);
         scanf("%d",&t[i]);
    }
     
    void bull(int t[],int n)
    {
         int i,j,x;
         for(j=0;i<n;j++)
         {
            for(i=1;i<n-j;i++)
            if(t[i]>t[i+1])
            {
            x=t[i];
            t[i]=t[i+1];
            t[i+1]=x;
            }
         }
    }
     
     
     
     
    void affich(int t[],int n)
    {    int i;
         for(i=0;i<n;i++)
         printf("t[%d]=%d\n",i,t[i]);
    }

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par space-cowboy Voir le message
    j'ai fais quelk modification (remplacer les pointeur par un simple tableau..) mais hélas toujours ya kelk choses qui ne va pas bien . ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void bull(int t[],int n)
    {
         int i,j,x;
         for(j=0;j<n;j++)
         {
            for(i=1;i<n-j;i++)
            if(t[i]>t[i+1])
            {
            x=t[i];
            t[i]=t[i+1];
            t[i+1]=x;
            }
         }
    }
    Même problème qu'au début => En dehors que tu fais évoluer "j" pendant que tu regardes "i", ta boucle interne part de "1" pour arriver à "n" et tu vas aller t'amuser avec t[i + 1] => l'élément "0" n'est jamais traité et à un moment t'es hors tableau !!!!
    Soit tu pars de 0 jusqu'à "n - 1" et tu joues avec t[i] et t[i + 1]; soit tu pars de 1 jusqu'à n et tu joues avec t[i - 1] et t[i]...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Par défaut
    merci sv@r pour ton aide.mais il y a toujours un probleme que j'arrive pas a résoudre.
    le compilateur affiche toujours ce message que je ne comprend plus.:

    a function-definition is not allowed here before '{' token

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par space-cowboy Voir le message
    merci sv@r pour ton aide.mais ya tjrs un probleme q j'arrive pas a rsoudre. le compilateur affiche tjrs ce message que je n comprend plus.:

    a function-definition is not allowed here before '{' token

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void remplir(int t[],int n)
    {
         int i;
         for(i=0;i<n;i++)
         {printf("entrer l`element numero %d : ",i);
         scanf("%d",&t[i]);   // Pourquoi pas scanf("%d",t + i); ???
    }
    No comment !
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Par défaut
    Oui c'est ça il faut fermer pour boucler.
    merci bien

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Il reste le problème du décalage dans tes indices. Fais un test en rentrant la plus grande valeur en tout premier, suis à peu près certain (j'ai pas compilé) que cette valeur ne partira jamais en fin de tableau comme elle se devrait (puisque tu traites jamais l'élément "[0]"). Et si tu affiches tes éléments dans ta boucle interne, à un moment donné tu afficheras un truc que t'as jamais saisi dans ton tableau (l'élément "[i + 1]" quand "i" vaut "n - 1")...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Tri bulle, insertion, rapide
    Par jcaspar dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2007, 12h58
  2. tri bulle (setValueAt )
    Par ghotique dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 28/06/2007, 19h42
  3. quelle instruction pour un tri à bulles?
    Par bandit_debutant dans le forum Langage
    Réponses: 2
    Dernier message: 30/11/2006, 07h16
  4. besoin d aide et de vrification algo tri bulle
    Par dju.ly dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 30/12/2005, 13h04
  5. Tri à bulle - Affichage de sprite
    Par Gory dans le forum Assembleur
    Réponses: 5
    Dernier message: 10/03/2005, 15h27

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