j'ai un problème de réalisation dans l'exercice 5 du cours sur les tableaux. Ça fait un peu plus d'une heure que je fais différents manières pour réussir mais ça ne marche jamais. SI quelqu'un pourrait m'e'xpliquer pourquoi ça ne marche pas ? Pour ceux qui ne s'en rappelle plus de l'exercice ou qui ne l'ont pas fait, on doit faire un tableau et le mettre dans l'ordre décroissant. Voici mon code pour que vous puissez me donnez des conseils sur comment réussir à le faire et ce qui ne va pas. Merci d'avance !
#include <stdio.h>
#include <stdlib.h>
int main()
{
int compteur = 1, i = 0, valeurTableau = 0, tableau[5] = {0}, tableauFinal[5] = {0};
printf("Entrer 5 valeurs au hasard : \n");
while (i < 5)
{
scanf("%d", &valeurTableau);
tableau[i] = valeurTableau;
i++;
}
i = 0;
while (i < 5 || tableau[i] > tableau[i + 1])
{
if (tableau[i] > tableau[i + 1])
{
tableauFinal[i] = tableau[i + 1];
tableauFinal[i + 1] = tableau[i];
i++;
}
if (tableau[i] < tableau[i + 1])
{
tableauFinal[i] = tableau[i];
tableauFinal[i + 1] = tableau[i + 1];
i++;
}
if (i >= 5)
{
i = 0;
}
i++;
}
while (i < 5)
{
printf("case %d : %d\n", compteur, tableauFinal[i]);
i++;
compteur++;
}
}
- Edité par AbcAbc6 25 juin 2020 à 3:30:55
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Pour tester ton programme, tu devrais rentrer les valeur du tableau en dur dans le code. Ça t'éviterait de te les retaper à chaque essais ! Enfin, tu fais comme tu veux.
Pour ceux qui ne s'en rappelle plus de l'exercice ou qui ne l'ont pas fait, on doit faire un tableau et le mettre dans l'ordre décroissant.
___
Si tu as fait l'exercice inverse ordonnerTableau() qui consiste à trier un tableau dans l'ordre croissant cela ne devrait pas poser trop de problème ...
Pour ceux qui ne s'en rappelle plus de l'exercice ou qui ne l'ont pas fait, on doit faire un tableau et le mettre dans l'ordre décroissant.
___
Si tu as fait l'exercice inverse ordonnerTableau() qui consiste à trier un tableau dans l'ordre croissant cela ne devrait pas poser trop de problème ...
Je ne comprend pas ta remarque. Je comprend qu'il faut changer les tests, mais le niveau de difficulté est le même.
Le Tout est souvent plus grand que la somme de ses parties.
J'ai fait une erreur je voulais dire croissant et non décroissant :/
> Pourquoi utilises-tu des while, tu n'as pas droit au for?
Non c'est juste que j'aime bien les whiles. Ça serait mieux d'utiliser des for ?
Ce que je voulais faire (dans l'idée) ça aurait été de comparer toute l'indice == i (si i = 5 comparer l'indice 5) à i +1 (donc 6). Si "i" > i + 1, alors inversé les valeurs (c'était à dire mettrela valeur de la 6èmecase à la 5 ème ety vice-versa). En revanche, si "i" < i +1, alors ajouter 1 à "i" et continuer de faire le tester jusu'a être arrivé à i == la taille du tableau.
> Ça se fait également sans tableauFinal, on fait le tri sur place avec une variable temporaire. En fait, c'est plus facile de faire un tri sur place.
Je pensais que ça ne changer pas le niveau de difficulté
- Edité par GalipetteCendrée 25 juin 2020 à 22:46:17
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Si j'ai bien compris comme ça ça va juste me mettre la plus grande valeur à la fin du tableau et tu dis que si je veux garde le même code la taille du tableau je devrai la décrémenter à chaque tour ??! J'pense pas que ce soit ça:D
> Tu parles des indices 5 et 6 alors que ton tableau a une dimension de 5, donc les indices vont de 0 à 4.
Je sais.C'était juste un exemple comme ça mais pas inspiré de mon code.
- Edité par GalipetteCendrée 26 juin 2020 à 12:33:01
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
je l'ai fait il y a quelques jours, je suis pas un expert du tout mais c'est pas si difficile (une fois qu'on a capté^^)
Tu devrais peut-être commencer par int tab[4] = {15, 81, 22, 13} (ça t'évite de perdre du temps avec ton scanf, tu pourra le faire une fois que tu aura compris le truc)!
En gros dans ton tableau, tu vas comparer tab de i et tab de j (int j à 1)
Si tab de j est plus petit que tab de i tu swap (ça se fait sur 3 lignes)
Pour le swap si tu galères pense à un verre d'eau A et un verre de coca B tu veux que B soit dans A comme tu fais?
En fait, c'est là que c'est intéressant. Parce qu'on a très rarement la bonne idée qui va marcher dans tous les cas sans erreur du premier coup.
Le débutant, l'idée pour démarrer, il l'a. Après, il constate que ça ne marche pas bien. Normal. C'est là qu'il y a un travail à faire :
1. on constate que sur un exemple comme [3, 8 , 45, 1 , 34, -8, -2, 17 ] ça ne marche pas. C'est déjà bien de le constater, y en a qui sont tellement contents quand ça compile enfin, qu'ils ne vérifient rien.
2. on ne pas se refarcir tout le déroulement de l'algorithme à la main, donc on enlève des morceaux pour avoir le plus petit exemple possible qui ne marche pas. Par exemple on va trouver que ça ne marche pas pour [3, 8, 1], mais que ça marche pour [3, 8], [8,1] et [3,1].
3. Là, on peut suivre le déroulement à la main. Si on est parti sur une série d'échanges : 3<8 donc on laisse, 8>1 donc on échange et ça nous fait [3,1,8]. Qui effectivement n'est pas dans l'ordre.
4. Et c'est là qu'on se dit que le plus petit (1) n'est pas arrivé à gauche. Et que vient l'idée qu'il va falloir faire plusieurs tours.
Mais bon, le débutant il s'imagine souvent qu'il va taper des trucs, qu'il va corriger des points virgules, et que ça va forcément marcher de suite. En réalité, on a une idée pour faire des trucs, et il faut affiner en analysant POURQUOI ça ne marche pas (il ne s'agit pas de changer <n par <n+1 au hasard).
J'ai mis un peu de temps mais ça y est. Je n'ai pas mis enrésolu parce que j'aimerai que vous me dites si je pourrai améliorer mon code parce que je pense qu'on pourrait le faire avec un meilleur code mais ça marche ! Après tout c'est normal que mon code ne soit pas trop optimal vu que je commence mais j'espère que ça s'améliora dans le temps ._.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int compteur = 1, i = 0, valeurTemp = 0, tableau[5] = {17, 47, 1, 0 ,14}, tailleTableau = 4;
while (i <= tailleTableau || i > tailleTableau)
{
if (tableau[i] > tableau[i + 1])
{
valeurTemp = tableau[i + 1];
tableau[i + 1] = tableau[i];
tableau[i] = valeurTemp;
valeurTemp = 0;
i++;
if (i == tailleTableau)
{
i = 0;
tailleTableau--;
}
if (tailleTableau < 0)
{
i = 0;
while (i < 5)
{
printf("case %d : %d\n", compteur, tableau[i]);
i++;
compteur++;
if (i == 5)
{
return 0;
}
}
}
}
if (tableau[i] < tableau[i + 1])
{
if (i >= tailleTableau)
{
i = 0;
tailleTableau--;
}
i++;
if (tailleTableau < 0)
{
i = 0;
while (i < 5)
{
printf("case %d : %d\n", compteur, tableau[i]);
i++;
compteur++;
if (i == 5)
{
return 0;
}
}
}
}
}
}
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Ah oui bien vu. Je viens de corriger ça en regardant ou ça n'aller pas dans le mode Debug avec la fenêtre Watches(je le dis pour ce qi cherche une solution et qui voudrais analyser le problème on sait jamais). En me faisant remarquer ça j'ai essayé de voir commentle programme réagissez si je mettais des nombres égaux et je me suis aperçu que mon programme ne finissait jamais et j'ai vu que je n'avais rien prévu dans ce cas la.
La version de ce code normalement devrait marcher correctement et ça peut importe les chiffres/nombres qu'on mets. Si vous voulez tester au cas ou j'ai oublié des trucs je vous mets le code :
#include <stdio.h>
#include <stdlib.h>
int main()
{
int compteur = 1, i = 0, valeurTemp = 0, tableau[5] = {5, 5, 1, 0 ,14}, tailleTableau = 4;
while (i <= tailleTableau || i > tailleTableau)
{
if (tableau[i] > tableau[i + 1])
{
valeurTemp = tableau[i + 1];
tableau[i + 1] = tableau[i];
tableau[i] = valeurTemp;
valeurTemp = 0;
i++;
if (i == tailleTableau)
{
i = 0;
tailleTableau--;
}
if (tailleTableau < 0)
{
i = 0;
while (i < 5)
{
printf("case %d : %d\n", compteur, tableau[i]);
i++;
compteur++;
if (i == 5)
{
return 0;
}
}
}
}
if (tableau[i] < tableau[i + 1])
{
if (i >= tailleTableau)
{
i = 0;
tailleTableau--;
if (tableau[i] > tableau[i + 1])
{
valeurTemp = tableau[i + 1];
tableau[i + 1] = tableau[i];
tableau[i] = valeurTemp;
valeurTemp = 0;
i++;
}
}
i++;
if (tailleTableau < 0)
{
i = 0;
while (i < 5)
{
printf("case %d : %d\n", compteur, tableau[i]);
i++;
compteur++;
if (i == 5)
{
return 0;
}
}
}
}
if (tableau[i] == tableau[i + 1])
{
i++;
if (tailleTableau < 0)
{
i = 0;
while (i < 5)
{
printf("case %d : %d\n", compteur, tableau[i]);
i++;
compteur++;
if (i == 5)
{
return 0;
}
}
}
}
}
}
Je sais que pour améliorer mon code je pourrai faire une fonction qui comprendrais ce code au lieu de le copié/collé pour chaque situation
if (tailleTableau < 0)
{
i = 0;
while (i < 5)
{
printf("case %d : %d\n", compteur, tableau[i]);
i++;
compteur++;
if (i == 5)
{
return 0;
}
}
}
- Edité par GalipetteCendrée 29 juin 2020 à 0:08:06
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
J'aurais bien testé avec un tableau plus grand, mais je n'ai pas le courage de modifier les tailles partout dans le code ! Ce n'est pas très pratique pour un pauvre utilisateur comme moi !
Normalement pour cet exercice on fait une fonction capable de trier n'importe quel tableau quelque soit sa taille.
void tirerTableau(int tableau[], int tailleTableau);
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Le Tout est souvent plus grand que la somme de ses parties.
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Le Tout est souvent plus grand que la somme de ses parties.
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Il n'y a pas de mauvaises inventions, juste des mauvaises pratiques.
Le Tout est souvent plus grand que la somme de ses parties.