Tableau et tri à bulles [Fermé]

Messages postés
97
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
17 novembre 2012
- - Dernière réponse : fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
- 17 nov. 2012 à 21:11
Bonjour, j'ai cet exercice à rendre pour lundi seulement je suis completement paumé pouvez vous m'aidez? Merci !

La fonction suivante permet de mettre dans un tableau n nombres aléatoires.
void alea(int a[],int n)
{
int i;
srand(1);
for (i=0;i<n;i++) a[i]=rand()/100;
}
Écrire une fonction permettant d'afficher les n éléments du tableau.


Tri à bulles:

On effectue un certain nombre de parcours du tableau à classer, un parcours consiste à aller d'un bout à l'autre du tableau en effectuant la comparaison de deux éléments successifs et en les permutant s'ils ne sont pas classés. Cette comparaison remonte dans le tableau comme une bulle, en entraînant l'extremum.
A l'issue du premier parcours, l'élément 48 est à sa place.
On peut améliorer le tri par bulles en limitant les parcours à la partie non triée du tableau :
après un parcours, l'élément maximal est rangé, le deuxième parcours peut donc être limité à n-1 positions. Après deux parcours, les deux plus grands éléments sont classés, le troisième parcours peut être limité à n-2 positions etc...
Écrire la procédure tri_bulles(n,A) permettant de trier par la méthode bulles le tableau A.
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
78
1
Merci
En pseudo-code:
procédure tri_bulle(tableau T, entier n)
     répéter
         échange_effectué = faux
         pour j de 0 à n - 2
             si T[j] > T[j + 1], alors
                 échanger T[j] et T[j + 1]
                 échange_effectué = vrai
     tant que échange_effectué
fin procédure

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63593 internautes nous ont dit merci ce mois-ci

Messages postés
97
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
17 novembre 2012
18
1
Merci
Merci pour ton aide. Ca c'est la fonction que j'ai à créer pour faire le tri? J'ai esssayé de on coté avec des morceaux de cours mais ca donne pas grand chose... Regarde :
#include <stdio.h>
#include <stdlib.h>

int main()
{
int n=10, A[100];
alea (A,n);
affichage (A,n);
Tri (A,n);
affichage (A,n);
return (0);
}
void alea(int A[],int n)
{
int i;
srand(1);
for (i=0;i<n;i++) A[i]=rand()/100;
}
void Tri (int A[],int n )
{
int j;
int i;
for( j=0,j<n-1,j++)
for(i=0,i<n-j-1,i++)
if(A[i]>A[i+1])echange (&A(i),&A(i+1));
}
void echange (int*x,int*y)
{
int k,h;
h=*x;
*x=*y;
*y=k;
}
void affichage(int n,float A[100])
{
int i;
for (i=0;i< n;i++) printf("A[%d] = %f\n",i,A[i]);
}

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63593 internautes nous ont dit merci ce mois-ci

fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1602 -
Le C ce n'est pas juste de l'assemblage de code...
Tu utilises void affichage(int, float) alors que ton tableau est en int... Il faut au moins une certaine cohérence.
Pour la fonction Tri, Heliotte t'a donné le pseudo-code, encore faut-il respecter l'algorithme. Ce que vous avez écrit n'est pas du tri à bulle.
Ta fonction echange() est fausse. Tu fais *y=k. Alors que k vaut n'a pas été initialisé... Cette ligne est à revoir.

Et enfin, il ne faut pas oublier de déclarer tes variables avant de les appeler. Sinon ton compilateur va raler.
Messages postés
1273
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
77
0
Merci
1) Pas besoin de pointeur à ton niveau.
2) Tu te permet de sauter les acolades des bloques conditionnels et des boucles, chose fortement deconseillé même pour les programmeurs expérimentés.
3) Ta fonction alea n'est absolument pas aléatoire, cherche sur le net des exemples.
Messages postés
97
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
17 novembre 2012
18
0
Merci
Merci pour vos aides et désolé si je vous choque par mon travail ^^ Je trouve que le prof commence bien trop fort pour des étudiants qui ont jamais vu ça...
Messages postés
1273
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
77
0
Merci
C'est des trucs de base à vrai dire ^^
Messages postés
97
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
17 novembre 2012
18
0
Merci
Ah lol Quelqu'un aurait il la gentillesse de me proposer un programme complet? Je ne parvient pas à corriger les erreurs :/
armasousou
Messages postés
1273
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
77 -
C'est simple.

Tu regarde tous les nombres dans ton tableau, tu cherche le plus petit, tu le met à la place 0. Tu reregarde tous les nombres dans ton tableau, tu cherche le plus petit sans compté le 0 et tu le met à la place 1. Autant de fois qu'il y a besoin.
Lewisdu76
Messages postés
97
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
17 novembre 2012
18 -
Oui j'ai compris le principe mais c'est à retranscrire en language C que je n'arrive pas enfin bon je vais continuer d'essayer et au pire je rendrais un programme qui ne fonctionne pas ..
armasousou
Messages postés
1273
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
77 -
if( t[i] < t[i-1] )
{
tmp=t[i];
t[i] = t[i-1];
t[i-1]=rmp;
}
Lewisdu76
Messages postés
97
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
17 novembre 2012
18 -
Merci beaucoup
Heliotte
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
78 -
armasousou,
je pense ..
if( t[i] > t[i+1] )
{
tmp=t[i];
t[i] = t[i-1];
t[i-1]=tmp;
}
A confirmer, bien sûr
Messages postés
97
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
17 novembre 2012
18
0
Merci
Alors voilà ce que j'ai, le programme marche seulement la fonction aléatoire non comment faire pour généner des chiffres aléatoire et non fixés?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int A[100];
    int n=10;
    alea(A,n);
    affichage(A,n);
    Tri(A,n);
    affichage(A,n);
    return(0);
}
void alea(int A[],int n)
{
    int i;
    srand(1);
    for (i=0;i<n;i++)  A[i]=rand()/100;
}

void affichage(int A[], int N)
{
    int i;
    for (i=0 ; i<N ; i++)
    printf("%d\n",A[i]);
    printf("\n\n");
}
void Tri(int A[],int n)
{
    int i,j;
    for (j=0;j<n;j++)
    for (i=0 ; i<n-j-1 ; i++) if (A[i] >= A[i+1]) echange(&A[i],&A[i+1]);
}
void echange(int*x,int*y)
{
    int k;
    k=*x;
    *x=*y;
    *y=k;
}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1602 -
Normal, tu as mis srand(1); il faudrait mettre srand(time(NULL)); et inclure l'entête time.h.

Sinon, ton programme fonctionne, sauf que tu respectes pas la consigne...
Il faut implémenter le tri à bulle.
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
78
0
Merci
Le tri à bulles devrait ressembler à :
void Tri(int A[],int n)
{
    int i,j,iTemp;
    bool EchangeEffectue;
    EchangeEffectue=true;
    while(EchangeEffectue)
    {
        EchangeEffectue=false;
        for (i=0 ; i<n-j-1 ; i++)
        {
            if (A[i] >= A[i+1])
            {
                iTemp=A[i];
                A[i]=A[i+1];
                A[i+1]=iTemp;
                EchangeEffectue=true;
            }
        }
    }
}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1602 -
T'as le chic pour faire les exos des autres ^^.
Mais, il y a des erreurs.
Espérons qu'il les voit :-)
Heliotte
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
78 -
Espérant ne pas avoir contrecarré tes projets ..
Pour un simple tri à bulles, il est dessus depuis hier soir, je pense qu'il a bien bossé .. un coup de pouce, c'est tout
Sans rancune j'espère
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1602 -
Heliotte,
Perso, j'en ai rien à secouer que tu fasses ses devoirs.
Ce que je dis juste, c'est que je te propose plutôt de l'aider en donnant des indices, en le corrigeant que de donner la réponse. Surtout que ton code est faux...
Je t'invite à lire la charte CCM pour comprendre sa philosophie ;-)