diff --git a/Y/Ada-S1/exercices/complet-s1.html b/Y/Ada-S1/exercices/complet-s1.html new file mode 100644 index 0000000..e3b4884 --- /dev/null +++ b/Y/Ada-S1/exercices/complet-s1.html @@ -0,0 +1,47 @@ + + +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

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 bDeLorean
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.
\ No newline at end of file diff --git a/Y/Ada-S2/exo-intervalles.html b/Y/Ada-S2/exo-intervalles.html new file mode 100644 index 0000000..fa43cdb --- /dev/null +++ b/Y/Ada-S2/exo-intervalles.html @@ -0,0 +1,24 @@ + + +Exercice avec des types article

Objectifs

  • L'objectif est d'écrire quelques fonctions manipulant des intervalles de réels, représentés avec un type article.

Étapes à suivre

Première partie : les intervalles compacts

  • Créez un nouveau fichier mission2.adb contenant la structure habituelle d'un programme Ada.
  • Définissez un type article T_Intervalle permettant de représenter les intervalles de réels fermés et bornés, c'est-à-dire de la forme [inf, sup] où inf et sup sont des réels. Remarquez qu'il suffit de connaître inf et sup pour définir l'intervalle.
  • Définissez une fonction Intervalle_Image qui reçoit un T_Intervalle et renvoie une chaîne de caractères, de la forme "[3,5]" (pour un affichage pas trop laid, convertir les bornes en entier, ou alors utiliser l'acteur DFloat).
  • Ajoutez une fonction Est_Inclus qui reçoit deux arguments A et B de type T_Intervalle et qui renvoie vrai si et seulement si A est inclus dans B. Function Est_Inclus(Le corps de la fonction tient en une seule ligne.)
  • Ajoutez une fonction Disjoints ayant la même signature que Est_Inclus (même arguments, même type de résultat) et qui renvoie vrai si et seulement si A et B sont disjoints. (Elle tient aussi en une seule ligne.)
  • Ajoutez une procédure Afficher_Relation qui reçoit deux arguments A et B de type T_Intervalle et qui affiche l'un ou l'autre des messages suivants (selon ce qui est le plus adéquat) :
    • A est inclus dans B
    • B est inclus dans A
    • A et B sont disjoints
    • A et B ne sont pas disjoints (mais aucun n'est inclus dans l'autre)
    Vous pouvez utiliser Intervalle_Image pour afficher l'intervalle lui-même au lieu de "A" ou "B".
  • Pour tester, créez trois constantes C, D, E, représentant respectivement les intervalles [5, 10], [7, 8], et [4, 6]. Puis, dans le corps du programme principal, invoquez Afficher_Relation avec les paires d'arguments (C,D), (D,C), (C,E), et (D,E).
    Grâce à votre maîtrise absolue des relations ensemblistes, vous pouvez prévoir à l'avance ce qui sera affiché.

Deuxième partie : produits cartésiens d'intervalles compacts

  • Dans le même programme, définissez un type T_Prod représentant un produit cartésien de deux intervalles. Par exemple : [1,5]x[3,8] est un élément de T_Prod
  • Définissez une fonction Prod_Image qui reçoit un T_Prodet qui renvoie une chaîne de caractère, par exemple "[1,5]x[3,8]". Vous pensez spontanément à utiliser Intervalle_Image, c'est bien.
  • Comme ci-dessus, définissez les fonctions Prod_Est_Inclus et Prod_Disjoints qui reçoivent deux arguments A et B de type T_Prod et qui indiquent si A est inclus dans B ou si A et B sont disjoints (respectivement).
    Le corps de ces fonctions tient toujours en une seule ligne.
  • Comme ci-dessus, ajoutez une procédure Prod_Afficher_Relation qui joue le même rôle que Afficher_Relation mais pour des arguments de type T_Prod.
  • Testez dans le corps du programme principal en invoquant Prod_Afficher_Relation avec les paires d'arguments suivants :
    • CxC et DxD
    • CxD et DxC
    • DxC et ExC
    en prévoyant à l'avance ce qui sera affiché.

Bilan

  • Avec le type T_Prod, vous avez expérimenté un type article imbriqué dans un autre type article.
  • Vous savez maintenant que vous devez vous souvenir du produit cartésien À VIE.
\ No newline at end of file diff --git a/Y/Ada-S2/exo-traces.html b/Y/Ada-S2/exo-traces.html new file mode 100644 index 0000000..e76a39c --- /dev/null +++ b/Y/Ada-S2/exo-traces.html @@ -0,0 +1,77 @@ + + +Exercice de tracés avec des caractères

Objectifs

  • Écrire quelques procédures qui affichent des formes géométriques en utilisant le caractère dièse #. Par exemple, un pseudo-carré et un damier :
    #####
    +#   #
    +#   #
    +#   #
    +#####
      ##  ##  ##  ##  
    +  ##  ##  ##  ##  
    +##  ##  ##  ##  ##
    +##  ##  ##  ##  ##
    +  ##  ##  ##  ##  
    +  ##  ##  ##  ##  
    +##  ##  ##  ##  ##
    +##  ##  ##  ##  ##
    +  ##  ##  ##  ##  
    +  ##  ##  ##  ##  
  • Ces exercices vous familiariseront avec les concepts des séances de TP à venir.

Prérequis

➪ Au moins quelques restes du semestre 1.

Étapes à suivre

  • Le seul acteur dont vous aurez besoin est GAda.Text_IO.
  • Créez un nouveau dossier Exos-Algo.
  • Créez-y un fichier vide mission1.adb que vous complétez avec la structure d'usage (page 5 du livret du semestre 1).
    Si vraiment vous n'y parvenez pas, exclamez-vous : O cursed spite that ever I was born to set it right! (Hamlet, Act I, Scene 5) puis copiez le fichier mission1.adb qui se situe sur commetud (comme au premier TP du premier semestre).
  • Dans votre programme, qui s'appelle déjà Mission1, ajoutez une procédure Tracer_Ligne qui reçoit en argument un entier Long et qui trace une ligne de Long symboles dièses puis passe à la ligne.
    Par exemple, si Long vaut 5, la procédure affiche#####Procedure Tracer_Ligne Pour tester, invoquer la procédure dans le corps du programme principal avec les arguments 3, 8, puis 20. Vous obtenez alors le résultat suivant :
    ###
    +########
    +####################
    Corps de la procédure : 4 lignes Ada.
  • Ajoutez maintenant à votre programme une procédure Tracer_Rectangle qui reçoit deux arguments : Largeur et Hauteur, et qui trace (toujours avec des dièses) les contours d'un rectangle des dimensions indiquées (en nombre de dièses). Procedure Tracer_Rectangle Pour tester, invoquer la procédure dans le corps du programme principal avec les paires d'arguments (5,5), (4,6), puis (14,2). Vous obtenez alors le résultat suivant (utiliser des espaces " " pour décaler les dièses les uns des autres quand c'est nécessaire.) :
    #####
    +#   #
    +#   #
    +#   #
    +#####
    +
    +####
    +#  #
    +#  #
    +#  #
    +#  #
    +####
    +
    +##############
    +##############
    Corps de la procédure : une dizaine de lignes Ada.
  • Ajoutez une procédure Tracer_Quadrillage qui reçoit aussi en argument une largeur et une hauteur. Invoquée avec la paire d'arguments (19, 11), votre procédure doit afficher ceci :
    ###################
    +# # # # # # # # # #
    +###################
    +# # # # # # # # # #
    +###################
    +# # # # # # # # # #
    +###################
    +# # # # # # # # # #
    +###################
    +# # # # # # # # # #
    +###################
    Corps de la procédure : une dizaine de lignes Ada, un seul IF.
  • Faites de même une procédure Tracer_Damier qui, invoquée avec les arguments (18,10) affiche ceci :
    # # # # # # # # # 
    + # # # # # # # # #
    +# # # # # # # # # 
    + # # # # # # # # #
    +# # # # # # # # # 
    + # # # # # # # # #
    +# # # # # # # # # 
    + # # # # # # # # #
    +# # # # # # # # # 
    + # # # # # # # # #
    Corps de la procédure : une dizaine de lignes Ada, un seul IF.
  • FacultatifEt enfin, écrivez une procédure Tracer_Gros_Damier qui, invoquée avec les arguments (18,10) affiche ceci :
      ##  ##  ##  ##  
    +  ##  ##  ##  ##  
    +##  ##  ##  ##  ##
    +##  ##  ##  ##  ##
    +  ##  ##  ##  ##  
    +  ##  ##  ##  ##  
    +##  ##  ##  ##  ##
    +##  ##  ##  ##  ##
    +  ##  ##  ##  ##  
    +  ##  ##  ##  ##  
    Corps de la procédure : une dizaine de lignes Ada, un seul IF.

Bilan

  • Vous avez compris que pour parcourir une structure à deux dimensions (damier, matrice), il faut deux boucles FOR imbriquées.
  • Dans ces deux boucles FOR imbriquées, vous reconnaissez le compteur des lignes et le compteur des colonnes.
\ No newline at end of file diff --git a/Y/Gen/Acceleration_Stats-2-a60-f.png b/Y/Gen/Acceleration_Stats-2-a60-f.png new file mode 100644 index 0000000..fb475e0 Binary files /dev/null and b/Y/Gen/Acceleration_Stats-2-a60-f.png differ diff --git a/Y/Gen/Afficher_Action-2-b9e-.png b/Y/Gen/Afficher_Action-2-b9e-.png new file mode 100644 index 0000000..7146641 Binary files /dev/null and b/Y/Gen/Afficher_Action-2-b9e-.png differ diff --git a/Y/Gen/Controler_Vitesse-2-c6e-f.png b/Y/Gen/Controler_Vitesse-2-c6e-f.png new file mode 100644 index 0000000..84d4886 Binary files /dev/null and b/Y/Gen/Controler_Vitesse-2-c6e-f.png differ diff --git a/Y/Gen/Date_Vitesse_Max-1-99f-f.png b/Y/Gen/Date_Vitesse_Max-1-99f-f.png new file mode 100644 index 0000000..745621e Binary files /dev/null and b/Y/Gen/Date_Vitesse_Max-1-99f-f.png differ diff --git a/Y/Gen/Est_Inclus-2-a14-f.png b/Y/Gen/Est_Inclus-2-a14-f.png new file mode 100644 index 0000000..74e34cc Binary files /dev/null and b/Y/Gen/Est_Inclus-2-a14-f.png differ diff --git a/Y/Gen/Tester_Affichage-0-c97-.png b/Y/Gen/Tester_Affichage-0-c97-.png new file mode 100644 index 0000000..e9eead2 Binary files /dev/null and b/Y/Gen/Tester_Affichage-0-c97-.png differ diff --git a/Y/Gen/Tester_Controler_Vitesse-2-aa8-.png b/Y/Gen/Tester_Controler_Vitesse-2-aa8-.png new file mode 100644 index 0000000..9227902 Binary files /dev/null and b/Y/Gen/Tester_Controler_Vitesse-2-aa8-.png differ diff --git a/Y/Gen/Tracer_Ligne-1-4e0-.png b/Y/Gen/Tracer_Ligne-1-4e0-.png new file mode 100644 index 0000000..629388d Binary files /dev/null and b/Y/Gen/Tracer_Ligne-1-4e0-.png differ diff --git a/Y/Gen/Tracer_Rectangle-2-266-.png b/Y/Gen/Tracer_Rectangle-2-266-.png new file mode 100644 index 0000000..9596344 Binary files /dev/null and b/Y/Gen/Tracer_Rectangle-2-266-.png differ diff --git a/Y/Gen/Vitesse_Min-0-fb9-f.png b/Y/Gen/Vitesse_Min-0-fb9-f.png new file mode 100644 index 0000000..feb4eb2 Binary files /dev/null and b/Y/Gen/Vitesse_Min-0-fb9-f.png differ diff --git a/Y/Gen/Vitesse_Moy-1-99f-f.png b/Y/Gen/Vitesse_Moy-1-99f-f.png new file mode 100644 index 0000000..c2c5a49 Binary files /dev/null and b/Y/Gen/Vitesse_Moy-1-99f-f.png differ diff --git a/Y/Images/algo-auto1.png b/Y/Images/algo-auto1.png new file mode 100644 index 0000000..594c072 Binary files /dev/null and b/Y/Images/algo-auto1.png differ diff --git a/Y/Images/car1.png b/Y/Images/car1.png new file mode 100644 index 0000000..ce45ead Binary files /dev/null and b/Y/Images/car1.png differ diff --git a/Y/Images/car2.png b/Y/Images/car2.png new file mode 100644 index 0000000..17b393e Binary files /dev/null and b/Y/Images/car2.png differ diff --git a/Y/Images/car3.png b/Y/Images/car3.png new file mode 100644 index 0000000..662a75a Binary files /dev/null and b/Y/Images/car3.png differ diff --git a/Y/Images/car4.png b/Y/Images/car4.png new file mode 100644 index 0000000..baee6e6 Binary files /dev/null and b/Y/Images/car4.png differ diff --git a/Y/Images/etoile.png b/Y/Images/etoile.png new file mode 100644 index 0000000..5ab713a Binary files /dev/null and b/Y/Images/etoile.png differ diff --git a/Y/Images/forbid.png b/Y/Images/forbid.png new file mode 100644 index 0000000..01bdcec Binary files /dev/null and b/Y/Images/forbid.png differ diff --git a/Y/Images/logo-insa-light.jpg b/Y/Images/logo-insa-light.jpg new file mode 100644 index 0000000..ee0765f Binary files /dev/null and b/Y/Images/logo-insa-light.jpg differ diff --git a/Y/Images/speed1.png b/Y/Images/speed1.png new file mode 100644 index 0000000..8688d75 Binary files /dev/null and b/Y/Images/speed1.png differ diff --git a/Y/Images/speed2.png b/Y/Images/speed2.png new file mode 100644 index 0000000..cbd4ddb Binary files /dev/null and b/Y/Images/speed2.png differ diff --git a/Y/ystyle.css b/Y/ystyle.css index ee6fba1..6d5b628 100644 --- a/Y/ystyle.css +++ b/Y/ystyle.css @@ -74,7 +74,7 @@ main { display: block; } -.yfold:not(.card) { +.yfold:not(.card):not(aside) { background: rgba(189, 189, 189, 0.2); position: relative; z-index: 1; @@ -210,7 +210,7 @@ footer .pcom a { /* PAGE DE CODE */ -code { +code:not(.inline) { z-index: 2; background: #000; width: min(94vw, 900px); @@ -243,7 +243,7 @@ span.comment { white-space: pre; } -span.kw { +span.kw, code.kw { color: rgb(227,99,99); } @@ -267,22 +267,153 @@ span.uident{ color: rgb(203, 203, 53); } +.light code:not(.inline) { + z-index: 2; + background: black; + width: min(94vw, 900px); + border-radius: 12px; + margin-left: 3vw; + margin-top: 20px; + font-family: monospace; + display: block; + color: white; + tab-size: 2; + white-space: pre; + overflow-x: scroll; + font-size: 120%; + padding: 20px 50px 22px 15px; + border-bottom: 10px solid #222; + line-height: 1.55; +} +code * { + white-space: pre; + tab-size: 2px; + display: inline; +} + +.light span.comment { + font-style: italic; + color: rgb(204, 209, 209); + white-space: pre; +} + +.light span.kw { + color: rgb(138, 74, 10); +} + +.light span.type { + color: rgb(138, 74, 10); +} + +.light span.fname { + color: rgb(138, 138, 10); +} + +.light span.string { + color: rgb(10, 138, 74); +} + +.light span.letvar { + color: rgb(74, 138, 10); +} + +.light span.uident { + color: rgb(138, 138, 10)); +} + +span.file { + font-weight: bold; +} + +var, samp, code.inline { + display: inline-block; + padding: 2px 8px; + background: #222; + color: #ffffcc ; + border-radius: 4px; + font-size: 90%; + font-family: monospace; + font-style: normal; + } + +pre { + margin: 20px 0; +} + +img.space { + margin-left: auto; + margin-right: auto; + display: block; + margin-top: 1.5ex; + margin-bottom: 1.5ex; + } + +span.lbutton{ + position:relative; + margin-right: 6px; +} + +span.lbutton:before{ + content:""; + z-index:-1; + left:-0.5em; + top:-0.1em; + border-width:2px; + border-style:solid; + border-color:rgb(138, 138, 10); + position:absolute; + border-right-color:transparent; + width:100%; + height:1em; + transform:rotate(2deg); + opacity:0.7; + border-radius:50%; + padding:0.1em 0.25em; +} +span.lbutton:after{ + content:""; + z-index:-1; + left:-0.5em; + top:0.1em; + padding:0.1em 0.25em; + border-width:2px; + border-style:solid; + border-color:rgb(138, 138, 10); + border-left-color:transparent; + border-top-color:transparent; + position:absolute; + width:100%; + height:1em; + transform:rotate(-1deg); + opacity:0.7; + border-radius:50%; +} + +aside.yfold { + margin: 20px 0; +} + +aside .yfold-title, .card .yfold-title { + color: black; + font-family: 'Poppins', sans-serif; + font-weight: 100; +} /* MEDIA */ @media (min-width: 1400px) { - footer { - flex-direction: column; - max-height: 400px; - position: absolute; - top: calc(20px + 150px); - right: 3vw; - width: calc(91vw - 900px); - border-radius: 12px; - } +footer { +flex-direction: column; +max-height: 400px; +position: absolute; +top: calc(20px + 150px); +right: 3vw; +width: calc(91vw - 900px); +border-radius: 12px; +} } /* ANIMATION */