Objectifs

  • Mettre en application toutes les compétences ALGO du premier semestre.
  • Ce sujet, typique de l'examen, peut être fait complètement en 1H50, ou alors en 1H30 (durée de l'examen) en ne faisant qu'un seul exercice à la question 3.

Exercices

Voiture autonome
StarQuestion 1 : Traduction d'algorigramme et procédure de test
Compétences mises en oeuvre :
  • Distinguer les structures de contrôle while, if, et for.
  • Traduire une spécification de sous-programme en un en-tête Ada.
  • Écrire une procédure de test qui invoque une fonction et affiche le résultat.
Algorigramme
  • Écrivez une fonction Controler_VitesseFunction Controler_VitesseCette fonction doit correspondre exactement à l'algorigramme ci-dessous, avec les conventions suivantes:
    • Cond1 signifieVitesse > Limite
    • Cond2 signifieDepassements ⩾ Securite
    Algorigramme
Procédure de test
  • Écrivez une procédure de test Tester_Controler_VitesseProcedure Tester_Controler_VitesseLa procédure de test doit afficher la valeur de ses deux arguments, puis la valeur renvoyée par la fonction Controler_Vitesse (invoquée avec les arguments de test) de cette manière :
    Seuil Vitesse =  5.50000E+01 km/h
    Seuil Sécurité =  5 dépassements.
    Nombre de dépassements =  16
    
    Seuil Vitesse =  5.60000E+01 km/h
    Seuil Sécurité =  4 dépassements.
    Nombre de dépassements =  14
    
    Seuil Vitesse =  5.70000E+01 km/h
    Seuil Sécurité =  1 dépassements.
    Nombre de dépassements =  6
    Vous voyez ici trois invocations de la procédure de test.
  • Dans le corps du programme principal, invoquez trois fois la procédure de test, avec les valeurs ci-dessus, et vérifiez que vous obtenez les mêmes résultats.
Solution
Solution utile si vous avez fait preuve de persévérance mission9.adb.
Circulation de voitures autonomes
StarStarQuestion 2 : Affichage et type article
  • Écrivez une procédure Afficher_ActionProcedure Afficher_Action
  • Cette procédure affiche la vitesse et le contenu de l'action passés en argument de cette manière :
    Vitesse =  13 km/h
    Direction =  14 degrés
    Accélération =  10
    Freinage =  0
    ou encore
    Vitesse =  71 km/h
    Direction = -7 degrés
    Accélération =  0
    Freinage =  0
    --- ACTION D'URGENCE ---
  • Notez que la vitesse et la direction sont convertis en entier pour un affichage plus agréable.
  • Les unités sont précisées.
  • S'il s'agit d'une action d'urgence, on ajoute une dernière ligne (comme dans le deuxième exemple).
Procédure de test
  • Écrivez une procédure de testTester_AffichageProcedure Tester_Affichage
  • Cette procédure commence par fixer la destination Long : -1.12, Lat : 40.31
  • Puis, il faut afficher les dix premières actions effectuées par la voiture (en utilisant Action_Courante).
  • Il faut invoquer Attend_Ms entre chaque action pour laisser le temps à la voiture de changer d'action.
  • Avec la destination indiquée ci-dessus, votre première action devrait être
    Vitesse =  13 km/h
    Direction =  14 degrés
    Accélération =  10
    Freinage =  0
    et votre sixième action devrait être
    Vitesse =  71 km/h
    Direction = -7 degrés
    Accélération =  0
    Freinage =  0
    --- ACTION D'URGENCE ---
Solution
Avez-vous réellement besoin de consulter la solution ? mission10.adb.
Circulation de voitures autonomes
StarStarQuestion 3 : Recherche d'extremum
Moyenne
Compteur de vitesse
  • Écrivez une fonction Vitesse_Moy qui renvoie la moyenne des vitesses mesurées sur les N prochaines mesures (N étant l'argument de la fonction). Function Vitesse_MoyCette fonction doit mesurer N (= l'argument Mesures) fois la vitesse, en invoquant Attend_Ms entre chaque mesure, et renvoyer la moyenne calculée.
  • Pour tester, dans le corps du programme, établir la destination à Long : -0.82, Lat : 41.22
    Afficher la moyenne après 100 mesures, vous devriez trouver 44,910 km/h (avec cette précision).
Max
  • Écrivez une fonction Date_Vitesse_MaxFunction Date_Vitesse_MaxDe manière similaire, cette fonction doit mesurer la vitesse N fois, en invoquant Attend_Ms entre chaque mesure.
    La fonction doit renvoyer la date à laquelle la vitesse est maximale (voir la fonction Date).
    Forbidden Ne renvoyez pas la vitesse maximale, ce n'est pas ce qui est demandé.
  • Testez dans le corps du programme principal, en établissant la destination à Long : 0.5, Lat : 40.18
    La vitesse maximale sur 100 mesures est atteinte à la date 1.425s.
Min
Compteur de vitesse
  • Écrivez une fonction Vitesse_Min qui renvoie la vitesse minimale calculée jusqu'à l'arrivée à destination.Function Vitesse_MinLa fonction doit invoquer Attend_Ms entre chaque mesure de vitesse, et ne s'arrêter que lorsque le véhicule a atteint sa destination (voir la fonction Arrivee).
  • Testez dans le corps du programme principal, en établissant la destination à Long : 0.2, Lat : 40.37
    La vitesse minimale est 0.57 km/h.
Solution
Avant de lire la solution, avez-vous déjà un programme qui fonctionne ? mission11.adb.
Flying DeLorean
StarStarStarQuestion 4 : Algorithme enrichi (nécessaire uniquement pour obtenir A ou A+ à l'examen)
  • Définissez dans votre programme un type article T_Stats qui contient :
    • Un réel Moy,
    • Deux entiers Min et Max,
    • Et encore un entier Urgences.
    Ce type servira à effectuer quelques statistiques pendant le pilotage de la voiture.
  • Écrivez une fonction Acceleration_StatsFunction Acceleration_StatsCette fonction doit obtenir N (= l'argument Mesures) fois l'action courante, en invoquant Attend_Ms entre chaque mesure, et renvoyer certaines statistiques :
    • Le nombre d'action d'urgence (dans l'attribut Urgences).
    • Et, en ne considérant que les actions
      • dont la valeur de direction est supérieure ou égale à Dir_Abs (en valeur absolue),
      • et dont la valeur de freinage est 0,
      calculer les valeurs max, min, et la moyenne de l'accélération (à placer dans les attributs correspondant du type article).
  • Testez dans le corps du programme principal, en établissant la destination à Long : -0.2, Lat : 41.63, et en effectuant 22 mesures avec le seuil de direction 4.0. Vous obtenez :
    Acceleration Moyenne :  6.25000E+00
    Acceleration Min :  3
    Acceleration Max :  8
    Actions d'urgence :  1
Solution
Voici une solution : mission12.adb.

Acteurs utilisés

Bilan

En gardant tout votre flegme, vous êtes capables :
  • de traduire correctement un algorigramme en Ada.
  • d'écrire une procédure de test correspondant à une fonction donnée.
  • d'exploiter intelligemment les arguments d'un sous-programme, fussent-ils d'un type article.
  • d'appliquer quelques algorithmes classiques à connaître : min, max, moyenne.
  • d'adapter un algorithme connu pour prendre en compte une contrainte supplémentaire.