Corrigé

Transcription

Corrigé
Examen écrit de juin 1998
Corrigé
1.
1.1.1
Donne A si z est un diviseur de x, B sinon, erreur si z==0
1.1.2
Donne A si y représente exactement x/z, (p.ex. 3.5/8.0); B sion (p.ex. 1.0/3.0)
1.1.3
Donne B, sauf si b == 1 (a/1 + a%1 == a)
1.1.4
Donne A si epsilon ≥ 0 et le rapport | epsilon/x | < précision de la représentation (p.ex. 10-7 pour
les flottants 32 bits), donne B sinon (p.ex. si x = 1.0 et epsilon = 10–25.
Erreur fréquente: donne B seulement si epsilon < 10-309.
1.2
Il faut additionner entre eux des nombres de même ordre de grandeur.
((((x2+x5)+x1)+x4)+x0)+x3.
2.1
eq. 1.1: La hauteur d’une image de largeur a et de hauteur b est b.
eq. 1.2: Peindre un pixel ne change pas la hauteur de l’image.
eq. 1.3: Inverser une image ne change pas sa hauteur.
eq. 2.1: Peindre le pixel (u, v) de couleur k donne la couleur k à ce pixel et ne change pas la couleur des autres pixels.
eq. 2.2: La couleur d’un pixel (u, v ) dans l’inverse d’une image et la couleur du pixel (u, H-1v) de l’image originale, où H est la hauteur de l’image.
Erreur fréquente: donner une interprétation opérationnelle des équations, du genre : “on peint un
objet puis on demande sa couleur”. Ne pas oublier qu’il s’agit d’équivalences.
2.2
a) <==> 7124 par 2.1
b) <==> 3243 par 2.1 • 2.1
c) <==> new Image(6,6).couleur(5, 6) par 2.1 • 2.1
d) <==> 6 par 1.2 • 1.2 • 1.1
e) <==> 111 par 2.2 • 1.2 • 1.2 • 1.1 • 2.1
2
Erreur typique:
new Image(6,6).peindre(1,1,45321).peindre(2,3,7124).couleur(2,3)
<==> new Image(6,6).peindre(1,1,45321).7124 (par 2.1)
- d’une part cette formule est syntaxiquement fausse (il existe aussi la variante avec +7124)
- d’autre part la formule 2.1 dit
i.peindre(u, v, k).couleur(u', v') <==> k si u=u' et v=v' ...
dans notre cas i=(new Image(6,6).peindre(1,1,45321)), u=u'=2, v=v'=3, k=7124, donc la seule
chose qui reste est 7124 (c-à-d k).
2.3
i.verticale(x, c).couleur(u,v) <==> c si u = x, i.couleur(u, v) sinon
i.verticale(x, c).hauteur() <==> i.hauteur()
i.verticale(x, c).inverseHB() <==> i.inverseHB().verticale(x, c) [redondant]
3.1
Il faut un type collection qui conserve l’ordre dans lequel on place le éléments (≠ Ensemble, ≠
Fonction) et qui permet d’accéder à n’importe quel élément et d’insérer un élément n’importe
où (≠ Pile, ≠ File). Les types Liste ou tableau conviennent, bien que tableau soit moins pratique
pour l’insertion.
3.2
float perimetre()
int p = 0;
int n = sommets.longueur();
for (int i = 0; i < n-1; i++) {
s = sommets.element(i); t = sommets.element(i+1);
p += s.distance(t);
}
s = sommets.element(n-1); t = sommets.element(0);
p += s.distance(t);
return p
}
Rem. On peut aussi l’écrire avec un itérateur, ce qui est un peu plus compliqué mais parfois
plus efficace dans une implémentation réelle, p.ex. si la liste est une liste liée.
void ajouterSommetApres(Sommet s, int i) {
sommets.inserer(s, i);
}
3.3
Il faut utiliser le type Fonction, dans ce cas une fonction de String vers Polygone. Etant donné un nom la fonction fournit directement le polygone correspondant. Avec le type ensemble il
3
faut au contraire faire un parcours de tous les éléments, à l’aide d’un itérateur, pour trouver le
polygone qui porte le nom recherché.
Remarque. Personne n’a trouvé la réponse.
4.
Il faut simplement ajouter un compteur à l’algorithme de parcours en profondeur et incrémenter celui-là chaque fois qu’on rencontre s1.
classe Graphe {
...
Ensemble visites;
int compteur;
parcourirDepuis(Sommet s, Sommet s1) {
pour chaque s' dans adjacents(s){
si (s' == s1) { compteur++; retour }
si (s' n’appartient pas à visites) {
visites.ajouter(s');
parcourirDepuis(s', s1);
}
}
}
testNbChemins(Sommet s0, Sommet s1) {
visistes = {};
compteur = 0;
parcourirDepuis(s0, s1);
si (compteur == 1) retourne “1” sinon retourne “plus”
}
Remarque. La première partie de l’algorithme donné au cours n’était pas nécessaire car on
ne s’intéresse qu’aux parcours depuis s0 et le graphe est supposé connexe.