Aide programme tri croissant et décroissant

cs_nikesava Messages postés 3 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 8 novembre 2010 - 7 nov. 2010 à 02:04
cs_nikesava Messages postés 3 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 8 novembre 2010 - 8 nov. 2010 à 14:09
Bonjour, je dois obtenir cet affichage de mon programme:

Combien de valeurs vous desirez trier ? 5

Dans quel ordre desirez vous trier (1 pour croissant, 2 pour decroissant) ?1

Entrer la donnee 1 de 5 ? 45
Entrer la donnee 2 de 5 ? 23
Entrer la donnee 3 de 5 ? -14
Entrer la donnee 4 de 5 ? 0
Entrer la donnee 5 de 5 ? 4

Resultats des nombres tries
Index Origine Tri
1 45 -14
2 23 0
3 -14 4
4 0 23
5 4 45

Je n'y arrive toutefois pas, mon triage n'est pas correct...
voici mon code-source


#include
#include <math.h>

using namespace std ;

#define nDonneesMax 15

void main()
{
float Don[nDonneesMax], tempD; // Donnee
int iI, nDonI, Tri; // Variables d'itération
char Triok; // Variable de sortie

do // Reprise du programme
{
Triok = 'O';
do
{
do
{cout << "\nCombien de valeurs vous desirez trier? ";
cin >> nDonI;
if ((nDonI < 2 || nDonI >15))
{cout << "La valeur est hors de la plage, veuillez recommencer... \n\n";}
}while ((nDonI < 2 || nDonI >15));
} while (nDonI < 1 || nDonI > nDonneesMax);

cout << "\n\nDans quel ordre desirez vous trier (1 pour croissant, 2 pour decroissant) ?";
cin >> Tri;

// Entrée des coordonnées

for (iI = 0; iI < nDonI; iI++)
{
cout << "\nEntrer donnee " << iI+1 << " de 15 ?";
cin >> Don[iI];
}


// Calculs

if (Tri == 1)
{ for (iI=0; iI<nDonI; iI++)
do
{
if (Don[iI] < Don [iI+1])
{Triok = 0;
tempD= Don[iI+1];
Don[iI+1]=Don[iI];
Don[iI] = tempD;
}
}while (Triok =0);
}
if (Tri == 2)
{ for (iI=0; iI<nDonI; iI++)
do
{
if (Don[iI] > Don [iI+1])
{Triok = 0;
tempD = Don[iI+1];
Don[iI+1] = Don[iI];
Don[iI] = tempD;
}
} while (Triok =0);
}

/*cout << "valeur de i ? " << iI << "\n";*/

// Affichage des résultats

cout << "\n\nResultats des nombres tries\n";
cout << "Index\tOrigine\tTri\n";
for (iI=0; iI<nDonI; iI++)
cout << iI+1 << "\t" << Don[iI] << "\t" << tempD << "\n";

cout << "\nVoulez-vous recommencer (O/N) ?";
cin >> Triok;

}while (Triok 'O' || Triok 'o');
cout << "\nProgramme termine.\n";

// 5- Fin du programme
}

4 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 nov. 2010 à 03:20
Salut,

Jette donc un oeil aux algo de tri a bulles, vu que c'est ce que tu cherchers à faire.
Le tri à bulles est le pire qu'il existe d'un point de vu performance mais ca reste le plus simple a mettre en oeuvre et à comprendre pour un débutant.

A part ca lorsque tu écrit un message, pense a mettre ton code en forme tu y gagnera en lisibilité.

Shell
0
cs_nikesava Messages postés 3 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 8 novembre 2010
7 nov. 2010 à 03:36
Ok, comment je m'y prend pour le tri décroissant?
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
7 nov. 2010 à 19:54
Salut,

Je pense que tu peux faire quelque chose de plus simple pour l'algo de tri en lui-même.
L'algorithme global que tu sembles avoir choisit :
- Tu récupères les différentes valeurs dans un tableau
- Tu tries
- Tu affiches

Un exemple d'algorithme de tri (où tu peu choisir l'ordre) :
//Contient les valeurs saisies
int tab[] = {9, 2, 7, 3, 4};
//Permet de se déplacer dans la liste
int index1, index2;
//Classes les valeurs de la plus grande à la plus petite
int higher = 1;

//Tri du tableau de int
for (index1=0; index1<sizeof(tab); index1++) {
  for (index2=0; index2<sizeof(tab); index2++) {
    if (index2 < index1)
      continue;
    if (higher) {
      if (tab[index1] < tab[index2])
        swap(tab, index1, index2);
    }else{
      if (tab[index1] > tab[index2])
        swap(tab, index1, index2);
    }
  }
}


Un exemple de la fonction swap :
void swap (int * tab, int index1, int index2) {
  int temp;
  temp = tab[index1];
  tab[index1] = tab[index2];
  tab[index2] = temp;
  return;
}


Je ne sais pas comment s'appel mon algo, mais ce qui est sur c'est que ce n'est pas le meilleur au niveau des performances.

Ciao.
0
cs_nikesava Messages postés 3 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 8 novembre 2010
8 nov. 2010 à 14:09
Bonjour, j'ai retravaillé un peu mon algo et maintenant, le seul bug est que ma dernière valeur n'est pas triée... quelqu'un peu m'aider avec cela?


#include
#include <math.h>

using namespace std ;

#define nDonneesMax 15

int main(){
float Don[nDonneesMax], DonCopie[nDonneesMax], tempD; // Donnee
int iI, nDonI, Tri; // Variables d'itération
char Triok; // Variable de sortie

do // Reprise du programme
{
Triok = 'O';
do
{
cout << "\nCombien de valeurs vous desirez trier? ";
cin >> nDonI;
if ((nDonI < 2 || nDonI >15))
cout << "La valeur est hors de la plage, veuillez recommencer... \n\n";
}while ((nDonI < 2 || nDonI >nDonneesMax));
cout << "\n\nDans quel ordre desirez vous trier (1 pour croissant, 2 pour decroissant) ? ";
cin >> Tri;

// Entrée des valeurs
for (iI = 0; iI < nDonI; iI++)
{
cout << "\nEntrer donnee " << iI+1 << " de "<<nDonI<<" : ";
cin >> Don[iI];
}

//copie du tableau
for (iI = 0; iI < nDonI; iI++)
{
DonCopie[iI] = Don[iI];
}

// Calculs
if (Tri == 1)
{
for (iI=0; iI<nDonI-2; iI++)
{
for (int i = iI+1 ; i<nDonI-1 ; i++)
{
if (DonCopie[iI] > DonCopie [i])
{
tempD= DonCopie[iI];
DonCopie[iI]=DonCopie[i];
DonCopie[i] = tempD;
}
}
}
}
if (Tri == 2)
{
for (iI=0; iI<nDonI-2; iI++)
{
for (int i = iI+1 ; i<nDonI-1 ; i++)
{
if (DonCopie[iI] < DonCopie [i])
{
tempD= DonCopie[iI];
DonCopie[iI]=DonCopie[i];
DonCopie[i] = tempD;
}
}
}
}

// Affichage des résultats
cout << "\n\nResultats des nombres tries\n";
cout << "Index\tOrigine\tTri\n";
for (iI=0; iI<nDonI; iI++)
cout << iI+1 << "\t" << Don[iI] << "\t" << DonCopie[iI] << "\n";
cout << "\nVoulez-vous recommencer (O/N) ?";
cin >> Triok;
}while (Triok 'O' || Triok 'o');

cout << "\nProgramme termine.\n";
return 0 ;
}
0
Rejoignez-nous