# on recupère le fichier contenant la liste des noms et des notes passé en argument

if ($ARGV[0] eq "") {
  print "\n la syntaxe est moynotes nom_de_fichier.\n\n" ;
  exit(-1) ;
}  ; # fin de test sur les arguments

$fiche = $ARGV[0] ; # récupération du nom du fichier

open( FIC ,"<$fiche") || die "\n impossible d'ouvrir le fichier nommé $fiche \n\n" ;

# parcours du fichier : on crée un tableau associatif dont
# les clés sont les noms associés a la moyenne

$nbElv = 0 ;
while ($ligne=<FIC>) {

    @champs=split(/\*/,$ligne) ;

    # on supprime le retour chariot de la fin de la ligne dans champs[1]

    chomp ($champs[1]) ;

    # si la ligne est vide, on réitère la boucle

    if (length($champs[1])==0) { next ; } ;

    # on sépare les 3 notes

    @notes=split(/\s+/,$champs[1]) ;

    # on supprime la 1ère valeur des champs qui est un espace

    shift @notes ;

    $som=$notes[0]+$notes[1]+$notes[2] ;

    $moy=$som/3 ;

    $classe{$champs[0]}=$moy ;

   # on incrémente le compteur d'élèves

   $nbElv++ ;

} ; # fin de tant_que

print "Il y a ",$nbElv," élèves." ;

# on trie la liste des élèves par ordre alphabétique

print " Voici la liste des élèves par ordre alphabetique:\n" ;

foreach $name (sort keys %classe) {

    printf "    %s %10.2f\n",$name,$classe{$name} ;

} ; # fin pour chaque

# on trie la liste par ordre de mérite

print "Voici la liste des élèves par ordre de mérite:\n" ;

foreach $nom (reverse (sort by_value keys %classe)) {

    printf "    %s %10.2f\n",$nom,$classe{$nom} ;

} ; # fin pour chaque

sub by_value {

   local($test_num)=$classe{$a} <=> $classe{$b} ;

  #si $classe{$a}=$classe{$b} les deux moyennes sont identiques, donc il faut trier par ordre alphabétique les noms

  # si les deux sont égaux, $test_num vaut 0, donc on trie selon la
  # clé. Sinon on ne fait rien.

   if ($test_num) {return $test_num ;}

   return $b cmp $a ;

} ; # fin sub  by_value
