Liste chainée c++

Fermé
DanielP - 23 nov. 2020 à 02:06
yg_be Messages postés 22726 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 - 23 nov. 2020 à 10:35
/*
Bonsoir, dans la question 5 du tp3 B
Il faut afficher le nombre de femme et d’homme. L’affichage du nombre de femme fonctionne cependant l’homme ne marche pas et c’est le meme fonction.
De plus, dans la question 6, il faut ajouter la moyenne salaire hebdo des femmes et il m’Affiche :0
Le resultat est ci-dessous incorrecte.
Merci d’avance
Daniel Prudent

Le nombre de femme est 37
Le nombre d'homme est 0
La moyenne sal heb des femme est 0
  • /

#include <iostream> // pour entrée-sortie cin, cout
#include <iomanip> // pour le formatage
#include <string>
#include <fstream> // pour les fichiers
#include <list>
#include <algorithm>


using namespace std; // librairie standard

class Personne
{
private :
char sexe ;
float heure, taux ;
int numero;
public :
Personne(char sexe, int numero, float heure, float taux)
{
this->sexe = sexe;
this->numero = numero;
this->heure = heure;
this->taux = taux;

}

Personne()
{
}

// surcharger l'opéraur d'affichage :
friend ostream& operator << (ostream&, const Personne&);

char getSexe()
{
return sexe;
}

int getNumero()
{
return numero;
}

float getTaux()
{
return taux;
}
};

struct Element
{
Personne pers ;

Element * suivant ;
};

ostream& operator << (ostream& sortie, const Personne& unePers)
{
sortie.setf(ios::fixed);
sortie.setf(ios::showpoint);

sortie << setw(4) << unePers.sexe
<< setw(8) << unePers.numero
<< setw(7) << setprecision(2) << unePers.heure
<< setw(8) << setprecision(1) << unePers.taux << endl;
return sortie;
}

typedef Element * Pointeur ;


// conseils : dessiner le schéma pour créer la liste avec 3 lignes de données
void lireRemplir(const char nomALire[], Pointeur& liste, Pointeur & dernier)
{
// const float PIED_EN_METRE = 0.3048,
// LIVRE_EN_KG = 0.454;
int numero;
//nbPieds, nbPouces, nbLivres;
float heure, taux;
char sexe;

liste = NULL ;


ifstream aLire (nomALire, ios::in); // localiser et ouvrir pour la lecture


while (aLire >> sexe >> numero >> heure >> taux)
{
// taille = (nbPieds + nbPouces /12.0) * PIED_EN_METRE;
// poids = nbLivres * LIVRE_EN_KG ;

// construire une personne
Personne unePers(sexe, numero, heure, taux);

// préparer d'un nouvel élément :
Pointeur tempo = new Element ;
tempo->pers = unePers;

tempo->suivant = NULL ;
if (liste == NULL)
liste = dernier = tempo;
else
{ dernier->suivant = tempo ;
dernier = tempo;
}
}
aLire.close();
}

// afficher le contenu d'une liste
void afficher(Pointeur liste)
{
cout << "Contenu de la liste des personnes :\n";
int n = 0;
while (liste)
{
cout << setw(4) << n++ <<") " << liste->pers ;
liste = liste->suivant;

}

}

void afficher(Pointeur liste, char sexeVoulu)
{
bool trouve = false;
while (liste)
{
if ( liste->pers.getSexe() == sexeVoulu)
{ trouve = true;
cout << "\nCoordonnees de la premiere personne de sexe "
<< sexeVoulu << " : " << endl
<< liste->pers << endl;
break; // quitter la boucle while
}
liste = liste->suivant;
}
if (!trouve)
cout << "Aucune personne de sexe : " << sexeVoulu << endl;

}
void chercher(int aChercher, Pointeur liste, Pointeur & avant, Pointeur & cestLui)
{
avant = NULL; // avant le 1er élément : il n'en a pas => avant vaut NULL
cestLui = liste; // cestLui pointe vers le 1er élément

while (cestLui && cestLui->pers.getNumero() != aChercher)
{
// avant prendre la place de cestLui
avant = cestLui;
cout << cestLui->pers.getNumero() << endl;
cout << avant->pers.getNumero() << endl;

// cestLui s'avance
cestLui= cestLui->suivant ;
}
}

void demoRecherche(Pointeur liste)
{
int aChercher ;
Pointeur avant, cestLui;
char reponse = 'o';

while (cestLui && (reponse == 'o' || reponse == 'O'))
{
cout << "Quelle valeur recherchee " ;
cin >> aChercher;
chercher(aChercher, liste, avant, cestLui);
if (cestLui)
{
cout << "On trouve : " << cestLui->pers.getNumero() << endl;
if (avant)
cout << "La valeur avant : " << avant->pers.getNumero() << endl;
else
cout << "au debut de la liste\n";
}
else
cout << "introuvable\n";

cout << endl << "Voulez-vous continuer ? (o/n) " ;

cin >> reponse;
}
}
void demoSupprimer(Pointeur & liste)
{ int aChercher;

Pointeur avant, cestLui;
char reponse = 'o';

while (liste && (reponse == 'o' || reponse == 'O'))
{ cout << "Quelle valeur a supprimer " ;
cin >> aChercher;
chercher(aChercher, liste, avant, cestLui);
if (cestLui)
{
cout << "On trouve et supprime : " << cestLui->pers.getNumero() << endl;
if (avant)
avant->suivant = cestLui->suivant;
else
liste=liste->suivant;

delete cestLui;
afficher(liste);
}
else
cout << "introuvable\n";

cout << endl << "Voulez-vous continuer ? (o/n) " ;

cin >> reponse;
}
if (liste == NULL) cout << "La liste est vide!\n";
}


int nbSexe(Pointeur & liste, char item_to_find) { // fonction pour find femme ou monsieur

int compteur = 0;
//toujours au debut la liste pointe sur le premier element c'est equivalent a i=0 pour un tableau
while(liste) // tant que la liste ne pointe pas vers null
{
if(liste->pers.getSexe() == item_to_find)
{
compteur+= 1;
}
liste=liste->suivant;//equivalent i++ pour un tableau
}
return compteur;
}


float moyenne (Pointeur & liste, int nbElem, char sexeVoulu)
{
float somme = 0.0;

while(liste) // tant que la liste ne pointe pas vers null
{
if(liste->pers.getSexe() == sexeVoulu)
{
somme+= liste->pers.getTaux();
}
liste=liste->suivant;//equivalent i++ pour un tableau
}
return somme/nbElem;
}
// for(int i = 0; i < nbElem ; i++)
// if (sexe [i] == sexeVoulu)
// somme += tab[i];
//
// return somme / nbElem ;
// }
int main(){

//1. de lire le fichier, de créer une liste chaînée des employés dans l'ordre FIFO (First In First Out)
int sum = 0; // open the txt file
int x;
ifstream inFile;
Pointeur liste, dernier;
lireRemplir("emp_a20.txt",liste, dernier);

//2. d'afficher le premier et le dernier employé de la liste en surchargeant l'opérateur d'affichage
cout << "Premiere pers : " <<liste->pers;
cout << "Derniere pers : " << dernier->pers;
afficher(liste);

// afficher les coordonnees du 1er homme de la liste
afficher(liste, 'M');


//4. de supprimer le premier, le dernier et l'employé numéro 411
demoRecherche(liste);
demoSupprimer(liste);
afficher(liste);

//5. de compter et d'afficher :
//- le nombre de femmes;
//- le nombre d'hommes
int nbF=nbSexe(liste, 'F');
cout << "Le nombre de femme est " << nbF << endl;

int nbM=nbSexe(liste, 'M');
cout << "Le nombre d'homme est " << nbM << endl;

//6. de calculer le salaire hebdomadaire moyen des femmes
int nbMoy=moyenne(liste, 1, 'F');
cout << "La moyenne sal heb des femme est " << nbMoy << endl;



return 0;


}

1 réponse

yg_be Messages postés 22726 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
23 nov. 2020 à 10:35
bonjour, merci d'utiliser les balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0