Tableau et tri à bulles

Fermé
Lewisdu76 Messages postés 97 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 17 novembre 2012 - 17 nov. 2012 à 03:10
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 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.
A voir également:

8 réponses

Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
17 nov. 2012 à 09:50
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
1
Lewisdu76 Messages postés 97 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 17 novembre 2012 18
17 nov. 2012 à 12:00
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]);
}
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
17 nov. 2012 à 12:17
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.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 17/11/2012 à 18:04
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;
            }
        }
    }
}
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
17 nov. 2012 à 18:10
T'as le chic pour faire les exos des autres ^^.
Mais, il y a des erreurs.
Espérons qu'il les voit :-)
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 17/11/2012 à 19:07
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
17 nov. 2012 à 21:11
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 ;-)
0
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
Modifié par armasousou le 17/11/2012 à 12:22
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lewisdu76 Messages postés 97 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 17 novembre 2012 18
17 nov. 2012 à 12:32
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...
0
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
17 nov. 2012 à 12:39
C'est des trucs de base à vrai dire ^^
0
Lewisdu76 Messages postés 97 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 17 novembre 2012 18
17 nov. 2012 à 12:53
Ah lol Quelqu'un aurait il la gentillesse de me proposer un programme complet? Je ne parvient pas à corriger les erreurs :/
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
17 nov. 2012 à 12:58
T'arrives pas à traduire le code d'Héliotte en C ??
Un tuto sympa pour débuter : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c
0
Lewisdu76 Messages postés 97 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 17 novembre 2012 18
17 nov. 2012 à 13:01
J'ai déjà lu le premier chapitre du tuto et c'est vrai qu'il est super ! Mais je bloque quand même :/
0
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
17 nov. 2012 à 13:09
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.
0
Lewisdu76 Messages postés 97 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 17 novembre 2012 18
17 nov. 2012 à 13:13
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 ..
0
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
17 nov. 2012 à 13:24
if( t[i] < t[i-1] )
{
tmp=t[i];
t[i] = t[i-1];
t[i-1]=rmp;
}
0
Lewisdu76 Messages postés 97 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 17 novembre 2012 18
17 nov. 2012 à 14:05
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;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
17 nov. 2012 à 14:43
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.
0