AP-12 Programmation Ada – Contrôle – 03 octobre 2011 Exercice 1
Transcription
AP-12 Programmation Ada – Contrôle – 03 octobre 2011 Exercice 1
AP-12 Programmation Ada – Contrôle – 03 octobre 2011 Avec poly Ada autorisé – Durée : 1h30 NOM : ……………………………………………………GROUPE : ……… Exercice 1 : QUIZZ Cochez la (ou les) bonne(s) réponse(s) Déclaration Appel de procédure Clause d’utilisation Déclaration Comparaison Affectation Comparaison Déclaration Affectation with p_calcul ; use p_calcul ; ... a = true ... a := ... ; ch : string(1..5) ; Parmi les instructions suivantes, lesquelles sont valides ? ch := "merle" ch := "canard" ch := 'aigle' ch := "émeu" k := k + 7 ; while not stop loop ... end loop; où stop est un booléen ... x,y : integer; b1,b2 : boolean; Begin x := 9; y := 4; b1 := false; B2 := (x/=9) or (not b1 and (y<=5)); Itération Incrémentation Conditionnelle Itération Incrémentation Conditionnelle Quelle est la valeur de b2 ? true false De quel type peut être c ? Ecrire(c) ; Function produit(a, b : in integer) return integer is ... Procedure produit(a, b : in integer; s : out integer) is ... Contrôle AP12 entier booléen caractère chaîne de caractères type structuré Parmi les instructions suivantes, quelles sont les bonnes ? x := produit(0,2) ; y := produit(1,2,3) ; produit(4,4) ; z := produit (produit(a,b),c) ; Parmi les instructions suivantes, quelles sont les bonnes ? r := produit(a,b,s) ; produit(1,2,3) ; produit(a,b,c) ; produit(a,a,a); 03 octobre 2011 1/5 Exercice 2 : Une petite itération… Ecrire un programme principal (procedure Puissance) qui : • déclare 2 entiers x et n ; permet leur saisie ; • calcule xn à l'aide d'une itération (donc, sans utiliser le symbole **) ; • affiche le résultat. with p_esiut; use p_esiut; procedure puissance is x, n,m : integer; r : float:= 1.0 ; begin ecrire("donnez un entier x et un entier n "); lire(x); lire(n); if n <0 then m:=-n; else m:=n; end if ; for i in 1 ..m loop r:=r*float(x); end loop ; if n < 0 then r:= 1.0 /r; end if ; ecrire( "resultat de x a la puissance n : "); ecrire(image(r)); end puissance; Exercice 3 : Un voyage dans les planètes… Les 8 planètes du système solaire, rangées dans l’ordre de leur distance au soleil, sont : Mercure, Venus, Terre, Mars, Jupiter, Saturne, Uranus, Neptune. Ecrire un programme principal (procedure LesPlanetes) qui : • déclare un type énuméré T_Planete contenant les 8 planètes dans l’ordre ci‐dessus ; • instancie le paquetage p_enum sur le type T_Planete ; • déclare une variable Pl de type T_Planete ; Ce programme devra successivement : • Demander à l’utilisateur de saisir le nom d’une planète et afficher son rang en partant du soleil (ex : Jupiter est la 5ème planète); • Afficher le nom des planètes situés à côté de celle‐ci (ex : Mars et Saturne entourent Jupiter). • Afficher le nom des 8 planètes ; with p_esiut; use p_esiut; procedure LesPlanetes is type T_Planete is (Mercure, Venus, Terre, Mars, Jupiter, Saturne, Neptune); package p_planete_io is new p_enum(T_Planete); use p_planete_io; Pl : T_Planete; Uranus, Begin Ecrire("Planete : "); Lire(Pl); Ecrire("Position :"); Ecrire(T_Planete'Pos(Pl) + 1); a_la_ligne; If Pl/=T_Planete’First then Ecrire("Planete precedente :"); Ecrire(T_Planete'Pred(Pl)); a_la_ligne; End if; If Pl/=T_Planete’First then Ecrire("Planete suivante :"); Ecrire(T_Planete'Succ(Pl)); a_la_ligne; End if ; For i in T_Planete loop ecrire(i); end loop; End LesPlanetes; Contrôle AP12 03 octobre 2011 2/5 Exercice 4 : besoin d’une voiture ? Contexte : Gestion de la vente et de l’acquisition de voitures neuves dans un garage Pensez à utiliser quand cela est possible les procédures ou fonctions que vous avez écrites. Question 4.1. Dans un programme principal garage déclarer : • un sous‐type T_Places pour des entiers de 2 à 7. • un type article TR_Auto pour représenter les voitures à vendre dans le garage, avec les champs suivants : ‑ marque, chaîne de 10 caractères pour la marque de la voiture (ex : Peugeot, Citroen, Renault, …) ‑ modele, chaîne de 10 caractères pour le type de la voiture (ex : Partner, C5, Megane,…) ‑ nbplaces, entier représentant le nombre de passagers, conducteur inclus (entre 2 et 7) ‑ stock, entier pour le nombre de voitures de cette marque et de ce type disponibles à la vente ‑ break, booléen indiquant si la voiture est un break. • 2 variables A1 et A2 de type TR_Auto. Ce programme devra : • Initialiser A1 par agrégat avec les valeurs de votre choix • Initialiser A2 par saisie de l’utilisateur. Remarque : vous pouvez déclarer d’autres variables si besoin… with p_esiut; use p_esiut; procedure garage is subtype T_Places is integer range 2..7; type TR_Auto is record marque : string(1..10); modele : string(1..10); nbplaces : T_Places; stock : natural; break : Boolean; end record; A1, A2 : TR_Auto; Rep : character; begin A1:=("CITROEN ","C5 ",5,3,false) ecrire("Marque : "); lire(A2.marque); ecrire("Type : "); lire(A2.modele); ecrire("nbplaces : "); lire(A2.nbplaces); ecrire("stock : "); lire(A2.stock); ecrire("Break ? (o/n) "); lire(Rep); if Rep ='o' then A2.break := true; else A2.break := false; end if; end Garage; Contrôle AP12 03 octobre 2011 3/5 Question 4.2. Ecrire une procédure modif_stock qui augmente ou diminue le nombre de voitures en stock pour une voiture V passée en paramètre suite à la vente ou à l’acquisition. Le paramètre Nb est positif (s’il s’agit de l’acquisition de Nb voitures identiques à V) ou négatif (s’il s’agit de la vente de Nb voitures identiques à V). Remarque : dans le cas d’une vente de Nb voitures identiques à V, on suppose que le stock est suffisant… procedure modif_stock (V : in out TR_Auto; Nb : in integer) is begin V.stock := V.stock + Nb; end modif_stock; En supposant que, dans un programme principal, on ait déjà déclaré et initialisé une variable A de type TR_Auto, quelles instructions faudrait‐il rajouter pour diminuer le stock de 2 voitures identiques à A puis afficher le nouveau stock ? Modif_stock(A,-2) ; Ecrire("Nouveau stock pour cette voiture : ") ; Ecrire(A.stock) ; Question 4.3. Ecrire une fonction booléenne BreakFamilial qui renvoie vrai si une voiture donnée en paramètre a au moins 6 places et est un break. Function BreakFamilial(A : in TR_Auto) return boolean is --{} => {résultat = A a au moins 6 places et est un break} begin Return A.nbplaces >= 6 and A.break ; end FamilialeBerline ; En supposant que dans un programme principal, on ait déjà déclaré et initialisé une variable A de type TR_Auto, quelles instructions faudrait‐il rajouter pour afficher le fait que cette voiture est un break et a au moins 6 places ? if BreaFamilial(A) then Ecrire("Voiture modèle break familial") ; end if; Contrôle AP12 03 octobre 2011 4/5