Licence Informatique 3 e année Langages de Programmation II
Examen - 07/06/2007 - 2h00
Les notes de cours et de TD sont autorisées. Il sera tenu compte pour la notation de la qualité de rédaction et de la lisibilité des copies. Le barême est donné à titre indicatif.
1 Bulle (10 points)
Soit la définition de type suivante :
type BSTab is array(Integer range <>) of Integer;
1. Écrire une procédurebubbleSortprenant en paramètre unBSTabet qui le trie par la méthode du tri à bulle (Rappel : le tri à bulle consiste à pousser le plus grand élément en dernière position du tableau et à recommencer en omettant le dernier élément).
2. Proposer (et écrire!) une solution pour pouvoir gérer des tableaux d’in- dices entiers mais contenant n’importe quel type d’élément. Indiquez les modifications à apporter à la procédurebubbleSort.
2 Dates (10 points)
On veut pouvoir gérer des dates représentées par un numéro de jour, un mois et une année. On donne la spécification partielle suivante :
1 package Date is
2 type Année is new Integer range -9999..9999;
3 type Mois is (Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Aout, Septembre,Octobre,Novembre,Décembre);
4 type Jour is new Integer range 1..31;
5 DateOutOfBounds : Exception;
6 procedure creerDate(d : out Date;a : in Année; m : in Mois; j : in Jour);
7 – incrémente le jour et au besoin le mois 8 procedure incrementeJour(d : in out Date);
9 – incrémente le mois et au besoin l’année
1
10 procedure incrementeMois(d : in out Date);
11 – incrémente l’année, peut lancer une DateOutOfBounds 12 – si la dernière année du type Année est dépassée 13 procedure incrementeAnnée(d : in out Date);
14 function toString(d : Date) return String;
15 private
16 ...
17 end Date;
1. Compléter la spécification du paquetageDateen indiquant les lignes où vous insérez du code.
2. Écrire le corps de la procédure incrementeAnnéeet celui de la fonction toString.
3. Écrire la spécification du paquetage DateComplete, sous-paquetage du paquetageDate, ajoutant au type Datele nom du jour en définissant un typeDateCompletequi hérite deDateet inclut le nom du jour (modifier si nécessaire le paquetageDate).
4. Écrire le corps du paquetageDateCompleteen redéfinissant les procédures nécessaires à la prise en compte du nom du jour.
2
Bulle
Question 1.1 :
procedure bubbleSort(t : in out BSTab) is k : Integer;
i : Integer := t’LAST - 1;
begin
loop1 : while i > t’FIRST loop loop2 : for j in t’FIRST..i loop
if t(j+1) < t(j) then k := t(j+1);
t(j+1) := t(j);
t(j) := k;
end if;
end loop loop2;
i := i - 1;
end loop loop1;
end bubbleSort;
Question 1.2 : generic
type Element is private;
with function "<" (e1 : Element;e2 : Element) return Boolean;
package BubblesortG is
type BSTab_g is array(Integer range <>) of Element;
procedure bubbleSort(t : in out BSTab_g);
end BubblesortG;
with Ada.Text_IO;with Ada.Integer_Text_IO;
use Ada.Text_IO;use Ada.Integer_Text_IO;
package body BubblesortG is
– AJOUTER ICI LA PROCEDURE bubbleSort DE LA QUESTION 1.1 – EN METTANT COMME PARAMETRE UN BSTab_g ET AVEC k:Element;
end BubblesortG;
Dates
Question 2.1 :
Il faut ajouter entre les lignes 5 et 6 : type Date is tagged private;
Il faut ajouter dans le bloc private (ligne 16) : type Date is tagged record
année_d : Année;
mois_d : Mois;
jour_d : Jour;
end record;
3
Question 2.2 :
procedure incrementeAnnée(d : in out Date) is begin
if d.année_d = Année’LAST then raise DateOutOfBounds;
else d.année_d := d.année_d + 1; end if;
end incrementeAnnée;
function toString(d : Date) return String is begin
return Jour’IMAGE(d.jour_d) & " " & Mois’IMAGE(d.mois_d) & " " &
Année’IMAGE(d.année_d);
end toString;
Question 2.3 :
package Date.DateComplete is
type Jour_Nom is (Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche);
type DateComplete is new Date with private;
procedure creerDate(d : out DateComplete;a : in Année; m : in Mois;
j : in Jour; n : in Jour_Nom);
procedure incrementeJour(d : in out DateComplete);
function toString(d : DateComplete) return String;
private
type DateComplete is new Date with record jour_dn : Jour_Nom;
end record;
end Date.DateComplete;
Question 2.4 :
package body Date.DateComplete is
procedure creerDate(d : out DateComplete;a : in Année; m : in Mois;
j : in Jour; n : in Jour_Nom) is begin
creerDate(Date(d),a,m,j);
d.jour_dn := n;
end creerDate;
procedure incrementeJour(d : in out DateComplete) is begin
incrementeJour(Date(d));
if d.jour_dn = Jour_Nom’LAST then d.jour_dn := Jour_Nom’FIRST;
else d.jour_dn := Jour_Nom’SUCC(d.jour_dn); end if;
end incrementeJour;
function toString(d : DateComplete) return String is begin
return Jour_Nom’IMAGE(d.jour_dn) & " " & toString(Date(d));
end;
end Date.DateComplete;
4