sujet-2015

Transcription

sujet-2015
Algorithmique 1
Ensimag - 1A
Janvier 2015
Durée : 3h
Machines électroniques interdites
recto-verso
document autorisé : une feuille manuscripte
Les deux parties du sujet sont indépendantes.
Veuillez respecter les notations introduites dans l’énoncé. Il est inutile de paraphraser
l’énoncé dans vos réponses, mais des explications avec dessins sur votre code sont les bienvenues. Vous devez répondre aux questions du sujet en écrivant des procédures et fonctions
itératives. Le barème est donné à titre indicatif.
1
Le Vichy à la française (7 points)
Le tissu Vichy se construit par un tissage bicolore de fils. Classiquement, une des couleurs est le blanc ; l’autre le noir (figure 1), le rouge, le jaune ou le vert. Plus précisément,
le Vichy résulte de l’alternance régulière de bandes de fils à la fois en vertical et en horizontal. Par exemple, 10 fils noirs puis 10 fils blancs puis 10 fils noirs, etc. Le croisement de
fils colorés de même couleur résulte en la perception d’une couleur intense (par exemple,
le noir sur la figure 1) ; le croisement d’un fil coloré et d’un fil blanc renvoie une couleur
plus modérée (le gris sur la figure 1) ; le croisement de fils blancs restitue un blanc franc.
Le cadre de modélisation est le suivant :
— on dispose d’un type énuméré Couleur défini de la manière suivante :
type Couleur is (Blanc, Noir, Rouge, Jaune, Vert);
— le croisement de deux fils est modélisé par le type Tissage
type Tissage i s record
-- Couleur du fil horizontal , blanc par d é faut
CoulH : Couleur := Blanc ;
-- Couleur du fil vertical , blanc par d é faut
CoulV : Couleur := Blanc ;
end record ;
— un foulard carré Vichy est modélisé par le type
type Foulard is array(Positive Range <>, Positive Range <>) of Tissage;
Les deux intervalles d’indices sont de même longueur.
1
NbBandes × LgBande
LgBande
Figure 1 – Exemple de tissu Vichy (9 bandes)
— une configuration est définie par les informations suivantes :
— LgBande : Positive qui modélise le nombre de fils par bande unicolore ; les
bandes sont toutes de même largeur ;
— NbBandes : Positive qui modélise le nombre de bandes sur un côté de tissu
donné ;
— CouleurTissage : Couleur range Noir..Vert stocke la couleur non blanche
utilisée pour le tissu
L’exercice consiste à tisser un foulard Vichy dans une couleur donnée. On remarquera,
dans le type Tissage, l’initialisation des deux couleurs CoulH et CoulV à blanc.
1.1
Configuration du tissage
Il vous est demandé de bien lire les questions de cette section pour avoir un code simple
et clair. Notemment grâce à l’utilisation de fonctions et procédures utilitaires annexes.
1. (1 point) Définissez un type Ada permettant de stocker une configuration.
2. (1 point) Écrire une procédure Get(C : out Couleur) qui récupère une couleur saisie
sur l’entrée standard. On supposera que l’utilisateur tape une seule lettre (b, n, r, j
ou v). Nous ne vous demandons pas de gérer ici d’exceptions mais par contre on pose
comme contrainte de ne pas utiliser de conditionnelles.
3. (2 points) Écrire la procédure ConfigurerTissageManu(C : out Configuration) qui
place la configuration du tissage sous le contrôle de l’utilisateur :
— Le logiciel invite l’utilisateur à initialiser la largeur de bande (LgBande), le nombre
de bandes (NbBandes) puis la couleur du tissage (CouleurTissage) ;
— Le logiciel affiche alors la configuration saisie et demande à l’utilisateur de confirmer, modifier ou abandonner sous forme d’une lettre ’c’, ’m’, ou ’a’;
— En cas de confirmation, la procédure se termine ;
— En cas de modification, l’initialisation est renouvelée ;
— En cas d’abandon, une erreur est levée. La procédure affiche à l’utilisateur un
message d’abandon et lève l’exception ECHEC MANU.
Page 2
1.2
Tissage
1. (2 points) Écrire une procédure Tisser(Tissu : out Foulard ; Config : Configuration)
qui remplit un Foulard à partir d’une Configuration. Votre procédure devra être
simple et claire, de préférence utilisant des fonctions ou procédures annexes.
2. (1 point) Écrire le programme principal, demandant la configuration à l’utilisateur
puis remplissant un Foulard.
Page 3
2
AM-STRAM-GRAM (13 points)
AM-STRAM-GRAM est un jeu classique en école élémentaire. Pour y jouer, les enfants
forment une ronde, choisissent l’un d’eux comme premier, commencent à compter à partir
de ce premier et sortent le k eme de la ronde. L’enfant suivant devient le premier et on
recommence jusqu’à ce qu’il n’y ait plus d’enfants. La variante ici imaginée alterne un
comptage un tour en avant, un coup en arrière comme illustré dans la figure 2.
2
3
2
1
4
3
2
1
8
5
7
3
1
5
7
8
5
7
6
6
6
Figure 2 – Trois tours de jeu, k = 4
Voici le cadre de la modélisation :
type Enfant ;
type EnfantPtr i s a c c e s s Enfant ;
type Enfant i s record
Numero : Natural := 0; --0 pour la sentinelle
Prec : EnfantPtr := n u l l ; -- chainage double
Suiv : EnfantPtr := n u l l ;
end record ;
type Ronde i s record
Sentinelle : EnfantPtr ;
NbEnfants : Integer := 0;
end record ;
Une ronde est une liste circulaire, doublement chaı̂née, triée par ordre croissant des
numéros, contenant une sentinelle. La sentinelle a le numéro zéro qui n’est utilisé par
aucun enfant.
Dans ce exercice, ne pas oublier de libérer la mémoire lorsque des données deviennent
inutiles.
1. (1 point) Écrire une procédure NouvelleRonde(R : out Ronde) qui crée et initialise
une nouvelle ronde.
2. (3 points) Écrire une procédure AjouterEnfant(R: in out Ronde; N: in Positive)
qui ajoute l’enfant numéro N à la bonne place dans la ronde (triée par ordre croissant
de numéro).
3. (1 point) Écrire une procédure permettant de retirer un enfant de la ronde. Sa signature est la suivante :
procedure RetirerEnfant(R: in out Ronde; E: in EnfantPtr)
4. (2 points) Nous allons maintenant écrire une fonction qui permet de trouver le prochain enfant à éliminer. Pour cela, nous utiliserons les types suivants:
Page 4
2
3
2
1
4
1
8
5
4
7
8
5
6
7
6
Figure 3 – Variante question 6, deux tours de jeu, k = 4
type Sens i s ( Avant , Arriere );
type Situation i s record
EnfantCour : EnfantPtr ;
SensCour : Sens ;
K : Positive ;
end record ;
Voici la signature de la fonction attendue :
function Suivant(S: Situation) return EnfantPtr
5. (3 points) Écrire la procédure de jeu Jouer qui sort les enfants les uns après les autres
à partir de l’enfant numéro Premier pour un K donné en alternant des parcours en
avant et en arrière. Sa signature est :
procedure Jouer (R : in out Ronde; Premier : Positive ; K : Positive)
6. (2 points) Nous nous intéressons maintenant à une variante du jeu. On itère désormais
sur les enfants en faisant un pas en avant puis deux pas en arrière puis trois pas en
avant... Le déroulement d’un tour est explicité sur la figure 3.
Proposez une nouvelle fonction function Suivant(S: Situation) return EnfantPtr
passant sur tous les enfants en fonctionnant en temps linéaire (en k). Vous pouvez
modifier la structure Situation.
7. (1 point) Comment pourriez vous modifier le programme afin d’éviter les redondances de code dues au parcours dans deux sens différents de la ronde ? (Il n’est
pas nécessaire d’écrire le code, une explication détaillée suffit. Vous avez le droit de
proposer des modifications dans le code fourni).
Page 5