Examen écrit de structures de données

Transcription

Examen écrit de structures de données
Examen écrit de structures de données
G. Falquet, C.-L. Mottaz Jiang, semestre d’été 2001
Tous les documents sont autorisés
Durée : trois heures
Note maximum : 7 (toutes les questions valent 1 pt)
Ecrivez vos réponses directement sur l'énoncé
NOM :
_________________
PRENOM : _________________
1. Nombres entiers
On considère une machine dans laquelle les entiers sont représentés sur 14 bits en complément à
deux.
Pour chacune des expressions ci-dessous, trouvez une valeur de la variable entière x qui rende
l'expression vraie.
1. x > 0 et 8100 + x < 8100
2. x > 0 et 8191 + x = -8192
3. x > 0 et 2 * x < x
4. x > 0 et x * 4096 = 0
5. x * x < 0
2. Nombres flottants
Dans une application comptable écrite en Java, on a décidé d'utiliser le type float pour représenter
des sommes d'argent en francs et centimes.
a. Lors d'un bouclement, on doit additionner 1000 sommes comprises entre 0.01 Fr. et
999'999.99 Fr. Quelle pourra être la différence maximum entre le total exact et le total obtenu
par le programme ? Justifiez votre réponse.
b. Quel type de données faudrait-il choisir et comment faudrait-il l'utiliser pour être absolument sûr
que le résultat soit toujours exact, c'est-à-dire sans aucune imprécision aussi infime soit-elle ?
1/9
NOM: ________________
3. Types abstraits algébriques
On définit un type Spile de la manière suivante:
SPECIFICATION SPile
SORTES pile, elem
OPERATIONS vide : pile;
empiler : elem, pile pile;
depiler : pile pile
sommet : pile elem;
inverser : pile pile
AXIOMES
VAR E, E1, E2 : elem; P : pile
depiler(empiler(E,P)) == P
sommet(empiler(E,P)) == E
inverser(empiler(E1, empiler(E2, P))) == empiler(E2, empiler(E1, P))
Simplifiez au maximum les expressions suivantes en vous servant des axiomes
- a, b, c, etc. sont des constantes de la sorte elem
- P est une variable de la sorte pile
1. sommet(depiler(empiler(c, empiler(a, P))))
2. sommet(inverser(empiler(a, empiler(b, P))))
3. sommet(inverser(inverser(empiler(a, empiler(b, P)))))
4. inverser(empiler(d, inverser(empiler(c, inverser(empiler(b, empiler(a, P)))))))
5. sommet(inverser(empiler(d, inverser(empiler(c, inverser(empiler(b, empiler(a, P))))))))
6. sommet(inverser(depiler(depiler(inverser(empiler(a, empiler(b, empiler(c, P))))))))
2/9
NOM: ________________
3. Types abstraits algébriques (suite)
Expliquez pourquoi toute expression correcte (où on n'essaie pas de dépiler des piles vides, etc.) ne
contenant que les opérations empiler, dépiler et inverser peut être transformée en une expression
équivalente ne contenant que des empiler.
(Facultatif, pour les mordus)
A partir de là démontrez que pour toute pile P
- inverser(inverser(P)) == P
Remarques pour les questions 4, 5, 6 et 7
•
La définition des types Ensemble, Liste, Fonction et Iterateur est donnée en annexe. Pour les
questions 4, 5 et 6, vos solutions devront utiliser uniquement les opérations de ces types.
•
Attention: écrire un algorithme en pseudo-code ne signifie pas écrire un texte vague. Vos
algorithmes doivent être écrits très précisément et être facilement transposables dans un vrai
langage de programmation (un texte en français n’est donc pas suffisant).
3/9
NOM: ________________
4. Ensembles
Intersection d'ensembles
On a au départ deux ensembles A et B. Le but est d'obtenir un nouvel ensemble qui contiendra tous
les éléments communs à A et B.
exemple:
au départ, on a
A = {a, k, o, q, b, c, e, t}
B = {q, g, b, y, u, p, i, t, e}
on devra obtenir pour résultat l'ensemble :
{q, e, t, b}
Ecrivez un algorithme sous forme d'une séquence d'instructions en pseudo-code qui réalise
l'opération ci-dessus. On suppose que les ensembles de départ se trouvent dans des variables A et B
de type Ensemble.
4/9
NOM: ________________
5. Listes
Modification d'une liste
On a au départ une liste que l'on souhaite modifier en remplaçant un ou plusieurs de ses éléments.
On utilise une deuxième liste pour indiquer la position des éléments à remplacer dans la liste de
départ.
exemple :
la variable listeCar contient la liste [a, h, o, a, v, r, k, w, y, j, l ]
la variable listePos contient la liste [2, 5, 7, 9, 10]
remplace(listeCar, listePos, 'H')
doit retourner la liste : [a, h, H, a, v, H, k, H, y, H, H]
c'est-à-dire que l'on remplace les éléments se trouvant aux positions 2, 5, 7, 9 et 10 par le
caractère H
Ecrivez la méthode Liste remplace(Liste depart, Liste Positions, Element
e) sous forme d'une séquence d'instructions en pseudo-code. La méthode reçoit comme paramètres
la liste de départ, la liste des positions des éléments à remplacer et l'élément à utiliser pour le
remplacement.
5/9
NOM: ________________
6. Fonctions
Indexation à l'aide d'une fonction
On a au départ une liste dont certains éléments peuvent apparaître plusieurs fois. Le but est d'obtenir
une fonction qui indiquera pour chaque élément la liste de ses positions dans la liste de départ.
exemple :
si on a au départ on a une liste
L = ["ours", "chat", "chien", "chat", "serpent", "ours"]
on devra obtenir la fonction :
{ ours → [0, 5], chat → [1, 3], chien → [2], serpent → [4] }
Ecrivez un algorithme sous forme d'une séquence d'instructions en pseudo-code qui réalise
l'opération ci-dessus.
6/9
NOM: ________________
7. Arbres
On a un arbre binaire (qui contient des nombres entiers) dont la structure est définie par le type
Arbre ci-dessous :
classe Arbre
// variables d’instance
int valeur ;
// valeur du nœud racine
Arbre gauche ; // sous-arbre de gauche
Arbre droite ; // sous-arbre de droite
On veut répondre à la question : combien l'arbre compte-t-il d'entiers supérieurs à X ?
Écrivez une méthode comptePlusGrand(int x) qui explore l'arbre en profondeur et retourne
le nombre d'entiers plus grands que x contenus dans l'arbre.
exemple :
Si on a l’arbre
12
70
2
140
120
24
8
90
150
70
1
3
11
10
145
comptePlusGrand(50) doit retourner 7.
7/9
Annexes: définition des types
Type Liste d’éléments de type T (un type quelconque)
résultat
opération
paramètres
effet
Liste
new Liste
Liste
insérer
int i, T elem
insère elem à la position i
Liste
remplacer
int i, T elem
remplace le ie élément par elem
Liste
supprimer
int i
supprime l’élément à la position i
T
element
int i
element se trouvant à la position i
int
longueur
longueur de la liste
boolean
estVide
la liste est-elle vide ? (longueur = 0)
crée une liste vide
Type Ensemble d’éléments de type T
résultat
opération
paramètres
description
Ensemble
new Ensemble
booléen
ajoute
Tt
ajoute l’élément t à l’ensemble;
retourne vrai si t a été ajouté et faux si t
était déjà dans l’ensemble
booléen
retire
Tt
retire l’élément t de l’ensemble;
retourne vrai si t a été retiré et faux si t
n’était pas dans l’ensemble
int
cardinalite
cardinalité de l’ensemble
boolean
estVide
l’ensemble est-il vide ?
boolean
appartient
créer un nouvel ensemble vide
Tt
t appartient-il à l’ensemble ?
8/9
Type Fonction
résultat
Fonction
opération
paramètres
new
Fonction
effet
crée une fonction vide
lier
TD d, TA a
ajoute la paire (d  a) à la fonction
TA
delier
TD d
supprime la paire dont l’élément de départ est
d, retourne l’ancienne image de d.
int
cardinalite
cardinalité de la fonction
boolean
estVide
la fonction est-elle vide ?
boolean
estLie
TD d
vrai s’il existe une paire (d =ΚΚΚΦ=(dont d est
la clé)
TA
image
TD d
retourne l’image de d
Type Itérateur sur une collection (ensemble, liste) d’éléments de type T.
résultat
Iterateur
opération
new
Iterateur
paramètres
Collection c
effet
crée un nouvel itérateur sur la collection c
avancer
passe à l’élément suivant
T
courant
fournit l’élément courant de la collection
boolean
encore
vrai s’il reste des éléments à voir
9/9