/*############################################
# (\__/)    Programme   : Statistique de Groupe
# ( . .)    Auteur      : Martin Robinson
# c(")(")   Conception  : Aujourd'hui
#		    Description : Plein d'etudian dans
						un fichier et on sort
						des statistiques
modification : 20 fev 2012
			   Martin Robinson
			   ajout de la librairie
			   creation de fonction de sortie
###########################################
         (\_/)   directive du pr�processeur
        ( . . ) /
###########################################*/

#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>

//#include "martinrobinson.hpp"
//#include "../librairie/martinrobinsonv2.hpp"
#include "../../lib/saisieMR.hpp"
#include "../../lib/algoMR.hpp"

using namespace std;

/*       (\_/)   Prototype de fonction
        ( . . ) /
###########################################*/

void ecrireEnTete();
void lireEtudiant(lecture &, char [], char []);
void Trier8PremieresNotes(lecture &, float &);
void calculerNoteFinale(lecture &, float &);
void AfficherEtudiant(char [], char [], float);
int CalculerNbSuppAMoyenne(float [20] ,int , float );
void AfficherStatistique(float , int , char [] , char []);

/*       (\_/)   Programme Principal
        ( . . ) /
###########################################*/

int main ()
{
	/*  (\_/) initialisation
	___( . . )_/________________*/
	for (int i = 0; i<50; i++)											//vider l'ecran
		cout << "\n";
	saisie <void> attendre("appuyer sur une touche pour terminer");		//foncteur saisie s�curis� configurer pour faire une pause

	float note, 						//note de l'etudiant
		  moyenne = 0;					//moyenne du groupe

	int nbEtudiants = 0,				//nombre d'etudiants
		nbEchec = 0,					//nombre d'echecs
		nbSupMoy = 0,					//nombre d'�tudiants superieurs � la moyenne.
		meilleur = 0;					//index du meilleur etudiant du groupe

	//les tableaus
	char noms[20][15],		//liste de nom des etudiant
		 prenoms[20][15];		//liste des pr�noms
	float notes[20];		//liste des notes finales
	for (int i = 0; i< 20 ;i++)
		notes[i] = 0;

	/*  (\_/) ouvrire fichiers
	___( . . )_/________________*/

	lecture entree("etudiants.txt");		//ouverture du fichier
	if(!entree)								//en cas d'�chec
	{
		cout << "probleme avec l'ouverture du fichier \"Etudiant.txt\"" << endl;
		attendre();
		return 0;
	}

	ecrireEnTete();

	/*  (\_/) tanque le fichier n'est pas vide
	___( . . )_/________________*/
	do
	{
		lireEtudiant(entree, noms[nbEtudiants], prenoms[nbEtudiants]);

		Trier8PremieresNotes(entree,notes[nbEtudiants]);

		calculerNoteFinale(entree,notes[nbEtudiants]);

		//battire la moyenne
		moyenne += notes[nbEtudiants];
		//trouver le meilleurs etudiant
		if (notes[meilleur] < notes[nbEtudiants])	//la meilleure note
			meilleur = nbEtudiants;					//on utilise l'index

		AfficherEtudiant(noms[nbEtudiants], prenoms[nbEtudiants] ,notes[nbEtudiants]);

		nbEtudiants++;				//le nombre d'etudiants augmente
	}while(entree);					//tant que le fichier n'est pas fini
	//calculer la moyenne
	moyenne /= nbEtudiants;

	nbSupMoy = CalculerNbSuppAMoyenne(notes,nbEtudiants,moyenne);

	AfficherStatistique(moyenne, nbSupMoy, prenoms[meilleur], noms[meilleur]);

	/*  (\_/)  fin
	___( . . )_/________________*/
	entree.fermer();

	cout << "\n\n (\\_/)\n"
		 << "( . .)\n"
		 << "c(\")(\")\n"
		 << "Fin du programme\n";
	attendre();
	return 0;
}

/*       (\_/)   classe
        ( . . ) /
###########################################*/



/*       (\_/)   fonction
        ( . . ) /
###########################################*/
void ecrireEnTete()
{
	cout << right << setw(50) << "Liste des �tudiants" << endl
		 << right << setw(50) << "===================" << endl << endl
		 << left << setw(50) << "Nom"
		 << left << setw(20) << "Note Finale" << endl
		 << left << setw(50) << "========================"
		 << left << setw(20) << "===========" << endl;
}

void lireEtudiant(lecture & entree, char nom[], char prenom[])
{
	//lire etudiant ... c'est un foncteur avec validation automatique
	entree >> nom >> prenom;
}

void Trier8PremieresNotes(lecture &entree, float &laNote)
{
	float note;
	//ponderation des huits premiere notes , utilise une liste heap
    float tableau[8];
    maxCmp <float> maxHeap;
	heap <float,8> Ponderation(maxHeap,tableau);
	//lire les 8 premieres notes a 5% chaque avec trie
	for (int i=0; i<8;i++)
	{
		entree >> note;
		Ponderation.push(note);
	}
	//prendre les 5 meilleurs note de la ponderation
	for (int i=0; i<5; i++)
	{
		laNote += Ponderation.pop() * 0.05;
	}
}

void calculerNoteFinale(lecture & entree, float & laNote)
{
	float note;
	//lire les deux derniere notes
	entree >> note;
	laNote += note * 0.25;	//premier examen vaux 25%
	entree >> note;
	laNote += note * 0.5;	//deuxieme examen vaux 50%
}

void AfficherEtudiant(char nom[], char prenom[], float  note)
{
	//afficher l'etudiant;
	cout << left << setw(15) << nom
		 << left << setw(25) << prenom
		 << right << setw(19) << fixed << setprecision(0) << note << " %\n";
}

int CalculerNbSuppAMoyenne(float notes[20],int nbEtudiants, float moyenne)
{
	int nbSupMoy=0;	//nombre d'etudiant sup�rieurs � la moyenne
	//calculer le nb d'etudiant supp�rieurs � la moyenne
	for (int i = 0; i<nbEtudiants;i++)			//pour tout les etudiants
	{
		if (moyenne < notes[i])					//si plus grand que la moyennes
			nbSupMoy++;							//il y a un �tudiant de plus supp�rieurs � la moyenne
	}
	return nbSupMoy;
}

void AfficherStatistique(float moyenne, int nbSupMoy, char prenomMeilleur[], char nomMeilleur[])
{
	cout << endl << left << setw(30) << "Moyenne du groupe:  "
		 << fixed << setprecision(1) << setw(5) << moyenne << "%\n"
		 << left << setw(30) << "Nb sup�rieur � la moy: "
		 << setw(7) << nbSupMoy << endl
		 << left << setw(30) << "Meilleur r�sultat:"
		 << prenomMeilleur[0] << ". "
		 << nomMeilleur << endl;
}

/*       (\_/)   fini
        ( . . ) /
###########################################*/