mission4.adb

with Gada.Text_IO ;
with Tennis ;

procedure Mission4 is
   
   package Ten renames Tennis ;
   package Txt renames Gada.Text_IO ;
   
   --- Afficher tous les joueurs
   procedure Afficher(Clas : Ten.T_Classement) is
   begin
      for Index in Clas'Range loop
	 -- Numéro de classement, nom du joueur, pays.
	 Txt.Put(Integer'Image(Index) & " : " & Clas(Index).Nom & "  " 
		   & Clas(Index).Pays & "  ") ;
	 
	 -- Symbole qui dépend de la valeur Move
	 if Clas(Index).Move = 0 then
	    Txt.Put("=") ;
	 else
	    if Clas(Index).Move > 0 then
	       Txt.Put("+") ;
	    end if ;
	    
	    -- Valeur de Move
	    Txt.Put(Integer'Image(Clas(Index).Move)) ;
	 end if ;
	    
	 Txt.New_Line ;
      end loop ;
   end Afficher ;
   
   --- Chercher un joueur du pays indiqué
   function Chercher (Clas : Ten.T_Classement ; Nation : String) return Ten.T_Resultat is
      -- Resultat par défaut
      Result : Ten.T_Resultat := (False, 0) ;
      
      Trouve : Boolean := False ;
      Index : Integer := 1 ;
   begin
      while (Index <= Clas'Last and not Trouve) loop
	 -- Est-ce le joueur que l'on cherche ?
	 if Clas(Index).Pays = Nation then
	    -- On a trouvé !
	    Trouve := True ;
	 else
	    -- Pas le bon, on passe au suivant
	    Index := Index + 1 ; 
	 end if ;
      end loop ;
      
      if Trouve then
	 Result := (True, Index) ;
      end if ;
      
      return Result ;
   end Chercher ;
   
   procedure Tester_Chercher(Clas : Ten.T_Classement ; Orig : String) is
      Reponse : Ten.T_Resultat ;
   begin
      Txt.New_Line ;
      Txt.Put_Line("Chercher un joueur de " & Orig) ;
      Reponse := Chercher(Clas, Orig) ;
      
      if Reponse.Succes then
	 Txt.Put_Line("  Trouvé : " & Integer'Image(Reponse.Numero) & "  " & Clas(Reponse.Numero).Nom) ;
      else
	 Txt.Put_Line("  Introuvable.") ;
      end if ;
      
      Txt.New_Line ;
   end Tester_Chercher ;
   
   --- Construire le classement précédent
   function Precede(Clas : Ten.T_Classement) return Ten.T_Classement is
      -- Le joueur inconnu, pour les cases indéterminées.
      Joueur_Inconnu : Ten.T_Entree := (Ten.Inconnu, "---", 0) ;
      
      -- Tableau du résultat, initialisé avec le joueur inconnu.
      Result : Ten.T_Classement(Clas'Range) := (others => Joueur_Inconnu) ;
      
      Nouvel_Index : Integer ;
   begin
      
      -- Parcours de toutes les entrées du classement et remplissage du tableau de résultat.
      for Index in Clas'Range loop
         
         -- Si move est > 0, cela signifie que l'on remonte dans le classement,
         -- donc le nouvel index diminue.
	 Nouvel_Index := Index - Clas(Index).Move ;
	 
	 if Nouvel_Index <= Result'Last then
	    Result(Nouvel_Index) := (Clas(Index).Nom, Clas(Index).Pays, 0) ;
	 end if ;
	 
      end loop ;
      
      return Result ;
   end Precede ;
   
begin
   
   Afficher(Ten.Joueurs) ;
   Afficher(Ten.Joueuses) ;
   
   Tester_Chercher(Ten.Joueurs, "FRA") ;
   Tester_Chercher(Ten.Joueurs, "USA") ;
   Tester_Chercher(Ten.Joueuses, "ITA") ;
   Tester_Chercher(Ten.Joueuses, "INSA") ;
   
   Afficher(Precede(Ten.Joueurs)) ;
   
end Mission4 ;