# Exercice sur TOUT

## ▸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

- Copiez ces fichiers dans un dossier de travail : auto.ads, auto.adb, et le programme mission1.adb.
- Prenez le temps de bien lire l'acteur Auto.

##### Question 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_Vitesse`Cette fonction doit correspondre exactement à l'algorigramme ci-dessous, avec les conventions suivantes:
  - `Cond1` signifie`Vitesse > Limite`
  - `Cond2` signifie`Depassements ⩾ Securite`

###### Procédure de test

- Écrivez une procédure de test `Tester_Controler_Vitesse`La 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.

##### Question 2 : Affichage et type article

- Écrivez une procédure `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 test`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.

##### Question 3 : Recherche d'extremum

###### Moyenne

- É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). Cette 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_Max`De 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).
  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

- Écrivez une fonction `Vitesse_Min` qui renvoie la vitesse minimale calculée jusqu'à l'arrivée à destination.La 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.

##### Question 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_Stats`Cette 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

- Auto
- GAda.Text_IO

## ▸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.