Tri a bulle en c
Résolu/Fermé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
- Tri a bulle en c
- Video bulle whatsapp - Accueil - Messagerie instantanée
- Tri excel - Guide
- Logiciel de tri de photos - Guide
- Changer couleur bulle whatsapp - Forum WhatsApp
- Bulle verte snap ✓ - Forum Snapchat
3 réponses
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
@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)?
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.
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.
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...
Modifié le 16 déc. 2022 à 09:48
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 :
il faut plutôt écrire :
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 :
Bonne chance