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 le joueur a remonté dans le classement, -- donc son ancien index était plus grand. 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 ;