Vous êtes sur la page 1sur 56

Algorithmes et structures de donnes

Patrick Reuter
matre de confrences
http://www.labri.fr/~preuter

Droulement

CM mardi de 11h15 12h15 TD/TP en alternance


- Groupe YB (Yonel Blanc) le mardi de 16h15 17h45 - Groupe PR (Patrick Reuter) le mercredi de 18h30 20h00

Motivation

Niklaus Wirth, ETH Zuerich, 1976


Algorithms + Data Structures = Programs

Motivation
8.168.684.336 pages

Comment a marche ?

Motivation
Structure de donne:

p.ex. fantme - couleur - position - direction - aggressif ou pas ?


Algorithmes:

p.ex. mettre a jour le meilleur score

Motivation
Structure de donne:

- tableau a 2 dimension

Algorithmes: - surtout I.A.

Motivation
Structure de donne :

File

FIFO (First In First Out) Aussi: File priorit

Motivation
Structure de donne :

Pile
LIFO (Last In First Out)

Motivation
Structure de donne :

Arbre (pour llimination des parties caches)

Motivation
Structure de donne :

Graphe (pour plannifier des trajets)

Algorithme
Dfinition Wikipedia (12/9/2005) L'algorithmique est la science des algorithmes, visant tudier les oprations ncessaires la ralisation d'un calcul. Ren Descartes dans le Discours de la Mthode : diviser chacune des difficults que j'examinerois, en autant de parcelles qu'il se pourroit, et qu'il seroit requis pour les mieux rsoudre. . Un algorithme est une mthode de rsolution de problme nonce sous la forme d'une srie d'oprations effectuer. La mise en uvre de l'algorithme consiste en l'criture de ces oprations dans un langage de programmation et constitue alors la brique de base d'un programme informatique (implmentation, codage ) L'algorithme devra tre plus ou moins dtaill selon le niveau d'abstraction du langage utilis ; autrement dit, une recette de cuisine doit tre plus ou moins dtaille en fonction de l'exprience du cuisinier.

Structure de donnes
Dfinition Wikipedia (12/9/2005) une structure logique destine contenir des donnes afin de leur donner une organisation permettant de simplifier leur traitement. Exemple : On peut prsenter des numros de tlphone *

- par dpartement, - par nom - par profession (pages jaunes), - par numro tlphonique (annuaires destins au tlmarketing), - par rue et/ou - une combinaison quelconque de ces classements. chaque usage correspondra une structure d'annuaire approprie.

Ingrdients dalgorithmes
Variables : nombre y i patrick x1

Mais non pas : 3x entre

Ingrdients dalgorithmes
Affectation Condition/Comparaison Appel de fonction Structure de contrle
Branchements conditionnels (multiples) Boucles

Bloc dinstruction

Ingrdients dalgorithmes
Affectation a := 7; score := 0; score := score + 100; gameover := FAUX; - Note:
- Affectation dune seule variable avec un valeur. - La variable affecter figure gauche, la valeur droite Faux: a+b := 6; 7 := c;

Ingrdients dalgorithmes
Condition/Comparaison
a=7 absent = FAUX malade = VRAI OU vacances = VRAI score > highscore;

- Note:
- Le rsultat dune condition/comparaison peut tre uniquement soit VRAI, soit FAUX

Ingrdients dalgorithmes
Appel de fonction, p.ex. afficher( Bonjour tout le monde ); resultat := racine_carre(16);

Ingrdients dalgorithmes
Structure de contrle
Branchements conditionnels
SI <condition> ALORS
<bloc dinstructions>

SINON
<bloc dinstructions>

Ingrdients dalgorithmes
Structure de contrle
Branchements conditionnels
SI <condition> ALORS <bloc dinstructions> SINON <bloc dinstructions>

Exemple: SI (score>meilleur_score) ALORS meilleur_score := score;

Ingrdients dalgorithmes
Structure de contrle
Branchements conditionnels
SI <condition> ALORS <bloc dinstructions> SINON <bloc dinstructions>

Exemple: SI (score>meilleur_score) ALORS meilleur_score := score;

En PASCAL : IF (score>meilleur_score) THEN meilleur_score := score;

Ingrdients dalgorithmes
Structure de contrle
Branchements conditionnels multiples CAS mois DE 1': nom := Janvier ; 2': nom := Fvrier ; 3': nom := Mars ; 4': nom := Avril ; 5': nom := Mai ; . 12': nom := Dcembre ; AUTREMENT afficher('Erreur dans le mois') ; FIN CAS;

Ingrdients dalgorithmes
Structure de contrle
Boucle

Dfinition : Suite dinstructions qui peut tre excut plusieurs fois (itration)

Ingrdients dalgorithmes
Structure de contrle
Boucle

TANT QUE <condition> FAIRE <bloc dinstructions> FIN TANT QUE ou FAIRE <bloc dinstructions> TANT QUE <condition>

Ingrdients dalgorithmes
Structure de contrle
Boucle TANT QUE <condition> FAIRE <bloc dinstructions> FIN TANT QUE

Exemple : Afficher les nombres entiers dont le carr est infrieur 100. nombre := 1; TANT QUE (nombre*nombre<100) FAIRE afficher(nombre); nombre := nombre + 1; FIN TANT QUE

Faire tourner un algorithme

nombre := 1; nombrecarre := nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre := nombre + 1; nombrecarre := nombre * nombre; FIN TANT QUE
Chaque variable une colonne nombre

nombrecarre

nombre := 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre := nombre + 1; nombrecarre := nombre * nombre; FIN TANT QUE
Chaque instruction une ligne nombre 1

nombrecarre

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre 1

nombrecarre

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre 1

nombrecarre

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre 1

nombrecarre

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre 1

nombrecarre

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre 1

nombrecarre

2
4

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre 1

nombrecarre

2
4

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre

nombrecarre

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre

nombrecarre

nombre = 1; nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; nombrecarre = nombre * nombre; FIN TANT QUE

nombre

nombrecarre

Ingrdients dalgorithmes
Structure de contrle
Boucle
FAIRE <bloc dinstructions> TANT QUE <condition>

Ingrdients dalgorithmes
Structure de contrle
Boucle
FAIRE jouer(); afficher( Voulez vous rejouer (O/N) ? ); prendreDuClavier(charactere); TANT QUE (caractere= "O" OU caractere = "o");

Ingrdients dalgorithmes
Structure de contrle
Boucle POUR
POUR variable de valeur valeur FAIRE <bloc dinstructions> FIN POUR

Ingrdients dalgorithmes
Structure de contrle
Boucle POUR

POUR variable de valeur valeur FAIRE <bloc dinstructions> FIN POUR

Exemple
POUR i:=1 10 FAIRE afficher(i); afficher(i*i); FIN POUR

FAIRE TOURNER un algorithme


Exemple: Tester si un nombre est premier Stratgie: Supposer que le nombre est premier jusqu on a trouv un diviseur. FONCTION estPremier(nombre) estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; FIN TANT QUE FIN FONCTION

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre estPremier Diviseur resultat

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat := testSiPremier(9); Nombre 9 estPremier Diviseur resultat

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre % diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3
FAUX

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX;
diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3 4

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX;
diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3 4

FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3 4
FAUX

FONCTION testSiPremier(nombre) estPremier := VRAI;

Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3 4

FONCTION testSiPremier(nombre) estPremier = VRAI;

Diviseur = 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS
estPremier = FAUX; diviseur = diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION

EXEMPLE: resultat = testSiPremier(9); Nombre 9 VRAI estPremier Diviseur resultat

2 3 4
FAUX