DEUG MIAS M2


Examen - 5 septembre 1997 - 3 heures



Note : aucun document autorisé.

[Corrigé de l'examen]



Problème (12 points)

On veut écrire un programme qui contrôle l'affichage de l'heure sur une montre à affichage digital. Chaque chiffre est représenté par 7 segments numérotés de 1 à 7 selon le schéma ci-dessous.

1. Définir un type abstrait Afficheur constitué de :

2. Réaliser le type abstrait Afficheur en utilisant le type concret suivant :

Etat = (on, off)
Afficheur = tableau [1 .. 7] de Etat
 

L'élément d'indice i du tableau indique si le segment de numéro i est allumé. Le tableau dont les valeurs sont {off, on, on, on, off, on, off} correspond ainsi à l'affichage du chiffre 4.

3. Spécifier et réaliser l'action Eteint qui éteint tous les segments d'un afficheur.

4. On considère le type concret Symbole suivant qui permet de représenter tous les symboles affichables sur un afficheur :

Symbole = tableau [1 .. 7] de entier
 

Les éléments du tableau sont les numéros des segments à allumer pour représenter un symbole sur l'afficheur (par exemple un chiffre). Les éléments du tableau qui ne sont pas utilisés valent 0. Tous les éléments non nuls sont au début du tableau. Ainsi, le symbole 4 est représenté par un tableau dont les éléments ont pour valeur {2 3 4 6 0 0 0} ou {2 4 3 6 0 0 0}, mais pas {0 2 3 4 0 6 0}.

Expliquer la différence entre les types Afficheur et Symbole. Spécifier et réaliser l'action AfficheSymbole qui affiche un symbole sur un afficheur.

5. On souhaite pouvoir afficher aisément les 10 chiffres sur un afficheur. Déclarer un tableau chiffres tel que chiffres[i] soit le symbole décrivant le chiffre i, et donner ses valeurs initiales.

Spécifier et réaliser l'action Afficher (a:Afficheur; n:entier) qui affiche le chiffre n (0 <= n <= 9) sur l'afficheur a.

6. Spécifier un type abstrait Montre qui permette l'affichage de l'heure sur une montre grâce à 4 afficheurs. Un constructeur initialise la montre à 12h00, une opération affiche une heure sur les afficheurs et une autre opération retourne l'heure courante de la montre. On pourra utiliser le type Heure, produit des types 0..24 et 0..60.

7. Donner le type concret permettant de réaliser cette montre et réaliser le type abstrait avec ce type concret.

8. Spécifier la fonction TicTac qui incrémente l'heure courante d'une montre d'une minute et affiche la nouvelle heure sur la montre, et la réaliser sous forme de procédure.

Exercice (5 points)

On considère un langage impératif de type Pascal. On veut étendre l'instruction d'affectation de façon à pouvoir affecter deux valeurs à deux variables de façon simultanée. On note cette affectation de la façon suivante :

a, b := e1, e2
 

e1 et e2 sont des expressions, a et b des variables. Les expressions sont évaluées, puis la valeur de e1 est affectée à a et la valeur de e2 est affectée à b.

1. Indiquer les valeurs des variables a, b, c, d après chacune de ces affectations doubles :

a, b := 1, 2
c, d := b, a + b
a, b := b, a
c, d := c - d, d - c
 

2. Donner la sémantique de l'affectation double à l'aide des fonctions Env et Mem qui définissent respectivement l'environnement et la mémoire et de la procédure d'évaluation d'une expression Val. Expliquer pourquoi l'affectation double
a, b := e1, e2 est différente de deux affectations a := e1; b := e2.

3. Les nombres de Fibonacci sont les nombres de la suite fn définie comme suit :

f0 = 0 ; f1 = 1 ; fn = fn-1 + fn-2 pour n > 1

Spécifier et réaliser la fonction qui calcule le n-ième nombre de Fibonacci sans utiliser d'appel récursif. On utilisera l'affectation double, avec deux variables u et v dont les valeurs sont successivement f0 et f1, f1 et f2, f2 et f3, ..., fn-1 et fn.

Ecrire un réalisation sur le même principe mais sans utiliser l'affectation double et comparer les deux réalisations.

Question de cours (3 points)

Définir la notion de portée d'une variable dans un langage impératif. Donner les règles de portée du langage Pascal. Expliquer le terme de "masquage d'une déclaration" et l'illustrer d'un exemple.


Michel Beaudouin-Lafon, mbl@lri.fr