Tri a bulle en c

Résolu/Fermé
achour - Modifié le 15 déc. 2022 à 16:42
mamiemando Messages postés 33311 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 octobre 2024 - 16 déc. 2022 à 10:15

J'ai écrit ce programme en c et il ne marche pas et je trouve pas l'erreur .

#include <stdio.h>
#include <stdlib.h>
  void permuter (int *t,int *k){
     int s;
     s=*t;
     *t=*k;
     *k=s;

 }
 void triabulle(int t[],int *n){
     int i=0;
     while (*n>0){
            i=0;
         while(i<=*n){
         if(t[i]>t[i+1]){
             permuter (&t[i],&t[i+1]);
         }
         i++;}n--;
     }

 }

int main() {
  printf( "entrer la taille du tableau \n" );
  int n;
  scanf("%d",&n);
  int t[n];
  int i;
  for(i=0;i<n;i++){
      printf("entrer la case num % d   \n",i+1);
      scanf("%d",&t[i]);
  }
 int k=n;int s=n-1;
triabulle(&t,&s);
printf("le tableau trie = \n ");
int e;
  for(e=0;e<k;e++){
      printf("%d\n",t[e]);
  }
    return 0;
}

Merci d'avance

Modération : merci de partager les extraits de code comme expliqué ici

A voir également:

3 réponses

mamiemando Messages postés 33311 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 octobre 2024 7 794
Modifié le 16 déc. 2022 à 09:48

Bonjour,

Merci de partager les extraits de code comme expliqué ici et de soigner l'indentation. Le programme devient :

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

void permuter(int *t, int *k) {
    int s;
    s = *t;
    *t = *k;
    *k = s;
}

void triabulle(int t[], int *n) {
    int i = 0;
    while (*n > 0){
        i = 0;
        while (i <= *n) {
            if (t[i] > t[i + 1]) {
                permuter(&t[i], &t[i + 1]);
            }
            i++;
        }
        n--;
    }
}

int main() {
    printf("entrer la taille du tableau\n");
    int n;
    scanf("%d", &n);
    int t[n];
    int i;
    for (i = 0; i < n; i++) {
        printf("entrer la case num % d   \n", i + 1);
        scanf("%d", &t[i]);
    }
    int k = n;
    int s = n - 1;
    triabulle(&t, &s);
    printf("le tableau trie = \n");
    int e;
    for (e = 0; e < k; e++) {
        printf("%d\n", t[e]);
    }
    return 0;
}

Parmi les problèmes que je vois :

  • le tableau t n'est pas alloué
  • certaines variables sont redondantes ou inutiles
  • il y a des confusions sur les passages par pointeur

Voici un programme plus correct (mais pas encore correct) :

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

void permuter(int *t,int *k) {
    int s;
    s = *t;
    *t = *k;
    *k = s;
}

void triabulle(int * t, int n){
    int i = 0;
    while (n > 0){
        i = 0;
        while (i <= n){
            if (t[i] > t[i + 1]){
                permuter(&t[i], &t[i + 1]);
            }
            i++;
        }
        n--;
    }
}

int main() {
    printf("entrer la taille du tableau\n");
    int n;
    scanf("%ld", &n);
    int * t = malloc(sizeof(int) * n);
    int i;
    for (i = 0; i < n; i++){
        printf("entrer la case num % d\n", i + 1);
        scanf("%ld", &t[i]);
    }
    triabulle(t, n);
    printf("le tableau trie = \n");
    for (i = 0; i < n; i++){
        printf("%d\n", t[i]);
    }
    free(t);
    return 0;
}

Je te recommande de faire une fonction qui affiche le tableau et que tu pourras appeler à différents endroits de l'algorithme pour voir ce qui cloche...

Bonne chance

0

Merci pour votre aide .

J'ai trouvé les fautes que j'ai faites

La première c'est que fait un passage par adresse pour la taille, alors j ai pas le droit de faire *n--.

Et la deuxième c'est sur condition d'arrêt, au lieu de :

while(i <= *n) {
    if (t[i] > t[i + 1]) {
        permuter(&t[i], &t[i + 1]);
    }

il faut plutôt écrire :

while (i < *n - 1) {
    if (t[i] > t[i+1]) {
        permuter (&t[i], &t[i+1]);
    }
    i++;
}
1
mamiemando Messages postés 33311 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 octobre 2024 7 794 > mamiemando
16 déc. 2022 à 10:15

Bravo à toi ! Merci d'éviter d'utiliser mon pseudo pour répondre, c'est confusant :-D

Voici le programme final qui tient compte de tes modifications, plus quelques autres améliorations :

  • On utilise plutôt le type size_t (entier positif) pour représenter des tailles. Attention aux valeurs négatives !
  • Ajout d'une fonction d'affichage
  • Amélioration des printf
  • Renommage triabulle en tri_a_bulle
  • Remplacement des while par des for, plus appropriés
#include <stdio.h>
#include <stdlib.h>

void permuter(int *t,int *k) {
    int s;
    s = *t;
    *t = *k;
    *k = s;
}

void tri_a_bulle(int * t, size_t n) {
    for (size_t j = n ; j > 0; j--) {
        for (size_t i = 0; i < j - 1; i++) {
            if (t[i] > t[i + 1]) {
                permuter(&t[i], &t[i + 1]);
            }
        }
    }
}

void afficher_tableau(int * t, size_t n) {
    for (size_t i = 0; i < n; i++){
        printf("%d\n", t[i]);
    }
}

int main() {
    size_t n;
    printf("Entrer la taille du tableau\n");
    scanf("%ld", &n);

    int * t = malloc(sizeof(int) * n);
    for (size_t i = 0; i < n; i++){
        printf("tab[%d] ? ", i + 1);
        scanf("%ld", &t[i]);
    }

    tri_a_bulle(t, n);
    afficher_tableau(t, n);
    free(t);
    return 0;
}

Bonne chance

1

@mamiemando:
L'usage des VLA est contesté. Certains l'acceptent, d'autres pas.
Quel est ton opinion? (VLA = Variable Length Array)
Pour le code:
    while (n > 0){
Est-ce que ça vaut la peine de trier un tableau de longueur 1??
        while (i <= n){
Ou se trouve t[i+1] quand i vaut n (voire n-1)?

0
mamiemando Messages postés 33311 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 octobre 2024 7 794
15 déc. 2022 à 18:32

Hé bien je n'utilise pas les VLAs, je fais des malloc et vu l'exercice je doute qu'Achour sache ce que c'est et l'ait écrit intentionnellement :-D

Ensuite pense que les boucles ont effectivement des problèmes au niveau des bornes comme celles que tu soulignes, mais je n'ai pas prétendu que le programme que j'ai partagé était correct. Personnellement j'utilise très rarement while en C++ et en l'occurrence j'aurais plutôt écrit une boucle for (comme c'est fait actuellement pour l'affichage).

Je pense que c'est à Achour de corriger son programme et tes remarques devraient l'y aider.

0
PierrotLeFou
15 déc. 2022 à 18:47

Merci mamiemando. Je n'utilise pas les VLA en C, mais je le vois souvent.
Je déplore également que les gens utilisent trop les while quand un for est parfait.

0
mamiemando Messages postés 33311 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 octobre 2024 7 794
16 déc. 2022 à 09:43

J'ai l'impression que beaucoup d'enseignants enseignent le while avant le for, et surtout introduisent le while comme une manière de faire un for. Et cela fait prendre un mauvais départ aux élèves. Pourtant un for a bien des avantages, permet de s'assurer qu'on teste bien une condition d'arrêt et d'éviter beaucoup d'erreur de programmation qui conduisent à des boucles infinies...

0