Aide c++

nikesava -  
Arya Dröttningu Messages postés 581 Date d'inscription   Statut Membre Dernière intervention   -
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 <iostream>
#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
}

3 réponses

Arya Dröttningu Messages postés 581 Date d'inscription   Statut Membre Dernière intervention   157
 
Salut,
J'ai un peu regardé ton code et j'ai fait quelques modifs. Si tu ne comprends pas n'hésite pas à poser des questions. Je n'ai pas codé la fonction tri par ordre décroissant : je te laisse le faire ;)

Pour l'affichage : c'est normal que ça ne fonctionnait pas !
Tu veux afficher le tableau d'origine (Don[iI]) or ce tableau est modifié par la fonction de tri et ensuite tu voulais afficher le tableau final mais tu affichais juste la variable tempD (qui te servait à échanger les valeurs de ton tableau).
Tu dois donc utiliser deux tableaux : au début ils contiendront les mêmes données mais pour trier tu ne modifieras qu'un tableau.
Tu auras donc le tableau Don qui contiendra les valeurs triées et le tableau DonCopie qui lui contiendra les valeurs telles qu'elles ont été rentrées ;).


#include <iostream>
#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 coordonnées
		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)
		{
			//A faire	
		}
		
		// 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
nikesava
 
Bonjour, j'ai regardé l'algo que vous m'avez envoyé, tout est parfait, j'ai même fait la partie décroissante :P

Cependant, le seul petit bug est que ma dernière valeur n'est jamais triée?

Merci de m'aider
0
Arya Dröttningu Messages postés 581 Date d'inscription   Statut Membre Dernière intervention   157
 
Ah oui excuse c'est un problème dans les valeurs max des "for"
Il faut mettre :
for (iI=0; iI<nDonI-1; iI++) //Au lieu de nDonI-2
			{
				for (int i = iI+1 ; i<nDonI ; i++) //Au lieu de nDonI
				{
					if (DonCopie[iI] > DonCopie [i])
					{
						tempD= DonCopie[iI];
						DonCopie[iI]=DonCopie[i];
						DonCopie[i] = tempD;
					}
				}
			}
0