Exercices sur les structures imbriquées

Objectifs

  • Exploiter une structure imbriquée que l'on découvre pour la première fois (une simple, puis une plus complexe).
  • Appliquer les algorithmes à connaître : max, min, algorithme de recherche.

Prérequis

Exercices

Exercice : Structure imbriquée simple (tableau et record).
StarQuestion 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 :TennisProcedure Afficher
     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.
StarStarQuestion 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. Function Chercher
  • 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.
StarStarQuestion 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.Function Precede
  • 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.
Solution
La solution ne vous sera utile que si vous vous êtes suffisamment confrontés au problème. La voici : mission4.adb
Exercice : Structure imbriquée complexe.
StarQuestion 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.Function Compter
  • 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.
StarStarQuestion 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.Function Duree_plus_grande
  • 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 sous la forme 25 / 12.
  • É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.Function Plus_Long
  • 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.Schéma explicatif du solstice
StarQuestion 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.Procedure Afficher_Jour
  • É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.
StarStarQuestion 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. Function Chercher_Lune
  • Par exemple, Chercher_Lune( Calendrier, (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 aurez besoin de placer use Calendrier ; au début de votre programme ou avant le begin de votre fonction.
Solution
Solution utile si vous avez été pugnace face au problème : mission5.adb.

Acteurs utilisés

Bilan

  • Vous êtes maintenant prêt à comprendre n'importe quelle structure de données.
  • Les algorithmes classiques sont parfaitement connus (max, min, algo de recherche).