Aide c++

nikesava -  
Arya Dröttningu Messages postés 650 Statut Membre -
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

  1. Arya Dröttningu Messages postés 650 Statut Membre 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
  2. 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
  3. Arya Dröttningu Messages postés 650 Statut Membre 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