Planche: 1
Planche: 2
Plan
- Un peu de Java
- Un peu de ML
- Tableaux
- Tri élémentaire
- Graphique
- Tri animé
- Tri Shell
Planche: 3
Types de données
Primitifs: booléens; numériques
boolean; byte, short, int, long, char, float, double
Références: classes, tableaux, nulle
Objet: instance d'une classe ou d'un tableau. Les objets
sont aussi tous instances de la classe générale Object.
Object £ T pour toute classe T
(T est une sous-classe de Object)
Une variable de type T primitif contient des valeurs de
type T.
Une variable de type classe T contient la référence nulle ou une
référence vers un objet de type U ³ T.
Une variable de type tableau de T contient la référence nulle ou une
référence vers tout tableau de U ³ T.
Une variable de type Object contient la référence nulle ou une
référence vers un objet ou vers un tableau.
Planche: 4
Constantes
true false
123 'a' 12.5 314.59e-2 0.27E10}
null
Opérateurs
= > < ! ~ ? :
== <= >= != && || ++ --
+ - * / & | ^ % << >> >>>
+= -= *= /= &= |= ^= %= <<= >>= >>>=
Planche: 5
Variables et durée de vie
Variable de classe (avec le mot-clé static), créée
quand la classe est chargée, disparait quand la classe est déchargée.
Variable d'instance (sans le mot-clé static),
créée avec l'objet dont elle est un champ, disparait avec l'objet
quand il n'est plus référencé.
Elément d'un tableau, créé avec le tableau et disparait
quand il n'est plus référencé.
Paramètre de fonctions/méthodes, créé à l'appel de la
méthode, prend la valeur de l'expression passée, disparait à la fin de
l'exécution de la méthode.
Paramètre de traitement d'exception, créé quand l'exception est
attrapée par catch, disparait à la fin du traitement de l'exception.
Variable locale: créée quand on exécute la déclaration,
disparait à la fin du bloc correspondant.
Planche: 6
Exemples
class Date {
int j; // jour j, m, a variables d'instance
int m; // mois
int a; // annee
Date (int jour, int mois, int annee) {
j = jour; // jour, mois, annee, paramètres
m = mois;
a = annee; // equals, toString variables d'instance
}
public boolean equals (Date d) {
return j == d.j && m == d.m && a == d.a;
}
public String toString () {
return j + "/" + m + "/" + a;
}
Planche: 7
Tableaux
int a[] = new int[20];
int lg = a.length;
static void initialisation (int a[]) {
for (int i = 0; i < a.length; ++i)
a[i] = (int) (Math.random() * 100);
}
int[] b = new int[20]; écriture aussi autorisée
a[i] pour obtenir le i+1ème élément de a
a[i] = v pour le modifier.
Les tableaux à 2 dimensions sont des tableaux 1D de tableaux 1D, avec
la facilité d'écriture.
int a[][] = new int[20][20];
Planche: 8
Types de données en ML
Primitifs: booléens, numériques, caractères, vide
boolean; int, float, char, unit
Non primitifs: n-uplets, enregistrements, variants, tableaux
Constantes
true false
123 12.5 314.59e-2 0.27E10 'a' ()
[| 1;2 |] {x=20; y=10} [ 1;2;3 ] (1,2)
tableaux, enregistrements, listes, paires
Planche: 9
Opérateurs
+ * / mod +. -. *. /. entiers, flottants
land lor lsl lsr lxor
|| && < <= <> = > >= <. <=. <>. =. >. >=.
:: @ == != := ! ^
La fonction associée à un opérateur s'obtient en tapant l'opérateur
entre parenthèses. Son type est obtenu par:
(||) ;;
- : bool -> bool -> bool = <fun>
(=) ;;
- : 'a -> 'a -> bool = <fun>
où 'a (lire a) est une variable de type. (Le type de = est dit polymorphe)
Le modificateur <- est une construction syntaxique (et non
un opérateur).
Planche: 10
Enregistrements
On déclare le type d'un enregistrement.
type date = {j: int; m: int; d: int};;
let bastille = {j=14; m=7; a=1789};;
let berlin = {j=11; m=11; a=1989};;
berlin.j, berlin.m, berlin.a pour obtenir les champs.
(On peut aussi utiliser le filtrage qu'on verra plus tard).
bastille.j <- 13 pour modifier un champ modifiable.
Un exemple d'enregistrement avec un champ modifiable est celui des
références (au sens de ML):
type 'a ref = { mutable contents: 'a }
ref, !, :=, incr, decr pour construire, accèder au contenu, ou
modifier le contenu d'une variable de type 'a ref
Exercice: donner la définition de ref, !, :=, incr, decr.
Planche: 11
Tableaux
let a = Array.make 20 0;;
let lg = Array.length a;;
let initialisation a =
for i = 0 to Array.length a - 1 do
a.(i) <- Random.int 100;
done;;
let a = Array.init 20 (function i -> Random.int 100);;
a.(i) pour obtenir le i+1ème élément de a
a.(i) <- v pour le modifier.
Array.make_matrix 10 10 0 crée une matrice 100× 100
remplie de zéros.
Planche: 12
Tri
Un tableau contient N nombres ai (0 £ i <N), on veut les
trier dans l'ordre croissant (" i " j i<j Þ
ai < aj).
La bible: Knuth vol3, Sorting and Searching, The art of Computer
Programming, Addison Wesley 1973.
Tri sélection
Tri bulle
Tri insertion
Tri Shell
QuickSort
Tri Fusion
Tri par tas
Tri des mécanographes (radix)
...
Autrefois (années 60), il y avait des trieuses. IBM.
Exercice: trouver une ou deux méthodes
Planche: 13
Recherche du minimum dans un tableau
static int min (int a[]) {
r = Integer.MAX_VALUE;
for (i=0; i < a.length; ++i)
if ( a[i] < r )
r = a[i];
return r;
}
let min a =
let r = ref max_int in
for i=0 to Array.length a - 1 do
if a.(i) < !r then
r := a.(i)
done;
!r;;
On fait N comparaisons (si N est la longueur du tableau). Le
nombre total d'opérations est O(N). Cet algorithme est linéaire (en
temps), il a une complexité linéaire.
Planche: 14
Le tri par insertion
let tri_insertion a =
let j = ref 0 in
for i = 1 to Array.length a - 1 do
let v = ref a.(i) in
begin
j := i;
while !j > 0 && a.(!j - 1) > !v do
a.(!j) <- a.(!j - 1);
decr j
done;
a.(!j) <- !v;
end
done;;
val tri_insertion : 'a array -> unit = <fun>
Complexité?
Planche: 15
Le tri par insertion en Java
static void triInsertion(int a[]) {
int j, v;
for (int i = 1; i < N; ++i) {
v = a[i]; j = i;
while (j > 0 && a[j-1] > v) {
a[j] = a[j-1];
--j;
}
a[j] = v;
}
}
Complexité?
Planche: 16
Le tri Shell [D. L. Shell 1959]
static void triShell() {
int h = 1; do h = 3*h + 1; while ( h <= N );
do {
h = h / 3;
for (int i = h; i < N; ++i)
if (a[i] < a[i-h]) {
int v = a[i], j = i;
do {
a[j] = a[j-h];
j = j - h;
} while (j >= h && a[j-h] > v);
a[j] = v;
}
} while ( h > 1);
}
Pas plus que O(N3/2) comparaisons !!
Bon pour de gros fichiers (celui du noyau Maple)
Planche: 17
Quelques primitives graphiques
// constantes graphiques
static int epsilonX, epsilonY, pasX, pasY, x0, y0;
static int background, foreground, hilite, hilite2;
static MacLib gc;
static void ouvrirGraphique (int n, int valeurMax) {
Rect r = new Rect();
gc = new MacLib();
gc.initQuickDraw();
int sizeX = Math.min(500, (n+5) * 10);
int sizeY = Math.min(400, (valeurMax+5) * 5);
r.left = 10; r.right = (short)(r.left + sizeX);
r.top = 10; r.bottom = (short)(r.bottom + sizeY);
gc.setDrawingRect(r);
epsilonX = Math.max(7, sizeX / (n + 3));
epsilonY = Math.max(20, sizeY / valeurMax);
pasX = Math.max (1, (sizeX - 2 * epsilonX) / n);
pasY = Math.max (1, (sizeY - epsilonY) / valeurMax);
x0 = epsilonX; y0 = sizeY - epsilonY;
foreground = gc.redColor; background = gc.Whitecolor;
hilite = gc.blueColor; hilite2 = gc.yellowColor;
}
Planche: 18
Graphique en Java -- suite
static void tracerElement (int v[], int i, int color) {
int xi = x0 + i * pasX;
int yi = y0 - v[i] * pasY;
gc.foreColor (color);
Rect r = new Rect();
gc.setRect(r, xi, yi, xi+pasX, y0);
gc.paintRect (r);
}
La documentation sur Maclib se trouve en
Informations diverses sur la page Web du cours
http://w3.edu.polytechnique.fr/informatique/
Cette bibliothèque est une version simplifiée de AWT. En outre, elle
est compatible avec la même bibliothèque en C, Pascal ou ML; elle
existe sur stations Unix et sur MacIntosh.
Planche: 19
Graphique en Caml
open Graphics;;
type repere = {x0:int; y0:int; pas_x: int; pas_y: int;
epsilon_x: int; epsilon_y: int};;
let hilite = blue and hilite2 = yellow;;
let bg = background and fg = red;;
let ouvrirGraphique n valeurMax =
open_graph "";
let e_x = max 7 (size_x() / (n+3)) in
let e_y = max 20 (size_y() / valeurMax) in
{x0 = e_x;
y0 = e_y;
pas_x = max 1 ((size_x() - 2 * e_x) / n);
pas_y = max 1 ((size_y() - e_y) / valeurMax);
epsilon_x = e_x;
epsilon_y = e_y};;
Planche: 20
Graphique en Caml -- suite
let tracerElement xy v i color =
let xi = xy.x0 + i * xy.pas_x in
let yi = v.(i) * xy.pas_y in
set_color color;
fill_rect xi xy.y0 xy.pas_x yi;;
La documentation sur
le graphique
de Caml se trouve dans le
manuel
utilisateur en ligne que l'on trouve en
Informations diverses sur la page Web du cours
http://w3.edu.polytechnique.fr/informatique/
Planche: 21
Exercices en TD
This document was translated from LATEX by HEVEA.