# Exercices sur les structures imbriquées

## Structure imbriquée simple (tableau et record).

- Copiez l'acteur tennis.ads et tennis.adb
- Copiez le programme vide mission1.adb

### Question 1

- Écrire une procédure `Afficher` qui reçoit en argument un classement (de type `T_Classement`) et qui affiche tous les joueurs de ce classement de la manière suivante :

       1 : Novak Djokovic          SRB  =
       2 : Andy Murray             GBR  =
       3 : Roger Federer           SUI  =
       4 : David Ferrer            ESP  + 1
       5 : Rafael Nadal            ESP  -1
       6 : Tomas Berdych           CZE  =
       7 : Jo-Wilfried Tsonga      FRA  + 1
       8 : Juan Martin Del Potro   ARG  -1
       9 : Richard Gasquet         FRA  =
       10 : Stanislas Wawrinka      SUI  =
       11 : Tommy Haas              GER  + 3
       12 : Marin Cilic             CRO  -1
         etc.

- Lorsque l'évolution (Move) vaut 0, afficher un égal (=). Bien mettre un + lorsque c'est positif.
- Pour tester, afficher les deux tableaux contenus dans l'acteur.

### Question 2

- Écrire une fonction `Chercher` qui reçoit en argument un classement (de type T_Classement) et un pays (une chaîne) et qui renvoie une valeur de type `T_Resultat` .
- La fonction renvoie le numéro du premier joueur de la liste provenant du pays demandé. Si aucun joueur n'est trouvé, la fonction renvoie une valeur T_Resultat avec Succes valant False. Sinon, la fonction renvoie une valeur T_Resultat contenant le numéro du joueur et Succes valant True.
- La fonction doit être efficace et ne pas parcourir toute la liste lorsque le joueur est trouvé.
- Mettez au point une procédure de test que l'on pourrait invoquer comme ceci : `Tester_Chercher(Tennis.Joueurs, "FRA") ;
  Tester_Chercher(Tennis.Joueurs, "USA") ;
  Tester_Chercher(Tennis.Joueuses, "ITA") ;
  Tester_Chercher(Tennis.Joueuses, "INSA") ;` et qui afficherait les résultats suivants :

      Chercher un joueur de FRA
        Trouvé :  7  Jo-Wilfried Tsonga

      Chercher un joueur de USA
        Trouvé :  19  Sam Querrey

      Chercher un joueur de ITA
        Trouvé :  5  Sara Errani

      Chercher un joueur de INSA
        Introuvable.

### Question 3

- Écrire une fonction `Precede` qui reçoit en argument un classement (T_Classement) et qui renvoie un nouveau tableau de type T_Classement correspondant au classement précédant le classement en cours.
- Pour construire le classement précédent, utiliser les informations Move de chaque joueur indiquant de combien de places il s'est amélioré.
- Certains joueurs étant sortis du classement, les cases indéterminées seront remplies avec un joueur au nom indéterminé (voir la constante `Inconnu` définie dans l'acteur Tennis)
- Dans le tableau retourné, mettre la valeur de Move à 0 pour tous les joueurs.
- Tester en affichant les classements précédant les deux classements donnés dans l'acteur.

La solution ne vous sera utile que si vous vous êtes suffisamment confrontés au problème. La voici : mission4.adb

## Structure imbriquée complexe.

- Copiez les deux fichiers de l'acteur calendrier.ads et calendrier.adb
- Copiez le programme vide mission1.adb

### Question 1 : compter le nombre de jours

- Écrivez une fonction `Compter` qui reçoit en argument un calendrier (de type T_Annee) et compte le nombre total de jours de ce calendrier.
- Testez avec l'année 2042 (la seule fournie dans l'acteur) et affichez le résultat. Vous savez ainsi si votre fonction est correcte.

### Question 2 : trouver les solstices

- Écrivez une fonction `duree_plus_grande` qui reçoit en argument deux durées et qui renvoie le booléen vrai si la première durée est strictement supérieure à la seconde durée.
- Définir un type `T_Date` qui contient un numéro de jour et un numéro de mois.
- Écrivez une procédure `Afficher_Date` qui reçoit en argument une date et l'affiche.
- Écrivez une fonction `Plus_Long` qui reçoit en argument un calendrier et qui renvoie le jour (de type T_Date) le plus long de l'année
- Testez en affichant, vous devriez trouver le jour du solstice d'été (à quelques jours près, dû aux arrondis à la minute).
- Faites de même pour trouver le jour le plus court.

### Question 3 : affichage

- Écrivez une procédure `Afficher_Jour` qui affiche un T_Jour (y compris la durée du jour). Si la lune est dans une phase remarquable, le préciser.
- Écrivez une procédure `Afficher_Mois` qui affiche un T_Mois (y compris tous les jours du mois).
- Écrivez une procédure `Afficher_Annee` qui affiche un T_Annee (y compris tous les jours de l'année).
- Essayez de soigner l'affichage.

### Question 4 : algorithme de recherche

- Écrivez une fonction `Chercher_Lune` qui reçoit en argument un calendrier, un jour de départ (de type T_Date), et une phase de la lune (de type T_Lune), et qui renvoie le premier jour trouvé après le jour de départ correspondant à la phase de lune indiquée.
- Par exemple, `Chercher_Lune( (14,07), Pleine_Lune)` doit renvoyer la date de la première pleine lune après le 14 juillet.
- Si aucun jour ne convient, renvoyer le jour (0,0).
- Vous aures besoin d'utiliser `use Calendrier ;` au début de votre programme ou avant le begin de votre fonction.

Solution utile si vous avez été pugnace face au problème : mission5.adb