Académique Documents
Professionnel Documents
Culture Documents
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.
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
Remarque : le fonction quickSort reste elle inchangée par rapport à la version du cours !
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];
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