Vous êtes sur la page 1sur 7

Faculté de Lettres, Traduction et Communication

Département des sciences de l’information et de la communication

stic-b-455 “Algorithmes et programmation II”


Joël Goossens

Examen de première session


Année académique 2021–2022

Remarque préliminaire

Nous vous demandons de répondre pour chaque question sur des feuilles différentes. Veuillez
bien indiquer votre numéro de matricule, nom, prénom ainsi que le numéro de la question
sur chaque feuille.

Question 1 (1/3 des points)


Considérons les déclarations suivantes :
1 class Car {
2 color c;
3 int xpos;
4 int ypos;
5 int xspeed;
6 Car(){ //Constructor
7 c = color(random(255));
8 xpos = int(random(width));
9 ypos = int(random(height));
10 xspeed = int(random(10));
11 }
12 }
13
14 int num_items = 100;
15 Car[] unsorted = new Car[num_items];
16
17 for (int i=0; i<num_items; i++) {
18 unsorted[i] = new Car();
19 }

Nous vous demandons le code des fonctions partition(int lo, int hi) et QuickSort←-
(int lo, int hi) afin de trier le tableau d’objets unsorted par la méthode récursive du
tri rapide vu au cours.
Le critère de tri sera basé sur la distance des objets (coordonnées xpos et ypos) par rapport
à l’origine (de coordonnées (0,0)).
Dans votre solution vous devez utiliser la fonction processing dist(x1, y1, x2, y2) qui
retourne la distance qui sépare le point (x1, y1) du point (x2, y2).

1/7
Solution

1 int partition(int lo, int hi){


2 Car pivot, tmp; // Adaptation: échange des objets !
3 int i,j;
4 pivot = QuickSorted[hi];
5 i = lo;
6 for (j=lo; j<hi; j++){
7 if (dist(0,0,unsorted[j].xpos,unsorted[j].ypos) < dist(pivot.←-
xpos,pivot.ypos))
8 // Adaptation : le critère de tri est la distance à l'origine
(0,0)
9 {
10 // on échanges des objets
11 tmp = QuickSorted[i];
12 QuickSorted[i] = QuickSorted[j];
13 QuickSorted[j] = tmp;
14 i++;
15 }
16 }
17 tmp = QuickSorted[i];
18 QuickSorted[i] = QuickSorted[hi];
19 QuickSorted[hi] = tmp;
20 return i;
21 }

Remarque : le fonction quickSort reste elle inchangée par rapport à la version du cours !

Question 2 (1/3 des points)


Soient des fichiers csv qui ont la structure suivante :
1 nom, prenom
2 Dupond, Josiane
3 Brugman, George
4 Durand, Renée
5 Dupond, Pierre
6 Brugmann, Isabelle

Nous demandons d’écrire la fonction processing

boolean homonyme(String filename)

qui reçoit le nom du fichier (nous supposons que ce fichier respecte la structure décrite ci-
dessus) et qui renvoie true si le fichier possède des homonymes (c’est-à-dire des personnes
qui portent le même nom dans le fichier) ou false dans le cas contraire.

Solution

Remarque : le “setup” n’était pas demandé ; on pouvait aussi admettre une solution qui
commence par trier la table.

2/7
1 void setup(){
2 size(10,10);
3 if (homonyme("test.csv"))
4 println("ok");
5 else
6 println("ko");
7 }
8
9 boolean homonyme (String filename){
10 Table table = loadTable(filename, "header");
11 boolean res = false;
12 for (int i=0;i<table.getRowCount()-1;i++){
13 String name1 = table.getString(i,"nom");
14 for (int j=i+1;j<table.getRowCount();j++){
15 String name2 = table.getString(j,"nom");
16 if (name1.compareTo(name2)==0)
17 res = true;
18 }
19 }
20 return res;
21 }

3/7
Question 3 (1/3 des points)
Soit le code processing à la page suivante, qui produit des dessins du type :

Nous demandons de créer une classe MyLine qui permet de simplifier le code principal, de
sorte que les lignes
1 int[] lengths = new int[N];
2 int[] widths = new int[N];
3 int[] colors = new int[N];
4 int[] growingSpeeds = new int[N];
5 float[] alphas = new float[N];

deviennent MyLine[] lines = new MyLine[N]


Il faut donc écrire cette classe et modifier dans le code existant tous les endroits où on
manipule ces lignes (initialisation, dessin et réaction aux touches). Par exemple, au lieu du
code qui dessine une ligne, on s’attend plutôt à voir lines[i].draw();

Concentrez-vous d’abord sur l’écriture de la classe en identifiant bien les attributs néces-
saires et les méthodes pertinentes, changez ensuite le code principal avec l’utilisation de
cette classe. Attention, on préfère utiliser des méthodes pour interagir avec les objets de la
classe, plutôt que de manipuler directement les attributs.

4/7
1 int N = 30;
2 int MIN_LENGTH = 30;
3 int MAX_LENGTH = 250;
4
5 int[] lengths = new int[N];
6 int[] widths = new int[N];
7 int[] colors = new int[N];
8 int[] growingSpeeds = new int[N];
9 float[] alphas = new float[N];
10
11 void setup() {
12 size(500, 500);
13
14 // Initialization
15 for (int i = 0; i < N; i++) {
16 lengths[i] = int(random(MIN_LENGTH, MAX_LENGTH));
17 widths[i] = int(random(3, 10));
18 colors[i] = int(random(50, 256));
19 growingSpeeds[i] = int(random(1, 6));
20 alphas[i] = i * TWO_PI / N;
21 }
22 }
23
24 void draw() {
25 background(0);
26 translate(width/2, height/2);
27 fill(255);
28 ellipse(0, 0, 20, 20);
29
30 for (int i = 0; i < N; i++) {
31 pushMatrix();
32 rotate(alphas[i]);
33 stroke(colors[i]);
34 strokeWeight(widths[i]);
35 line(0, 0, 0, lengths[i]);
36 popMatrix();
37 }
38 }
39
40 void keyPressed() {
41 if (keyCode == UP) {
42 for (int i = 0; i < N; i++) {
43 if (lengths[i] < MAX_LENGTH) { // Increase line length
44 lengths[i] += growingSpeeds[i];
45 }
46 }
47 } else if (keyCode == DOWN) {
48 for (int i = 0; i < N; i++) {
49 if (lengths[i] > MIN_LENGTH) { // Decrease line length
50 lengths[i] -= growingSpeeds[i];
51 }
52 }
53 }
54 }

5/7
Solution

Une solution avec un constructeur sans paramètre qui initialise lui-même les attributs est
également possible.
— Tab principal
1 int N = 30;
2 int MIN_LENGTH = 30;
3 int MAX_LENGTH = 250;
4
5 MyLine[] lines = new MyLine[N];
6
7 void setup() {
8 size(500, 500);
9
10 // Initialization
11 for (int i = 0; i < N; i++) {
12 int l = int(random(MIN_LENGTH, MAX_LENGTH));
13 int w = int(random(3, 10));
14 int c = int(random(50, 256));
15 int growingSpeed = int(random(1, 6));
16 float alpha = i * TWO_PI / N;
17 lines[i] = new MyLine(l, w, c, growingSpeed, alpha);
18 }
19 }
20
21 void draw() {
22 background(0);
23 translate(width/2, height/2);
24 fill(255);
25 ellipse(0, 0, 20, 20);
26
27 for (int i = 0; i < N; i++) {
28 // Draw line
29 lines[i].draw();
30 }
31 }
32
33 void keyPressed() {
34 if (keyCode == UP) {
35 for (int i = 0; i < N; i++) {
36 // Increase line length when applicable
37 lines[i].grow();
38 }
39 } else if (keyCode == DOWN) {
40 for (int i = 0; i < N; i++) {
41 // Decrease line length when applicable
42 lines[i].shrink();
43 }
44 }
45 }

6/7
— Tab pour la classe MyLine
1 class MyLine {
2 int l;
3 int w;
4 int c;
5 int growingSpeed;
6 float alpha;
7
8 MyLine(int l, int w, int c, int growingSpeed, float alpha) {
9 this.l = l;
10 this.w = w;
11 this.c = c;
12 this.growingSpeed = growingSpeed;
13 this.alpha = alpha;
14 }
15
16 void draw() {
17 pushMatrix();
18 rotate(alpha);
19 stroke(c);
20 strokeWeight(w);
21 line(0, 0, 0, l);
22 popMatrix();
23 }
24
25 void grow() {
26 if (l < MAX_LENGTH) {
27 l += growingSpeed;
28 }
29 }
30
31 void shrink() {
32 if (l > MIN_LENGTH) {
33 l -= growingSpeed;
34 }
35 }
36 }

7/7

Vous aimerez peut-être aussi