Académique Documents
Professionnel Documents
Culture Documents
Mr Radouane CHAHIN
3
Définition : Programme informatique
• Un programme correspond à la description d’une méthode de résolution
pour un problème donné.
• Cette description est effectuée par une suite d’instructions d’un langage
de programmation
• Un programme n’est pas une solution en soi mais une méthode à suivre
pour trouver les solutions.
4
Langages informatiques
• Un langage informatique est un code de communication, permettant à un être humain de dialoguer avec
une machine en lui soumettant des instructions et en analysant les données matérielles fournies par le
système.
• Le langage informatique est l’intermédiaire entre le programmeur et la machine.
• Il permet d’écrire des programmes (suite consécutive d’instructions) destinés à effectuer une tache donnée
• exemple : un programme de résolution d’une équation du second degré
• Programmation : ensemble des activités orientées vers la conception, la réalisation, le test et la
maintenance de programmes.
• Deux types de langages:
• Langages procéduraux : Fortran, Cobol, Pascal, C, …
• Langages orientés objets : C++, Java, C#,…
• Le choix d'un langage de programmation n'est pas facile, chacun a ses spécificités et correspond mieux à
certains types d'utilisations
5
L'algorithmique, vous la pratiquez tous les jours et
depuis longtemps...
6
Notion d’algorithme
• Un programme informatique permet à l’ordinateur de résoudre un
problème
• Avant de communiquer à l’ordinateur comment résoudre ce problème, il faut
en premier lieu pouvoir le résoudre nous même
7
Algorithme informatique
• Un algorithme est une suite finie et non-ambiguë d’instructions ayant pour
but de résoudre un problème donné. Ces instructions doivent être
exécutées de façon automatique par un ordinateur.
8
Algorithme informatique: propriété
• Un algorithme doit:
• avoir un nombre fini d’étapes,
• avoir un nombre fini d’opérations par étape,
• se terminer après un nombre fini d’opérations,
• fournir un résultat.
• Chaque opération doit être:
• définie rigoureusement et sans ambiguïté
• effective, c-à-d réalisable par une machine
• Le comportement d'un algorithme est déterministe.
9
Analyse d’algorithmes
Analyser un algorithme = évaluer son efficacité
Efficacité ?
• Temps d'exécution : complexité en temps
• Espace mémoire occupé : complexité en espace
• Qualité du résultat :
• correction : si l’algorithme termine en donnant une proposition de solution,
alors cette solution est correcte.
• complétude : pour un espace de problèmes donné, l’algorithme, s’il termine,
donnera toujours des propositions de solutions.
• Simplicité ….
10
Théorie de la complexité (informatique théorique)
• La théorie de la complexité est un domaine des mathématiques, et plus précisément de l'informatique
théorique, qui étudie formellement la quantité de ressources (en temps et en espace) nécessaire pour la
résolution de problèmes au moyen de l'exécution d'un algorithme. Il s'agit donc d'étudier la difficulté
intrinsèque de problèmes posés mathématiquement.
• L'analyse de la complexité est étroitement associée à un modèle de calcul:
• la machine de Turing, le modèle de calcul le plus utilisé
• la machine RAM (Random Access Machine).
• Mesure de la complexité : Les mesures les plus classiques de la complexité d'un algorithme sont le temps et
l'espace utilisés. D'autre mesures existent, sur les communications par exemple.
• Règle de calcul de la complexité (nombre d’opérations de base): est exprimée sous la forme du nombre
d'opérations effectuées par celui-ci. En général, ce nombre dépend des données d'entrée.
• Nous noterons dorénavant T nomalgo (d) est le nombre d’opérations élémentaires pour exécuter l’algorithme sur
la donnée d’entrée d
• Classes de complexité :
• complexité en temps et en espace: TIME, NTIME, SPACE, NSPACE
• Classes en temps: P, NP, EXPTIME, NEXPTIME
• Classes en espace : L, NL, PSPACE, EXPSPACE 11
Théorie de la complexité : Fonction asymptotique
La famille de notations de Landau O, o, Ω, Θ
Notation Nom Description informelle Lorsque , à partir d'un certain rang...
13
complexité : Ordre de grandeur
• Ordre de grandeur du temps nécessaire à l'exécution d'un algorithme d'un type de complexité
Temps Temps
Temps Temps Temps Temps Temps Temps
pour pour
Temps Type de complexité pour pour pour pour pour pour Problème exemple
n = 10 00 n = 1 000
n=5 n = 10 n = 20 n = 50 n = 250 n = 1 000
0 000
complexité
10 ns 10 ns 10 ns 20 ns 30 ns 30 ns 40 ns 60 ns Dichotomie
logarithmique
complexité linéaire 50 ns 100 ns 200 ns 500 ns 2.5 µs 10 µs 100 µs 10 ms Parcours de liste
complexité quasi-
50 ns 100 ns 200 ns 501 ns 2.5 µs 10 µs 100,5 µs 10 050 µs Triangulation de Delaunay
linéaire
complexité Tris dont le Tri fusion ou le Tri
40 ns 100 ns 260 ns 850 ns 6 µs 30 µs 400 µs 60 ms
linéarithmique par tas
complexité
2.8 heure
quadratique 250 ns 1 µs 4 µs 25 µs 625 µs 10 ms 1s Parcours de tableaux 2D
s
(polynomiale)
complexité cubique 2.7 heure Multiplication matricielle non-
1.25 µs 10 µs 80 µs 1.25 ms 156 ms 10 s 316 ans
(polynomiale) s optimisée.
complexité Problème du sac à dos par force
320 ns 10 µs 10 ms 130 jours ans ... ... ...
exponentielle brute.
Problème du voyageur de
complexité an
1.2 µs 36 ms 770 ans ... ... ... ... commerce (avec une approche
factorielle s
naïve). 14
Classes de complexité :Rappelle mathématique 1/2
• Dans ce cours on va utiliser que la fonction O (Fonction asymptotique la plus petite)
de et à la complexité au pire de cas Tmax.
1. Rappelle mathématique: Propriétés fonction asymptotique
• O(f(n))+O(g(n))=O(f(n)+ g(n))
• O(1)+O(1)+O(1)= O(1)
• O(1)+……+O(1)= O(n)
n fois
• O(n3)>O(n2)>O(nlog(n))>O(n)>O(log(n))
• O(3n3+n2+5)=O(3n3)+O(n2)+O(5)=O(n3)
• f(n) = nlog(n) + 12n + 888 O(n log n)
15
Classes de complexité :Rappelle mathématique 2/2
Rappelle mathématique: raisonnement/
Démonstration
En utilise la Démonstration par déduction pour
démontrer une propriété O(log(n)) ou O(nlog(n)),
Rappel: Raisonnement par déduction / induction
• la déduction serait le procédé de l’esprit qui va du
général au particulier
• Le raisonnement déductif consiste à prouver une
implication du type HC
avec H désigne les hypothèses et C la ou les
conclusion(s).
• Comment faire ? on procède par un chaînage de
déductions logiques :
H C(1) C(2) C(3)……C(n) C
16
Représentation d’un algorithme
• Historiquement, deux façons pour représenter un algorithme:
• L’Organigramme: représentation graphique avec des symboles
(carrés, losanges, etc.)
• offre une vue d’ensemble de l’algorithme
• représentation quasiment abandonnée aujourd’hui
• Le pseudo-code: représentation textuelle avec une série de
conventions ressemblant à un langage de programmation
• plus pratique pour écrire un algorithme
• représentation largement utilisée
17
bon en algorithmique ?
• La maîtrise de l’algorithmique requiert deux qualités, très complémentaires d’ailleurs :
• il faut avoir une certaine intuition, car aucune recette ne permet de savoir a priori quelles
instructions permettront d’obtenir le résultat voulu. C’est là, si l’on y tient, qu’intervient la forme
« d’intelligence » requise pour l’algorithmique. Alors, c’est certain, il y a des gens qui possèdent au
départ davantage cette intuition que les autres. Cependant, et j’insiste sur ce point, les réflexes, cela
s’acquiert. Et ce qu’on appelle l’intuition n’est finalement que de l’expérience tellement répétée que
le raisonnement, au départ laborieux, finit par devenir « spontané ».
• il faut être méthodique et rigoureux. En effet, chaque fois qu’on écrit une série d’instructions qu’on
croit justes, il faut systématiquement se mettre mentalement à la place de la machine qui va les
exécuter, armé d'un papier et d'un crayon, afin de vérifier si le résultat obtenu est bien celui que l’on
voulait. Cette opération ne requiert pas la moindre once d’intelligence. Mais elle reste néanmoins
indispensable, si l’on ne veut pas écrire à l’aveuglette.
• Et petit à petit, à force de pratique, vous verrez que vous pourrez faire de plus en plus souvent l’économie
de cette dernière étape : l’expérience fera que vous « verrez » le résultat produit par vos instructions, au
fur et à mesure que vous les écrirez. Naturellement, cet apprentissage est long, et demande des heures
de travail patient. Aussi, dans un premier temps, évitez de sauter les étapes : la vérification méthodique,
pas à pas, de chacun de vos algorithmes représente plus de la moitié du travail à accomplir... et le gage de
vos progrès.
18
Organisez-vous
Pour bien réfléchir, il faut être dans de bonnes conditions. En particulier, il faut éviter de perdre du temps à
retrouver sur quelle page on a écrit le premier exemple, il vaut mieux gommer des lignes que les rayer dans
tous les sens, et c'est pratique de laisser dans la marge des petites notes pour s'y retrouver entre les
différentes phases de recherche de la solution. Pour être dans de bonnes conditions :
1. Prenez un porte-mine et une gomme. C'est très pratique de gommer, ça permet d'améliorer une partie
de ce qu'on a écrit sans tout recopier.
2. Prenez une grande feuille toute blanche. Trouvez du papier qui ne se froisse pas quand on le gomme
plusieurs fois.
3. Notez le nom de l'exercice et le numéro de la page en haut de chacune des feuilles utilisées pour
l'exercice, afin de vous y retrouver plus tard. L'idéal est d'avoir une grande feuille double.
4. Marquez l'heure de début et de fin de chaque phase de recherche dans la marge, pour pouvoir bien
gérer votre temps.
19
Structures algorithmiques
20
De ADN au instruction algorithmique
• Comme L’ADN, qui est en quelque sorte le programme génétique, l’algorithme à la
base de construction des êtres vivants, est une chaîne construite à partir de quatre
éléments invariables. Ce n’est que le nombre de ces éléments, ainsi que l’ordre dans
lequel ils sont arrangés, qui vont déterminer si on obtient une puce ou un éléphant.
21
Algorithmique : Processus de développement
• Processus de développement :
• Conception
• comment développer un algorithme?
• quelles techniques produisent de bons algorithmes?
• Analyse
• étant donné un algorithme, quelles sont ses qualités?
• est-il adapté au problème?
• est-il efficace?
• comment mesurer ses performances?
• Étant donné un problème sans solution évidente, comment peut on le résoudre?
• en considérant les problèmes similaires connus,
• en considérant les solutions analogues - algorithmes - connues,
• en faisant marcher son imagination !!!
22
Clarifier et valider une idée d'algorithme
1. Décrivez vôtres solution en deux ou trois phrases.
2. Trouvez une bonne représentation visuelle de cette solution.
3. Appliquez votre idées sur quelques exemples, en utilisant cette
représentation.
4. Cherchez des contre-exemples à vos idées d'algorithmes.
5. Essayez de déterminer pourquoi l'algorithme fonctionne. Déterminez ses
invariants.
6. Calculez la complexité en temps et mémoire de vos solutions.
7. Ecrivez le pseudo-code de l'algorithme, et essayez de le simplifier.
23
Méthode de résolution des sujets d'algorithmique 1/2
Étapes de la méthode:
1. Lisez le sujet: Ce qui est important est :
1. Ne faites surtout pas de contresens. Si vous comprenez un autre sujet que celui qui est décrit, c'est
foutu. Ne commencez pas à chercher avant d'être sûr d'avoir bien compris le sujet.
2. À la fin, vous devez avoir le sujet entièrement en tête. Il faut vraiment éviter d'y revenir toutes les 30
secondes pendant que vous cherchez une solution.
3. Reformulez le sujet le plus simplement possible, de manière à faire le tri entre les idées clés et le
texte d'enrobage.
2. Résolvez des exemples :En résumé, résoudre des exemples sert à :
1. faire sortir des idées ;
2. déterminer les cas limites (les cas triviaux et les cas pathologiques) ;
3. préparer un support pour tester et déboguer efficacement.
3. Cherchez un algorithme :est détaillé dans la méthode de recherche d'un algorithme
24
Méthode de résolution des sujets d'algorithmique 2/2
Étapes de la méthode(suite):
4. Pseudo-codez l'algorithme et Vérifiez votre solution (crayon et papier)
Ne commencez pas à coder avant d'avoir vérifié que votre algorithme :
1. répond bien au sujet (relire le sujet !),
2. est correct (en particulier qu'il résout bien les exemples que vous avez générés au début, y compris
les cas limites),
3. a bien la complexité que vous pensez (recalculez-là soigneusement),
4. a le pseudo-code le plus simple possible.
5. Codez votre solution et Testez votre solution (logiciel exemple AlgExec ou python):Voici l'ordre
recommandé des exemples à tester :
1. l'exemple du sujet,
2. les exemples résolus entièrement à la main,
3. d'autres exemples générés sur le tas,
4. des exemples de pire cas, dans la mesure du possible
25
Méthode de recherche d'un algorithme 1/4
28
Méthode de recherche d'un algorithme 4/4
7. Changez de point de vue, en envisageant les algorithmes classiques.
Il n'y a pas des millions de types de problèmes différents. On peut en général les classer dans une quinzaine
de catégories. Certains types d'algorithmes apparaissent très souvent. Vous pouvez trouver une liste des
algorithmes les plus utilisés, on va voir dans ce cours:
• Algorithmique des nombres:
• Crible d'Ératosthène
• Algorithme d'Euclide
• Algorithme de tri
• Tri sélection
• Trie bulle
• Trie insertion
• Algorithme de recherche
• dichotomie
• Algorithme optimisation: Algorithme glouton
• Algorithme géométrique
• Fouille de flots de données:
• Fenêtres Glissantes
• Algorithmes d’approximation :méthode de Monte-Carlo 29
Algorithmique : Processus de développement exemple
• Exemple : Algorithme d’Euclide PGCD
Étant donnés deux entiers, retrancher le plus petit au plus grand et recommencer jusqu’à ce que les deux nombres soient
égaux. La valeur obtenue est le plus grand diviseur commun.
• Étape 1 : Écrire proprement l’idée
Prendre les deux nombres et, tant qu’ils ne sont pas égaux, retirer le plus petit au plus grand.
• Étape 2 Algorithme (idée détaillé) : Décrire précisément les étapes
a,b : deux nombres
Répéter tant que a et b sont différents :
si le plus grand est a :
les deux nombres deviennent a−b et b
sinon (b est donc le plus grand) :
les deux nombres deviennent a et b−a
le pgcd est a
Algorithmique : Processus de développement exemple
Étape 3 Algorithme (pseudocode) : Écrire un algorithme formel fonction
Fonction pgdc(a,b : entiers) :entier
tantque a<>b faire
si a>b alors
aa−b
sinon
bb−a
finsi
retourner a
fin
Algorithmique : Processus de développement exemple
Étape 4 : Écrire un programme consiste à traduirel’algorithme dans un langage de programmation
fin
33
Variables
• La première chose à faire avant de pouvoir utiliser une variable est de créer la boîte et de lui coller une étiquette
(identificateur).
• Ceci se fait tout au début de l’algorithme, avant même les instructions proprement dites.
• C’est ce qu’on appelle la déclaration des variables
• La variable doit être déclarée avant d’être utilisée, elle doit être caractérisée par :
• un nom (Identificateur) est un mot : - commençant obligatoirement par une lettre
- ne comportant aucun espace
• un type qui indique l’ensemble des valeurs que peut prendre la variable (entier, réel, booléen, caractère, chaîne
de caractères, …)
• Une valeur: En informatique, une variable possède à un moment donné une valeur et une seule valeur
• Exemple:
variable i, j, k : entier
i
variable x, y : réel
x
variable OK: booléen
variable Ch1, ch2 : chaîne de caractères
• Dans un programme une variable a un identificateur unique
• Conseil Identificateur : pour la lisibilité du code choisir des noms significatifs qui décrivent les données manipulées
34
Type de variable résumé
type Syntaxe caractères ensemble exemples taille en octets
python autorisés de valeurs de valeurs
booléen bool {.vrai., .faux.} .vrai. ou 1 1
{true, false} python .faux. ou 0
chaîne string tout caract. "abcd" Max 255
"67000"
entier int 0 à 9, -, + [-32768..+32767] -152 2
+4560 ou 4560
réel float 0 à 9, -, +, . -3,40x1038 à -1,40x1045 pour -12.3652 4
les valeurs négatives +0.186 ou
1,40x10-45 à 3,40x1038 pour 0.186
les valeurs positives
35
Constante
• Instruction permettant de réserver de l’espace mémoire pour stocker des
données dont la valeur est fixée pour tout l’algorithme
• La déclaration des constants se fait avant la déclaration des variables
• La constantes doit être caractérisée par :
• Un nom (Identificateur)
• valeur
• Dans un programme une constant a un identificateur unique
• Exemple:
constante
PI=3.14
MAX=14
36
Affectation
• L’affectation consiste à attribuer une valeur à une variable (c’est-à-dire remplir ou modifier le contenu d'une zone
mémoire)
• En pseudo-code, l'affectation est notée par le signe ← (logiciel <-)et en python =
V← e : attribue la valeur de e à la variable V
• e peut être une valeur, une autre variable ou une expression
• V et e doivent être de même type ou de types compatibles
• l’affectation ne modifie que ce qui est à gauche de la flèche
• Exemples :(avec i, j, k : entier; x :réel; ok :booléen; ch1,ch2 :chaine de caractères)
i ←1
j ←i
k ←i+j
x ←10.3
OK ←FAUX
ch1 ←"SMI"
ch2 ←ch1
x ←4
• Exemples non valides: i ←10.3
OK ←"SMI"
j ←x
37
i+1 j
Affectation :Expressions et opérateurs
• Opérateurs numériques :
• + : addition
• - : soustraction
• * : multiplication
• / : division
• Parenthèses * et / + et –
• 12 * 3 + 5 et (12 * 3) + 5 valent strictement la même chose.
• En revanche, 12 * (3 + 5) vaut 12 * 8 soit 96
• Opérateur alphanumérique : + concaténer
• Opérateurs logiques (ou booléens) ET, du OU, du NON
38
Affectation :Expressions et opérateurs (résume)
Opérateurs Commentaires Type d'opérandes Type du résultat
+ et - + - tous les langage entier, réel, décimal de l'opérande
non not tous les langage booléen booléen
* multiplication entier, réel, décimal entier, réel, décimal
/ division entier, réel, décimal entier, réel, décimal
DivEnt ( n,d) quotient de division// en python entier, réel, décimal entier
Modulo(n,d) reste d'une division % en python entier, réel, décimal entier
+ concaténation + en python chaîne ou caractère chaîne
+ et - binaire entier, réel, décimal entier, réel, décimal
< <= > >= <> équivalant à != en python tout type
= <>
et AND python booléen booléen
ou OR python booléen booléen
39
Affectation: remarques pour terminer
• Certains langages donnent des valeurs par défaut aux variables déclarées.
Pour éviter tout problème il est préférable d'initialiser les variables déclarées.
• La valeur d’une variable ne change pas jusqu’à une affectation vers cette
variable
• Lors d’une affectation, l’expression de droite est évaluée et la valeur trouvée
est affectée à la variable de gauche. Ainsi, A←B est différente de B←A
• l'affectation est différente d'une équation mathématique
• Les opérations x ← x+1 et x ← x-1 ont un sens en programmation et se nomment
respectivement incrémentation et décrémentation.
• A+1 ← 3 n'est pas possible en langages de programmation et n'est pas équivalente à
A←2
40
Affectation : exemple Instruction ligne A B
variables A, B : Entiers
Début 1 1 -
1) A ← 1 2 1 6
2) B ← 6 3 1 4
3) B ← A + 3
3 3 4
4) A ← 3
Fin
Illustration avec python
Complexité
Tmax = T(ligne1)+ T(ligne2)+ T(ligne3)+ T(ligne4)
= 4 affectation + 1 addition
= 5 ≤constant *1 = O(1)
41
Affectation : exercice 1
• Tracer les valeurs des variables A, B et C après exécution des instructions
suivantes ?
• Variables A, B, C : Entier
Début
A←5 Instruction ligne A B C
B←3
C←A+B 1
A←2 2
C←B–A 3
Fin
4
5
• Calculer complexité?
42
Affectation : exercice 2
• Plus difficile, mais c’est un classique absolu, qu’il faut absolument
maîtriser : écrire un algorithme permettant d’échanger les valeurs de
deux variables A et B, et ce quel que soit leur contenu préalable.
43
solution: exercice 2
• Début
…
C←A
A←B
B←C
Fin
• On est obligé de passer par une variable dite temporaire (la variable
C).
Complexité Tmax=3 affectation
= 3≤constant *1 = O(1)
44
Affectation : exercice 3
• Que produit l’algorithme suivant ?
• Variables A, B, C :Caractère
Début
A ← "423"
B ← "12"
C←A+B
Fin
• A la fin de l’algorithme, C vaudra donc "42312".
Complexité T =3 affectation + 1 concaténation
=4
45
Les instructions de lecture et d’écriture
(I/O standard: clavier/ écran )
• Dans un sens, ces instructions permettent à l’utilisateur de rentrer
des valeurs au clavier pour qu’elles soient utilisées par le programme.
Cette opération est la lecture.
• Dans l’autre sens, d’autres instructions permettent au programme de
communiquer des valeurs à l’utilisateur en les affichant à l’écran.
Cette opération est l’écriture.
46
Syntaxe des instructions d’écriture (I/O standard: écran )
• Syntaxe
afficher Toto
Dans le sens inverse, pour écrire quelque chose à l’écran. on peut utiliser le mot clé : afficher
• Important
afficher peut prendre de un à plusieurs paramètres de n'importe quel type de base. Elle affiche tous les paramètres les uns après
les autres (résultat identique à celui d'une concaténation).
instruction 1 : instruction 3 : instruction 4 :
Algorithme
affichage du texte affichage de la valeur texte et valeur
Remarque :afficher :affiche à l’écran avec un saut de ligne par défaut afficher et pour afficher à l’écran sans saut de ligne il faut
écrire virgule à la fin de l'instruction pour annuler le saut de ligne en algo,
Exemple pour écrire "bonjour tous le monde " en même ligne on peut soit écrire afficher ( "bonjour tous le monde ") ou
afficher ("bonjour "), (équivalent print ("bonjour",end= "" ) en python).
afficher (" tous" ) (équivalent print (" tous" ) en python)
47
Les instructions
Syntaxe saisir nomVariable
de lecture (I/O standard: clavier)
Dès que le programme rencontre une instruction saisir, l’exécution s’interrompt, attendant la frappe d’une valeur au
clavier. Dès lors, aussitôt que la touche Entrée (Enter) a été frappée, l’exécution reprend
instruction 1 : instruction 2 : étape 1 instruction 2 étape 2 instruction 3 : texte
Algorithme
affichage du texte attente action utilisateur affecter la valeur et valeur
51
Instruction plusieurs ligne :bloc instruction
algoc python
si a=0 alors If a==0: • Instruction parente:
inst1 inst1 Bloc instruction 1:
inst2 inst2 Instruction …
• Il faut utiliser les Conditions composées (voir algèbre de Boole) Elif cond2:
inst2
• Facile à vérifier mais demande plus d'effort en exploitation
Inst3
Else:
inst4
54
Tests : exemple inst x y clv écran
• Variable x, y : réel 1 - - Entrez un réel :
Début 2 -2 -2
1) afficher (" Entrez un réel : " ) 34
2) saisir (x) 4 2
3) Si x < 0 alors 47
4) y ← -x
8 la valeur absolue de -2 est: 2
5) Sinon
6) y← x
7) Finsi
8) afficher ("la valeur absolue de ", x, "est:",y) inst x y clv écran
Fin 1 - - Entrez un réel :
Illustration cas 1: 2 3 3
Illustration cas 2: 35
Complexité 6 3
Tmax= 1 comp +max (1,1 aff) +3 I/O 67
8 la valeur absolue de 3 est: 3
=5≤constant *1 = O(1) 55
Tests imbriqués
Variable n : entier
: exemple inst n clv écran
inst n cl écran
1 entrez un nombre :
Début 1 entrez un nombre
1) afficher ("entrez un nombre : ") 2 1 1
2 0 0
2) saisir (n) 35
35
3) Si n < 0 alors 68
67
4) afficher("négatif") positif
710 nul 9
5) Sinon
6) Si n = 0 alors 10 et 11
7) afficher("nul") 10 et 11
ligne cout
8) Sinon
inst n clv écran 1 1
9) afficher("positif")
10) Finsi 1 entrez un nombre 2 1
11) Finsi 2 -3 -3 3 1
Fin 34 4 1
Illustration : Cas1, Cas2, Cas3 411 négatif 5
Complexité 11 6 1
Tmax= 2 I/O + Tmax(si_3à11)= 2 I/O + 1 comp +max(1 I/O, Tmax(si_5à10)) 7 1
= 2 I/O + 1 comp +max(1 I/O, 1 comp + max( 1 I/O, 1 I/O))=3 + max (1, 2)= 5 ≤ constant *1 = O(1) 8
56
9 1
Tests : Organigramme selon non
selon v v=1ou
v=3 non
cas 1,3: oui
instruction 1 Instruction 1 V=2 ou
v=4
cas 2,4: oui
instruction 2 Instruction 2 Instruction3
Autres :
instruction 3 Instruction
Finselon suivant
Illustration: Cas1 ,Cas2, Cas3
Algo Pas d’équivalent en python, mais on utilise if comme suit:
selon v If v==1 or v==3:
cas 1, 3 : print("impaire ")
afficher( "impaire") elif v==2 or v==4:
cas 2 ,4: print("paire ")
afficher (" paire") else:
Cas Autre : print("[1,3]")
afficher ("[1,3]")
finselon
57
Test :instruction selon
Lorsque l’on doit comparer (égalité) une même variable avec plusieurs valeurs, comme par exemple:
1 1
Tests : Organigramme selon 23
4) saisir N 4 4 4
64
Instructions itératives :La boucle Répéter
• La boucle «répéter ... jusqu’à»
Répéter
relance { réaffectation de la (des) variable(s) de} condition
traitement {suite d’instructions}
jusqu’à <expression logique (faux)>
• exécuter une suite d’instructions au moins une fois et la répéter tant qu’une condition est pas remplie
• Remarque: varie selon le langage on peut trouver plusieurs syntaxes et organigrammes:
Faire Ou Répéter
instructions instructions
tantque <expression logique (vrai)> tantque <expression logique (vrai)>
algoc En python Pas équivalent mais en peut utiliser équivalence avec tantque(voir le diapo
répéter équivalence répéter et tantque)
saisir (n) n=1
afficher ("essai négatif !" ) While n>=0:
jusqu’à (n <=0) n=int(input())
print("essai négatif !" )
65
Organigramme répéter…jusqu’à Instruction 1
répéter
instruction1 relance
relance
Jusqu’à booléen (faux)
Calcule complexité Booléen
Exemple non oui
1) R ← 1
2) I ← 1
3) Répéter Instruction 2
4) R ← R*I
5) I ← I+1
6) Jusqu'à I > N inst n R I
l c fois
Le temps d’exécution t(n) de cet algorithme en supposant que:
1 1 1 1 2 1
- N=n
- t1 est le temps d’exécution entre le début et la ligne 2 2 1 1 2 1
- t2 est le temps d’exécution de la comparaison de la ligne 6 34 1
- t3 est le temps d’exécution de l’action de la ligne 4 3
- t4 est le temps d’exécution de l’action de la ligne 5 4 2 n 5 2
- t1, t2, t3, t4 sont des constantes (ne dépendent pas de n) 63
5 2 n
s’écrit: n n
T (n) t1 (t 2 t 3 t 4) 2 (1 2 2) 5n 2 O(n) 34 2
i 1 i 1
6 1 n
alors Tmax(n) ≤ constant*n=O(n) 5 3
un algorithme est asymptotiquement linéaire en n 67 66
Lien entre la Boucle répéter…jusqu’à et tantque(suite)
• Equivalence entre boucles répéter et tant que (exemple)
Répéter
afficher "Donnez une valeur positive paire :"
saisir nombre
jusqu’à (nombre>= 1 ET (nombre=< 3) )
équivaut à:
afficher "Donnez une valeur positive paire :"
Nombre 0
saisir nombre
tantque (nombre< 1 ou (nombre> 3) ) faire
afficher "Donnez une valeur positive paire:"
saisir nombre
FinTantQue
67
Les Boucles répéter…jusqu’à (suite)
• Comparaison boucles répéter et tant que (suite)
•boucle tantque
-condition vérifiée avant chaque exécution du traitement
-le traitement peut donc ne pas être exécuté
-de plus : la condition porte surtout sur la saisie de nouvelles variables (relance)
•boucle répéter
-condition vérifiée après chaque exécution du traitement
-le traitement est exécuté au moins une fois
-de plus : la condition porte surtout sur le résultat du traitement
• Remarque: la boucle répéter est typique pour les saisies avec vérification.
68
Les Boucles
• Sémantique de la boucle pour
• Implicitement, l’instruction pour:
-initialise une variable de boucle (le compteur)
-incrémente cette variable à chaque pas
-vérifie que cette variable ne dépasse pas la borne supérieure
• Attention : -le traitement ne doit pas modifier le compteur de boucle
69
Instructions itératives : la boucle Pour
• Remarque : le nombre d'itérations dans une boucle Pour est connu avant le début de la boucle
• Pour compteur ← Initiale à finale par pas 2
instruction 1
finpour
• Compteur est une variable de type entier (ou caractère). Elle doit être déclarée
• Pas est un entier qui peut être positif ou négatif. Pas peut ne pas être mentionné, car par défaut sa valeur
est égal à 1. Dans ce cas, le nombre d'itérations est égal à finale - initiale+ 1
• Initiale et finale peuvent être des valeurs, des variables définies avant le début de la boucle ou des
expressions de même type que compteur
algo Pyton
pour i 0 à 3 Instruction range:
afficher ("Valeur de i : ", i) En pratique range(10) se comporte comme la suite de valeurs 0, 1, ..., 9 et ce code
finpour revient à dire : for i in range(4):
Pour chaque valeur dans [0, 1, ..., 3] affecter cette valeur à la variable i et
La dernier valeur de i est 4 for i in range(4):
avant la fin de boucle print("Valeur de i : ", i)
70
Remarque: range(1,4) commence par 1, les valeurs sont [1, 2, 3]
Organigramme: boucle pour
Pour compteur ← 0 à 4 par pas 2
Compteur1
instruction 1 non
compteur<=2
finpour
Calcule complexité oui
T( pour k ← a à b faire I(k) finpour) Instruction 1
= coût(I(a))+ coût(I(a+1)) … +coût(I(b))
Exemple Compteur Compteur+1
1) N← 2
2) R← 1
3) pour I ← 1 à N
4) R ← R*I Instruction 2
5) Finepour
Illustration l c foi inst n R I
Le temps d’exécution t(n) de cet algorithme en supposant que: 2 1 1 2 2 1
- t1 est le temps d’exécution entre le début et ligne 2
- t2 est le temps d’exécution de la comparaison de la ligne 3 3 1 initia 1 34 1
- t3 est le temps d’exécution de l’action de la ligne 4 3 1 comp n+1 4 1
- t4 est le temps d’exécution de l’incrémentation de la ligne 5
-t5 temps d’initialisation de compteur 4 2 n 53 2
- t1, t2, t3, t4 sont des constantes (ne dépendent pas de n) 5 2 incr n 34
s’écrit: n n
T (n) t1 t 5 (t 2 t 3 t 4) t 2 3 (1 2 2) 1 5n 4 O(n) 4 2
i 1 i 1 3
53
Tmax(n) ≤ constant*nTmax=O(n)
Encors un algorithme est asymptotiquement linéaire en n 36 71
Boucle Pour: exemple inst Ni cl écran
n n n 9 1 6 4
T (n) 5 (1 ( 2)) (1 2n) n(1 2n) 2n n
2
i 1 j 1 i 1
75 3
T (n) cons tan t n 2 58 3
84 73
T (n) est en O(n 2 )
Lien entre Pour et TantQue
pour cpt ←1 à nbVal
afficher "Donnez une valeur :"
saisir nombre
totalValeurs←totalValeurs+ valeur //cumul
Finpour
…………. équivaut à………………………
cpt ←1
tant que cpt <=nbVal faire
afficher "Donnez une valeur :"
saisir nombre
totalValeurs←totalValeurs+ valeur //{cumul}
cpt ←cpt + 1 //{compte le nombre de valeurs traitées}
fintantque
74
Lien entre répéter et TantQue
Répéter
afficher "Donnez une valeur positive paire :"
saisir nombre
jusqu’à (nombre> 1 ET (nombre< 3) )
Traitement
exécuté au
moins une OUI Boucle répéter
NON fois ?
Nombre
d’itérations
connu ?
OUI
Boucle pour
76
Boucle : exemple complexité O(log(n))
• Exemple
1) TantQue N div 2 <> 0 Faire ligne cout fois
2) NN div 2 1 2 q+1 avec n = 2q
3) I ← I+1 2 2 q
4) FinTantQue 3 2 q
iteration 1
• On remarque que la complexité de chaque tour de la boucle
Tantque est en O(1).
iteration 2
• La complexité de l’algorithme vaut q = le nombre max de
tours de boucle.
iteration 3
Illustration :
Cas1 avec N =8
iteration 4
Cas2 avec N=16
• En utiliser le raisonnement par récurrence ou par déduction 0 5 10 15 2
pour démontrer Que q= log(n)
77
Raisonnement par déduction :complexité O(log(n))
• Exemple
1) TantQue divEnt(N,2) <> 0 Faire ligne cout fois
2) NdivEnt(N,2) 1 2 q+1 avec n = 2q
3) I ← I+1 2 2 q
4) FinTantQue 3 2 q
• Supposons que n une puissance de 2 (n = 2q).
• Le pire des cas pour de ce algorithme est de continuer les divisions jusqu'à obtenir n égale à 1.
• q le nombre d'itérations nécessaires pour aboutir à n égale à 1
dernière itération n = 1
q log(n )
T max( n) (2 2 2) (6) 6 log(n)
i 1 i 1
n i n i
T max( n) 1 (1 ((2 2) 2) 1 1 (3 ( 4))
i 1 j 1 i 1 j 1
n n i n n
1 (3 4 * i ) 1 3n 4n 2
car ( (i )) ( (1))
i 1 i 1 j 1 i 1 j 1
T max( n) est en O ( n 2 )
80
Les Tableaux
• Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, s’appelle un tableau, ou encore une
variable indicée.
Le nombre qui, au sein d’un tableau, sert à repérer chaque valeur s’appelle l’indice. Chaque fois que l’on doit désigner un
élément du tableau, on fait figurer le nom du tableau, suivi de l’indice de l’élément, entre [].
• Dans ce chapitre, les tableaux seront statiques : leur taille sera fixée une fois pour toute au moment de déclaration
• l'indice minimum est toujours égal à 1 jusqu’à taille
exemple:
variables T: réel [taille]
T[4] ←0 est équivalent à i←4
T[i] ← 0
Remarque : on peut traiter qu‘un élément par élément d’un tableau et jamais plus. exemple pour initialiser les éléments d’un
tableau par 0 on peut pas écrire T 0 Mais on écrit: Pour i1 à 4
T[i]0
finpour
algoc python
variable t : entier[4] t=[1,2,3,4]
avec des indices 1, 2, 3 et 4 avec des indices avec des indices
t[1] 1 0, 1, 2 et 3.
Pour i1 à 4 t[0]=1
T[i]0 T=[0]*4 81
finpour Tableau de 4 element initializer avec des zero
Les Tableaux: opérations sur liste
• On peut utiliser des indices négatifs pour compter à partir de la fin de la liste :
en python
• exemple la valeur de :tab[-1] est 8, tab[-3] est 2
0 1 2 3 4 5
• La fonction len donne la longueur d’une liste :exemple len(tab) est 6 tab
1 5 7 2 2 8
• On peut extraire un sous-ensemble des éléments d’une liste en spécifiant un intervalle d’indices de la façon suivante :
liste[min:max] attention min inclus et max exclu de l'intervalle, si min ou max peut être omis. Dans ce cas, tout se passe comme s
min était 0, et max était len(liste)
• exemple : tab[1:4] le sous tableau avec les valeurs[5, 7, 2], Tab[:3] le sous tableau avec les valeurs [1, 5, 7],
Tab[3:] le sous tableau avec les valeurs[2, 2, 8]
• On peut aussi préciser un pas avec l’instruction liste[min:max:pas]. Pour avoir les éléments d’indices pairs : exemple tab[::2] le
sous tableau avec les valeurs[1, 7, 2]
• append permet d’ajouter un élément à la fin de la liste : tab.append(9) la taille de tab est 7 avec ces valeurs[1, 5,7,2,2,8,9]
• del permet de supprimer un élément d’une liste : del tab[2] la taille de tab est 5 avec ces valeurs[1, 5,2,2,8]
• remove(val) suppression du premier élément de valeur val tab.remove(7) la taille de tab est 5 avec ces valeurs[1,5,2,2,8]
• Parcourt de tableau avec instruction in exemple for valeur in tab:
• insert(idx,val) insertion d'un élément à une position exemple tab.insert(2,0) la taille de tab est 7 avec ces valeurs[1, 5,0,7,2,2,8]
• pop([idx]) retourne et supprime la valeur d'index idx (défaut le dernier) x=tab.pop()la taille de tab est 5 avec ces valeurs[1,5,7,2,2
82
• tab.sort() trie le tableau et tab.reverse() inversion de la liste sur place
Les Tableaux (listes): unidimensionnel
• Définition du type
nom du tableau Indice
1 2 3 4 5 6
tab
12 5 -78 2 -21 8
83
Les Tableaux (listes): les tableaux statiques
Enoncer exercice: Si vous voulez saisir les notes des étudiants d’une classe qui peut avoir au max 25 étudiants.
Solution: Vous devez déclarer un tableau de taille 25. même si vous avez une classe de 5 étudiants on va utiliser
que 5 élément de ce tableau.
84
Les Tableaux (listes): les tableaux dynamiques
Enoncer exercice: Si vous voulez saisir les notes des étudiants d’une classe. Avec -1 on arrête la saisie
Solution: Vous devez déclarer un tableau vide . On ajoute élément par élément
85
inst N i écran
Tableaux : exemple 1 -, -, -, - 1
2 1, -, -, -
• variable N : Entier [4]
i : Entier 3 1, -, -, - 1
• Début
41 1, -, -, - 2
1) Pour i ← 1 à 4
12 1, 4, -, -
2) N[i] ← i * i
3) afficher (N[i]) 3 1, 4, -, - 4
4) Finpour 41 1, 4, -, - 3
• Fin 2 1, 4, 9, -
• Calculer complexité? 3 1, 4, 9, - 9
41 1, 4, 9, - 4
12 1, 4, 9,16
3 1, 4, 9,16 16
41 1, 4, 9,16 5
15
86
Tableaux Multidimensionnels
• Exemple tableau à 2 lignes et 7 colonnes
10 3 20 5 25 2 422
tab
9 132 1 0 124 7 9
• Remarque :
• équivalent à déclarer un tableau de 7 colonne répéter 2 foie ( ligne)
• Déclaration
tab[2, 7] d’entiers
87
Tableaux Multidimensionnels
• REMARQUE ESSENTIELLE :
Il n’y a aucune différence qualitative entre un tableau à deux dimensions ( M, N ) et un tableau à une dimension ( M * N ).
De même que le jeu de dames qu’on vient d’évoquer, tout problème qui peut être modélisé d’une manière peut aussi être
modélisé de l’autre. Simplement, l’une ou l’autre de ces techniques correspond plus spontanément à tel ou tel problème,
et facilite donc (ou complique, si on a choisi la mauvaise option) l’écriture et la lisibilité de l’algorithme.
• Equivalence d’indice
Exemple T[itab] et T[iligne, icolonne] taille (3,2)=tableau de 2 colonne répéter 3 fois 1 4
iligne,icolonne 1,1 1,2 2,1 2,2 3,1 3,2 2 5
• itab= 2*(iligne-1)+ icolonne itab 1 2 3 4 5 6 3 6
• Relation général 1 :pour une taille (M,N): itab= N*(iligne-1)+ icolonne si indice commence par 0 itab= N*iligne+ icolonne
iligne,icolonne 1,1 2,1 3,1 1,2 2,2 3,2 1 2
itab 1 2 3 4 5 6 3 4
itab= 3*(icolonne -1)+ iligne 5 6
• Relation général 2 :pour une taille (M,N): itab= M*(icolonne -1)+ iligne si indice commence par 0 itab= M*icolonne + iligne
88
inst T iligne icolon
Tableaux multidimensionnel 12 -, -; -, -; -, - 1 -
: exemple 23
3
-, -; -, -; -, -
1, -; -, -; -, -
1
89
les structures
• Nous avons utilisé pour l'instant des types de base : ils contiennent des éléments de type entier, réel, caractère, chaîne.
Dans ce chapitre nous allons définir de nouveaux types qui vont permettre de représenter des entités plus complexes.
• Des types de variables personnalisés, composés d’un « collage » de plusieurs types existants (entier, réel, chaine
,caractère , booléen , etc.). Ce type de variable s'appelle un type structuré.
• Exemple: - pour représenter un point, il faut une abscisse et une ordonnée.
- pour représenter une fraction, il faut un numérateur et un dénominateur …
- Syntaxe Structure définition type date
jour : chaine
j,m,aa : entier
fintype
déclaration de variable variables a : date
affectation à un champ a.jour "lundi"
Remarque: l’instruction saisir peut lire que les type de base exemple :On peut pas saisir ou afficher: saisir a mais on peut
écrire : saisir a.j
type date class date(object):
nomj : chaine
j,moi,an : entier
def __init__(self, nomj , j,moi,an):
fintype self.nomj = nomj
variable d : date self.j = j
d.j30
self.moi=moi
self.an=an
d= date ("lundi", 2,2,2017)
d.j = 21 90
Structure :type
type copoint ins A1 A2 dx dy d clv ecr
x,y : réel x y x y
fintype
1 A1
variables A1,A2 : copoint
2 0 0
dx,dy,d: réel
début 3 0 0
1) afficher " cordonner point A1" 4 A2
2) saisir A1.x 5 0 0
3) saisir A1.y 6 2 2
4) afficher "cordonner point A2" 7 0
5) saisir A2.x
8 2
6) saisir A2.y
9 2
7) dxA2.x-A1.x
8) dyA2.y-A1.y 10 2
9) dRacineCarrée(Carré(dx)+Carré(dy)) illustration
10) afficher ("distance",d)
fin 91
Procédures
• Avantages:
et Fonctions
• Lorsqu'on a un ensemble de lignes de code qui doivent être exécutées à différents endroits dans un
programme, au lieu de réécrire les mêmes lignes de code, il est intéressant de créer des fonctions.
• Au lieu d'écrire un programme de 500 lignes, il est préférable de créer 25 fonctions de 20 lignes
• on structure le programme.
• il est plus facile de tester chaque fonction.
• Il est impossible d'avoir en tête plus de 1000 lignes de codes : or la plupart des programmes réels
comportent des dizaines de milliers de lignes et les grosses applications en comportent des millions.
écrire des fonctions est absolument obligatoire
• Utilisation :
• Lors de la conception d’un programme deux aspects apparaissent :
• La définition de la procédure ou fonction.
• L’appel de la procédure ou fonction au sein du programme.
• L’écriture de la procédure ou fonction s’effectue en fonction de paramètres formels utilisés dans la
conception de celle-ci.
• Par contre au moment de l’utilisation de la procédure ou fonction, on associera de véritables valeurs à
ces paramètres grâce à des paramètres d’appel ou paramètres effectifs.
92
Notion de fonction
93
Les Fonctions Prédéfinies: Math
syntaxe Python Résultat Argument p1
abs(p1) Abs(p1) valeur absolue de p1 entier, réel entier, réel
alea() from random import * nombre aléatoire compris entre réel
random() 0 et 1
ent(p1) Int(p1) partie entière de p1 sans entier, réel réel
arrondi
atn(p1) arc tangente de p1 entier, réel entier, réel
cos(p1) cos(p1) cosinus de p1 (sin,tan) entier, réel entier, réel
exp(p1) exp(p1) exponentielle de p1 entie r, réel entie r, réel
RacineCarrée(p1) sqrt(p1) racine carrée de p1 entier, réel entier, réel
CaractèreAscii (p1) chr(p1) caractère ayant pour code ASCI car, chaîne entier
la valeur de p1
CodeAscii (p1) ord(p1) converti caractère p1 en entier, réel chaîne
nombre
Pour python il faut écrire cette ligne au début: from math import *
94
Les Fonctions Prédéfinies Math python: exemple
variable s,p1,valeurAbs,partieEnt,aascii: Entier from math import *
variable expon,racine: réel from random import *
variable caractereb: caractère
p1=-10
Début
valeurAbs=abs(p1)
P1<- -10
print("la valeur absolu de -10 est ", valeurAbs)
valeurAbs<-abs(p1)
afficher("la valeur absolu de -10 est ", valeurAbs) p1=random()
p1<-Aléatoire(10) print("le chiffre aléatoire est ", p1)
afficher("le chiffre aléatoire [0,10]est ", p1) partieEnt=int(2*p1)
partieEnt<-Ent(2.15) print("la partie entière de", 2*p1, "est", partieEnt)
afficher("la partie entière de 2.15 est", partieEnt) expon=exp(2)
expon<-exp(2) print("exponentielle de 2 est ", expon)
afficher("exponentielle de 2 est ", expon)
racine=sqrt(9)
racine<-RacineCarrée(9)
print("le racine de 9 est ", racine)
afficher("le racine de 9 est ", racine)
aascii=ord("a")
aascii<-CodeAscii ("a")
afficher("le code ascci de a est ", aascii) print("le code ascci de a est ", aascii)
caractereb<-CaractèreAscii (aascii+1) caractereb=chr(aascii+1)
afficher("le caractere apres a est", caractereb) print("le caractere apres a est", caractereb)
fin Illustration
Les Fonctions Prédéfinies: texte
syntaxe Résultat p1 p2 p3
DébutChaîne (p1,p2) partie droite de p1 ; p2 = nombre de chaîne chaîne entier
caractères retournés
FinChaîne (p1,p2) partie gauche de p1 ;p2 = nombre de chaîne chaîne entier
caractères retournés
LgChaîne (p1) longueur de p1 entier chaîne
SousChaîne (p1,p2,p3) sous-chaîne de p1 de p3 caractères à partir chaîne entier entier
de la position p2 incluse
PositionChaîne (p1,p2) position du 1er car. de p1 dans p2 entier chaîne chaîne
maj(p1) caractères de p1 en majuscule chaîne chaîne
min(p1) caractères de p1 en minuscule chaîne chaîne
96
Les Fonctions Prédéfinies: texte (exemple)
• LgChaîne("Bonjour, ça va ?") vaut 16
LgChaîne("") vaut 0
SousChaîne("Zorro is back", 4, 7) vaut "ro is b"
SousChaîne("Zorro is back", 12, 1) vaut "c"
DébutChaîne("Et pourtant…", 8) vaut "Et pourt"
FinChaîne("Et pourtant…", 4) vaut "t…"
PositionChaîne("ur", "Un pur bonheur") vaut 5
PositionChaîne("techno", "Un pur bonheur") vaut 0
97
Les Fonctions Prédéfinies texte python: exemple
animaux = "girafe tigre"
longeur=len(animaux)
caractere4= animaux[3]
premier4caractere=animaux[0:4]
dernier4caractere=animaux[-4:]
for animal in animaux.split():
animalmaj=animal.upper()
animalmin=animalmaj.lower()
animal1maj=animal.capitalize()
print(animal,";", animalmaj,"; ",animalmin,"; ",animal1maj)
animaux = "girafe tigre"
posi=animaux.find('i')
posafe=animaux.find('afe')
postag=animaux.find('tag')
conti=animaux.count("i")
animaux2=animaux.replace("tigre", "singe")
animaux3=animaux.replace("i", "o")
Remarque: on peut pas modifier un caractère dans une chaine animaux[3]='i' . Par conséquent, si vous voulez modifier une chaîne,
vous êtes obligés d'en construire une nouvelle. Pour cela, n'oubliez pas que les opérateurs de concaténation (+)
Illustration
Structure de programme: Procédures et
Fonctions
• Fonction s'écrit toujours en-dehors au début de la procédure principale( au niveau
déclaration).
• Dans une fonction ont peut appelé une autre fonction mais on ne peut jamais définir une
autre fonction.
• Différence entre fonction et procédure
• Les fonctions ne sont qu'un cas particulier des sous-procédures : celui où doit être renvoyé vers la
procédure appelante une valeur et une seule. et celle-ci doit appartenir à un type de base du
Pascal. C’est à dire un nombre, un caractère ou une chaîne de caractère, booléen.
• Les procédures dans tous les autres cas (celui où on ne renvoie aucune valeur, comme celui ou en
en renvoie plusieurs.
Remarque important:
• pour le logiciel algo adopté dans ce cours Fonction s'écrit toujours en-dehors à la fin de
la procédure principale
• le logiciel algo adopté dans ce cours utilise la directive action au lieu de procédure
99
Règles : Procédures et Fonctions
• Les fonctions et les procédures permettent de décomposer un
programme complexe en une série de sous-programmes plus simples,
lesquels peuvent à leur tour être décomposes eux-mêmes en
fragments plus petits, et ainsi de suite.
100
Méthode pour Définition d’une fonction
Les 6 étapes de réflexions pour définir une fonction ou procédure:
1. Choix de Nom : un identificateur suffisamment explicite.
2. Paramètres : la liste des paramètres d’entrée-sortie de l’algorithme.
3. Préconditions : une liste d’expressions booléennes qui précisent les
conditions d’application de l’algorithme de fonction .
4. Appel : des exemples d’utilisation de l’algorithme avec les résultats
attendus.
5. Description : une phrase qui dit ce que fait l’algorithme.
6. Code : la séquence d’instructions nécessaires à la résolution du
problème.
101
Passage de paramètres
• Paramètre formel : variable utilisée dans le corps du sous-programme qui reçoit une valeur de l’extérieur
(ils font parti de la description de la fonction)
• Paramètre effectif : Il s'agit de la variable (ou valeur) fournie lors de l'appel du sous programme (valeurs
fournies pour utiliser la fonction et valeurs renvoyées)
• Le nombre et type des paramètres formel doivent être identique que les paramètre effectif
• Les paramètres formel on une duré de vie égale à l’appelle de la fonction
• Paramètres formel et effectif ont des noms différents
102
Passage de paramètres par variable ou par valeur
Une fonction peut avoir aucun ou plusieurs paramètres.
Il y a deux méthodes pour passer des variables en paramètre dans une fonction :
• Passage par valeur : La valeur de l'expression passée en paramètre est copiée dans une variable locale. C'est cette variable qui est
utilisée pour faire les calculs dans la fonction appelée.
• Passage par variable (référence) : La deuxième technique consiste à passer non plus la valeur des variables comme paramètre, mais
à passer les variables elles-mêmes. Il n'y a donc plus de copie, plus de variable locale. Toute modification du paramètre dans la
fonction appelée entraîne la modification de la variable passée en paramètre
python utilise passage par valeur pour les variables simples
(Int,float), et passage par référence pour les variables composés
(liste,chaine,structure)
algo utilise les directive D ou DR devant les Variable, en séparant
les noms de variable de même type par une virgule. Pour déclarer
des variables avec des types différents, placer des points-virgules
entre chaque groupe de variables.
• Remarque important: Le principe des variables globales
On ne peut déclarer dans le corps de notre programme, donc en dehors de tout corps de fonction, une variable, tout ce qu'il y a de plus
normal. Dans le corps d'une fonction qui doit modifier cette variable (changer sa valeur par affectation), on déclare à Python que la
variable qui doit être utilisée dans ce corps est globale, exemple: global i # Python recherche i en dehors de l'espace local de la fonction
103
Procédures et Fonctions :Syntaxe
• Declaration
Fonction RepOuiNon(D Msg : Caractère) : Caractère
arguments formelles type de résultat
variables résultat : caractère
Début
…………………….
Retourner ( résultat )
. qui indique quelle valeur doit prendre la fonction lorsqu'elle est utilisée par le
programme
fin
• Utilisation : il suffit de citer son nom en lui indiquant le paramètre qu'elle demande.
Début
……
afficher RepOuiNon("oui")
argument réel
…….
104
fin
Procédures et Fonctions :Syntaxe
• Déclaration procédure
procédure RepOuiNon( D Msg : Caractère)
arguments formelles
variables résultat : caractère
Début
…………………….
finprocédure
• Utilisation : il suffit de citer son nom en lui indiquant le paramètre qu'elle demande.
Début
……
argument réel
RepOuiNon("oui")
…….
Fin
105
Procédures et Fonctions :Syntaxe python
Procédure
def nomfonction(parametrefor1, parametrefor2, ….):
…..
…..
…….
nomfonction(parametreeff1, parametreeff2, ….)
…….
Fonction
def nomfonction(parametrefor1, parametrefor2, ….):
…..
…..
Return résultat
…….
X=nomfonction(parametreeff1, parametreeff2, ….)
…….
Procédures et Fonctions : passage par valeur
variables X : Entier inst X afficheecr écran
Procédure afficheecr(D k : entier)
k
Début k=5
1) afficher ("au début",k) 1 5
2) kk+1
3) afficher ("au fin",k) 2 Avant 5
finprocédure 3 5
Début Passage par valeur affiche
1) X ← 5 X=5 33.1 Début 5
2) afficher ("au avant",X) 3.2 6
3) afficheecr(X) 3.3 Fin 6
4) afficher ("au apres",X) 3.33 Vide k
retour
Fin
Remarque: avec algo il faut ajouter le mot D avant les argument 4 Apres 5
Généralement par défaut le passage utilisé est par valeur
Exemple :
afficheecr(D k : entier)
Equivalent à
afficheecr( k : entier)
illustration 107
Suggestion : voir support de cours architecture ordinateur diapo passage paramètre à une procédure par pile
Procédures et Fonctions : passage par référence
variables X : Entier inst X afficheecra écran
procédure afficheecra(DR k : entier) K point sur @K=@XK=5
Début k
1) afficher ("au début",k) 1 5
2) kk+1
3) afficher ("au fin",k) 2 Avant 5
fin
Début Passage par variable 3 5
affiche
1) X ← 5 X=5
33.1 Début 5
2) afficher ("au avant",X)
3.2 6
3) afficheecr(X)
4) afficher ("au apres",X) 3.3 Fin 6
Fin 3.33 Vide k
Remarque: avec algo’exe il faut ajouter le mot DR avant les argument (ou adresse ou adr) retour
Exemple : 4 Apres 6
afficheecra(DR k : entier)
Remarque: passage par référence on doit utiliser un tableau d’un seul élément au lieu d’une variable
illustration
Suggestion : voir support de cours architecture ordinateur diapo passage paramètre à une procédure par pile
108
exemple:calcule de quotient et reste d’une division
variables x, y,quo,rest : entier
• procédure division_euclidienne (a,b : entier ; DR q,r:entier)
Début
Début afficher " première valeur "
q 0 saisir x
r a afficher "deuxième valeur"
Tantque r>=b faire saisir y
q q+1 Division_euclidienne (x,y,quo,rest)
r r-b afficher quo, rest
FinTantque
Fin
Fin
x y quo rest x y quo rest
16 6 16 6 2 4
illustration
a b q a b q
16 6 16 6 2 4
a b q r a b q r
109
Une fonction qui appelle une autre
fonction perimetre_rayon_cercle(p : réel):réel
Début ins prc rac va vp clv ecr
1) Retourner(p/ 6.28) p pp r
fin 1 périmètre
fonction rayon_aire_cercle( pp : réel):réel 2 6.28 6.28
variables r : réel
Début
33.1 6.28
rac
1) rperimetre_rayon_cercle(pp)
3.13.1.1 6.28
2) Retourner(3.14*r*r)
prc
Fin
3.1.13.1 1
variables vp,va : réels prc
Début 3.23 3.14
1) afficher ("périmètre ") rac
2) saisir (vp) 4 Aire 3.14
3) varayon_aire_cercle(vp) illustration
4) afficher ("aire ",va)
Fin
110
Fonctions: récursivité
• Une fonction est dit récursif s'elle s’appelle elle-même
• Un exemple classique:
• La fonction factorielle
n! = 1 ·2 ·3 · ··· ·(n−1) ·n
• Définition récursive:
1 si n 0
f (n)
n. f (n 1) sin on
111
Fonctions: Trace d’une fonction récursive 1
Définition du fonction: Paramètre= 3
fonction fact( n : entier) : réel 1
variable Paramètre= 2
r : réel 2
début Paramètre= 1
si n = 1 alors 3 si n = 1 alors
r1 r1
sinon
r n * fact(n-1) 4
finsi
retourner (r) 5
fin résultat= 6
Trace: 6
2) saisir (a)
3.4.53.4.6
3) resfact(a)
3.4.63.4 6
4) afficher (res)
3.53.6
Fin illustration 113
3.63 6
Fonctions : Schéma général d'un algorithme récursif
114
Importance de l’ordre des appels récursifs (pile/file)
• Procédure terminale (file) • Procédure non terminale (pile)
procédure decimalbinaire (D n :entier; DR res:entier) procédure decimalbinaire (D n :entier;DR res:entier)
1) Si (n>0) Alors 1) Si (n>0) Alors
2) res res*10+ n mod 2 2) decimalbinaire(divEnt(n , 2) )
3) decimalbinaire(divEnt(n , 2) ) 3) res res*10+ n mod 2
4) FinSi 4) FinSi
Fin Fin
• Illustration illustration
11 5 2 1 0
11 5 2 1 0 0 0 0 0 0
0 1 11 110 1101
11 5 2 1 0
11 5 2 1 0 1011 101 10 1 0
1101 1101 1101 1101 1101
116
Les types de récursivité :La récursivité mutuelle 2/3
• Des fonctions sont dites mutuellement récursives si elles dépendent
les unes des autres
• Par exemple la définition de la parité d'un entier peut être écrite de la
manière suivante :
119
Méthode par substitution [Equations
récursives] 1/3
On utilise le résonnement par récurrence
• Principe : on vérifie une intuition
T(n) =a×T(n/b) +f(n) et T(1) =c
• Hypothèse
T(n) =g(n) (intuition)
• Conclusion
a×g(n/b) +f(n) =g(n) et g(1) =c
120
Méthode Générale [Equations récursives] 2/3
• On peut ramener une fonction récursive à la Forme générale suivant :
fonction Functionrécursive ( n:entier)
1) si (n > 1) alors
2) Functionrécursive(n/2), coût T(n/2)
3) Traitement(n), coût C(n)
4) Functionrécursive(n/2), coût T(n/2)
5) finsi
fin
• Equation récursive
T(n) = 2 ∗ T(n/2) + C(n)
121
Calcule de complexité :Elimination de la récursivité 3/3
• Dérécursiver, c’est transformer un algorithme récursif en un
algorithme équivalent ne contenant pas des appels récursifs.
• Elimination de la récursivité terminale simple
• Rappel :
Un algorithme est dit récursif terminal s’il ne contient aucun traitement
après un appel récursif.
La récursivité terminale simple peut être remplacée par une solution
itérative.
122
Méthode d’élimination de la récursivité terminale
simple
• Algo. récursif • Algo. itératif
Procédure ALGOR(X) Procédure ALGOI(X)
Si (COND) Alors Tantque (COND) faire
TRAIT1 TRAIT1
ALGOR(β (X)) X β (X)
Sinon Fintantque
TRAIT2 TRAIT2
FinSi Fin
Fin
Avec
X est la liste des paramètres ;
COND est une condition portant sur X ;
TRAIT1 est le traitement de base de l'algorithme (dépendant de X) ;
β(X) représente la transformation des paramètres ;
TRAIT2 est le traitement de terminaison (dépendant de X). 123
Méthode d’élimination de la récursivité terminale simple
suite
Itération Récursivité
procédure Itération( ) procédure Itération( )
Tantque (condition) faire Si (condition) alors
<Instructions> <Instructions>
fin tantque Itération()
fin si
finprocédure finprocédure
fonction S(n) : entier
fonction S(n) : entier
S :=0
Tant que (n>0) faire Si (n=0) alors
S0
S:=S+n sinon
n:=n-1 SS(n-1)+n
fin tant que fin si
retourner( S) retourner( S)
fin fin
élimination de la récursivité terminale simple : exemple
• Vérifier si a est diviseur de b avec méthode soustraction successive
Algo. récursif Algo. itératif
Fonction Diviseur ( a,b:entier) : Booléen 1) Fonction Diviseur ( a,b:entier) : Booléen l c fois
1) Si (a <=0) Alors 2) Si (a <=0) Alors
2) retourner( Faux 3) retourner( Faux) 1 2
3) Sinon 4) Sinon 2 1
4) Si (a>=b) alors 5) Tantque (a>=b) Faire 3 1
5) retourner( a=b) 6) b b-a 4
6) Sinon 7) Fintantque 5 1 q+1 Avec
7) retourner( Diviseur (a,b-a)) 8) retourner( a=b) b≈q*a
8) FinSi 9) FinSi 6 2 q
4) FinSi 10) fin 7
fin 8 2
q
T max( a, b) (3) 3 * q 3 * b
Calcule de complexité par résonnement i 1
a 9
T (a, b) cons tan t b
par déduction a
127
Algorithmique des nombres:
• La théorie algorithmique des nombres ou théorie calculatoire des nombres est une branche des
mathématiques et de l'informatique qui essaie de fournir des solutions concrètes et efficaces à
des problèmes calculatoires rencontrés en théorie des nombres.
• Exemple:
• PGCD
• Nombre premier
• Puissance
• Nombres de Fibonacci
• Nombre amicale
• Conversion décimal binaire
• …….
128
Exemple: PGCD
• Il existe plusieurs méthodes pour trouver le PGCD de deux nombres. On peut notamment utiliser
au choix:
• Les listes des diviseurs de chacun des deux nombres.
• L'algorithme des différences. (ou des soustractions successives)
a si b 0
p gcd(a, b)
p gcd(a b, b) sia b
• L'algorithme d'Euclide. (ou des divisions successives)
a si b 0
p gcd(a, b)
p gcd(b, a mod b) sin on
129
Exemple: algorithme
fonction pgcdeuclude( a,b : entier) : entier
PGCD
fonction pgcddiff( a,b : entier) : entier
variable variable
résult : entier résult : entier
début début
si b = 0 alors si b = 0 alors
résult a résult a
sinon sinon
si (a>b) alors si (a>b) alors
résult pgcdeuclude (b, modulo(a, b)) résult pgcddiff (a-b,b)
sinon sinon
résult pgcdeuclude (a,modulo(b, a)) résult pgcddiff (b-a,a)
finsi finsi
finsi finsi
retourner (résult ) retourner (résult )
fin fin
Illustration Illustration 130
Exemple : les Nombres premiers (crible d'Ératosthène)
Variable T: entier [12]
Variable i,j:entier
Début
Pour i1 a 12
T[i]i
Finpour
Pour i2 a 11
si T[i]<>0 alors
pour ji+1 a 12
si(i<>j )ET (modulo(T[j] ,T[i])=0) alors
T[j]0
finsi
finpour
finsi
Finpour
131
fin
Algorithme de tri
• Un algorithme de tri est, en informatique ou en mathématiques, un algorithme qui
permet d'organiser une collection d'objets selon un ordre déterminé. Les objets à trier
font donc partie d'un ensemble muni d'une relation d'ordre (de manière générale un
ordre total). Les ordres les plus utilisés sont l’ordre numérique et l'ordre lexicographique
(dictionnaire)
• On va traiter dans ce chapitre 3 tri:
• Tri à bulles
• Tri par sélection
• Tri par insertion
132
Tri par sélection
procédure trie ( n : entier, DR t: entier [5])
variable i,j,temp,imin:entier t=[4,3,2,1]
début for i in range(4):
pour i 1 à n - 1 imin=i
imin ← i for j in range(i+1, 4):
pour j i + 1 à n if t[j] < t[imin] :
si t[j] < t[imin] alors
imin = j
if imin != i:
imin ← j
temp=t[i]
finsi
t[i]=t[imin]
finpour
t[imin]=temp
si imin <> i alors
for i in range(4):
tempt[i]
print(t[i] )
t[i] t[imin]
t[imin]temp illustration
finsi
finpour
133
fin
Tri à bulles
procédure tri_bulle( n : entier, DR t: entier [5]))
Variable échange_effectué : booléen
j,temp : entier
début
répéter
échange_effectué faux
pour j 1 à n - 1
si T[j] > T[j + 1] alors
TempT[j]
T[j] T[j + 1]
T[j + 1]temp
échange_effectué vrai
finsi
finpour
jusqu’à échange_effectué = faux
fin
134
Tri par insertion
procédure tri_insertion( n : entier, DR t: entier [5]))
variable i,j,x,temp : entier
début
pour i 1 à n-1
x ← T[i]
j←i
tantque j > 1 ET T[j - 1] > x faire
T[j] ← T[j - 1]
j←j-1
fintantque
T[j] ← x
finpour
fin
135
Algorithme de recherche : (exemple recherche racine
fonction) : Méthode de dichotomie
En informatique, un algorithme de recherche est un type d'algorithme qui, pour un domaine, un problème de ce domaine et
des critères donnés, retourne en résultat un ensemble de solutions répondant au problème (racine de f(x)=x-5 dans [a,b])
Fonction f( x :réel):réel
Début
retourner( x-5)
fin
Fonction dichotomie ( a,b,eps :réel):réel
Début
Tantque b-a > eps faire
mil(a+b)/2
Si f(mil)*f(a)<0 alors
bmil
Sinon
amil
FinSi
FinTantque
Retorner (mil)
136
fin
Algorithme glouton
Aujourd'hui nous allons parler des algorithmes gloutons qui sont des algorithmes couramment utilisés dans la résolution
de problèmes.
Le principe de tels algorithmes consiste à choisir des solutions locales optimales d'un problème dans le but d'obtenir une
solution optimale globale au problème.
Exemple: sac a dos ou Le problème du rendu de monnaie est le suivant : étant donné un système de monnaie (pièces et
billets), comment rendre une somme donnée de façon optimale, c'est-à-dire avec le nombre minimal de pièces et billets ?
Les pièces de système de monnaie sm[i] 50 20 5
Le nombre de chaque pièce nb[i] 0 0 0
Procédure Glouton( s, i:entier; DR sm,nb : Entier [3]) • Exemple:45 dans un system de 50 ,20 ,5
Si i<= 3 ET s <>0 alors g(45, 1) 0,0,0
Si s>= sm[ i] alors g(45, 2) 0,0,0
nb[i] nb[i]]+1 g(25, 2) 0,1,0
Glouton (s- sm[ i], i) g(5, 2) 0,2,0
Sinon
g(5, 3) 0,2,1
Glouton (s, i+1)
Resultat:2 pièce de 20 et une de 5
finsi
finprocédure 137
géométrie algorithmique
• La géométrie algorithmique est le domaine de l'algorithmique qui
traite des algorithmes manipulant des concepts géométriques
Exemple:
• intersection des segments
• Recherche enveloppe convexe
• recherche des deux points les plus rapprochés
• Calcule de surface ou de l’aire de : cercle, triangle, rectangle…..
• Position dans une forme (intérieur, extérieur)
• …………
138
Exemple :position dans une zone
équation de segment des triangle vers est: y=-x+5 Alors si y<-x+5 le point est
dans la zone vers
139
La fouille de flots de données
La fouille de flots de données est le processus d'extraction des connaissances de flux de données
continus. Un flux/flot de données est une séquence ordonnée d'instances lisibles une seule fois — ou un
nombre de fois très faible — dans un système limité en capacité mémoire et en capacité de stockage. Les
flux sont continus, illimités, arrivent avec une grande rapidité, et ont une distribution qui change avec le
temps.
On va traiter trois principe:
• Algorithmes à balayage, qui consiste à parcourir les données (exemple le plan en suivant une
ligne de balayage, et à calculer, pas à pas.
• Les fenêtres glissantes servent à restreindre l'analyse sur les éléments les plus récents du flot de
données. C'est une méthode déterministe.
• Algorithmes d’approximation :Ce sont des techniques probabilistes qui donnent un résultat dans
une limite donnée à l'avance. Toutes les méthodes de Monte-Carlo et l'algorithme de las Vegas en
font partie. Ces algorithmes donnent des résultats approchés avec des erreurs contenues dans
des limites pré-établies
140
Algorithmes à balayage : exemple Calcul approché d’intégrales (Méthode des trapèzes)
représenter l’intégrale comme un aire et d’approcher cette aire par la somme d’aires de trapèzes. La ligne de
balayage est suivant l’axe x. Dans ce qui suit, n désigne le nombre de trapèzes et on pose.
Fonction f( x1 :réel):réel
début
retourner( x1-5)
fin
Fonction intégrale( a, b: réel; n:entier ):réel
Variable x, integ, pas: réel
i:entier
Début
Pas(b-a)/n
integ0
pour i1 a n-1
x a+i*pas
integinteg+(((f(x)+f(x+pas))pas/2)
fintpour
retourner( integ)
141
fin
Les fenêtres glissantes: exemple (suite de Fibonacci)
Croissance de population des lapins selon une suite de Fibonacci:
au (début du) premier mois, il y a juste une paire de lapereaux ;
les lapereaux ne procréent qu'à partir du (début du) troisième mois ;
chaque (début de) mois, toute paire susceptible de procréer engendre effectivement une nouvelle paire de lapereaux ;
les lapins ne meurent jamais (donc la suite de Fibonacci est croissante).
Fonction Fibonacci( n:entier):entier
Variable pn, pn1 ,pn2 , i:entier
Début
pn11
pn21
pour i3 a n
pnpn1+pn2
pn2pn
pn1pn2
fintpour
retourner( pn)
142
fin
Algorithme d'approximation : exemple (méthode de Monte-Carlo)
Calcule de la superficie d'un lac : Soit une zone rectangulaire ou carrée dont les côtés sont de longueur connue. Au sein de cette aire se
trouve un lac dont la superficie est inconnue. Grâce aux mesures des côtés de la zone, on connaît l'aire du rectangle. Pour trouver l'aire du
lac, on demande à une armée de tirer X coups de canon de manière aléatoire sur cette zone. On compte ensuite le nombre N de boulets
qui sont restés sur le terrain
Par exemple, si le terrain fait 1 000 m2, que l'armée tire 500 boulets et que 100 projectiles sont tombés dans le lac, estimation de la
superficie du plan d'eau est de : 1000×100÷500 = 20
• Fonction calculePImc( n : entier ) :entier
• Calcul de π :consiste à tirer au hasard
des nombres x et y dans l’intervalle [0 Variable r, x, y :réel
; 1]. Si x2 +y2 < 1 le point M(x, y) ni, i:entier
appartient à un quart de disque de Début
rayon 1. La probabilité pour qu’il en
soit ainsi est le rapport des aires du ni0
quart de disque de rayon 1 et du carré pour i1 a n
de côté 1 et soit π/4
x Aléatoire(100)/100
y Aléatoire(100)/100
si (x*x + y*y) <1 alors
nini+1
finsi
finpour
retourner( 4*ni/n)
fin
143
Grands classiques I
• Ce diapositive recense quelques algorithmes « historiques » dont les principales vertus
aujourd’hui sont d’ordre pédagogique. A ce titre, tout informaticien débutant doit être
capable de les redéfinir lui-même:
1 Algorithme d’Euclide 11 Produit de matrices
2 Coefficients du binôme 12 Recherche dichotomique
3 Conversion en base b 13 Recherche séquentielle
4 Courbe fractale de Koch 14 Tours de Hanoï
5 Crible d’Eratostène 15 Tri bulles
6 Développement limite 16 Tri fusion
7 Fonction factorielle 17 Tri par insertion
8 Fonction puissance 18 Tri par sélection
9 Nombres de Fibonacci 19 Tri rapide
10 Palindrome
144
bibliographie
• www.pise.info/algo
• Cours algorithmique Université Libre de Bruxelle
• Cours deLicence Maths Info 2ème année Faculté des sciences Jean
Perrin - Université d’Artois
• http://fr.wikipedia.org/
• www.commentcamarche.net/
• http://www.wikituto.org/index.php/Algorithme:Intro
• http://www.iro.umontreal.ca/~hamelsyl/recursion.pdf
• www.france-ioi.org/
145