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