Cours - USTM - 2017 Programmation Et Algorithmique
Cours - USTM - 2017 Programmation Et Algorithmique
ALGORITHMES ET PROGRAMMATION
DIEU-DONNÉ OKALAS-OSSAMI
DÉPARTEMENT MATH-INFO
(ANNÉE ACADÉMIQUE 2016-2017)
Déroulement
Lundi
(20/03/17
)
Déroulement
INTRODUCTION
• ALGORITHMIQUE
• PROGRAMMATION
Introduction
Généralités
Problème du logiciel:
Taille
Coût : développement et maintenance
Fiabilité
Solutions :
Modularité
Réutiliser le logiciel
Certification
Comment?
Introduction
Objectifs généraux
Objectifs de ce cours
A la programmation JAVA
Pourquoi programmer ?
• Gamelan
http://www.gamelan.com
I. Introduction et historique
Introduction
Généralités
Problème du logiciel:
Taille
Coût : développement et maintenance
Fiabilité
Solutions :
Modularité
Réutiliser le logiciel
Certification
Comment?
Pourquoi programmer ?
I. Survol du chapitre
Survol du chapitre
• Qu’est-ce que Java ?
• La plateforme Java
La Java Virtual Machine
Les interfaces de programmation d’application (API)
• Objectif
Langage sûr (fortement typé)
MyProgram.c
MyProgram.o
010110…
MyProgram.java
MyProgram.class
010110…
Nous allons commencer par découvrir comment créer des variables dans la
mémoire. Pour cela, il faut les déclarer. Une déclaration de variable se fait comme
ceci :
types simples ou types primitifs, en Java, ce sont tout bonnement des nombres
entiers, des nombres réels, des booléens ou encore des caractères, et vous allez
voir qu'il y a plusieurs façons de déclarer certains de ces types.
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
Variables
JOUR 1
class Sdz1 {
public static void main(String[] args) {
//Notre objet Scanner
Scanner sc = new Scanner(System.in);
}while(reponse == 'O');
//Fin de programme
}
Application HelloWorld
• Créer un fichier texte : HelloWorld.java
• Règle de bonne pratique : 1 classe par fichier et 1 fichier par classe
public static void main (String[]args) Tout programme doit contenir une méthode
{ main qui porte la signature ci-contre
System.out.println("Hello the World");
Écrire à l’écran “Hello the World”
}
} Fermer les accolades
class body
Les textes entre « /** » et « */ » sont utilisés pour créer des commentaires que
l’exécutable JAVADOC pourra traiter afin de produire une documentation (cf.
documentation de l’API Java)
/** Commentaires destinés
à la documentation */
Référence: Adresse
Chart Title
Integral Floating
Textual Logical
• Déclaration et initialisation :
int int x=12;
short short x= 32; (short x=33000; // Hors limite)
long long x= 200L; // Nombre accolé à un L
byte byte x=012; // Nombre commençant avec un 0
double double x=23.2323;
float float x= 23.233F; // Nombre accolé à un F
char char c=‘a’; char c=‘\u0061’; char c=(char)97;
boolean boolean b=true;
int a = 5;
Déclaration et initialisation de 2 entiers: a et b
int b = 8;
Référence: Adresse
• Opérateurs logiques:
Opérateur Usage Renvoie TRUE si
&& expr1 && expr2 expr1 et expr2 sont vraies
& expr1 & expr2 Idem mais évalue toujours les 2 expressions
|| expr1 || expr2 Expr1 ou expr2, ou les deux sont vraies
| expr1 | expr2 idem mais évalue toujours les 2 expressions
! ! expr1 expr1 est fausse
!= expr1 != expr2 si expr1 est différent de expr2
if (expression)
{
//instructions
}
if (expression)
{
//instructions
}
else
{
//instructions dans les autres cas
}
switch (number)
{
case 1 : instructions;
case 2 : instructions; break;
default : instructions;
}
Exemples:
for (int i=0 ; i<10 ; i++) {
System.out.println("The value of i is : " + i);
}
Boucle infinie:
while (true) {
//instructions
}
Introduction à la POO INFO 114
Instructions et structures de contrôle
Structures de contrôle
• BREAK / CONTINUE
if (i==7) break outer; // if i=7, you jump outside the loop and continue
System.out.println(«The value of i,j is :»+i+ «,»+j);
}
Exemple:
• Créer et initialiser une matrice contenant deux tableaux de 2 et 3 points respectivement
• Créer 5 objets de type « Point »
• Affecter ces 5 objets aux 5 éléments de la matrice
p4 = new Point(13,18);
p5 = new Point(14,19); 12,17 dy0adfc14 p3 [1]
matriceDePoints[0][0] = p1; [0]
matriceDePoints[0][1] = p2; ox0fdfc17 p4 [1]
13,18
matriceDePoints[1][0] = p3; [2]
matriceDePoints[1][1] = p4;
14,19 ox0agrc57 p5
matriceDePoints[1][2] = p5;
• Etudiants EX 3.3
Vous recevez une à une les notes de vos N étudiants (/10). N est donné par
l’utilisateur au début.
Notez pour chaque étudiant s’il réussit ou échoue et, à la fin, indiquez le
nombre de ceux qui échouent, le nombre de ceux qui réussissent, la moyenne
totale et les deux moyennes de ceux qui échouent et réussissent
EX 3.4
• NameTest
Analyser la classe NameTest
Observer la méthode main et la façon dont elle récupère les arguments
Recherche, Tri
ALGORITHMES
TRI ET RERCHERCHE
TRI
RECHERCHE
154
ALGORITHMES
TRI PAR SÉLECTION
TRI
o PAR SÉLECTION
o TRIS PAR INSERTION
o TRI A BULLES
o LE TRI RAPIDE OU QUICKSORT
RECHERCHE
o RECHERCHE SÉQUENTIELLE
o RECHERCHE DICHOTOMIQUE
o RECHERCHE PAR INTERPOLATION
155
ALGORITHMES
TRI
o PAR SÉLECTION
o TRIS PAR INSERTION
o TRI A BULLES
o TRI RAPIDE OU QUICKSORT
156
ALGORITHMES
157
ALGORITHMES DE TRI
UTILITÉ:
➢ Les algorithmes de tri servent principalement à ordonner les données, mais ils participent
aussi à la conception d’autres algorithmes, comme les recherches, en organisant
préalablement les données.
➢ Les algorithmes de tri ne sont pas tous équivalents, et certains sont spécifiques aux
données numériques, ce qui les rend inopérants dans d’autres contextes.
o Certains effectuent un tri sur place, c’est-à-dire dans le même espace mémoire,
alors que d’autres utilisent un espace supplémentaire pour y copier les données
triées.
158
ALGORITHMES DE TRI
UTILITÉ:
Deux catégories d’algorithmes étudiés dans ce cours: les tris élémentaires et les tris
avancés.
➢ Les tris élémentaires se basent sur des méthodes simples, que l’on retrouve parfois dans
la vie courante, comme la classification d’une pile de chèques par le déplacement de
chaque chèque à sa position finale.
➢ Les tris avancés s’appuient sur des méthodes plus sophistiquées, qui nécessitent une
organisation particulière des données ou une programmation spécifique, comme l’appel de
fonctions récursives
159
ALGORITHMES DE TRI
➢ L’inversion de deux valeurs est souvent employée dans les algorithmes de tri.
160
ALGORITHMES DE TRI
Le tri par sélection est basé sur DEUX BOUCLES POUR (FOR) imbriquées:
➢ La DEUXIÈME BOUCLE
o recherche la plus petite valeur de la position courante (compteur de la première boucle), à
la fin du tableau
o puis l’inverse avec la position courante. La partie gauche de la liste est triée au fur et à
mesure de l’avancement de la première boucle.
161
ALGORITHMES DE TRI
162
ALGORITHMES DE TRI
/* localisation du minimum */
Pour j variant de i+1 à nb-1 Faire
Si (Tab[j] < Tab[IndMin]) Alors
IndMin ← j
FinSi
FinPour
Si (IndMin <> i) Alors
// inversion
k ← Tab[i] // étape 1
Tab[i] ← Tab[IndMin] // étape 2
Tab[IndMin] ← k // étape 3
FinSi
FinPour
Fin
163
ALGORITHMES
164
ALGORITHMES DE TRI
Pour organiser son jeu, le joueur prend chaque carte et l’insère à sa place en décalant les autres.
Ce type de tri peut être effectué sur place, ou bien utiliser un deuxième espace mémoire qui reçoit
les données triées.
Le tri par insertion n’est pas le plus performant pour un grand ensemble de données, mais il devient
intéressant quand il faut insérer une seule donnée dans un ensemble déjà trié.
165
ALGORITHMES DE TRI
Pour organiser son jeu, le joueur prend chaque carte et l’insère à sa place en décalant les autres.
Ce type de tri peut être effectué sur place, ou bien utiliser un deuxième espace mémoire qui reçoit
les données triées.
Le tri par insertion n’est pas le plus performant pour un grand ensemble de données, mais il devient
intéressant quand il faut insérer une seule donnée dans un ensemble déjà trié.
166
ALGORITHMES DE TRI
Le tri par insertion utilise le processus élémentaire d’insertion d’un élément dans
la liste des valeurs:
1. Décalage vers la droite des données situées à droite de la position d’insertion en partant de la
fin, pour libérer la case d’insertion.
2. La dernière case est copiée dans la case suivante, puis c’est au tour de l’avant-dernière case, et
de proche en proche, on remonte jusqu’à la case à libérer.
167
ALGORITHMES DE TRI
168
ALGORITHMES DE TRI
TRI PAR INSERTION
Pseudo-code
Procédure Tri_insertion(Tab, nb)
Déclarations
Paramètre Tab en Tableau[20] d’Entiers
Paramètre nb en Entier
Variables
i, j, val en Entier
Début
// boucle de traitement
Pour i variant de 0 à nb-1 Faire
val ← Tab[i]
// boucle de déplacement des éléments de gauche
plus petits
j←i
Tant que ( (j > 0 ) ET (val < Tab[j-1]) ) Faire
Tab[j] ← Tab[j-1]
j ← j-1
FinTantQue
169
ALGORITHMES
TRI A BULLE
170
ALGORITHMES DE TRI
TRI A BULLES
Le tri à bulles propose une approche assez déroutante. On peut même se demander
comment la méthode proposée aboutit au tri des données.
Ce tri fait partie des grands classiques des cours d’algorithmique, à l’instar du tri par insertion.
Il est construit à partir de deux boucles imbriquées qui évoluent en sens inverse l’une de l’autre, et
d’un processus d’inversion des éléments successifs qui ne sont pas ordonnés.
171
ALGORITHMES DE TRI
TRI A BULLES
1ère Boucle régresse de la fin du tableau vers le début (la figure présente la deuxième itération de cette boucle).
2ème Boucle interne progresse du début du tableau jusqu’à la case pointée par le
premier compteur (celui de la boucle principale). À l’intérieur de cette deuxième
boucle, qui ne gère que la partie gauche du tableau, on compare les éléments situés
dans les deux cases successives, et on les inverse s’ils ne sont pas dans l’ordre.
La 1ère valeur (9) est plus grande que la deuxième (5), donc on les inverse.
Ensuite, on compare la deuxième valeur (qui est 9 à la suite de la première inversion)
avec la troisième (12).
Elles sont dans l’ordre, donc on ne les inverse pas. On effectue le même traitement
avec le troisième élément (12) et le quatrième (45), qui sont déjà ordonnés.
Le quatrième élément (45) est inversé avec le cinquième (4).
Le cinquième élément (45 à la suite de l’inversion précédente) est inversé avec le
sixième (3).
Le sixième élément (45 à la suite de l’inversion précédente) est inversé avec le
septième (41).
La boucle interne s’arrête enfin, car la partie gauche du tableau (du début jusqu’à la
case indiquée par l’indice de la première boucle) a été totalement parcourue. La
boucle interne a pour effet de faire remonter vers la fin du tableau les éléments de
poids fort.
La figure montre que la valeur 45 remonte jusqu’à la fin du tableau et vient se « coller » à la partie droite déjà triée. Quand la boucle
interne est terminée, la boucle principale effectue une nouvelle itération en régressant d’une case, ce qui fait passer le dernier élément
(la valeur 45) dans la partie droite du tableau, qui ne contient que les données à leur place finale. La boucle interne est à nouveau
déroulée sur la partie gauche du tableau, moins une case, et le processus recommence
ALGORITHMES DE TRI
TRI A BULLES
Pseudo-code
174
ALGORITHMES DE TRI
Le tri rapide, aussi appelé quicksort, est probablement l’algorithme de tri le plus employé de tous.
Il possède trois qualités fondamentales : il est performant dans de nombreux cas, il effectue un tri sur place,
donc sans allouer d’espace mémoire supplémentaire, et
il est facile à écrire.
L’algorithme de base a été découvert par C.A.R. Hoare en 1960. Il a depuis reçu quelques petites
modifications qui améliorent encore ses performances.
175
ALGORITHMES DE TRI
176
ALGORITHMES DE TRI
177
ALGORITHMES DE TRI
Un algorithme qui se base sur une valeur aléatoire pour tendre vers un comportement «idéal» est appelé
algorithme probabiliste.
Le pivot peut donc être choisi au hasard parmi les valeurs à trier. Mais il existe une meilleure technique
appelée partitionnement par la médiane des trois, qui consiste à prendre au hasard trois valeurs parmi
les valeurs à trier, à les ordonner, puis à prendre la valeur médiane comme pivot. Ce type d’optimisation
se justifie dès que le nombre de données est important.
179
ALGORITHMES
TP
Ecrire en Java les algorithmes de Tri vus en cours.
Le programme demandera à l’utilisateur:
• de saisir les données à trier
• de choisir l’algorithme à utiliser.
180
ALGORITHMES
ALGORITHMES DE RECHERCHE
181
ALGORITHMES
RECHERCHE
RECHERCHE
o RECHERCHE SÉQUENTIELLE
o RECHERCHE DICHOTOMIQUE
o RECHERCHE PAR INTERPOLATION
182
ALGORITHMES
RECHERCHE SÉQUENTIELLE
183
ALGORITHMES DE RECHERCHE
RECHERCHE SÉQUENTIELLE
La recherche séquentielle est une méthode élémentaire qui Fonction recherche_séquentielle(tab,nb,valrech)
consiste à comparer la clef recherchée à toutes les autres clefs. Déclarations
Paramètre tab en Tableau[20] d’Entiers
Rechercher une valeur entière dans une liste d’entiers se résume à Paramètres nb, valrech en Entier
Variables i en Entier
• parcourir chaque élément de la liste, et à
Variable trouvé en Booléen
• vérifier s’il s’agit de l’élément recherché.
Constante NON_TROUVÉ = -1
Début
Dans cet exemple, la clef et la donnée sont confondues. i←0
trouvé ← FAUX
La boucle utilisée dans une recherche séquentielle est une boucle // boucle de recherche
TANT QUE avec un double critère d’arrêt : Tant que ( ( NON trouvé) ET (i < nb)) Faire
• on s’arrête quand on a trouvé la donnée ou Si (tab[i] = valrech) Alors
• quand on atteint la fin de la liste. trouvé ← VRAI
Sinon
Voici la fonction recherchant une valeur dans une liste de valeurs i ← i+1
entières contenues dans un tableau. Les paramètres sont: FinSi
• le tableau des données (tab), FinTantQue
• le nombre d’éléments dans le tableau (nb) et
Si (trouvé = VRAI) Alors
• La valeur recherchée (valrech).
retourner i
Sinon
Cette fonction retourne le numéro de la case du tableau dans retourner NON_TROUVÉ
laquelle se trouve la donnée, ou –1 (représenté par la constante FinSi
NON_TROUVÉ) si elle n’est pas trouvée. Fin
184
ALGORITHMES
RECHERCHE DICHOTOMIQUE
185
ALGORITHMES DE RECHERCHE
RECHERCHE DICHOTOMIQUE
Dès que le nombre de données devient important, la recherche Fonction recherche_dichotomique(tab,début,fin,valrech)
séquentielle n’est plus envisageable. Déclarations
Paramètre tab en Tableau[20] d’Entiers
• Cet algorithme est basé sur le principe de «diviser pour Paramètres début, fin, valrech en Entier
résoudre». On divise l’ensemble de recherche en deux sous- Variables milieu, résultat en Entier
ensembles égaux. Constante NON_TROUVÉ = -1
Début
• On détermine ensuite dans quel sous-ensemble doit se trouver
milieu ← (début + fin) DIV 2
la clef de recherche, puis on poursuit la recherche dans ce Si (valrech=tab[milieu]) Alors
sous-ensemble. résultat ← milieu
Le préalable à cette méthode de recherche est de disposer d’un
ensemble trié de données, car la détermination du sous-ensemble Sinon Si (début >= fin) Alors
dans lequel se poursuit la recherche se fait par comparaison entre résultat ← NON_TROUVÉ
la valeur recherchée et les valeurs de début et de fin du sous-
Sinon Si (valrech < tab[milieu]) Alors
ensemble. résultat ←
La recherche dichotomique est récursive dans son approche, mais recherche_dichotomique(tab,début,milieu-
il est aussi possible d’avoir une version itérative. 1,valrech)
Sinon
La version récursive présentée travaille sur le tableau d’entiers résultat ←
utilisé comme exemple dans la recherche séquentielle. Chaque recherche_dichotomique(tab,milieu+1,fin,va
appel de la fonction indique les bornes de lrech)
l’intervalle de recherche (début, fin) dans le tableau de données FinSi
(tab). retourner résultat
Fin
Le paramètre valrech correspond à l’entier recherché. L’opérateur
DIV renvoie le quotient de la division entière.
186