/*############################################
# (\__/)    Programme   : Statistique de Groupe
# ( . .)    Auteur      : Martin Robinson
# c(")(")   Conception  : Aujourd'hui
#		    Description : Plein d'etudian dans
						un fichier et on sort
						des statistiques
###########################################
         (\_/)   directive du pr�processeur
        ( . . ) /
###########################################*/

#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string.h>

#include "../lib/saisieMR.hpp"
#include "../lib/algoMR.hpp"

using namespace std;

/*       (\_/)   Prototype de fonction
        ( . . ) /
###########################################*/

void afficherEnTete();
void lireEtudiant(lecture & entree, char nom[], char prenom[], float note[]);
void trier8PremieresNotes(float []);
float calculerNoteFinale(float[]);
void afficherEtudiant(char [], char [], float);
int calculerNbSuppAMoyenne(float [] ,int , float );
void afficherStatistique(float , int , char [] , char []);

/*       (\_/)   Programme Principal
        ( . . ) /
###########################################*/

int main ()
{
	/*  (\_/) initialisation
	___( . . )_/________________*/
	saisie <void> attendre("appuyer sur une touche pour terminer");		//foncteur saisie s�curis� configurer pour faire une pause

	float note[10],					//liste des notes
		  notesFinale[20],             //liste des notes finales
		  moyenne = 0,					//moyenne du groupe
		  noteMeilleur = 0;             //note du meilleur etudiant

	int nbEtudiant = 0,				//nombre d'etudiants
		nbEchec = 0,					//nombre d'echecs
		nbSupMoy;						//nombre d'�tudiants superieurs � la moyenne.

	//les tableaus
	char nom[15],					//liste de nom des etudiant
		 prenom[15],				//liste des pr�noms
		 nomMeilleur[15],           //nom du meilleurs etudiant
		 prenomMeilleur[15];        //prenom du meilleurs etudiant

	
	/*  (\_/) ouvrire fichiers
	___( . . )_/________________*/

	lecture entree("etudiants.txt");		//ouverture du fichier
	if(!entree)								//en cas d'�chec test fait par l'objet lui meme
	{
	    attendre();     //la sortie de programme en cas d'échec n'est pas déplacable dans une fonction
		return 0;
	}

	for (int i = 0; i<50; i++)		//vider l'ecran
		cout << "\n";
	afficherEnTete();
	
	lireEtudiant(entree, nom, prenom,note);

	/*  (\_/) tant que le fichier n'est pas vide
	___( . . )_/________________*/
	while(entree)					//tant que le fichier n'est pas fini
	{
		trier8PremieresNotes(note);
		notesFinale[nbEtudiant] = calculerNoteFinale(note);
		moyenne += notesFinale[nbEtudiant];                   //accumulation pour la moyenne

		if (noteMeilleur < notesFinale[nbEtudiant])	        //trouver le meilleurs etudiant
		{
			noteMeilleur = notesFinale[nbEtudiant];
			strcpy(nomMeilleur,nom);
			strcpy(prenomMeilleur,prenom);
		}

		afficherEtudiant(nom, prenom ,notesFinale[nbEtudiant]);

		nbEtudiant++;				//le nombre d'etudiants augmente
		
	    lireEtudiant(entree, nom, prenom,note);
	}
	
	moyenne /= nbEtudiant;                                                 //fin du calcul de moyenne
	nbSupMoy = calculerNbSuppAMoyenne(notesFinale,nbEtudiant,moyenne);    //nombre d'étudiants superieurs à la moyenne

	afficherStatistique(moyenne, nbSupMoy, prenomMeilleur, nomMeilleur);

	/*  (\_/)  fin
	___( . . )_/________________*/
	entree.fermer();

	cout << "\n\n (\\_/)\n"
		 << "( . .)\n"
		 << "c(\")(\")\n"
		 << "Fin du programme\n";
	attendre();
	return 0;
}

/*       (\_/)   fonction
        ( . . ) /
###########################################*/
//affichage
void afficherEnTete()
{
	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;
}
//lecture du fichier
void lireEtudiant(lecture & entree, char nom[], char prenom[], float note[])
{
	//lire etudiant ... c'est un foncteur avec validation automatique
	entree >> nom >> prenom;
	for (int i=0;i<10;i++)
	    entree >> note[i];
}
//trie les huits premieres notes , utilise une liste heap
void trier8PremieresNotes(float note[])
{
    float tableau[8];                       //tableau de trie temporaire
    minCmp <float> minHeap;                 //direction du trie
	heap <float,8> triage(minHeap,tableau); //objet de triage par heap (arbre binaire)
	for (int i=0; i<8;i++)      //injecter les notes dans la structure de trie
		triage.push(note[i]);
	for (int i=0; i<8; i++)     //resortire les notes trié de la structure (HeapSort)
		note[i] = triage.pop();
}
//un commentaire
float calculerNoteFinale(float note[])
{
	int pond[7] = {5,5,5,5,5,25,50};      //ponderation
	float noteF = 0;                      //accumulateur , noteFinale
	for(int i=3;i<10;i++)
		noteF += note[i] * pond[i-3] / 100;

	return noteF;
}
//afficher l'etudiant;
void afficherEtudiant(char nom[], char prenom[], float  note)
{
	cout << left << setw(15) << nom
		 << left << setw(25) << prenom
		 << right << setw(19) << fixed << setprecision(0) << note << " %\n";
}
//calculer le nb d'etudiant supp�rieurs � la moyenne
int calculerNbSuppAMoyenne(float note[],int nbEtudiant, float moyenne)
{
	int nbSupMoy=0;	//nombre d'etudiant sup�rieurs � la moyenne
	
	for (int i = 0; i<nbEtudiant;i++)			//pour tout les etudiants
	{
		if (moyenne < note[i])					//si plus grand que la moyennes
			nbSupMoy++;							//il y a un �tudiant de plus supp�rieurs � la moyenne
	}
	return nbSupMoy;
}
//un commentaire
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
        ( . . ) /
###########################################*/
