Initiation ` lalgorithmique
a
Jacques TISSEAU
LISYC EA 3883 UBO-ENIB-ENSIETA
Ces notes de cours accompagnent les enseignements dinformatique du 1er semestre (S1) de
lEcole Nationale dIngnieurs de Brest (ENIB : www.enib.fr). Leur lecture ne dispense en
e
aucun cas dune prsence attentive aux cours ni dune participation active aux travaux dirigs.
e
e
Sommaire
1 Introduction gnrale
e e
1.1 Contexte scientique . . .
1.2 Objectifs du cours . . . .
1.3 Organisation du cours . .
1.4 Mthodes de travail . . .
e
1.5 Exercices complmentaires
e
1.6 Annexes . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
4
11
13
16
20
31
2 Instructions de base
2.1 Introduction . . . . . . . .
2.2 Aectation . . . . . . . .
2.3 Tests . . . . . . . . . . . .
2.4 Boucles . . . . . . . . . .
2.5 Exercices complmentaires
e
2.6 Annexes . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
39
40
42
46
51
63
91
3 Procdures et fonctions
e
3.1 Introduction . . . . . . . .
3.2 Dnition dune fonction .
e
3.3 Appel dune fonction . . .
3.4 Exercices complmentaires
e
3.5 Annexes . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
99
100
104
115
128
152
4 Structures linaires
e
4.1 Introduction . . . . . . . . . .
4.2 Squences . . . . . . . . . . .
e
4.3 Recherche dans une squence
e
4.4 Tri dune squence . . . . . .
e
4.5 Exercices complmentaires . .
e
4.6 Annexes . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
157
158
162
170
173
180
193
A Grands classiques
207
B Travaux dirigs
e
223
C Contrles types
o
231
Index
252
257
261
263
Rfrences
ee
271
Chapitre 1
Introduction gnrale
e e
Sommaire
1.1
Informatique
S1
1.2
1.3
Initiation ` lalgorithmique
a
introduction gnrale
e e
1.4
Jacques TISSEAU
1.5
enib c 2009
1.6
tisseau@enib.fr
enib c 2009
Algorithmique
1/18
Contexte scientique . . . . . . . . . . . . . .
1.1.1 Informatique . . . . . . . . . . . . . . .
1.1.2 Algorithmique . . . . . . . . . . . . . .
1.1.3 Programmation . . . . . . . . . . . . .
Objectifs du cours . . . . . . . . . . . . . . . .
1.2.1 Objectifs thmatiques . . . . . . . . .
e
1.2.2 Objectifs pdagogiques . . . . . . . . .
e
1.2.3 Objectifs comportementaux . . . . . .
Organisation du cours . . . . . . . . . . . . . .
1.3.1 Prsentiel . . . . . . . . . . . . . . . . .
e
1.3.2 Documents . . . . . . . . . . . . . . . .
1.3.3 Evaluations des apprentissages . . . .
1.3.4 Evaluation des enseignements . . . .
Mthodes de travail . . . . . . . . . . . . . . .
e
1.4.1 Avant, pendant et apr`s le cours . . .
e
1.4.2 Avant, pendant et apr`s le laboratoire
e
1.4.3 Apprendre en faisant . . . . . . . . . .
Exercices complmentaires . . . . . . . . . . .
e
1.5.1 Conna
tre . . . . . . . . . . . . . . . . .
1.5.2 Comprendre . . . . . . . . . . . . . . .
1.5.3 Appliquer . . . . . . . . . . . . . . . . .
1.5.4 Analyser . . . . . . . . . . . . . . . . .
1.5.5 Solutions des exercices . . . . . . . . .
Annexes . . . . . . . . . . . . . . . . . . . . . .
1.6.1 Lettre de Jacques Perret . . . . . . .
1.6.2 Exemple de questionnaire dvaluation
e
1.6.3 Exemple de planning . . . . . . . . . .
1.6.4 Informatique ` lENIB . . . . . . . . .
a
4
4
5
8
11
11
11
12
13
13
13
14
16
16
16
18
19
20
20
22
22
23
26
31
31
33
34
35
CHAPITRE 1. INTRODUCTION GENERALE
1.1
1.1.1
Contexte scientique
Informatique
Le terme informatique est un nologisme propos en 1962 par Philippe Dreyfus pour
e
e
caractriser le traitement automatique de linformation : il est construit sur la contraction de
e
lexpression information automatique . Ce terme a t accept par lAcadmie franaise en
ee
e
e
c
avril 1966, et linformatique devint alors ociellement la science du traitement automatique
de linformation, o` linformation est considre comme le support des connaissances humaines
u
ee
et des communications dans les domaines techniques, conomiques et sociaux (gure 1.1). Le
e
mot informatique na pas vraiment dquivalent aux Etats-Unis o` lon parle de Computing
e
u
Science (science du calcul) alors que Informatics est admis par les Britanniques.
Dnition 1.1 : informatique
e
Linformatique est la science du traitement automatique de linformation.
Linformatique traite de deux aspects complmentaires : les programmes immatriels (logie
e
ciel, software) qui dcrivent un traitement ` raliser et les machines (matriel, hardware) qui
e
a e
e
excutent ce traitement. Le matriel est donc lensemble des lments physiques (microprocese
e
ee
seur, mmoire, cran, clavier, disques durs. . .) utiliss pour traiter les donnes. Dans ce contexte,
e
e
e
e
lordinateur est un terme gnrique qui dsigne un quipement informatique permettant de traie e
e
e
ter des informations selon des squences dinstructions (les programmes) qui constituent le loe
giciel. Le terme ordinateur a t propos par le philologue Jacques Perret en avril 1955 en
ee
e
rponse ` une demande dIBM France qui estimait le mot calculateur (computer) bien trop
e
a
restrictif en regard des possibilits de ces machines (voir la proposition de Jacques Perret en
e
annexe 1.6.1 page 31).
que deux tats seulement (par exemple un potentiel lectrique maximum ou minimum). Ces
e
e
squences de signaux obissent ` une logique binaire du type tout ou rien et peuvent donc
e
e
a
tre considrs conventionnellement comme des suites de nombres ne prenant jamais que les
e
ee
deux valeurs 0 et 1 : un ordinateur est donc incapable de traiter autre chose que des nombres
binaires. Toute information dun autre type doit tre convertie, ou code, en format binaire.
e
e
Cest vrai non seulement pour les donnes que lon souhaite traiter (les nombres, les textes,
e
les images, les sons, les vidos, etc.), mais aussi pour les programmes, cest-`-dire les squences
e
a
e
dinstructions que lon va fournir ` la machine pour lui dire ce quelle doit faire avec ces donnes.
a
e
Larchitecture matrielle dun ordinateur repose sur le mod`le de Von Neumann (gure 1.2)
e
e
qui distingue classiquement 4 parties (gure 1.3) :
Les 2 premi`res parties sont souvent rassembles au sein dune mme structure : le microe
e
e
processeur (la puce ), unit centrale de lordinateur.
e
Dans ce cours, nous ne nous intresserons quaux aspects logiciels de linformatique.
e
1.1.2
Algorithmique
Exemple 1.1 : Mode demploi dun telecopieur
Extrait du mode demploi dun tlcopieur concernant lenvoi dun document.
ee
unit de
contrle
unit
arithmtique
et logique
entre
sortie
CHAPITRE 1. INTRODUCTION GENERALE
automatique, numro de fax, pav numrique, touche envoi) pour raliser la tche dsire (envoi
e
e
e
e
a
e e
dun document).
Chacun a dj` t confront ` de tels documents pour faire fonctionner un appareil plus ou
eaee
ea
moins rticent et donc, consciemment ou non, a dj` excut un algorithme (ie. excuter la suite
e
ea e e
e
dinstructions dans lordre annonc, gure 1.4).
e
TD1.1
Dnition 1.4 : algorithme
e
Un algorithme est une suite ordonne dinstructions qui indique la dmarche ` suivre pour
e
e
a
rsoudre une srie de probl`mes quivalents.
e
e
e
e
Exemple 1.2 : Trouver son chemin
Extrait dun dialogue entre un touriste gar et un autochtone.
e e
Pourriez-vous mindiquer le chemin de la gare, sil vous plait ?
Oui bien sr : vous allez tout droit jusquau prochain carrefour, vous prenez ` gauche au
u
a
carrefour et ensuite la troisi`me ` droite, et vous verrez la gare juste en face de vous.
e
a
Merci.
Dans ce dialogue, la rponse de lautochtone est la description dune suite ordonne dinse
e
tructions (allez tout droit, prenez ` gauche, prenez la troisi`me ` droite) qui manipulent des
a
e
a
donnes (carrefour, rues) pour raliser la tche dsire (aller ` la gare). Ici encore, chacun a
e
e
a
e e
a
dj` t confront ` ce genre de situation et donc, consciemment ou non, a dj` construit un
eaee
ea
ea
algorithme dans sa tte (ie. dnir la suite dinstructions pour raliser une tche). Mais quand
e
e
e
a
on dnit un algorithme, celui-ci ne doit contenir que des instructions comprhensibles par celui
e
e
qui devra lexcuter (des humains dans les 2 exemples prcdents).
e
e e
TD1.2
Dans ce cours, nous devrons apprendre ` dnir des algorithmes pour quils soient compra e
e
hensibles et donc excutables par un ordinateur.
e
Dnition 1.5 : algorithmique
e
Lalgorithmique est la science des algorithmes.
Lalgorithmique sintresse ` lart de construire des algorithmes ainsi qu` caractriser leur
e
a
a
e
validit, leur robustesse, leur rutilisabilit, leur complexit ou leur ecacit.
e
e
e
e
e
TD 1.3 : Proprietes dun algorithme
Reprendre le TD 1.1 et illustrer la validit, la robustesse,
e
la rutilisabilit, la complexit et lecacit de lalgoe
e
e
e
rithme propos pour dessiner sur la plage.
e
`
Fig. 1.5 : Du probleme au code source
problme
algorithmique
algorithme
programmation
code source
CHAPITRE 1. INTRODUCTION GENERALE
1.1.3
Programmation
interprtation
semicompilation
Lisp, Prolog
Java, Python
code source
code source
code source
compilateur
code objet
compilateur
interprteur
excuteur
rsultat
bytecode
interprteur
rsultat
rsultat
10
CHAPITRE 1. INTRODUCTION GENERALE
Python : www.python.org
Dans ce cours, nous choisirons dexprimer directement les algorithmes dans un langage informatique oprationnel : le langage Python [16], sans passer par un langage algorithmique
e
intermdiaire.
e
1.2
1.2.1
11
Objectifs du cours
Objectifs thmatiques
e
Lobjectif principal des enseignements dinformatique S1 de lENIB est lacquisition des notions fondamentales de lalgorithmique. Plus prcisment, nous tudierons successivement :
e e
e
1. les instructions de base permettant de dcrire les algorithmes : aectation, tests, boucles ;
e
2. les procdures et les fonctions qui permettent de structurer et de rutiliser les algorithmes ;
e
e
on parlera alors dencapsulation, de prconditions, de porte des variables, de passage de
e
e
param`tres, dappels de fonctions, de rcursivit et de jeux de tests ;
e
e
e
3. les structures de donnes linaires : tableaux, listes, piles, les, qui amliorent la struce
e
e
turation des donnes manipules par les algorithmes. A cette occasion, on valuera la
e
e
e
complexit et lecacit de certains algorithmes utilisant ces structures linaires.
e
e
e
Ces direntes notions seront mise en uvre ` travers lutilisation du langage Python.
e
a
1.2.2
`
TD 1.5 : Premiere utilisation de Python
Se connecter sur un poste de travail dune salle informatique.
1. Lancer Python.
2. Utiliser Python comme une simple calculette.
3. Quitter Python.
Ne pas oublier de se dconnecter du poste de travail.
e
TD1.5
Objectifs pdagogiques
e
Au cours du semestre S1, nous nous positionnerons principalement sur les 3 premiers niveaux
de la taxonomie de Bloom qui constitue une rfrence pdagogique pour la classication des
ee
e
niveaux dapprentissage (gure 1.9) : connaissance, comprhension, application. Les 3 derniers
e
niveaux seront plutt abords au cours du semestre S2 (analyse, synth`se, valuation).
o
e
e e
1. Connaissance : mmorisation et restitution dinformations dans les mmes termes.
e
e
2. Comprhension : restitution du sens des informations dans dautres termes.
e
3. Application : utilisation de r`gles, principes ou algorithmes pour rsoudre un probl`me,
e
e
e
les r`gles ntant pas fournies dans lnonc.
e
e
e
e
4. Analyse : identication des parties constituantes dun tout pour en distinguer les ides.
e
5. Synth`se : runion ou combinaison des parties pour former un tout.
e
e
6. Evaluation : formulation de jugements qualitatifs ou quantitatifs.
An de mieux nous situer par rapport aux dirents types de pdagogie associs, nous
e
e
e
lerons une mtaphore musicale inspire de [3].
e
e
CHAPITRE 1. INTRODUCTION GENERALE
12
Pdagogie par objectifs : Le solf`ge est ltude des principes lmentaires de la musique et
e
e
e
ee
de sa notation : le musicien fait ses gammes et chaque exercice a un objectif prcis
e
pour valuer lapprentissage du langage musical . Il en va de mme pour linformaticien
e
e
dbutant confront ` lapprentissage dun langage algorithmique.
e
ea
Pdagogie par lexemple : Lapprentissage des grands classiques permet au musicien de sape
proprier les bases du solf`ge en les appliquant ` ces partitions connues et en les (re)jouant
e
a
lui-mme. Linformaticien dbutant, en (re)codant lui-mme des algorithmes bien connus,
e
e
e
se constituera ainsi une base de rexes de programmation en imitant ces algorithmes.
e
Pdagogie de lerreur : Les bogues (bugs) sont ` linformaticien ce que les fausses notes sont
e
a
aux musiciens : des erreurs. Ces erreurs sont ncessaires dans lacquisition de la connaise
sance. Un l`ve a progress si, apr`s stre tromp, il peut reconna quil sest tromp,
ee
e
e e
e
tre
e
dire o` et pourquoi il sest tromp, et comment il recommencerait sans produire les mmes
u
e
e
erreurs.
Pdagogie par probl`mes : Connaissant ses classiques et les bases du solf`ge, le musicien
e
e
e
devenu plus autonome peut envisager sereinement la cration de ses propres morceaux. Le
e
dveloppement dun projet informatique ambitieux sera mis en musique au semestre
e
S2.
Dans ce cours, nous adopterons ces direntes stratgies pdagogiques sans oublier quen
e
e
e
informatique on apprend toujours mieux en faisant par soi-mme.
e
1.2.3
Objectifs comportementaux
13
1.3
1.3.1
Organisation du cours
TD 1.7 : Dessins sur la plage : perseverance
Finir lalgorithme suivant qui cherche ` dessiner un loa
sange sur la plage.
1. avance de 10 pas,
2. tourne ` gauche dun angle de 60 ,
a
.
.
.
TD 1.8 : Autonomie
Trouver les dnitions du mot autonomie et de son
e
contraire (de son antonyme).
Prsentiel
e
1.3.2
Documents
Les principaux documents accompagnant les cours sont de 2 types : les supports de cours et
les notes de cours.
14
Support de cours : il sagit de la copie papier des transparents projets en prsentiel (gure
e
e
1.10).
Notes de cours : il sagit de notes qui compl`tent et prcisent certains points prsents en
e
e
e
e
cours. Ces notes proposent galement les exercices de travaux dirigs qui sont tudis en
e
e
e
e
cours et au laboratoire. Le document que vous tes en train de lire constitue le premier
e
chapitre des notes du cours dinformatique S1 de lENIB. Il y en aura 3 autres sur les
sujets suivants :
Informatique
Dnition
e
information automatique
CHAPITRE 1. INTRODUCTION GENERALE
Matriel Logiciel
e
matriel : ordinateurs
e
tisseau@enib.fr
Algorithmique
enib c 2009
2/18
Un site Web permet de retrouver ces documents au format pdf (Portable Document Format)
ainsi que dautres documents tels que le planning prvisionnel des cours et des contrles, des
e
o
exemples corrigs dvaluation, les notes aux dirents contrles ou encore des liens vers des
e
e
e
o
sites pertinents pour le cours. Un forum de discussions professeursl`ves est galement ouvert
ee
e
sur ce site.
TD1.9
La consultation rguli`re du site est indispensable pour se tenir au courant des derni`res
e
e
e
volutions du cours : en cas dambigu e, ce sont les informations de ce site qui feront foi.
e
t
1.3.3
Lvaluation des connaissances et des comptences acquises par les tudiants repose sur 4
e
e
e
types de contrle : les contrles dattention, les contrles de TD, les contrles dautoformation
o
o
o
o
et les contrles de comptences.
o
e
Contrle dattention : il sagit dun QCM (questionnaire ` choix multiples) auquel il faut
o
a
rpondre individuellement sans document, en 5 en n de cours, et dont les questions
e
portent sur des points abords pendant ce cours. Ce type de contrle teste directement
e
o
lacquisition de connaissances au sens du conna de la classication de Bloom (section
tre
1.2.2 page 11). Il permet dvaluer ` chaud la capacit dattention des tudiants et les
e
a
e
e
incite ` une prsence attentive an de bncier au maximum des heures de prsence aux
a
e
e e
e
cours.
TD1.10
Des exemples de QCM sont systmatiquement proposs dans les notes de cours comme
e
e
par exemple celui du TD 1.19 page 20 pour cette introduction gnrale.
e e
15
Contrle de TD : il sagit ici dinciter les tudiants ` prparer activement les sances de
o
e
a e
e
laboratoire. En dbut de chaque sance de laboratoire, chaque binme doit rpondre sans
e
e
o
e
document en 10 aux questions dun exercice de TD. Lexercice est choisi alatoirement
e
parmi les exercices de TD situs en marge des notes de cours et se rapportant au th`me
e
e
du TD.
TD1.11
Il concerne le comprendre et l appliquer de la taxonomie de Bloom (section 1.2.2
page 11).
Contrle dautoformation : un contrle dautoformation porte sur un th`me prvu ` lavance
o
o
e
e a
et que ltudiant doit approfondir par lui-mme. Les th`mes retenus pour lautoformation
e
e
e
en S1 sont par exemple le calcul boolen, le codage des nombres ou encore la recherche
e
dlments dans un tableau de donnes.
ee
e
TD1.12
Ces contrles se droulent pendant les sances de cours : ce sont des crits individuels de
o
e
e
e
30 sans document qui concernent le conna , le comprendre et l appliquer
tre
de la taxonomie de Bloom.
Contrle de comptences : les contrles de comptences (ou DS) durent 80 pendant une
o
e
o
e
sance de cours. Plus longs, ils permettent daborder lun des 3 derniers niveaux de la
e
classication de Bloom (analyser, synthtiser, valuer) comme le font les exercices de la
e
e
section 1.5.4 page 23.
TD1.13
Quel que soit le type de contrle, un exercice cherche ` valuer un objectif particulier. Aussi, la
o
ae
notation exprimera la distance qui reste ` parcourir pour atteindre cet objectif (gure 1.11) :
a
0
1
2
3
:
:
:
:
Ainsi, et pour changer de point de vue sur la notation, le contrle est russi lorsquon a 0 ! Il
o
e
ny a pas non plus de 1/2 point ou de 1/4 de point : le seul barme possible ne comporte que 4
e
niveaux : 0, 1, 2 et 3. On ne cherche donc pas ` grappiller des points :
a
on peut avoir 0 (objectif atteint) et avoir fait une ou deux erreurs bnignes en regard de
e
lobjectif recherch ;
e
on peut avoir 3 (objectif non atteint) et avoir quelques lments de rponse corrects mais
ee
e
sans grand rapport avec lobjectif.
0
1
2
3
Remarque 1.3 : Une absence ` un contrle conduit `
a
o
a
la note 4 ( la cible nest pas vise ).
e
CHAPITRE 1. INTRODUCTION GENERALE
16
1.3.4
1.4
Remarque 1.4 : Ce document comporte 259 pages
structures en 4 chapitres, 3 annexes, 4 index et une
e
bibliographie. Il propose 47 dnitions, 86 gures, 39
e
exemples, 79 remarques, 128 exercices et 5 contrles types
o
corrigs. En moyenne, au cours des 14 semaines que dure
e
le cours dinformatique S1 de lENIB, le travail personnel
hebdomadaire consiste donc ` lire entre 15 et 20 pages de
a
ce cours en retenant 3 ` 4 dnitions et en faisant entre
a
e
7 et 10 exercices.
Mthodes de travail
e
Il ne sagit pas ici dimposer des mthodes de travail, mais de fournir des pistes pour ceux
e
qui en cherchent. Dans tous les cas, lexprience montre que :
e
1. la seule prsence, mme attentive et active, aux sances de cours et de laboratoire ne sut
e
e
e
pas : il faut prvoir un temps de travail personnel qui, selon ltudiant et la mati`re, peut
e
e
e
aller de 50% ` 150% du temps de prsence en cours ;
a
e
2. la rgularit dans le travail personnel est un gage dapprentissage plus ecace.
e
e
Le calendrier prvisionnel des enseignements et des contrles associs est distribu en dbut de
e
o
e
e
e
semestre (un exemple de planning est donn en annexe 1.6.3 page 34).
e
TD1.14
Les documents de cours sont distribus au moins 15 jours avant les sances correspondantes
e
e
(sauf en ce qui concerne les 2 premi`res semaines de cours videmment). Par ailleurs, ` tout
e
e
a
moment, le calendrier et les documents sont disponibles sur le site Web dInformatique S1.
1.4.1
Prparation : Certains cours dbutent par un contrle dautoformation (voir section 1.3.3)
e
e
o
dont le th`me est en rapport avec certains aspects du cours qui suivra immdiatement. Il
e
e
est donc ncessaire davoir tudi avant et par soi-mme le sujet du contrle.
e
e
e
e
o
En gnral, on trouvera les informations ncessaires soit directement sur le site dInformae e
e
tique S1, soit dans les rfrences bibliographiques donnes en n des notes de cours (voir
ee
e
1.4. METHODES DE TRAVAIL
17
par exemple les rfrences de ce chapitre en page 271), soit dans les polycopis dautres
ee
e
cours de lENIB (mathmatiques, lectronique, productique, microprocesseurs. . .), soit ene
e
core sur internet en sassurant de la qualit du site (prfrer des sites universitaires ou
e
ee
dcoles dont lactivit principale est denseigner ces mati`res).
e
e
e
Par exemple, il est ncessaire davoir assimil les principes du calcul boolen pour ma
e
e
e
triser
les tests et les boucles du langage algorithmique. Cest pourquoi, une autoformation est
impose sur ce domaine dj` connu des tudiants. Un contrle-type dautoformation sur le
e
ea
e
o
calcul boolen pourrait par exemple tre compos des TD 1.12 page 15 et 1.15 ci-contre.
e
e
e
TD1.15
Pour chaque contrle dautoformation, un exemple corrig est disponible sur le site dInforo
e
matique S1. Il est donc fortement recommand de travailler ce contrle-type : apr`s avoir
e
o
e
revu par soi-mme les principales notions du domaine, faire le contrle sans consulter au
e
o
pralable la solution propose.
e
e
Participation : Par respect pour les autres participants, la ponctualit est de rigueur pour
e
ltudiant comme pour le professeur. Mais assister ` un cours na dintrt que dans le cas
e
a
ee
dune prsence attentive et soutenue : le temps pass en cours pour assimiler les nouvelles
e
e
notions sera gagn sur le temps de travail personnel futur ncessaire ` leur assimilation.
e
e
a
Chaque page des supports de cours est constitue dune copie dun transparent de cours
e
dans la demi-page suprieure alors que la demi-page infrieure est volontairement laisse
e
e
e
vierge pour que ltudiant prenne des notes pendant le cours (gure 1.12).
e
La prise de note systmatique est en eet un facteur qui favorise lattention. Un contrle de
e
o
type QCM en n de cours valuera lattention des tudiants (voir section 1.3.3). TD1.16
e
e
Le cours est illustr par des exemples et des exercices : ` ces occasions, cest une particie
a
pation active de ltudiant qui est attendue dans une dmarche volontaire dassimilation
e
e
du cours ` chaud .
a
Appropriation : Dans la mesure du possible, il faut relire ses propres notes ainsi que les notes
de cours le soir mme an de xer les principales ides du cours. La rvision propree
e
e
ment dite peut venir ultrieurement quelques jours plus tard (et non quelques semaines ni
e
quelques mois apr`s).
e
Les dnitions, comme toute dnition, sont ` apprendre par cur . Une technique pose
e
a
sible est de lire 2 fois de suite ` voix haute la dnition en dtachant distinctement les
a
e
e
direntes expressions (exemple : linformatique est la science du traitement
e
automatique de linformation ), puis lcrire de mmoire.
e
e
Dnition
e
information automatique
Matriel Logiciel
e
matriel : ordinateurs
e
Algorithmique
tisseau@enib.fr
enib c 2009
2/18
,
Dnitions
e
informatique Linformatique est la science du traitement automatique de
linformation.
matriel Le matriel informatique est un ensemble de dispositifs physiques
e
e
utiliss pour traiter automatiquement des informations.
e
logiciel Le logiciel est un ensemble structur dinstructions dcrivant un
e
e
traitement dinformations ` faire raliser par un matriel
a
e
e
informatique.
CHAPITRE 1. INTRODUCTION GENERALE
18
Pour rviser le cours, faire systmatiquement les TD au moment o` ils sont rfrencs dans
e
e
u
ee
e
les notes par le symbole
. Cest particuli`rement vrai avec les exemples pour lesquels
e
sont associs des exercices en marge des notes de cours (exemple : lexemple 1.1 de la page
e
5 et le TD 1.1 associ en marge de la mme page). Lorsque lexemple est un algorithme, il
e
e
faut systmatiquement se mettre mentalement ` la place de la machine qui va les excuter
e
a
e
(on parle alors d empathie numrique ) an de vrier le rsultat obtenu. Pour cela, il
e
e
e
faut tre mthodique et rigoureux. Et petit ` petit, ` force de pratique, lexprience fera
e
e
a
a
e
quon verra le rsultat produit par les instructions au fur et ` mesure quon les crit.
e
a
e
Naturellement, cet apprentissage est long, et demande des heures de travail patient. Aussi,
dans un premier temps, il faut viter de sauter les tapes : la vrication mthodique, pas
e
e
e
e
a
` pas, de chacun des algorithmes reprsente plus de la moiti du travail ` accomplir [5].
e
e
a
1.4.2
TD 1.17 : Nombres dexercices de TD
Combien dexercices y avait-il ` faire avant celui-ci ?
a
Prparation : Faire les exercices situs dans les marges de ces notes de cours est non seulement
e
e
une faon de rviser son cours (voir section 1.4.1) mais aussi de prparer les sances de
c
e
e
e
laboratoire. Pour ces notes de cours, la liste compl`te des exercices est donne en annexe
e
e
B page 223. Un de ces exercices choisi alatoirement fera lobjet dune valuation en dbut
e
e
e
de chaque sance de TD (voir section 1.3.3).
e
TD1.17
Tous ces exercices ne ncessitent pas une longue phase de rexion comme les TD 2.7 ou
e
e
1.13 ( 1.28). Certains au contraire ne prsentent aucune dicult particuli`re comme
e
e
e
les TD 1.14 et 1.17 qui demandent simplement de compter les contrles et les exercices.
o
Dautres comme les TD 1.10 et 1.16 font appel ` la mmoire, dautres encore ` la recherche
a
e
a
dinformations comme les TD 1.4 et 1.8, ou ` une mise en uvre pratique comme les TD
a
1.5 et 1.9.
Participation : Ici encore, par respect pour les autres participants, la ponctualit est de
e
rigueur pour ltudiant comme pour le professeur.
e
En informatique, lorsquon travaille en binme, il faut rguli`rement alterner les rles entre
o
e
e
o
l crivain qui manipule clavier et souris et le lecteur qui vrie la production de
e
e
lcrivain. A la n du semestre, chaque tudiant doit tre devenu un lecteur-crivain .
e
e
e
e
La pratique est en eet ncessaire pour apprivoiser lenvironnement de travail an
e
que la machine devienne transparente et que seul subsiste le probl`me algorithmique
e
a e
` rsoudre.
TD1.18
1.4. METHODES DE TRAVAIL
19
Pour certains exercices, la solution est donne dans les notes de cours (en section 1.5.5
e
page 26 pour ce chapitre). Pendant les sances de laboratoire, il faut donc savoir jouer le
e
jeu pour ne pas simplement recopier la solution propose (il existe dailleurs dautres
e
solutions pour la plupart des exercices).
Un apprenti programmeur est toujours confront ` ses propres erreurs (revoir le TD 1.6
ea
page 13 par exemple). En gnral, ce sont des erreurs simples ` corriger ` condition de lire
e e
a
a
les messages derreur et de faire leort de les comprendre avant dappeler le professeur
` laide .
a
Exemple 1.5 : Erreur de nom en Python
Voici une erreur classique dune variable non correctement initialise en Python :
e
>>> print(x)
Traceback (most recent call last) :
File "<stdin>", line 1, in ?
NameError : name x is not defined
>>>
En Python, la derni`re ligne du message derreur est la plus parlante au dbutant.
e
e
Appropriation : Avant le cours suivant, il faut refaire les TD qui ont pos des probl`mes et
e
e
faire les exercices qui nont pas pu tre abords en sance de laboratoire (les solutions de
e
e
e
ces exercices complmentaires sont donnes dans les notes de cours).
e
e
1.4.3
Apprendre en faisant
CHAPITRE 1. INTRODUCTION GENERALE
20
1.5
1.5.1
Exercices complmentaires
e
Conna
tre
1.5. EXERCICES COMPLEMENTAIRES
21
Remarque 1.7 : Parmi les 4 items de la question cicontre, un seul item dnit la validit dun algorithme,
e
e
les 3 autres se rapportent ` dautres proprits des algoa
ee
rithmes. Lesquelles ?
CHAPITRE 1. INTRODUCTION GENERALE
22
3. un micro-ordinateur actuel,
4. Deeper-Blue : lordinateur qui a battu Kasparov aux checs en 1997,
e
5. le plus puissant ordinateur actuel.
Remarque 1.8 :
1.5.2
Remarque 1.9 :
Remarque 1.10 :
1.5.3
Remarque 1.11 :
Comprendre
Appliquer
1.5. EXERCICES COMPLEMENTAIRES
23
1.5.4
Analyser
`
TD 1.25 : La multiplication a la russe
La technique de multiplication dite ` la russe consiste ` diviser par 2 le multiplicateur
a
a
(et ensuite les quotients obtenus), jusqu` un quotient nul, ` noter les restes, et ` multiplier
a
a
a
parall`lement le multiplicande par 2. On additionne alors les multiples obtenus du multiplicande
e
correspondant aux restes non nuls.
Exemple : 68 123 (= 8364)
multiplicande multiplicateur
reste somme partielle
M 2
m 2 m mod 2
123
68
0
(0 123) + 0
246
34
0
(0 246) + 0
492
17
1
(1 492) + 0
984
8
0
(0 984) + 492
1968
4
0 (0 1968) + 492
2
0 (0 3936) + 492
3936
7872
1
1 (1 7872) + 492
68 123 =
8364
Eectuer les multiplications suivantes selon la technique ` la russe .
a
1. 64 96 (= 6144)
2. 45 239 (= 10755)
TD 1.26 : La multiplication arabe
On consid`re ici le texte dIbn al-Banna concernant la multiplication ` laide de tableaux [2].
e
a
Tu construis un quadrilat`re que tu subdivises verticalement et horizontalement en autant de bandes quil y
e
a de positions dans les deux nombres multiplis. Tu divises diagonalement les carrs obtenus, ` laide de diagonales
e
e
a
allant du coin infrieur gauche au coin suprieur droit (gure 1.14).
e
e
Remarque 1.12 :
tique.
La multiplication ` la
a
russe est une variante
connue dune technique
gyptienne dcrite dans le
e
e
papyrus Rhind (environ
-1650). Le scribe Ahm`s
e
y expose des probl`mes de
e
gomtrie et darithmtique
e e
e
(qui viennent en partie des
Babyloniens) dont cette
technique de multiplication.
CHAPITRE 1. INTRODUCTION GENERALE
24
7
8
8
4
2
7
6
2
4
2
1
0
6
8
4
4
2
1
0
0
8
4
2
3
0
0
0
2
6
3
7
6
1
0
0
2 4
1 2
0 1
Tu places le multiplicande au-dessus du quadrilat`re, en faisant correspondre chacune de ses positions ` une
e
a
a
a
e
colonne1 . Puis, tu places le multiplicateur ` gauche ou ` droite du quadrilat`re, de telle sorte quil descende avec
lui en faisant correspondre galement chacune de ses positions ` une ligne2 . Puis, tu multiplies, lune apr`s lautre,
e
a
e
chacune des positions du multiplicande du carr par toutes les positions du multiplicateur, et tu poses le rsultat
e
e
partiel correspondant ` chaque position dans le carr o` se coupent respectivement leur colonne et leur ligne,
a
e u
en plaant les units au-dessus de la diagonale et les dizaines en dessous. Puis, tu commences ` additionner, en
c
e
a
partant du coin suprieur gauche : tu additionnes ce qui est entre les diagonales, sans eacer, en plaant chaque
e
c
nombre dans sa position, en transfrant les dizaines de chaque somme partielle ` la diagonale suivante et en les
e
a
ajoutant ` ce qui y gure.
a
La somme que tu obtiendras sera le rsultat.
e
8017 :
Ces r`gles ne sont pas des r`gles logiques, mais de simples procds mnmotechniques indie
e
e e
e
quant ce quil convient de faire selon la situation. Leur nonc dbute par le rappel du diviseur,
e
e e
ici 7, et se poursuit par lnonc du dividende, par exemple 3 : 7-3. Le reste de la r`gle indique
e
e
e
1
Lcriture du nombre seectue de droite ` gauche (exemple : 352 scrira donc 253).
e
a
e
3
5
2
scrira donc
e
2
5
3
).
1.5. EXERCICES COMPLEMENTAIRES
25
quelles manipulations eectues, ajouts ou retraits de boules. Il faut galement savoir que le die
e
vidende tant pos sur le boulier, on doit appliquer les r`gles aux chires successifs du dividende,
e
e
e
en commenant par celui dont lordre est le plus lev. ajouter en dessous veut dire mettre
c
e e
des boules au rang immdiatement infrieur (` droite) au rang considr et monter veut
e
e
a
e e
dire mettre des boules au rang immdiatement suprieur (` gauche) au rang considr .
e
e
a
e e
Pour eectuer la division dun nombre par 7, on pose le dividende ` droite sur le boulier et
a
le diviseur (7) ` gauche. On op`re sur les chires successifs du dividende en commenant par
a
e
c
celui dordre le plus lev (le plus ` gauche). Les r`gles prcdemment nonces sont appliques
e e
a
e
e e
e
e
e
systmatiquement.
e
Utiliser un boulier chinois pour diviser 1234 par 7 (1234 = 176 7 + 2).
1
0 0 0 0
1
0 1 1 0
2
1 2 3 4
2
1 2 1 2
TD 1.28 : Le calcul Shadok
Les cerveaux des Shadoks avaient une capacit tout ` fait limite [15]. Ils ne comportaient en
e
a
e
tout que 4 cases. Comme ils navaient que 4 cases, videmment les Shadoks ne connaissaient pas
e
plus de 4 mots : ga, bu, zo et meu (gure 1.17). Etant donn quavec 4 mots, ils ne pouvaient
e
pas compter plus loin que 4, le Professeur Shadoko avait rform tout a :
e
e
c
Quand il ny a pas de Shadok, on dit ga et on crit ga.
e
Quand il y a un Shadok de plus, on dit bu et on crit bu.
e
Quand il y a encore un Shadok, on dit zo et on crit zo.
e
Et quand il y en a encore un autre, on dit meu et on crit meu.
e
Tout le monde applaudissait tr`s fort et trouvait a gnial sauf le Devin Plombier qui disait
e
c e
quon navait pas ide dinculquer ` des enfants des btises pareilles et que Shadoko, il fallait
e
a
e
le condamner. Il fut tr`s applaudi aussi. Les mathmatiques, cela les intressait, bien sr, mais
e
e
e
u
brler le professeur, ctait intressant aussi, faut dire. Il fut dcid ` lunanimit quon le
u
e
e
e e a
e
laisserait parler et quon le brlerait apr`s, ` la rcration.
u
e a
e e
Rptez avec moi : meu zo bu ga. . .ga bu zo meu.
e e
Et apr`s ! ricanait le Plombier.
e
Si je mets un Shadok en plus, videmment, je nai plus assez de mots pour les compter,
e
alors cest tr`s simple : on les jette dans une poubelle, et je dis que jai bu poubelle. Et pour
e
ne pas confondre avec le bu du dbut, je dis quil ny a pas de Shadok ` ct de la poubelle
e
a oe
et jcris bu ga. bu Shadok ` ct de la poubelle : bu bu. Un autre : bu zo. Encore
e
a oe
un autre : bu meu. On continue. zo poubelles et pas de Shadok ` ct : zo ga. . .meu
a oe
`
Fig. 1.16 : Regles de la division par 7
R`gle
e
7-1
7-2
7-3
7-4
7-5
7-6
7-7
1
2
1
2
1
2
1
2
1
2
1
2
1
2
Avant
0 0
0 1
0 0
0 2
0 0
0 3
0 0
0 4
0 1
0 0
0 1
0 1
0 1
0 2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
2
1
2
1
2
1
2
1
2
1
2
1
2
Apr`s
e
0 0
0 1
0 0
0 2
0 0
0 4
0 1
0 0
0 1
0 2
0 1
0 3
0 0
1 0
0
3
1
1
0
2
1
0
0
1
0
4
0
0
CHAPITRE 1. INTRODUCTION GENERALE
26
poubelles et meu Shadoks ` ct : meu meu. Arriv l`, si je mets un Shadok en plus, il
a oe
e a
me faut une autre poubelle. Mais comme je nai plus de mots pour compter les poubelles,
je men dbarrasse en les jetant dans une grande poubelle. Jcris bu grande poubelle avec
e
e
pas de petite poubelle et pas de Shadok ` ct : bu ga ga, et on continue. . .bu ga bu,
a oe
bu ga zo. . .meu meu zo, meu meu meu. Quand on arrive l` et quon a trop de grandes
a
poubelles pour pouvoir les compter, eh bien, on les met dans une super-poubelle, on crit
e
bu ga ga ga, et on continue. . .(gure 1.18).
1. Quels sont les entiers dcimaux reprsents en base Shadok par les expressions suie
e
e
vantes ?
(a) ga ga
(b) bu bu bu
(c) zo zo zo zo
(d) meu meu meu meu meu
2. Eectuer les calculs Shadok suivants.
(a) zo zo meu + bu ga meu
(b) meu ga meu bu meu ga
(c) zo meu meu bu ga meu
(d) zo zo zo meu bu ga zo
1.5.5
:
:
:
:
:
:
ga
bu
zo
meu
bu ga
bu bu
6
7
8
9
10
11
:
:
:
:
:
:
bu
bu
zo
zo
zo
zo
zo
meu
ga
bu
zo
meu
12
13
14
15
16
17
:
:
:
:
:
:
meu ga
meu bu
meu zo
meu meu
bu ga ga
bu ga bu
1.5. EXERCICES COMPLEMENTAIRES
27
CHAPITRE 1. INTRODUCTION GENERALE
28
robustesse : cet algorithme suppose quon a susamment de place pour tracer une
spirale (le dernier ct fait 6 pas de long) ; sil fonctionne correctement sur une plage, il
oe
ne fonctionnera certainement plus dans un placard.
rutilisabilit : il existe une innit de spirales rectangulaires qui ont les caractristiques
e
e
e
e
attendues ; il sut de penser ` changer lorientation initiale ou la longueur du pas par
a
exemple. On ne pourra donc pas utiliser lalgorithme tel quel dans toutes les congurations : il aurait fallu paramtrer langle de rotation et la longueur du pas.
e
complexit : on peut la caractriser par le nombre de pas : 2 + 3 + 4 + 5 + 6 = 20 pas.
e
e
ecacit : si la complexit se calcule en nombre de pas comme ci-dessus, on pourrait
e
e
imaginer par exemple que la frquence des pas soit plus grande ( frquence dhorloge )
e
e
ou que 5 personnes prennent en charge chacune un ct de la spirale pour gagner du
oe
temps ( syst`me multi-processeurs ).
e
TD 1.24 : Tracs de polygones rguliers.
e
e
1. Pentagone rgulier de 10 pas de ct.
e
oe
(a) avance de 10 pas,
(b) tourne ` gauche de (360/5) ,
a
(c) avance de 10 pas,
(d) tourne ` gauche de
a
(360/5) ,
1.5. EXERCICES COMPLEMENTAIRES
29
2.
multiplicande
M 2
96
192
384
768
1536
3072
6144
multiplicateur
m2
64
32
16
8
4
2
1
reste
m mod 2
0
0
0
0
0
0
1
64 96 =
multiplicande
M 2
239
478
956
1912
3824
7648
multiplicateur
m2
45
22
11
5
2
1
reste
m mod 2
1
0
1
1
0
1
45 239 =
somme partielle
(0 96) + 0
(0 192) + 0
(1 384) + 0
(0 768) + 0
(0 1536) + 0
(0 3072) + 0
(1 6144) + 0
6144
somme partielle
(1 239) + 0
(0 478) + 239
(1 956) + 239
(1 1912) + 1195
(0 3824) + 3107
(1 7648) + 3107
10755
CHAPITRE 1. INTRODUCTION GENERALE
30
7
8
8
4
6
3
2
2
8
6
4
2
2 4
1 2
6
2
Remarque 1.14 :
i=n
X
ri bi
i=0
i=n
X
i=m
ri bi
1
0 0 0 0 7-1 1
0 1 0 0 7-5 1
2
1 2 3 4
2
1 0 3 4
2
8
rsultat
1
2
0
1
1
2
0
4
0 7-4 1
4
2
0
1
1
2
1
0
1 7-7 1
4
2
0
1
1
2
0
4
0
1
1
2
1
1
0
4
0
2
1.6. ANNEXES
1.6
1.6.1
31
Annexes
Lettre de Jacques Perret
Au printemps de 1955, IBM France sapprtait ` construire dans ses ateliers de Corbeile
a
Essonnes (consacrs jusque-l` au montage des machines mcanographiques tabulatrices,
e
a
e
trieuses, . . . de technologie lectromcanique) les premi`res machines lectroniques destines
e
e
e
e
e
au traitement de linformation. Aux Etats-Unis ces nouvelles machines taient dsignes sous
e
e
e
le vocable Electronic Data Processing System. Le mot computer tait plutt rserv aux
e
o e
e
machines scientiques et se traduisait aisment en calculateur ou calculatrice . Sollicit
e
e
par la direction de lusine de Corbeil-Essonnes, Franois Girard, alors responsable du service
c
promotion gnrale publicit, dcida de consulter un de ses anciens ma
e e
e e
tres, Jacques Perret,
professeur de philologie latine ` la Sorbonne. A cet eet il crit une lettre ` la signature de C.
a
e
a
de Waldner, prsident dIBM France. Il dcrit sommairement la nature et les fonctions des noue
e
velles machines. Il accompagne sa lettre de brochures illustrant les machines mcanographiques.
e
Le 16 avril, le professeur Perret lui rpond. Lordinateur IBM 650 peut commencer sa carri`re.
e
e
Protg pendant quelques mois par IBM France, le mot fut rapidement adopt par un public
e e
e
de spcialistes, de chefs dentreprises et par ladministration. IBM dcida de le laisser dans le
e
e
`
domaine public (dapr`s le site de la 10eme semaine de la langue franaise et de la francophonie
e
c
www.semainelf.culture.fr/site2005/dixmots).
Le 16 IV 1955
Cher Monsieur,
Que diriez-vous d ordinateur ? Cest un mot correctement form, qui se trouve mme
e
e
dans le Littr comme adjectif dsignant Dieu qui met de lordre dans le monde. Un mot de
e
e
ce genre a lavantage de donner aisment un verbe ordiner , un nom daction ordinae
tion . Linconvnient est que ordination dsigne une crmonie religieuse ; mais les deux
e
e
e e
champs de signication (religion et comptabilit) sont si loigns et la crmonie dordination
e
e
e
e e
connue, je crois, de si peu de personnes que linconvnient est peut-tre mineur. Dailleurs votre
e
e
machine serait ordinateur (et non ordination) et ce mot est tout ` fait sorti de lusage
a
thologique. Systmateur serait un nologisme, mais qui ne me para pas oensant ; il pere
e
e
t
met systmatis ; - mais syst`me ne me semble gu`re utilisable - combinateur a
e
e
e
e
linconvnient du sens pjoratif de combine ; combiner est usuel donc peu capable de
e
e
devenir technique ; combination ne me para gu`re viable ` cause de la proximit de comt e
a
e
binaison . Mais les Allemands ont bien leurs combinats (sorte de trusts, je crois), si bien
Apple II (1977)
IBM PC (1981)
ZX 81 (1981)
Macintosh (1984)
32
8086
Pentium 4
80486
Core Duo
PDA
iPhone
Tablette
Wii
CHAPITRE 1. INTRODUCTION GENERALE
que le mot aurait peut-tre des possibilits autres que celles quvoque combine .
e
e
e
Congesteur , digesteur voquent trop congestion et digestion . Synthtie
e
seur ne me para pas un mot assez neuf pour designer un objet spcique, dtermin comme
t
e
e
e
votre machine. En relisant les brochures que vous mavez donnes, je vois que plusieurs de vos
e
appareils sont dsigns par des noms dagent fminins (trieuse, tabulatrice). Ordinatrice
e
e
e
serait parfaitement possible et aurait mme lavantage de sparer plus encore votre machine du
e
e
vocabulaire de la thologie. Il y a possibilit aussi dajouter ` un nom dagent un complment :
e
e
a
e
ordinatrice dlments complexes ou un lment de composition, par ex. : slecto-systee
ee
e
e
mateur . - Slecto- ordinateur a linconvnient de 2 o en hiatus, comme lectroe
e
e
ordinatrice . Il me semble que je pencherais pour ordinatrice lectronique . Je souhaite que
e
ces suggestions stimulent, orientent vos propres facults dinvention. Nhsitez pas ` me donner
e
e
a
un coup de tlphone si vous avez une ide qui vous paraisse requrir lavis dun philologue.
ee
e
e
Vtre.
o
J. Perret
1.6. ANNEXES
1.6.2
33
Proposition
1 2
Vos connaissances antrieures taient susantes pour suivre ce 2 2
e
e
cours
Les objectifs du cours ont t clairement dnis
ee
e
2 2
Vous tes satisfait des supports de cours fournis
e
2 2
2 2
Vous tes satisfait de lquilibre cours/TD/TP
e
e
Vous tes satisfait de la prsentation de ce cours (clart dexpres- 2 2
e
e
e
sion. . .)
Si vous avez plusieurs professeurs, la cohrence de lenseignement 2 2
e
vous a sembl assure
e
e
Le rythme de travail vous a permis de suivre et de comprendre
2 2
Le temps allou ` cette mati`re vous a sembl satisfaisant
ea
e
e
2 2
2 2
Cette mati`re a ncessit beaucoup de travail personnel
e
e
e
Vous avez eu limpression de progresser
2 2
Les contrles sont adapts ` lobjectif et au niveau du cours
o
e a
2 2
Vous tes satisfait du mode dvaluation
e
e
2 2
Apr`s les contrles, les enseignants fournissent des commentaires 2 2
e
o
qui aident ` mieux maitriser la mati`re
a
e
Vous tes satisfait des conditions de travail (salles de cours, 2 2
e
matriel utilis. . .)
e
e
Respect du programme pdagogique
e
2 2
1 :Tr`s satisfait , 2 :Satisfait , 3 :Peu satisfait , 4 :Pas satisfait ; :Ne me
e
3
2
4
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2 2
2
concerne pas
CHAPITRE 1. INTRODUCTION GENERALE
34
1.6.3
Exemple de planning
3
4
5
Cours-TD
introduction gnrale
e e
instructions de base
instructions de base
DS1 : instructions de base
7
8
procdures et fonctions
e
9
10
11
12
procdures et fonctions
e
13
14
TD
environnement de programmation
CTD1 : aectation et tests
instructions de base
1.6. ANNEXES
1.6.4
35
Informatique ` lENIB
a
ENIB : www.enib.fr
Semestre
S1
S2
S3
S3
S4
Th`me
e
Algorithmique
Mthode de dveloppement
e
e
Programmation procdurale
e
Programmation par objets
Programmation pour lembarqu
e
Horaires
42 h
42 h
42 h
42 h
42 h
Semestre
S5
S6
S6
S6
Th`me
e
Programmation par objets
Programmation par objets
Mod`les pour lingnierie des syst`mes
e
e
e
Bases de donnes
e
Horaires
42 h
42 h
42 h
21 h
`
Au cours du 3eme semestre du cycle ingnieur (S7), les l`ves choisissent une option parmi
e
ee
trois : lectronique, informatique ou mcatronique. Les modules de loption informatique sont
e
e
`
lists dans le tableau ci-dessous. Le 4eme semestre (S8) est consacr ` un Projet Professionnalisant
e
ea
en Equipe (PPE) ou ` un stage en entreprise.
a
CHAPITRE 1. INTRODUCTION GENERALE
36
Semestre
S7
S7
S7
S7
S7
S7
S7
S7
Th`me
e
Syst`mes embarqus 1
e
e
Syst`mes embarqus 2
e
e
Rseaux
e
Administration Syst`mes et Rseaux
e
e
Gnie Logiciel
e
Syst`mes dInformation
e
Interfaces Homme-Machine
Applications Rparties
e
Horaires
42 h
42 h
42 h
42 h
42 h
42 h
42 h
42 h
`
Au cours du 5eme semestre du cycle ingnieur (S9), les tudiants doivent suivre 9 modules
e
e
scientiques, les modules ` caract`re informatique sont donns dans le tableau ci-dessous. Le
a
e
e
dernier semestre (S10) est consacr au stage en entreprise.
e
Semestre
S9
S9
S9
S9
S9
Th`me
e
Syst`mes distribus
e
e
Contrle adaptatif
o
Styles de programmation
Intelligence articielle et Simulation
Ralit Virtuelle
e e
Horaires
42 h
42 h
42 h
42 h
42 h
Recherches en informatique
LISyC : www.lisyc.univ-brest.fr
LENIB accueille trois laboratoires de recherche correspondant aux trois options : lectronique,
e
informatique et mcatronique.
e
Le laboratoire de recherche en informatique de lENIB est le LISyC (Laboratoire dInformatique des Syst`mes Complexes). Le LISyC est ` Brest une Equipe dAccueil (EA 3883) commune
e
a
a
` lUniversit de Bretagne Occidentale (UBO), ` lEcole Nationale dIngnieurs de Brest (ENIB)
e
a
e
et ` lEcole Nationale Suprieure des Ingnieurs des Etudes des Techniques dArmement (ENa
e
e
SIETA).
Le LISyC a fait sienne lide selon laquelle comprendre et ma
e
triser les comportements des
syst`mes complexes, naturels ou articiels, constituent pour les scientiques le d majeur du
e
e
eme si`cle. Il compte actuellement 50 enseignants-chercheurs permanents et 25 doctorants
`
21
e
1.6. ANNEXES
37
regroups en 4 quipes STIC et 1 quipe SHS qui explorent de mani`re complmentaire cette
e
e
e
e
e
problmatique :
e
AReVi
in virtuo
IdM
SARA
SuSy
:
:
:
:
:
Les quipes AReVi, in virtuo et SARA sont localises au CERV : le Centre Europen de
e
e
e
Ralit Virtuelle, tablissement de lENIB ouvert en juin 2004.
e e
e
CERV : www.cerv.fr
38
CHAPITRE 1. INTRODUCTION GENERALE
Chapitre 2
Instructions de base
Sommaire
2.1
2.2
Informatique
S1
2.3
Initiation ` lalgorithmique
a
2.4
instructions de base
Jacques TISSEAU
2.5
enib c 2009
2.6
tisseau@enib.fr
enib c 2009
Algorithmique
39
1/30
Introduction . . . . . . . . . . . . .
2.1.1 Jeu dinstructions . . . . . .
2.1.2 Instructions de base . . . .
Aectation . . . . . . . . . . . . . .
2.2.1 Variables . . . . . . . . . . .
2.2.2 Attribuer une valeur . . . .
2.2.3 Squences daectations . .
e
Tests . . . . . . . . . . . . . . . . . .
2.3.1 Tests simples . . . . . . . . .
2.3.2 Alternatives simples . . . .
2.3.3 Alternatives multiples . . .
Boucles . . . . . . . . . . . . . . . .
2.4.1 Itration conditionnelle . .
e
2.4.2 Parcours de squences . . .
e
2.4.3 Imbrications de boucles . .
2.4.4 Excutions de boucles . . .
e
Exercices complmentaires . . . . .
e
2.5.1 Conna
tre . . . . . . . . . . .
2.5.2 Comprendre . . . . . . . . .
2.5.3 Appliquer . . . . . . . . . . .
2.5.4 Analyser . . . . . . . . . . .
2.5.5 Solutions des exercices . . .
Annexes . . . . . . . . . . . . . . . .
2.6.1 Instructions Logo . . . . . .
2.6.2 Instructions Python . . . .
2.6.3 Construction dune boucle
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
40
40
41
42
42
43
45
46
47
48
49
51
52
56
59
61
63
63
66
72
74
76
91
91
92
95
40
2.1
Introduction
Un algorithme est une suite ordonne dinstructions qui indique la dmarche ` suivre pour
e
e
a
rsoudre une srie de probl`mes quivalents. Ainsi quand on dnit un algorithme, celui-ci ne
e
e
e
e
e
doit contenir que des instructions comprhensibles par celui qui devra lexcuter. Dans ce cours,
e
e
nous devrons donc apprendre ` dnir des algorithmes pour quils soient comprhensibles et
a e
e
donc excutables par un ordinateur.
e
2.1.1
Remarque 2.1 : On distingue classiquement 2 grands
types darchitectures de micro-processeurs :
les architectures risc (Reduced Instruction Set Computer) prconisent un petit nombre dinstructions
e
lmentaires dans un format xe ;
ee
les architectures cisc (Complex Instruction Set Computer) sont bases sur des jeux dinstructions tr`s
e
e
riches de taille variable orant des instructions composes de plus haut niveau dabstraction.
e
Chaque architecture poss`de ses avantages et ses ine
convnients : pour le risc la complexit est reporte au
e
e
e
niveau du compilateur, pour le cisc le dcodage est plus
e
pnalisant. En fait les machines cisc se sont orientes
e
e
vers une architecture risc o` les instructions cisc sont
u
traduites en instructions risc traites par le coeur du proe
cesseur.
Jeu dinstructions
Chaque microprocesseur a son jeu dinstructions de base dont le nombre varie typiquement
de quelques dizaines ` quelques centaines selon le type darchitecture du processeur. On peut
a
classer ces instructions de base en 5 grands groupes : les oprations arithmtiques (+, -, *, /. . .),
e
e
les oprations logiques (not, and, or. . .), les instructions de transferts de donnes (load, store,
e
e
move. . .), les instructions de contrle du ux dinstructions (branchements impratifs et condio
e
tionnels, boucles, appels de procdure. . .), et les instructions dentre-sortie (read, write. . .).
e
e
Le traitement des ces instructions par le microprocesseur passe ensuite par 5 tapes :
e
1. fetch : chargement depuis la mmoire de la prochaine instruction ` excuter,
e
a e
2. decode : dcodage de linstruction,
e
3. load operand : chargement des donnes ncessaires ` linstruction,
e
e
a
4. execute : excution de linstruction,
e
2.1. INTRODUCTION
41
du pouvoir dexpressivit des langages, du langage machine aux langages de haut niveau.
e
machine
2.1.2
assembleur
Pascal
Python
A1
8B
01
A3
MOV
MOV
ADD
MOV
c = a + b
00 01
1E 02 01
D8
04 01
AX,[100h]
BX,[102h]
AX,BX
[104h],AX
Instructions de base
Dans ce cours, nous nous intresserons aux instructions disponibles dans un langage de
e
haut niveau tel que Python. Les principales instructions (statements) concerneront laectation
(assignment), les tests (conditional statements) et les boucles (loops). Le tableau ci-dessous donne
la syntaxe Python des instructions de base qui seront utilises dans ce chapitre (dapr`s [10]).
e
e
Une liste plus dtaille des principales instructions en Python est propose en annexe 2.6.2
e
e
e
page 92.
Statement
pass
print([s1] [, s2 ]*)
a = b
if condition :
suite
[elif condition : suite]*
[else :
suite]
while condition :
suite
for element in sequence :
suite
Result
Null statement
Writes to sys.stdout. Puts spaces between arguments si. Puts newline at end unless arguments end
with end= (ie : end= ). print is not required when
running interactively, simply typing an expression will
print its value, unless the value is None.
Basic assignment - assign object b to label a
Usual if/else if/else statement.
Python : www.python.org
42
2.2
2.2.1
Aectation
Variables
2.2. AFFECTATION
43
Seules les lettres ordinaires sont autorises. Les lettres accentues, les cdilles, les espaces,
e
e
e
les caract`res spciaux tels que $, #, @, etc. sont interdits, ` lexception du caract`re
e
e
a
e
(soulign).
e
La casse est signicative : les caract`res majuscules et minuscules sont distingus.
e
e
Ainsi, python, Python, PYTHON sont des variables direntes.
e
Par convention, on crira lessentiel des noms de variable en caract`res minuscules (y come
e
pris la premi`re lettre). On nutilisera les majuscules qu` lintrieur mme du nom pour en
e
a
e
e
augmenter ventuellement la lisibilit, comme dans programmePython ou angleRotation.
e
e
Une variable dont la valeur associe ne varie pas au cours du programme (on parle alors
e
de constante) pourra tre crite enti`rement en majuscule, par exemple PI ( = 3.14).
e
e
e
Le langage lui-mme peut se rserver quelques noms comme cest le cas pour Python
e
e
(gure 3.5). Ces mots rservs ne peuvent donc pas tre utiliss comme noms de variable.
e
e
e
e
2.2.2
del
elif
else
except
exec
finally
for
from
global
if
import
in
is
lambda
not
or
pass
print
raise
return
try
while
with
yield
Une fois nomme, il est souvent ncessaire de modier la valeur de la donne rfrence par
e
e
e ee
e
une variable. Cest le rle de linstruction daectation.
o
Dnition 2.2 : affectation
e
Laectation est lopration qui consiste ` attribuer une valeur ` une variable.
e
a
a
nom
bool
int
float
str
tuple
list
dict
exemples
False, True
3, -7
3.14, 7.43e-3
salut, "leau"
1,2,3
[1,2,3]
{a :4, r :8}
44
variable = expression : Lexpression peut tre nimporte quelle expression valuable telle
e
e
quune opration logique (x = True or False and not True), une opration arithmtie
e
e
que (x = 3 + 2*9 - 6*7), un appel de fonction (y = sin(x)) ou toute autre combinaison
valuable (x = (x != y) and (z + t >= y) or (sin(x) < 0)).
e
TD2.2
reste =
somme =
delta =
surface
= b
+= b
-= b
*= b
/= b
%= b
**= b
a
a
a
a
a
a
=
=
=
=
=
=
a
a
a
a
a
a
+ b
- b
* b
/ b
% b
** b
autreBooleen = True
autreEntier = -329
autreReel = -5.4687e-2
autreChaine = bonjour, comment a va ?
c
autreTableau = [a,[6,3.14],[x,y,[z,t]]]
autreMatrice = [[1,2],[3,4],[5,6],[7,8]]
autreNUplet = "e",True,6.7,3,"z"
autreDictionnaire = {"a":7, "r":-8}
a%b
n*(n+1)/2
b*b - 4*a*c
= pi*r**2
quotient = a/b
sommeGeometrique = s = a*(b**(n+1) - 1)/(b-1)
racine = (-b + sqrt(delta))/(2*a)
volume = surface * hauteur
2.2. AFFECTATION
2.2.3
45
Squences daectations
e
et eut la dsagrable surprise de constater que les valeurs des variables ntaient pas permutes
e
e
e
e
apr`s cette squence daectations.
e
e
En eet, pour xer les ides supposons quinitialement x = 10 et y = 20. Laectation x = y
e
conduit ` valuer y puis ` attribuer la valeur de y (20) ` x : x vaut maintenant 20. La deuxi`me
ae
a
a
e
aectation (y = x) commence par valuer x puis ` attribuer la valeur de x (20 !) ` y. Apr`s
e
a
a
e
ces 2 aectations, x et y sont donc identiques et non permutes ! Pour eectuer la permutation,
e
lapprenti informaticien aurait pu utiliser une variable temporaire (que nous nommerons tmp)
et excuter la squence dinstructions suivante :
e
e
La premi`re aectation (tmp = x) permet de stocker la valeur initiale de x (10), la deuxi`me
e
e
(x = y) attribue ` x la valeur de y (20) et la troisi`me (y = tmp) attribue ` y la valeur de
a
e
a
tmp, cest-`-dire la valeur initiale de x (10). Ainsi, les valeurs nales de x et y (20 et 10) sont
a
bien permutes par rapport aux valeurs initiales (10 et 20).
e
TD2.3
tmp = x
x = y
y = tmp
=
=
=
=
=
=
12
18
a%b
b
r
a%b
#
#
#
#
#
#
a = 12
b = 18
r = 12
a = 18
b = 12
r=6
a
b
r
a
b
=
=
=
=
=
b
r
a%b
b
r
#
#
#
#
#
a = 12
b=6
r=0
a=6
b=0
TD2.4
46
Les 2 exemples 2.2 et 2.3 prcdents illustrent la possibilit de raliser des calculs plus ou
e e
e
e
moins compliqus ` laide dune squence daectations bien choisies. Mais ce sont les tests et
e a
e
les boucles qui nous permettront daborder des algorithmes rutilisables, et plus robustes, en
e
amliorant lexpressivit du programmeur.
e
e
2.3
Fig. 2.6 : Flux dinstructions
instruction1
instruction2
instruction3
Tests
Sauf mention explicite, les instructions dun algorithme sexcutent les unes apr`s les autres,
e
e
dans lordre o` elles ont t crites. Le chemin suivi ` travers un algorithme est appel le ux
u
e ee
a
e
e
dinstructions (gure 2.6), et les constructions qui le modient sont appeles des instructions
de contrle de ux. On excute normalement les instructions de la premi`re ` la derni`re, sauf
o
e
e a
e
lorsquon rencontre une instruction de contrle de ux : de telles instructions vont permettre
o
de suivre dirents chemins suivant les circonstances. Cest en particulier le cas de linstruce
tion conditionnelle qui nexcute une instruction que sous certaines conditions pralables. Nous
e
e
distinguerons ici 3 variantes dinstructions conditionnelles (gure 2.7) :
test simple
Instructions conditionnelles
if condition : blocIf
alternative simple
Remarque 2.9 : A propos des instructions conditionnelles, on parle souvent des instructions if dans le
jargon des informaticiens.
Remarque 2.10 :
else : if ....
if condition : blocIf
else : blocElse
alternative multiple
if condition : blocIf
elif condition1 : blocElif1
elif condition2 : blocElif2
...
else : blocElse
o` if, else et elif sont des mots rservs, condition une expression boolenne (` valeur True
u
e
e
e
a
ou False) et bloc... un bloc dinstructions.
2.3. TESTS
2.3.1
47
Tests simples
Linstruction if sous sa forme la plus simple (gure 2.8) permet de tester la validit
e
dune condition. Si la condition est vraie, alors le bloc dinstructions blocIf apr`s le : est
e
excut. Si la condition est fausse, on passe ` linstruction suivante dans le ux dinstructions.
e e
a
Fig. 2.8 : Le test simple
if condition : blocIf
La condition value apr`s linstruction if est donc une expression boolenne qui prend
e
e
e
e
soit la valeur False (faux) soit la valeur True (vrai). Elle peut contenir les oprateurs de come
paraison suivants :
x == y
x != y
x > y
x < y
x >= y
x <= y
#
#
#
#
#
#
x
x
x
x
x
x
est
est
est
est
est
est
gal ` y
e
a
dirent de y
e
plus grand que y
plus petit que y
plus grand que, ou gal ` y
e
a
plus petit que, ou gal ` y
e
a
Mais certains probl`mes exigent parfois de formuler des conditions qui ne peuvent pas tre
e
e
exprimes sous la forme dune simple comparaison. Par exemple, la condition x [0, 1[ sexprime
e
par la combinaison de deux conditions x 0 et x < 1 qui doivent tre vries en mme temps.
e
e e
e
Pour combiner ces conditions, on utilise les oprateurs logiques not, and et or (gure 2.9). Ainsi
e
TD2.5
la condition x [0, 1[ pourra scrire en Python : (x >= 0) and (x < 1).
e
Oprateurs de comparaison : x == y, x != y,
e
x < y, x <= y, x > y, x >= y
Oprateurs arithmtiques : +x, -x, x + y,
e
e
x - y, x * y, x / y, x % y, x**y
Le tableau ci-dessous donne les tables de vrit des oprateurs not, or et and, leur reprsentae e
e
e
tion graphique traditionnelle ainsi que leurs principales proprits.
ee
TD2.6
a b c
48
ngation
e
not a
conjonction
a and b
a b ab
0 0
0
0 1
0
1 0
0
1 1
1
not (a or b)
a a
0 1
1 0
disjonction
a or b
a b a+b
0 0
0
0 1
1
1 0
1
1 1
1
not (a and b)
a, b, c {0; 1} :
a+0=a
a1=a
a+1=1
a0=0
a+a=a
aa=a
a+a=1
aa=0
a + (a b) = a
a (a + b) = a
a=a
a+b=ab
ab=a+b
(a + b) = (b + a)
(a b) = (b a)
(a + b) + c = a + (b + c)
(a b) c = a (b c)
a + (b c) = (a + b) (a + c)
a (b + c) = (a b) + (a c)
TD2.7
2.3.2
Alternatives simples
2.3. TESTS
49
On commence par tester le signe de x (if x < 0), si x < 0, alors la valeur absolue y vaut x
( : y = -x) sinon (x 0) elle vaut x (else : y = x).
TD2.8
Exemple 2.6 : Fonction porte
y
blocIf
[else]
blocElse
if x < -1 or x > 2 : y = 0
else : y = 2
TD2.9
x
1 0
Les exemples 2.4 et 2.6 prcdents nous montrent quune alternative se comporte comme un
e e
aiguillage de chemin de fer dans le ux dinstructions (gure 2.11). Un if ... else ouvre
deux voies correspondant ` deux traitements dirents, et seule une de ces voies sera emprunte
a
e
e
(un seul des deux traitements est excut). Mais il y a des situations o` deux voies ne susent
e e
u
pas : on utilise alors des alternatives simples en cascade (ou alternatives multiples).
2.3.3
Alternatives multiples
[else]
Un algorithme qui devrait dterminer ltat de leau en fonction de la temprature doit pouvoir
e
e
e
choisir entre trois rponses possibles : solide, liquide ou vapeur. Une premi`re version de cet
e
e
blocIf1
[condition2]
[else]
blocIf2
blocElse
50
Cet algorithme est correct mais va valuer les 3 conditions qui portent sur la mme variable t
e
e
et qui sont exclusives les unes des autres ; en eet, si (t < 0), alors on ne peut pas avoir (t
>= 0 and t <= 100) ni (t > 100). Il est donc inutile dvaluer les 2 derni`res conditions si la
e
e
premi`re est vrie, ou dvaluer la derni`re condition si la deuxi`me est vrie. On prf`re
e
e e
e
e
e
e e
ee
donc imbriquer les tests de la mani`re suivante :
e
if t < 0 : eau = glace
[condition1]
blocIf
blocElif1
[condition2]
blocElif2
else :
if t <= 100 : eau = liquide
else : eau = vapeur
TD2.10
On commence par valuer la premi`re condition (t < 0). Si la condition est vrie, on excute
e
e
e e
e
laectation eau = glace ; sinon (t >= 0), on value la deuxi`me condition (t <= 100) qui
e
e
en fait est quivalente ` (t >= 0) and (t <= 100). Si la condition est vrie, on excute
e
a
e e
e
laectation eau = liquide ; sinon (t > 100), on excute laectation eau = vapeur. La
e
gure 2.12 illustre le contrle du ux dinstructions lors de deux if ... else imbriqus :
o
e
il sagit de deux aiguillages en cascade. An de simplier lcriture des tests imbriqus, on peut
e
e
contracter le else : if en elif et obtenir une version plus compacte de lalgorithme, strictement quivalente ` la version prcdente :
e
a
e e
if t < 0 : eau = glace
elif t <= 100 : eau = liquide
else : eau = vapeur
[else]
blocElse
Linstruction if . . . elif teste une premi`re condition (gure 2.13). Si cette condition
e
est vraie, alors le bloc dinstructions blocIf est excut. Si la premi`re condition est fausse,
e e
e
on teste la deuxi`me (condition1). Si la deuxi`me condition est vrie, cest le bloc dinse
e
e e
tructions blocElif1 apr`s le premier elif : (sinon-si) qui est excut ; sinon on teste la
e
e e
condition suivante (condition2). Si elle est vrie, cest le bloc dinstructions blocElif2 apr`s
e e
e
le deuxi`me elif : qui est excut et ainsi de suite. Si aucune des conditions nest vrie,
e
e e
e e
cest le bloc dinstructions blocElse qui est excut. Dans tous les cas, un seul des blocs est
e e
donc excut.
e e
2.4. BOUCLES
51
2.4
Boucles
52
o` while, for et in sont des mots rservs, condition une expression boolenne (` valeur True
u
e
e
e
a
ou False), element un lment de la squence sequence et bloc... un bloc dinstructions.
ee
e
2.4.1
Fig. 2.15 : Boucle while
while condition : blocWhile
[condition]
blocWhile
Itration conditionnelle
e
Linstruction while permet de rpter plusieurs fois une mme instruction (gure 2.15) :
e e
e
le bloc dinstructions blocWhile est excut tant que (while) la condition est vrie. On arrte
e e
e e
e
d`s que la condition est fausse ; on dit alors quon sort de la boucle.
e
On commence par tester la condition ; si elle est vrie, on excute le bloc dinstructions
e e
e
blocWhile (encore appel le corps de la boucle) puis on reteste la condition : la condition
e
est ainsi value avant chaque excution du corps de la boucle ; si la condition est ` nouveau
e
e
e
a
vrie on rexcute le bloc dinstructions blocWhile (on dit quon repasse dans la boucle)
e e
e e
et ainsi de suite jusqu` ce que la condition devienne fausse, auquel cas on sort de la boucle.
a
[not condition]
2.4. BOUCLES
53
*
*
*
*
*
*
*
9
9
9
9
9
9
9
=
=
=
=
=
=
=
27
36
45
54
63
72
81
i = 1
while i < 10:
print(i, *, n, =, i*n)
i = i + 1
la condition nest jamais fausse : on ne sort jamais de la boucle ; on dit quon a aaire `
a
une boucle sans n .
54
y est initialement nul : on rentre dans la boucle ; linstruction du corps de la boucle ne peut quincrmenter
e
y puisque x est positif : y sera donc toujours positif
et on ne sortira jamais de la boucle.
y = 0
while y >= 0 : y = y + x
Le cas de la boucle sans n est videmment d le plus souvent ` une erreur involontaire
e
u
a
quil faut savoir dtecter assez vite pour viter un programme qui tourne indniment sans
e
e
e
sarrter.
e
Exemple 2.11 : Fonction puissance
La puissance enti`re p dun nombre x est dnie par : p = xn =
e
e
x = x x xx .
k=1
n fois
Dans les exemples 2.10 et 2.11 prcdents, on savait ` lavance combien de fois on devait
e e
a
passer dans les boucles : 9 fois pour acher une table de multiplication et n fois pour calculer
xn . Mais ce nest pas toujours le cas comme nous allons le constater dans les deux exemples
suivants qui permettent de calculer respectivement la fonction exponentielle (exemple 2.12 : ex )
et le pgcd de 2 nombres (exemple 2.13 : pgcd(a, b)).
Exemple 2.12 : Fonction exponentielle
La fonction exponentielle peut tre calcule en fonction de son dveloppement en srie enti`re.
e
e
e
e
e
n
y = exp(x)
uk =
k=0
k=0
x2
xn
xk
=1+x+
+ ... +
k!
2
n!
Les calculs seront arrts lorsque la valeur absolue du terme uk sera infrieure ` un certain seuil
ee
e
a
s (0 < s < 1). On nutilisera ni la fonction puissance (xn ) ni la fonction factorielle (n!) pour
eectuer le calcul de exp(x).
2.4. BOUCLES
55
Pour ce calcul, on pourrait avoir la mme dmarche que dans lexemple 2.11 de la puissance
e
e
enti`re ; ` savoir, on calcule le premier terme de la srie (x0 /0! = 1), on le mmorise dans y, on
e
a
e
e
eme terme (x1 /1! = x) et on lajoute ` la valeur de y prcdemment mmorise (1+x),
`
calcule le 2
a
e e
e
e
`
on calcule le 3eme terme (x2 /2! = x2 /2), on lajoute ` y (1 + x + x2 /2) et ainsi de suite jusqu`
a
a
ce que le nouveau terme calcul vrie la condition darrt impose (|uk | < s). Mais chaque
e e
e
e
valuation dun nouveau terme fait intervenir a priori les fonctions puissance (xk ) et factorielle
e
(n!). . .qui sont tr`s coteuses en temps de calcul. On prf`re remarquer que le terme uk+1 peut
e
u
ee
sexprimer simplement en fonction du terme prcdent uk selon la relation de rcurrence :
e e
e
uk+1 =
x
xk
x
xk+1
=
=
uk
(k + 1)!
k + 1 k!
k+1
et quil est donc possible de mmoriser ` chaque tape uk pour calculer le terme suivant uk+1
e
a
e
sans utiliser ni la fonction puissance, ni la fonction factorielle. On obtient alors lalgorithme
suivant :
k = 0
u = 1
y = u
while
u
y
k
fabs(u) > s:
= u*x/(k+1)
= y + u
= k + 1
Ici, on connait la condition darrt de la boucle (|uk | < s) mais on ne sait pas a priori come
bien de fois on passera dans la boucle : on ne connait pas lordre n pour lequel on arrtera le
e
TD2.14
dveloppement de la srie enti`re.
e
e
e
k=0
x3
x5
x2n+1
+
+ . . . + (1)n
6
120
(2n + 1)!
Les calculs seront arrts lorsque la valeur absolue du
ee
terme uk sera infrieure ` un certain seuil s (0 < s < 1).
e
a
On nutilisera ni la fonction puissance (xn ) ni la fonction
factorielle (n!) pour eectuer le calcul de sin(x).
=x
56
while
r
a
b
!= 0:
a%b
b
r
a
12
18
12
6
6
b
18
12
6
0
0
r
?
12
6
0
0
Cet algorithme de calcul de pgcd est connu sous le nom dalgorithme dEuclide (gure 2.16) et
fait partie des grands classiques de lalgorithmique.
TD2.15
L` encore, la condition darrt est connue (b = 0) mais pas le nombre de passages dans la boucle.
a
e
TD2.16
Dans tous les cas, que lon connaisse ou non a priori le nombre de passages dans la boucle,
on peut toujours utiliser litration conditionnelle (boucle while) pour rpter plusieurs fois un
e
e e
bloc dinstructions ` condition de conna la condition darrt pour sortir de la boucle.
a
tre
e
Lorsquon conna a priori le nombre de passages dans la boucle (voir exemples 2.10 et
t
2.11), il sut de dnir un compteur qui compte le nombre de fois o` on passe dans la
e
u
boucle : le multiplicateur i dans lexemple de la table de multiplication et lexposant k
dans le calcul de la puissance. On initialise correctement ce compteur avant la boucle (i
= 1 ou k = 1 selon lexemple considr), on incrmente le compteur dans la boucle (i =
ee
e
i + 1 ou k = k + 1) et on sort de la boucle lorsque ce compteur dpasse le nombre de
e
fois connu o` on doit passer dans la boucle (i < 10 ou k <= n).
u
Lorsquon ne conna pas a priori le nombre de passages dans la boucle (voir exemples
t
2.12 et 2.13), il faut absolument dterminer la condition darrt de lalgorithme : |uk | < s
e
e
pour le calcul de ex et b = 0 dans lexemple du pgcd. Il faut galement sassurer que cette
e
condition sera bien atteinte au bout dun certain nombre de passages dans la boucle : dans
le calcul du pgcd par exemple, le reste r de la division a b ne peut tre quinfrieur au
e
e
diviseur b et comme b est remplac par r dans le corps de la boucle, b ne peut que diminuer
e
et atteindre 0 au bout du compte.
2.4.2
Parcours de squences
e
Il est frquent de manipuler des suites ordonnes dlments comme les cha
e
e
ee
nes de caract`res
e
(exemple : s = "123"), les tableaux (exemple : t = [1,2,3]) et les n-uplets (exemple : u =
2.4. BOUCLES
57
1,2,3). Chaque lment dune squence est accessible par son rang dans la squence grce `
ee
e
e
a a
loprateur crochets : sequence[rang] (exemples : s[1], t[2] ou u[0]) et par convention,
e
`
le premier lment dune squence a le rang 0 (exemples : s[1] est le 2eme lment de la cha
ee
e
ee
ne
eme lment du tableau t et u[0] le 1er lment du n-uplet u).
`
s, t[2] le 3
ee
ee
>>> s = "123"
>>> s[1]
2
>>> t = [1,2,3]
>>> t[2]
3
>>> u = 1,2,3
>>> u[0]
1
Result
True if an item of s is equal to x, else False
False if an item of s is equal to x, else True
the concatenation of s1 and s2
n copies of s concatenated
ith item of s, origin 0
Slice of s from i (included) to j(excluded). Optional
step value, possibly negative (default : 1).
Length of s
Smallest item of s
Largest item of s
Returns list of ints from >= start and < end.
With 1 arg, list from 0..arg-1
With 2 args, list from start..end-1
With 3 args, list from start up to end by step
La derni`re fonction de ce tableau cre un tableau dentiers compris entre start inclus (= 0 par
e
e
dfaut) et end exclus par pas de step (= 1 par dfaut).
e
e
58
[i < len(s)]
>>>
>>>
[0,
>>>
>>>
[6,
s = "bonjour"
range(len(s))
1, 2, 3, 4, 5, 6]
t = [4,2,6,5,3]
range(max(t),min(t),-1)
5, 4, 3]
>>>
>>>
>>>
[0,
>>>
[0,
u1 = 10,12,14
u2 = a,b,c
range(len(u1+u2))
1, 2, 3, 4, 5]
range(len(2*u2[0:2]))
1, 2, 3]
`
`
Exemple 2.14 : Affichage caractere par caractere
Lalgorithme suivant ache les caract`res dune cha s, un par ligne :
e
ne
i = 0
while i < len(s) :
print(s[i])
i = i + 1
i = 0
range(3)
1, 2]
range(3,9,2)
5, 7]
range(7,0,-1)
6, 5, 4, 3, 2, 1]
element = s[i]
blocFor
i = i + 1
[i >= len(s)]
i = 0
while i < len(s):
# traiter s[i]
i = i + 1
Ainsi, lalgorithme de lexemple 2.14 ci-dessus peur se rcrire simplement sous la forme :
ee
for element in s : print(element)
De mme, lalgorithme de calcul de la fonction puissance (exemple 2.11) peut scrire avec une
e
e
boucle for :
p = x
for i in range(n) : p = p*x
TD2.19
2.4. BOUCLES
2.4.3
59
Imbrications de boucles
De la mme mani`re que lon peut cascader des alternatives simples (voir section 2.3.3), on
e
e
peut encapsuler une boucle dans une autre boucle.
Exemple 2.15 : Tables de multiplication
Nous avons ach une table de multiplication dans lexemple 2.10 page 52. Nous voulons maine
tenant acher les 9 premi`res tables de multiplication en rutilisant lalgorithme dachage
e
e
dune seule table. Il nous sut pour cela de rpter 9 fois lalgorithme dachage dune table
e e
en incrmentant le multiplicande n ` chaque itration :
e
a
e
n = 1
while n <= 9:
i = 1
while i < 10:
print(i, *, n, =, i*n)
i = i + 1
n = n + 1
Cet exemple dinstruction compose pose explicitement le probl`me de la dnition dun bloc
e
e
e
dinstructions : o` commence et o` termine un bloc dinstructions ? En eet, linstruction n =
u
u
n + 1 fait-elle partie du bloc de la boucle intrieure (while i < 10 :) ou du bloc de la boucle
e
extrieure (while n <= 9 :) ?
e
Les instructions composes ont toujours la mme structure : une ligne den-tte termine par
e
e
e
e
un double point ( :), suivie dune ou de plusieurs instructions indentes (dcales ` droite) sous
e
e e a
cette ligne den-tte (gure 2.18).
e
ligne den-t^te:
e
premi`re instruction du bloc
e
...
derni`re instruction du bloc
e
Sil y a plusieurs instructions indentes sous la ligne den-tte, elles doivent ltre exactement
e
e
e
au mme niveau (dcalage de 4 caract`res espace, par exemple). Ces instructions indentes
e
e
e
e
constituent ce quon appellera dsormais un bloc dinstructions. Un bloc dinstructions est une
e
suite dinstructions formant un ensemble logique, qui nest excut que dans certaines conditions
e e
dnies dans la ligne den-tte. Dans lexemple prcdent, les deux lignes dinstructions indentes
e
e
e e
e
sous la ligne contenant linstruction while i < 10 : constituent un mme bloc logique :
e
60
ces deux lignes ne sont excutes toutes les deux que si la condition teste avec linstruction
e e
e
while est vrie, cest-`-dire si le multiplicateur i est tel que 1 <= i < 10.
e e
a
b ab
0
0
1
0
0
0
1
1
>>>
...
...
...
0 0
0 1
1 0
1 1
for a in [0,1]:
for b in [0,1]:
print(a, b, a and b)
0
0
0
1
TD2.21
111111111
000000000
111111111
000000000
111111111
000000000
111111111
000000000
111111111
000000000
111111111
000000000
Fig. 2.19 : Nid dabeilles
Pour dessiner un tel motif, il faut dabord savoir dessiner un hexagone de ct a en utilisant les
oe
instructions ` la Logo de lannexe 2.6.1 page 91 :
a
for k in range(6):
forward(a)
left(60)
2.4. BOUCLES
61
for i in range(n):
x0 = -3*i*a/2.
for j in range(m):
y0 = a*sqrt(3)*(1/2.*(i%2) - j)
up()
goto(-x0,-y0)
down()
for k in range(6):
forward(a)
left(60)
TD 2.22 : Damier
En utilisant les instructions ` la Logo de lannexe 2.6.1
a
page 91, dessiner un damier rectangulaire de nm cases.
TD2.22
2.4.4
Excutions de boucles
e
La ma
trise de lalgorithmique requiert deux qualits complmentaires [5] :
e
e
il faut avoir une certaine intuition, car aucun algorithme ne permet de savoir a priori
quelles instructions permettront dobtenir le rsultat recherch. Cest l` quintervient la
e
e
a
forme dintelligence requise pour lalgorithmique : la crativit de linformaticien. Il
e
e
y a des gens qui poss`dent au dpart davantage cette intuition que les autres. Cependant,
e
e
les rexes, cela sacquiert (en particulier, lannexe 2.6.3 page 95 prsente une mthode
e
e
e
pour aider ` construire des boucles). Et ce quon appelle lintuition nest nalement que de
a
lexprience accumule, tellement rpte que le raisonnement, au dpart laborieux, nit
e
e
e ee
e
par devenir spontan .
e
il faut tre mthodique et rigoureux. En eet, chaque fois quon crit une srie dinstruce
e
e
e
tions que lon croit justes, il faut systmatiquement se mettre mentalement ` la place de
e
a
la machine qui va les excuter (sur papier ou dans sa tte) an de vrier si le rsultat
e
e
e
e
obtenu est bien celui que lon voulait. Cette opration ne requiert pas dintuition. Mais elle
e
reste nanmoins indispensable si lon ne veut pas crire des algorithmes ` l aveuglette .
e
e
a
Et petit ` petit, ` force de pratique, on fera de plus en plus souvent lconomie de cette
a
a
e
derni`re tape : lexprience fera quon verra le rsultat produit par les instructions,
e e
e
e
au fur et ` mesure quon les crira. Naturellement, cet apprentissage est long, et demande
a
e
des heures de travail patient. Aussi, dans un premier temps, il faut viter de sauter les
e
tapes : la vrication mthodique, pas ` pas, de chacun des algorithmes reprsente plus
e
e
e
a
e
de la moiti du travail ` accomplir. . .et le gage de progr`s.
e
a
e
Pour amliorer la comprhension dune boucle, on peut tracer son excution de tte,
e
e
e
e
a
` la main ou par programme. Dans tous les cas, lide est de suivre pas ` pas lvolution des
e
a
e
62
variables qui interviennent dans la boucle : on dtermine leur valeur juste avant la boucle, ` la
e
a
n de chaque itration et juste apr`s la boucle. Cest ce qui a t fait dans lexemple 2.13 page
e
e
ee
55 du calcul du pgcd ou on a pist les 3 variables concernes par ce calcul.
e
e
TD2.23
TD 2.24 : Figure geometrique
Que dessinent les instructions suivantes ?
x0 = 0
y0 = 0
r = 10
n = 5
m = 10
for i in range(n) :
up()
y = y0 - 2*r*i
x = x0 + r*(i%2)
goto(x,y)
for j in range(m) :
down()
circle(r)
up()
x = x + 2*r
goto(x,y)
k
1
2
3
4
4
p
2
4
8
16
16
f0 = f1 = 1
fn = fn1 + fn2 n > 1
Les 10 premiers nombres de la suite de Fibonacci valent donc successivement f0 = 1, f1 = 1,
f2 = 2, f3 = 3, f4 = 5, f5 = 8, f6 = 13, f7 = 21, f8 = 34, et f9 = 55.
e
Le nombre fn (n > 1) de Fibonacci se calcule selon lalgorithme itratif suivant :
f, f1, f2 = 2,1,1
for i in range(3,n+1) :
f2 = f1
f1 = f
f = f1 + f2
f1
1
2
3
5
8
13
21
34
34
f
2
3
5
8
13
21
34
55
55
TD2.24
2.5. EXERCICES COMPLEMENTAIRES
2.5
2.5.1
Exercices complmentaires
e
Conna
tre
a
b
b
a
=
=
=
=
(a) a = 13 et b = 13
(b) a = 4 et b = 4
(c) a = 4 et b = 13
(d) a = 13 et b = 4
13
4
a
b
63
64
8. Apr`s la squence
e
e
x = -3
if x <
elif x
elif x
elif x
else :
-4 : y = 0
< -3 : y = 4 - x
< -1 : y = x*x + 6*x + 8
< 3 : y = 2 - x
y = -2
(a) y = -1
(b) y = 0
(c) y = 7
(d) y = -2
9. Litration conditionnelle est une instruction de contrle du ux dinstructions
e
o
(a) qui permet dexcuter une instruction sous condition pralable.
e
e
(b) qui est vrie tout au long de son excution.
e e
e
2.5. EXERCICES COMPLEMENTAIRES
65
(c) qui permet sous condition pralable de rpter zro ou plusieurs fois la mme instruce
e e
e
e
tion.
(d) qui permet de choisir entre plusieurs instructions.
10. On ne sort jamais dune boucle si la condition darrt
e
(a) ne varie pas en cours dexcution.
e
(b) ne contient pas doprateurs boolens.
e
e
(c) est toujours fausse.
(d) nest jamais fausse.
11. Que vaut f ` la n des instructions suivantes si n = 5 ?
a
f = 0
i = 1
while i < n+1:
f = f + i
i = i + 1
(a) 6
(b) 10
(c) 15
(d) 21
12. Une squence est une suite ordonne
e
e
(a) dlments que lon peut rfrencer par leur rang.
ee
ee
(b) dinstructions formant un ensemble logique.
(c) dinstructions conditionnelles.
(d) de nombres
13. Dans la cha s = grard, s[2] vaut
ne
e
(a)
e
(b) r
(c) g
e
(d) gr
e
66
(a) 120
(b) 720
(c) 6
(d) 24
15. Que vaut f ` la n des instructions suivantes si n = 5 ?
a
f, f1, f2 = 2,1,1
for i in range(3,n+1) :
f2 = f1
f1 = f
f = f1 + f2
(a) 3
(b) 5
(c) 8
(d) 13
2.5.2
Comprendre
2.5. EXERCICES COMPLEMENTAIRES
67
n = 1
s = n
n = n + 1
s = s + n
n = n + 1
s = s + n
n = n + 1
s = s + n
n = n + 1
s = s + n
ab
ab
a+b
abc
a+b+c
abc
Donner les squences daectations permettant de calculer la (ou les) sortie(s) des circuits loe
giques suivants en fonction de leurs entres.
e
1. a et b sont les entres, s la sortie.
e
a
s
s
b
68
a
s
t
t
a b c
s
a b c
a b c
2.5. EXERCICES COMPLEMENTAIRES
s6
s5
s4
s3
s2
s1
s0
a b c
69
70
2.5. EXERCICES COMPLEMENTAIRES
71
d = 5
h = 4
if x > 0 and x < d :
if y > 0 and y < h : ok = 1
else : ok = 0
else : ok = 0
`
TD 2.33 : Racine carree entiere
Ecrire un algorithme qui calcule la racine carre enti`re r dun nombre entier positif n telle que
e
e
2 n < (r + 1)2 .
r
4. Quachent
vantes ?
les
itrations
e
sui-
for i in range(0,10) :
for j in range(0,i) :
print(*,end= )
print()
5. Quachent
vantes ?
les
itrations
e
for i in range(0,10) :
j = 10 - i
while j > 0 :
print(*,end= )
j = j - 1
print()
sui-
72
6. Quachent
vantes ?
les
itrations
e
sui-
for i in range(1,10) :
les
itrations
e
sui-
for n in range(0,15) :
for j in range(0,11) :
f = 1
print(i, x, j, = , i*j)
f1 = 1
print()
7. Quachent
vantes ?
8. Quachent
vantes ?
f2 = 1
les
itrations
e
for n in range(10) :
for p in range(n+1) :
num = 1
den = 1
for i in range(1,p+1) :
sui-
for i in range(2,n+1) :
f = f1 + f2
f2 = f1
f1 = f
print(f,end= )
num = num*(n-i+1)
b = 2
den = den*i
k = 8
c = num/den
n = 23
print(c,end= )
s = 0
print()
i = k - 1
q = n
while q != 0 and i >= 0 :
s = s + (q%b)*b**(k-1-i)
print(q%b,end= )
q = q/b
i = i - 1
2.5.3
Appliquer
TD 2.35 : Figures geometriques
1. Ecrire un algorithme qui calcule le prim`tre p et la surface s dun rectangle de longueur
e
e
L et de largeur l.
2. Ecrire un algorithme qui calcule le prim`tre p et la surface s dun cercle de rayon r.
e
e
3. Ecrire un algorithme qui calcule la surface latrale s et le volume v dun cylindre de rayon
e
r et de hauteur h.
2.5. EXERCICES COMPLEMENTAIRES
73
n
0 uk
n
0 uk
74
1. sinh(x)
k=0
n
2. cosh(x)
k=0
n
x2k+1
x3
x5
x2n+1
=x+
+
+ ... +
(2k + 1)!
6
120
(2n + 1)!
x2 x4
x2n
x2k
=1+
+
+ ... +
(2k)!
2
24
(2n)!
(1)k
3. cos(x)
k=0
x2 x4
x2n
x2k
=1
+
+ . . . + (1)n
(2k)!
2
24
(2n)!
(1)k
4. log(1 + x)
k=0
n
(1)k
5. arctan(x)
k=0
xk+1
x2 x3
xn+1
=x
+
+ . . . + (1)n
, pour 1 < x < 1
k+1
2
3
n+1
x2k+1
x3 x5
x2n+1
=x
+
+ . . . + (1)n
, pour 1 < x < 1
(2k + 1)
3
5
(2n + 1)
2.5.4
Analyser
TD 2.42 : Dessins geometriques
1. Que dessine la suite dinstructions
suivante ?
forward(20)
forward(10)
right(144)
left(45)
forward(20)
forward(10)
right(144)
left(135)
forward(20)
forward(10)
right(144)
left(45)
forward(20)
forward(10)
right(144)
left(135)
forward(20)
right(144)
2.5. EXERCICES COMPLEMENTAIRES
75
76
2.5.5
tmp
x =
y =
z =
= x
y
z
tmp
2.5. EXERCICES COMPLEMENTAIRES
77
>>> n,s
(5, 15)
# b = False
# c = True
1.
2.
b
a
s
3.
b
a
b
c
4.
>>> s = (a != (b != c))
>>> t = (b and c) or (a and (b != c))
t
78
5.
a b c
6.
a b c
7.
a b c
2.5. EXERCICES COMPLEMENTAIRES
79
s7
s6
s5
s4
s3
8.
s2
s1
s0
a b c
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
s7
s6
s5
s4
s3
s2
s1
s0
=
=
=
=
=
=
=
=
a and
a and
a and
a and
not a
not a
not a
not a
b and c
b and not
not b and
not b and
and b and
and b and
and not b
and not b
c
c
not
c
not
and
and
c
c
c
not c
80
x = - 1
if x < 0 : x = 3
if x >= 0 : x = -1
print(x)
2. >>> y
1
3. >>> y
1
4. >>> ok
1
5. >>> y
5
>>>
>>>
...
...
>>>
3
x = -1
if x < 0 : x = 3
else: x = -1
print(x)
2.5. EXERCICES COMPLEMENTAIRES
81
un
un
un
un
un
nombre
nombre
nombre
nombre
nombre
:
:
:
:
:
2
0
fin
3.14
33
un
un
un
un
un
nombre
nombre
nombre
nombre
nombre
:
:
:
:
:
1
3
2
3
6
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* *
* * *
* * * *
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* * * *
* * *
* *
*
82
0
1
2
3
4
5
6
7
8
9
10
=
=
=
=
=
=
=
=
=
=
2
2
2
2
2
2
2
2
2
2
2
0
1
2
3
4
5
6
7
8
9
10
=
=
=
=
=
=
=
=
=
=
3 x 0
3 x 1
3 x 2
3 x 3
3 x 4
3 x 5
3 x 6
etc...
=
=
=
=
=
=
=
x
x
x
x
x
x
x
x
x
x
x
0
1
2
3
4
5
6
7
8
9
=
10
0
2
4
6
8
10
12
14
16
18
= 20
0
3
6
9
12
15
18
p=0
1
3 1
6 4 1
10 10
15 20
21 35
28 56
36 84
5 1
15 6 1
35 21 7 1
70 56 28 8 1
126 126 84 36 9 1
2.5. EXERCICES COMPLEMENTAIRES
83
# v = 4*pi*r**3/3
s=
(a + bk) = a(n + 1) + b
k=0
k = (1 + 2 + 3 + + n) =
avec S =
k
k=1
k=1
n(n + 1)
2
S =
1
+
2
+
3
+ +
n
S =
n
+ n 1 + n 2 + +
1
2S = (n + 1) + (n + 1) + (n + 1) + + (n + 1) = n(n + 1)
Version constante :
>>> s = a*(n+1) + b*n*(n+1)/2
2. Somme s =
n
0 uk
Version itrative :
e
>>> s = 0
>>> for i in range(n+1) :
...
s = s + a + b*i
...
abk = a
s=
k=0
bk
k=0
84
bk = (b0 + b1 + b2 + + bn ) =
S=
k=0
Version constante :
>>> s = a*(b**(n+1) - 1)/(b-1)
bn+1 1
b1
Version itrative :
e
>>> s = 0
>>> for i in range(n+1) :
...
s = s + a*b**i
...
ai bi .
i
2.5. EXERCICES COMPLEMENTAIRES
85
18 :
== m : print(imp^t)
o
a < 35 : print(imp^t)
o
: print("pas dimp^t")
o
print("pas dimp^t")
o
1. y = sinh(x)
k=0
avec uk+1 =
>>>
>>>
>>>
>>>
>>>
...
...
...
...
x2k+1
x3
x5
x2n+1
=x+
+
+ ... +
(2k + 1)!
6
120
(2n + 1)!
x2(k+1)+1
x2
x2k+1
x2
=
=
uk
(2(k + 1) + 1)!
(2k + 2)(2k + 3) (2k + 1)!
(2k + 2)(2k + 3)
k = 0
u = x
y = u
s = 1.e-6
while fabs(u) > s :
u = u*x*x/((2*k+2)*(2*k+3))
y = y + u
k = k + 1
n
2. y = cosh(x)
k=0
x2k
x2 x4
x2n
=1+
+
+ ... +
(2k)!
2
24
(2n)!
avec uk+1 =
>>>
>>>
>>>
>>>
>>>
...
...
...
...
x2(k+1)
x2
x2k
x2
=
=
uk
(2(k + 1))!
(2k + 1)(2k + 2) (2k)!
(2k + 1)(2k + 2)
k = 0
u = 1.
y = u
s = 1.e-6
while fabs(u) > s :
u = u*x*x/((2*k+1)*(2*k+2))
y = y + u
k = k + 1
86
(1)k
3. y = cos(x)
k=0
x2k
x2 x4
x2n
=1
+
+ . . . + (1)n
(2k)!
2
24
(2n)!
x2(k+1)
x2
x2k
x2
=
(1)k
=
uk
(2(k + 1))!
(2k + 1)(2k + 2)
(2k)!
(2k + 1)(2k + 2)
k = 0
u = 1.
y = u
s = 1.e-6
while fabs(u) > s :
u = -u*x*x/((2*k+1)*(2*k+2))
y = y + u
k = k + 1
(1)k
4. y = log(1 + x)
k=0
xk+1
x2 x3
xn+1
= x + + . . . + (1)n
, pour 1 < x < 1
k+1
2
3
n+1
k+1
xk+1
k+1
x(k+1)+1
= x
(1)k
= x
uk
(k + 1) + 1
k+2
k+1
k+2
(1)k
5. y = arctan(x)
1 < x < 1
k=0
x2k+1
x3
x5
x2n+1
= x
+
+ . . . + (1)n
, pour
(2k + 1)
3
5
(2n + 1)
x2(k+1)+1
2k + 1
x2k+1
2k + 1
= x2
(1)k
= x2
uk
(2(k + 1) + 1)
2k + 3
(2k + 1)
2k + 3
2.5. EXERCICES COMPLEMENTAIRES
87
2.
...
...
...
...
...
...
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1
>>>
...
...
...
...
...
...
0 0
0 1
1 0
1 1
for b in [0,1] :
for c in [0,1] :
s = (a and not b) or
(b and not a)
print(a, b, c, s)
0 0
1 0
0 1
1 1
0 1
1 1
0 0
1 0
for a in [0,1] :
for b in [0,1] :
s = not (not (a and not b)
and
not (b and not a))
print(a, b, s)
0
1
1
0
4.
...
...
...
...
...
0 0
0 1
1 0
1 1
>>>
...
...
...
...
...
...
for b in [0,1] :
s = (a and not b) or (not a and b)
t = (not a) and b
print(a, b, s, t)
0 0
1 1
1 0
0 0
for a in [0,1] :
for b in [0,1] :
for c in [0,1] :
s = (a != (b != c))
t = (b and c) or (a and (b != c))
print(a, b, c, s, t)
88
6.
...
...
...
...
...
...
...
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1
>>>
...
...
...
...
...
...
...
...
...
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1
for b in [0,1] :
for c in [0,1] :
s = not (not (a and b) and
not (a and c) and
not (b and c))
print(a, b, c, s)
...
...
...
...
...
...
...
0 0
0 0
1 0
0 0
0 0
0 1
1 1
0 1
0 0
1 0
1 1
1 0
0 1
1 1
1 1
1 1
for a in [0,1] :
8. >>>
for b in [0,1] :
...
for c in [0,1] :
...
s = not (not (not a and
...
not b and not c) and ...
not (a and not b and
...
not c) and
...
not (a and b and not c))
...
print(a, b, c, s)
...
...
0 1
...
1 0
...
0 0
...
1 0
0 0
0 1
0 0
1 0
0 1
0 1
0 1
1 0
1 0
1 0
1 1
1 1
for b in [0,1] :
for c in [0,1] :
u = (b and not c) or (not b and c)
s = (a and not u) or (not a and u)
t = (b and c) or (a and u)
print(a, b, c, u, s, t)
0 0 0 0
1 1 1 0
0 1 1 0
1 0 0 1
0 0 1 0
1 1 0 1
0 1 0 1
1 0 1 1
for a in [0,1] :
for b in [0,1] :
for c in [0,1] :
s7 = a and b and c
s6 = a and b and not c
s5 = a and not b and c
s4 = a and not b and not c
s3 = not a and b and c
s2 = not a and b and not c
s1 = not a and not b and c
s0 = not a and not b and not c
print(a, b, c, s0, s1, s2, s3, s4, s5, s6, s7)
0
1
0
1
0
1
0
1
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
2.5. EXERCICES COMPLEMENTAIRES
89
2. Un losange
TD 2.43 : Police dassurance.
Il sagit en fait dune assurance a points (p) qui dpend de lge a du conducteur, de lan`
e
a
ciennet d du permis, du nombre n daccidents et du nombre r dannes en tant quassur
e
e
e
d`le.
e
>>>
>>>
...
>>>
...
>>>
>>>
>>>
...
>>>
...
...
...
...
...
p = 0
if a < 25 : p = p + 1
# jeune
if d < 2 : p = p + 1
# jeune conducteur
p = p + n
# accidents
# fidlit
e
e
if p
elif
elif
elif
else
== -1 : print(tarif A)
p == 0 : print(tarif B)
p == 1 : print(tarif C)
p == 2 : print(tarif D)
: print(refus dassurer)
90
2.6. ANNEXES
2.6
Annexes
2.6.1
Instructions Logo
Logo is the name for a philosophy of education and a continually evolving family of programming languages
that aid in its realization (Harold Abelson, Apple Logo, 1982). This statement sums up two fundamental
aspects of Logo and puts them in the proper order. The Logo programming environments that have been
developed over the past 28 years are rooted in constructivist educational philosophy, and are designed to
support constructive learning. [. . .] Constructivism views knowledge as being created by learners in their
own minds through interaction with other people and the world around them. This theory is most closely
associated with Jean Piaget, the Swiss psychologist, who spent decades studying and documenting the learning
processes of young children.
Logo Foundation : http://el.media.mit.edu/logo-foundation
91
92
2.6.2
Instructions Python
Les principales instructions Python sont listes dans les tableaux ci-dessous, tableaux exe
traits du Python 2.5 Quick Reference Guide [10].
Miscellaneous statements
Statement
pass
del name[, name]*
print([s1 [, s2 ]*)
input([prompt])
Assignment operators
Operator
a = b
a += b
a -= b
a *= b
a /= b
a //= b
a %= b
a **= b
a &= b
a |= b
a ^= b
a >>= b
a <<= b
Result
Null statement
Unbind name(s) from object
Writes to sys.stdout, or to fileobject if supplied. Puts spaces between arguments si. Puts newline at
end unless arguments end with end=
(ie : end= ). print is not required
when running interactively, simply typing an expression will print its value,
unless the value is None.
Prints prompt if given. Reads input
and evaluates it.
Result
Basic assignment - assign object b to label a
a = a + b
a = a - b
a = a * b
a = a / b
a = a // b
to a = a % b
to a = a ** b
a = a & b
a = a | b
a = a ^ b
a = a >> b
a = a << b
2.6. ANNEXES
93
Control ow statements
Statement
if condition :
suite
[elif condition : suite]*
[else :
suite]
while condition :
suite
[else :
suite]
for element in sequence :
suite
[else :
suite]
break
continue
return [result]
Result
Usual if/else if/else statement.
Usual while statement. The else suite is executed after loop exits, unless the loop is exited
with break.
Iterates over sequence, assigning each element
to element. Use built-in range function to iterate a number of times. The else suite is executed at end unless loop exited with break.
Immediately exits for or while loop.
Immediately does next iteration of for or while
loop.
Exits from function (or method) and returns
result (use a tuple to return more than one
value).
94
Statement
import module1 [as name1] [,
module2]*
Result
Imports modules. Members of module
must be referred to by qualifying with
[package.]module name, e.g. :
import sys ; print(sys.argv)
import package1.subpackage.module
package1.subpackage.module.foo()
module1 renamed as name1, if supplied.
Imports names from module module in current
namespace, e.g. :
from sys import argv ; print(argv)
from package1 import module ;
module.foo()
from package1.module import foo ;
foo()
name1 renamed as othername1, if supplied.
Imports all names in module, except those starting with .
2.6. ANNEXES
2.6.3
95
Un algorithme est un mcanisme qui fait passer un syst`me dune situation dite
e
e
initiale (ou prcondition) ` une situation nale (postcondition ou but). Le couple (situation
e
a
initiale, situation nale) est appel spcication de lalgorithme. Lalgorithmique vise donc `
e e
a
construire rationnellement des algorithmes ` partir de leur spcication.
a
e
Exemple 2.20 : Enfoncer un clou
On dispose dune planche, dun marteau et dun clou (situation initiale) et on veut que le clou
soit enfonc dans la planche jusqu` la tte (situation nale).
e
a
e
Le travail ` raliser consiste donc ` planter lg`rement le clou ` la main de faon quil tienne
a e
a
e e
a
c
seul, puis ` taper sur la tte du clou avec le marteau tant que la tte ne touche pas la planche.
a
e
e
Le nombre de coups ncessaire est a priori inconnu.
e
Le raisonnement qui permet de passer dune comprhension intuitive dun tel nonc ` lale
e
e a
gorithme nest pas toujours facile ` concevoir dun coup. Dans le cas dune boucle on pourra
a
systmatiser la conception de lalgorithme autour de 4 tapes (dapr`s [7] et [11]) :
e
e
e
1. Invariant (ou hypoth`se de rcurrence) : Le clou est plant dans la planche .
e
e
e
2. Condition darrt : La tte touche la planche .
e
e
3. Progression : Frapper un coup de marteau de faon ` enfoncer un peu plus le clou .
c a
4. Initialisation : Planter lg`rement le clou ` la main .
e e
a
Il faut noter que les tapes 1 et 2 dnissent des situations tandis que les tapes 3 et 4 concernent
e
e
e
des actions. Dans cette section, on notera les situations entre crochets ([]) pour les distinguer
des actions.
La recherche dun invariant est ltape cl autour de laquelle sarticule la conception des
e
e
boucles. La conjonction de linvariant et de la condition darrt conduit logiquement au
e
but recherch :
e
[ invariant and condition darr^t ] [ postcondition ]
e
La condition darrt seule nimplique pas le but : un clou pos sur la planche la pointe en
e
e
lair a bien la tte qui touche la planche, mais il nest pas plant dans la planche.
e
e
96
Pour enfoncer un clou dans une planche, on excutera ainsi lalgorithme suivant :
e
[ on dispose dune planche dun marteau, dun clou ]
Planter lg`rement le clou ` la main
e e
a
[ le clou est plant dans la planche ]
e
while [ la t^te du clou ne touche pas la planche ] :
e
frapper un coup de marteau sur la t^te du clou
e
[ le clou est plant dans la planche ]
e
[ le clou est enfonc dans la planche ]
e
2.6. ANNEXES
97
Dune mani`re plus gnrale, les 4 tapes de construction dune boucle sont les suivantes :
e
e e
e
1. Invariant : proposer une situation gnrale dcrivant le probl`me pos (hypoth`se de
e e
e
e
e
e
rcurrence). Cest cette tape qui est la plus dlicate car elle exige de faire preuve dimae
e
e
gination.
Exemple de la puissance 2.11 :
Exemple du pgcd 2.13 :
k+1 = x xk
x
pgcd(a, b) = pgcd(b, a mod b)
2. Condition darrt : ` partir de la situation gnrale imagine en [1], on doit formuler la
e a
e e
e
condition qui permet darmer que lalgorithme a termin son travail. La situation dans
e
laquelle il se trouve alors est appele situation nale. La condition darrt fait sortir de la
e
e
boucle.
Exemple de la puissance 2.11 :
Exemple du pgcd 2.13 :
k > n
b == 0
3. Progression : se rapprocher de la situation nale, tout en faisant le ncessaire pour
e
conserver ` chaque tape une situation gnrale analogue ` celle retenue en [1]. La proa
e
e e
a
gression conserve linvariant.
Exemple du pgcd 2.13 :
Exemple de la puissance 2.11 :
p = p*x
r = a%b
k = k + 1
a = b
b = r
4. Initialisation : initialiser les variables introduites dans linvariant pour que celui-ci soit
vri avant dentrer dans la boucle. Linitialisation instaure linvariant.
e e
Exemple de la puissance 2.11 :
Exemple du pgcd 2.13 :
k = 1
p = x
5. Boucle nale : Une fois les 4 tapes prcdentes menes ` leur terme, lalgorithme ree
e e
e a
cherch aura la structure nale suivante (gure 2.20) :
e
TD2.45
[ prcondition ]
e
initialisation
[ invariant ]
while not [ condition darr^t ] :
e
progression
[ invariant ]
[ postcondition ]
initialisation
[invariant]
progression
[condition darrt]
initialisation
progression
[condition darrt]
98
Dnition 2.8 :
e
Un invariant de boucle est une proprit vrie tout au long de lexcution de la boucle.
ee e e
e
Cette faon de procder permet de prouver la validit de lalgorithme au fur et ` mesure de
c
e
e
a
son laboration. En eet la situation gnrale choisie en [1] est en fait linvariant qui caractrise
e
e e
e
la boucle while. Cette situation est satisfaite au dpart grce ` linitialisation de ltape [4] ;
e
a a
e
elle reste vraie ` chaque itration (tape [3]). Ainsi lorsque la condition darrt (tape [2]) est
a
e
e
e e
atteinte cette situation nous permet darmer que le probl`me est rsolu. Cest galement en
e
e
e
analysant ltape [3] quon peut prouver la terminaison de lalgorithme.
e
Chapitre 3
Procdures et fonctions
e
Sommaire
3.1
Informatique
S1
Informatique
Initiation ` lalgorithmique
a
procdures et fonctions
e
2. Appel dune fonction
Jacques TISSEAU
Jacques TISSEAU
3.2
Initiation ` lalgorithmique
a
procdures et fonctions
e
1. Dnition dune fonction
e
S1
3.3
Technople Brest-Iroise
o
CS 73862 - 29238 Brest cedex 3 - France
Technople Brest-Iroise
o
CS 73862 - 29238 Brest cedex 3 - France
enib c 2009
enib c 2009
3.4
tisseau@enib.fr
Algorithmique
enib c 2009
1/21
tisseau@enib.fr
Algorithmique
enib c 2009
1/14
3.5
99
Introduction . . . . . . . . . . . . . .
3.1.1 Rutiliser . . . . . . . . . . . .
e
3.1.2 Structurer . . . . . . . . . . .
3.1.3 Encapsuler . . . . . . . . . . .
Dnition dune fonction . . . . . . .
e
3.2.1 Nommer . . . . . . . . . . . .
3.2.2 Paramtrer . . . . . . . . . . .
e
3.2.3 Protger . . . . . . . . . . . .
e
3.2.4 Tester . . . . . . . . . . . . . .
3.2.5 Dcrire . . . . . . . . . . . . .
e
3.2.6 Encapsuler . . . . . . . . . . .
3.2.7 Conclure . . . . . . . . . . . .
Appel dune fonction . . . . . . . . .
3.3.1 Passage des param`tres . . .
e
3.3.2 Param`tres par dfaut . . . .
e
e
3.3.3 Porte des variables . . . . .
e
3.3.4 Appels rcursifs . . . . . . . .
e
Exercices complmentaires . . . . . .
e
3.4.1 Conna
tre . . . . . . . . . . . .
3.4.2 Comprendre . . . . . . . . . .
3.4.3 Appliquer . . . . . . . . . . . .
3.4.4 Analyser . . . . . . . . . . . .
3.4.5 Solutions des exercices . . . .
Annexes . . . . . . . . . . . . . . . . .
3.5.1 Instructions Logo . . . . . . .
3.5.2 Fonctions Python prdnies
e e
3.5.3 Fonctions en Python . . . . .
3.5.4 Lutilitaire pydoc . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
100
100
101
102
104
105
106
107
108
110
112
114
115
115
119
120
121
128
128
130
131
132
137
152
152
153
155
156
CHAPITRE 3. PROCEDURES ET FONCTIONS
100
3.1
Introduction
3.1.1
Remarque 3.1 : Les chires ri en base b sont tels que
0 ri < b.
Exemples :
b = 2 : ri {0, 1} (bit = binary digit)
Rutiliser
e
b = 10 : ri {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
i=n
rn bn + rn1 bn1 + . . . + r1 b1 + r0 b0 =
b = 16 : ri {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f }
Plus la base b est faible plus il faut de chires pour
reprsenter un mme nombre.
e
e
Exemples :
(128)10 = 1.102 + 2.101 + 8.100 =
(128)10
= 1.27
= (10000000)2
= 8.161
=
(80)16
TD 3.1 : Codage des entiers positifs (1)
Dnir un algorithme qui code sur k chires en base b un
e
entier positif n du syst`me dcimal.
e
e
Exemples : (38)10 (123)5
(83)10 (123)8
(291)10 (123)16
ri bi
i=0
Exemples : (123)10
(123)5
(123)8
(123)16
=
=
=
=
= (123)10
= (38)10
= (83)10
= (291)10
On suppose que le nombre n est reprsent par un tableau de chires (code) en base b ; par
e
e
exemple si b = 5 et code = [1,2,3], alors en base 10 le nombre entier n correspondant vaudra
38 (1 52 + 2 51 + 3 50 = 25 + 10 + 3 = 38). Etant donns code et b, lalgorithme suivant permet
e
de calculer n en base 10 :
n = 0
for i in range(len(code)):
n = n + code[i]*b**(len(code)-1-i)
Sous linterprteur Python, pour calculer successivement la valeur dcimale n des nombres
e
e
(123)5 et (123)8 , nous devrons donc recopier 2 fois lalgorithme ci-dessus.
>>>
>>>
>>>
>>>
...
...
>>>
38
b = 5
code = [1,2,3]
n = 0
for i in range(len(code)):
n = n + code[i]*b**(len(code)-1-i)
n
>>>
>>>
>>>
>>>
...
...
>>>
83
b = 8
code = [1,2,3]
n = 0
for i in range(len(code)):
n = n + code[i]*b**(len(code)-1-i)
n
Dans la pratique, on ne souhaite pas recopier 2 fois le mme code dautant plus si celui-ci ncessite
e
e
de tr`s nombreuses lignes de code. Pour amliorer la rutilisabilit de lalgorithme (gure 3.1)
e
e
e
e
autrement que par un copier-coller , une solution sera lencapsulation du code ` rpter au
a e e
3.1. INTRODUCTION
101
sein dune fonction (gure 3.2) comme on en a lhabitude avec les fonctions mathmatiques
e
classiques : on appelle la fonction sinus (sin(x)) plutt que la rednir ` chaque fois ! Ainsi, il
o
e
a
arrivera souvent quune mme squence dinstructions doive tre utilise ` plusieurs reprises dans
e
e
e
e a
un algorithme, et on souhaitera bien videmment ne pas avoir ` la reproduire systmatiquement.
e
a
e
Pour cela, le concepteur dnira et utilisera ses propres fonctions qui viendront complter
e
e
le jeu dinstructions initial.
3.1.2
Structurer
ri bi
Un nombre x pourra tre reprsent en base b par un triplet [s, m, p] tel que x = (1)s m bp
e
e
e
o` s reprsente le signe de x, m sa mantisse et p son exposant (p comme puissance) o` :
u
e
u
signe s : s = 1 si x < 0 et s = 0 si x 0
mantisse m : m [1, b[ si x = 0 et m = 0 si x = 0
exposant p : p [min, max]
TD 3.2 : Codage dun nombre fractionnaire
Dterminer le signe, la mantisse et lexposant binaires
e
du nombre fractionnaire x = 140.8125 en suivant les 4
tapes dcrites ci-contre.
e
e
TD3.2
CHAPITRE 3. PROCEDURES ET FONCTIONS
102
Valeur
3.1415926535897931
2.7182818284590451
Rsultat
e
arc cosinus (en radians).
arc sinus (en radians).
arc tangente (en radians).
arc tangente (en radians) de y/x.
le plus petit entier >= x.
cosinus (en radians).
cosinus hyperbolique.
conversion radians degrs.
e
exponentielle.
valeur absolue.
le plus grand entier <= x.
mantisse m and exposant p de x
x = m * 2.**p.
distance euclidienne
sqrt(x*x + y*y).
x * (2**i).
logarithme en base b.
logarithme en base 10.
parties fractionnaire et enti`re de
e
x.
x puissance y (x**y).
conversion degrs radians.
e
sinus (en radians).
sinus hyperbolique.
racine carre.
e
tangente (en radians).
tangente hyperbolique.
3.1.3
Encapsuler
Cette petite session Python illustre quelques caractristiques importantes des fonctions.
e
Une fonction ` un nom : sin.
a
Une fonction est en gnral range dans une biblioth`que de fonctions (ici la biblioth`e e
e
e
e
que math de Python, gure 3.3) ; il faut aller la chercher (on importe la fonction) :
from math import sin.
Une fonction sutilise (s appelle ) sous la forme dun nom suivi de parenth`ses ; dans
e
les parenth`ses, on transmet ` la fonction un ou plusieurs arguments : sin(pi/2).
e
a
Lvaluation de la fonction fournit une valeur de retour ; on dit aussi que la fonction
e
renvoie ou retourne une valeur (sin(pi/2) 1.0) qui peut ensuite tre aecte
e
e
a
` une variable : y = sin(pi/2).
Dnition 3.1 : fonction
e
Une fonction est un bloc dinstructions nomm et paramtr, ralisant une certaine tche. Elle
e
e e e
a
admet zro, un ou plusieurs param`tres et renvoie toujours un rsultat.
e
e
e
Une fonction en informatique se distingue principalement de la fonction mathmatique par
e
le fait quen plus de calculer un rsultat ` partir de param`tres, la fonction informatique peut
e
a
e
3.1. INTRODUCTION
103
avoir des eets de bord : par exemple acher un message ` lcran, jouer un son, ou bien
a e
piloter une imprimante. Une fonction qui na pas deet de bord joue le rle dune expression
o
valuable. Une fonction qui na que des eets de bord est appele une procdure et joue le rle
e
e
e
o
dune instruction.
import lego
Pour comprendre la dirence entre ces deux mthodes, aidons-nous de la mtaphore des cubes
e
e
e
a
` la Lego (gure 3.4). Nous disposons dune bo de cubes (lego) range sous la table. Pour
te
e
utiliser un cube de cette bo nous pouvons soit prendre le cube dans la bo et le mettre sur
te,
te
la table (from lego import cube) : le cube est alors directement accessible sur la table (cube) ;
soit mettre la bo sur la table (import lego) : le cube nest alors pas directement accessible,
te
il faut encore le prendre dans la bo (lego.cube). Lintrt de cette deuxi`me mthode est de
te
ee
e
e
distinguer 2 cubes qui porteraient le mme nom (cube) mais qui ne seraient pas originaires de la
e
mme bo (bo lego et duplo) et qui seraient donc dirents (lego.cube et duplo.cube).
e
te
tes
e
Il est possible galement de verser tout le contenu de la bo sur la table (from lego import
e
te
*) : ici, lastrisque (*) signie tout .
e
>>> from math import *
>>> sqrt(tan(log(pi)))
1.484345173593278
duplo.cube
lego.cube
104
3.2
Pour encapsuler un algorithme dans une fonction, on suivra pas ` pas la dmarche suivante :
a
e
1. donner un nom explicite ` lalgorithme,
a
2. dnir les param`tres dentre-sortie de lalgorithme,
e
e
e
3. prciser les prconditions sur les param`tres dentre,
e
e
e
e
4. donner des exemples dutilisation et les rsultats attendus,
e
5. dcrire par une phrase ce que fait lalgorithme et dans quelles conditions il le fait,
e
6. encapsuler lalgorithme dans la fonction spcie par les 5 points prcdents.
e e
e e
Les 5 premi`res tapes rel`vent de la spcication de lalgorithme et la derni`re tape concerne
e
e
e
e
e e
lencapsulation proprement dite de lalgorithme. En Python, la spcication sera excutable :
e
e
a
` chaque tape, le code de la fonction est toujours excutable mme sil ne donne pas encore
e
e
e
le bon rsultat ; seule la derni`re tape dencapsulation (voir section 3.2.6 page 112) permettra
e
e e
dobtenir le rsultat valide attendu.
e
3.2. DEFINITION DUNE FONCTION
3.2.1
105
Nommer
La premi`re chose ` faire est de nommer la fonction qui encapsule lalgorithme. Les noms
e
a
de fonction sont des identicateurs arbitraires, de prfrence assez courts mais aussi explicites
ee
que possible, de mani`re ` exprimer clairement ce que la fonction est cense faire. Les noms des
e a
e
fonctions doivent en outre obir ` quelques r`gles simples :
e a
e
Un nom de fonction est une squence de lettres (a. . .z , A. . .Z) et de chires (0. . .9), qui
e
doit toujours commencer par une lettre.
Seules les lettres ordinaires sont autorises. Les lettres accentues, les cdilles, les espaces,
e
e
e
les caract`res spciaux tels que $, #, @, etc. sont interdits, ` lexception du caract`re
e
e
a
e
(soulign).
e
La casse est signicative : les caract`res majuscules et minuscules sont distingus.
e
e
Ainsi, sinus, Sinus, SINUS sont des fonctions direntes.
e
Par convention, on crira lessentiel des noms de fonction en caract`res minuscules (y
e
e
compris la premi`re lettre). On nutilisera les majuscules qu` lintrieur mme du nom
e
a
e
e
pour en augmenter ventuellement la lisibilit, comme dans triRapide ou triFusion.
e
e
Le langage lui-mme peut se rserver quelques noms comme cest le cas pour Python
e
e
(gure 3.5). Ces mots rservs ne peuvent donc pas tre utiliss comme noms de fonction.
e
e
e
e
En ce qui concerne la fonction de Fibonacci de lexemple 3.4, nous choisissons de lappeler
simplement fibonacci. Ce qui se traduira en Python par len-tte suivante o` def et return
e
u
sont deux mots rservs par Python pour dnir les fonctions (voir annexe 3.5.3 page 155) :
e
e
e
def fibonacci():
return
Le code de la partie gauche est la dnition actuelle de la fonction fibonacci que lon a dite
e
e e
dans un chier fibo.py : le module associ a donc pour nom fibo. La partie droite montre
e
comment on utilise couramment le module fibo et la fonction fibonacci sous linterprteur
e
Python. Dans ltat actuel, cette fonction na pas darguments et ne fait rien ! Mais elle est dj`
e
ea
compilable et excutable. On peut la dcrire de la mani`re suivante : La fonction fibonacci
e
e
e
calcule un nombre de Fibonacci .
del
elif
else
except
exec
finally
for
from
global
if
import
in
is
lambda
not
or
pass
print
raise
return
try
while
with
yield
CHAPITRE 3. PROCEDURES ET FONCTIONS
106
3.2.2
Un algorithme est une suite ordonne dinstructions qui indique la dmarche ` suivre pour
e
e
a
rsoudre une srie de probl`mes quivalents. Dans ce contexte, cest le paramtrage de lalgoe
e
e
e
e
rithme qui lui donnera cette capacit recherche de rsoudre des probl`mes quivalents. Dans
e
e
e
e
e
lexemple de la fonction sin, cest en eet le param`tre x qui permet de calculer le sinus de
e
nimporte quel nombre rel (sin(x)) et non le sinus dun seul nombre. La deuxi`me tape de
e
e
e
la dnition dune fonction consiste donc ` prciser les param`tres dentre-sortie de la fonction
e
a e
e
e
(gure 3.6).
`
Fig. 3.6 : Parametres dune fonction
sin
Paramtrer
e
y = sin(x)
a
s
b
functionName
t
Pour cela, on nomme ces param`tres avec des identicateurs explicites dans le contexte
e
courant dutilisation de la fonction. Les param`tres de sortie seront systmatiquement initialiss
e
e
e
a
` une valeur par dfaut (par exemple : 0 pour un entier, False pour un boolen, 0.0 pour un
e
e
rel, pour une cha de caract`res, [] pour un tableau).
e
ne
e
La fonction fibonacci prend lordre n en param`tre dentre et retourne le nombre u (un ).
e
e
Le param`tre de sortie u est un entier qui sera donc a priori initialis ` 0 dans la fonction et qui
e
ea
sera retourn par la fonction (return u).
e
def fibonacci(n):
u = 0
return u
>>>
>>>
0
>>>
0
>>>
0
Le code de la partie gauche est la nouvelle dnition de la fonction fibonacci toujours dite
e
e e
dans le mme chier fibo.py que prcdemment. La partie droite montre son utilisation sous
e
e e
linterprteur Python. Dans ltat actuel, cette fonction retourne 0 quels que soient le type
e
e
et la valeur du param`tre dentre ! Mais elle est encore compilable et excutable. On peut
e
e
e
3.2. DEFINITION DUNE FONCTION
107
e
maintenant la dcrire de la mani`re suivante : u = fibonacci(n) est le ni`me nombre de
e
e
Fibonacci (gure 3.7). Cette description est un peu moins littraire que dans la section
e
3.2.1 prcdente. Elle a cependant lavantage de montrer lutilisation typique de la fonction (u
e e
= fibonacci(n)) et dexpliciter le sens des param`tres dentre-sortie (n et u).
e
e
3.2.3
Protger
e
Dans la section prcdente, nous avons test la fonction fibonacci avec comme param`tre
e e
e
e
dentre la cha de caract`res n : cela na aucun sens pour le calcul dun nombre de Fibonacci !
e
ne
e
Il faut donc protger la fonction pour la rendre plus robuste face ` des contextes anormaux
e
a
dutilisation (gure 3.8). Pour cela, on imposera aux param`tres dentre de vrier certaines
e
e
e
conditions avant dexcuter la fonction appele. Ces conditions pralables ` lexcution sont
e
e
e
a
e
appeles les prconditions.
e
e
>>> fibonacci(-5)
Traceback ...
assert n >= 0
AssertionError
>>> fibonacci(n)
Traceback ...
assert type(n) is int
AssertionError
La dnition de la fonction fibonacci a donc t complte par les prconditions sur le pae
ee
ee
e
ram`tre dentre : n doit tre un entier (type(n) is int) positif ou nul (n >= 0). Sa descripe
e
e
fibonacci
CHAPITRE 3. PROCEDURES ET FONCTIONS
108
n:int
fibonacci
tion peut alors tre complte pour tenir compte de ces prconditions sur lordre n du nombre
e
ee
e
e
de Fibonacci calcul : u = fibonacci(n) est le ni`me nombre de Fibonacci si n :int >= 0
e
(gure 3.11). La fonction est toujours compilable et excutable, mais son excution est maine
e
tenant systmatiquement interrompue si les prconditions ne sont pas respectes : ce qui est le
e
e
e
cas pour les param`tres dentre -5 et n. Dans tous les autres cas (entiers positifs ou nuls),
e
e
elle retourne toujours 0 !
En Python, la mani`re dont nous avons initialis le param`tre de sortie u (u = 0) indique
e
e
e
quil sagit implicitement dun entier (int). La fonction fibonacci retourne donc un entier : cest
une postcondition sur le param`tre de sortie u dans le cas du calcul dun nombre de Fibonacci.
e
u:int
En plus des prconditions et des postconditions, on pourra quelquefois imposer que des
e
conditions soient vries tout au long de lexcution de la fonction : on parle alors dinvariants.
e e
e
[n >= 0]
3.2.4
Tester
Avant mme dimplmenter la fonction proprement dite (voir section 3.2.6), on dnit des
e
e
e
tests que devra vrier la fonction une fois implmente. Ces tests sont appels tests unitaires
e
e
e
e
car ils ne concernent quune seule fonction, la fonction que lon cherche ` dnir. Ce jeu de
a e
tests constitue ainsi un ensemble caractristique dentres-sorties associes que devra vrier
e
e
e
e
la fonction. Par exemple, fibonacci(0) devra retourner 1, fibonacci(1) devra retourner 1,
fibonacci(2) devra retourner 2 ou encore fibonacci(9) devra retourner 55. En fait, quelle que
soit la mani`re dont sera implmente la fonction fibonacci, les rsultats prcdents devront
e
e
e
e
e e
tre obtenus par cette implmentation.
e
e
En Python, on utilisera une docstring (cha entre 3 guillemets : """ ... """) pour
ne
dcrire ces tests. Cette cha spciale, place entre len-tte et les prconditions et qui peut
e
ne e
e
e
e
3.2. DEFINITION DUNE FONCTION
109
tenir sur plusieurs lignes, joue le rle de commentaire dans le corps de la fonction. Elle ne
o
change donc a priori rien ` son excution courante.
a
e
def fibonacci(n):
"""
>>> fibonacci(0)
1
>>> fibonacci(2)
2
>>> fibonacci(9)
55
"""
assert type(n) is int
assert n >= 0
u = 0
return u
>>> fibonacci(0)
0
>>> fibonacci(2)
0
>>> fibonacci(9)
0
Nous avons donc ajouter 3 tests dans la dnition de la fonction fibonacci. En Python, ces
e
tests ont la particularit de se prsentent sous la mme forme que lorsquon appelle la fonction
e
e
e
sous linterprteur Python, ` ceci pr`s quils sont crits dans une docstring (""" ... """) :
e
a
e
e
"""
>>> fibonacci(0)
1
>>> fibonacci(2)
2
>>> fibonacci(9)
55
"""
>>> fibonacci(0)
0
>>> fibonacci(2)
0
>>> fibonacci(9)
0
Dune certaine mani`re ces tests permettent de prciser ce quon attend de la fonction. Le choix
e
e
de ces tests est donc tr`s important pour valider limplmentation future.
e
e
CHAPITRE 3. PROCEDURES ET FONCTIONS
110
$ python fibo.py
**********************************************
File "fibo.py", line 10, in __main__.fibonacci
Failed example:
fibonacci(0)
Expected:
1
Got:
0
**********************************************
File "fibo.py", line 12, in __main__.fibonacci
Failed example:
fibonacci(2)
Expected:
2
Got:
0
**********************************************
File "fibo.py", line 14, in __main__.fibonacci
Failed example:
fibonacci(9)
Expected:
55
Got:
0
**********************************************
1 items had failures:
3 of
3 in __main__.fibonacci
***Test Failed*** 3 failures.
$
Ces tests seront conservs tant que la fonctionnalit est requise. A chaque modication du code,
e
e
on eectuera tous les tests ainsi dnis pour vrier si quelque chose ne fonctionne plus.
e
e
3.2.5
Dcrire
e
Une fois choisis le nom de la fonction, les param`tres dentre-sortie, les prconditions sur
e
e
e
les param`tres dentre et les jeux de tests, on peut alors prciser ce que fait lalgorithme et
e
e
e
dans quelles conditions il le fait : il sagit dune phrase de description en bon franais qui
c
permettra ` tout utilisateur de comprendre ce que fait lalgorithme sans ncessairement savoir
a
e
3.2. DEFINITION DUNE FONCTION
111
comment il le fait.
Dnition 3.10 : description dune fonction
e
La description dune fonction est une phrase qui prcise ce que fait la fonction et dans quelles
e
conditions elle le fait.
Cette phrase est une cha de caract`res qui doit expliciter le rle des param`tres dentre et
ne
e
o
e
e
leurs prconditions, ainsi que toutes autres informations juges ncessaires par le concepteur de
e
e
e
la fonction. En particulier, lorsque le retour de la fonction nest pas vident , on explicitera les
e
param`tres de sortie. Dans le cas de la fonction fibonacci, un utilisateur de la fonction saura
e
ce quest un nombre de Fibonacci et la prcision que cette fonction retourne un entier nest pas
e
ncessaire. Par contre, si la fonction retourne plus dune valeur, il faut au moins prciser lordre
e
e
dans lequel elle les retourne. Ainsi par exemple, pour la fonction divmod(a,b) de la biblioth`que
e
standard Python qui calcule le quotient q et le reste r de la division enti`re a b (voir annexe
e
3.5.2 page 153), il faut prciser quelle retourne un n-uplet (tuple) dans lordre (q,r). Dans
e
certains cas, il faut galement prciser que la fonction eectue les calculs dans telles ou telles
e
e
units : cest par exemple le cas des fonctions trigonomtriques usuelles o` les calculs sont mens
e
e
u
e
avec des angles en radians (gure 3.3 page 102). Dans dautres cas encore, on pourra prciser
e
une rfrence bibliographique ou un site Web o` lutilisateur pourra trouver des complments
ee
u
e
sur la fonction et lalgorithme associ. La description dune fonction int`grera donc au moins :
e
e
un exemple typique dappel de la fonction,
la signication des param`tres dentre-sortie,
e
e
les prconditions sur les param`tres dentre,
e
e
e
un jeu de tests signicatifs.
Ainsi, la description de la fonction fibonacci pourra se prsenter sous la forme suivante :
e
u = fibonacci(n) est le nombre de Fibonacci ` lordre n si n :int >= 0.
a
Exemples : fibonacci(0) 1, fibonacci(2) 2, fibonacci(9) 55 .
En Python, on int`grera cette description dans la docstring (cha entre 3 guillemets)
e
ne
que lon a dj` utilise pour le jeu de tests. Les exemples seront donns sous la forme dun jeu
ea
e
e
de tests ` la Python. Cette cha spciale, qui peut tenir sur plusieurs lignes, joue le rle de
a
ne e
o
commentaire dans le corps de la fonction. Elle ne change donc rien ` son excution. Par contre,
a
e
elle permettra de documenter automatiquement laide en-ligne de Python (help) ou encore, elle
pourra tre utilise par certains environnements (idle par exemple) ou par certains utilitaires
e
e
comme pydoc (voir annexe 3.5.4 page 156).
CHAPITRE 3. PROCEDURES ET FONCTIONS
112
def fibonacci(n):
"""
u = fibonacci(n)
est le nombre de Fibonacci
a
` lordre n si n:int >= 0
>>> fibonacci(0)
1
>>> fibonacci(2)
2
>>> fibonacci(9)
55
"""
assert type(n) is int
assert n >= 0
u = 0
return u
>>> fibonacci(5)
0
>>> fibonacci(100)
0
>>> help(fibo.fibonacci)
Help on function fibonacci in module fibo:
fibonacci(n)
u = fibonacci(n)
est le nombre de Fibonacci
a
` lordre n si n:int >= 0
>>> fibonacci(0)
1
>>> fibonacci(2)
2
>>> fibonacci(9)
55
La fonction est toujours compilable et excutable ; elle est maintenant documentable (help(fibo.
e
fibonacci)), mais retourne toujours 0 ! Il reste ` limplmenter.
a
e
TD3.3
Fig. 3.13 : Fonction fibonacci (3)
Spcication :
e
3.2.6
fibonacci
n:int
u:int
[n >= 0]
n:int
[n >= 0]
u1:int
u2:int
i:int
[i in 2..n]
[else]
u = u1 + u2
u2 = u1
u1 = u
i = i + 1
u:int
Encapsuler
La derni`re tape consiste enn ` dire comment fait la fonction pour rpondre ` la
e e
a
e
a
spcication dcrite au cours des tapes prcdentes. En phase de spcication, la fonction
e
e
e
e e
e
(ou la procdure) est vue comme une bo noire dont on ne conna pas le fonctionnement
e
te
t
interne (gure 3.13 : spcication). En phase dimplmentation, lencha
e
e
nement des instructions
ncessaires ` la rsolution du probl`me considr est dtaill (gure 3.13 : implmentation).
e
a
e
e
ee
e
e
e
>>>
9
>>>
>>>
...
...
...
...
>>>
55
n
u, u1, u2 = 1, 1, 1
for i in range(2,n+1):
u = u1 + u2
u2 = u1
u1 = u
u
Ce sont ces instructions quil faut encapsuler au cur de la fonction fibonacci comme le
3.2. DEFINITION DUNE FONCTION
113
TD3.4
def sommeArithmetique(n):
"""
s = sommeArithmetique(n) est la somme
des n premiers entiers si n:int >= 0
>>> for n in range(7):
...
print(sommeArithmetique(n)\
== n*(n+1)/2,end= )
True True True True True True True
"""
assert type(n) is int
assert n >= 0
s = 0
for k
in range(1,n+1): s = s + k
return s
return s
CHAPITRE 3. PROCEDURES ET FONCTIONS
114
n
X
k = (1 + 2 + 3 + + n) =
k=1
n(n + 1)
2
En eet :
S
S
2S
=
=
=
1
n
(n + 1)
+
+
+
2
n1
(n + 1)
+
+
+
+
+
+
n
1
(n + 1)
do` : 2S = n(n + 1)
u
3.2.7
Conclure
3.3
115
Une fonction sutilise (s appelle ) sous la forme du nom de la fonction suivi de parenth`ses
e
a
` lintrieur desquelles on transmet (on passe ) zro ou plusieurs arguments conformment
e
e
e
a
` la spcication de la fonction. Dans le cas de la fonction fibonacci, on doit transmettre un
e
argument et un seul lors de lappel de la fonction.
>>> fibonacci(9)
55
>>> fibonacci(5+4)
55
>>> fibonacci(8) + fibonacci(7)
55
>>>
>>>
55
>>>
>>>
>>>
55
y = fibonacci(9)
y
x = 9
y = fibonacci(x)
y
Largument transmis peut tout aussi bien tre une constante (par exemple 9), une variable (par
e
exemple x) ou toute expression dont la valeur est un entier positif ou nul (par exemple 5+4).
Mais quel rapport existe-t-il entre ces arguments transmis et les param`tres dentre-sortie de
e
e
la fonction (n et u dans le cas de la fonction fibonacci) ? Cest le probl`me du passage des
e
param`tres de linstruction appelante ` la fonction appele.
e
a
e
3.3.1
Dans la dnition dune fonction, la liste des param`tres dentre spcie les informations `
e
e
e
e
a
transmettre comme arguments lors de lappel de la fonction. Les arguments eectivement utiliss
e
doivent tre fournis dans le mme ordre que celui des param`tres dentre correspondants : le
e
e
e
e
premier argument sera aect au premier param`tre dentre, le second argument sera aect
e
e
e
e
au second param`tre dentre, et ainsi de suite.
e
e
Dnition :
e
Appel :
def fibonacci(n):
...
return u
>>> y = fibonacci(x)
Les param`tres introduits dans la dnition sont appels les param`tres formels (par exemple
e
e
e
e
n dans la dnition de la fonction fibonacci) ; les param`tres passs en arguments sont appels
e
e
e
e
les param`tres eectifs (par exemple x dans lappel fibonacci(x)).
e
CHAPITRE 3. PROCEDURES ET FONCTIONS
116
`
Dnition 3.11 : parametre formel
e
Un param`tre formel est un param`tre dentre dune fonction utilis ` lintrieur de la fonction
e
e
e
ea
e
appele.
e
`
Dnition 3.12 : parametre effectif
e
Un param`tre eectif est un param`tre dappel dune fonction utilis ` lextrieur de la fonction
e
e
ea
e
appele.
e
Lors de lappel dune fonction, il y a copie des param`tres eectifs dans les param`tres
e
e
formels : les valeurs des param`tres eectifs passs en argument sont aectes aux param`tres
e
e
e
e
formels dentre correspondants (on parle de passage par valeur ou de passage par copie ).
e
Ainsi, ce ne sont pas les param`tres eectifs qui sont manipuls par la fonction elle-mme mais
e
e
e
des copies de ces param`tres. A la sortie de la fonction, on copie la valeur du param`tre formel de
e
e
retour (u dans la fonction fibonacci) dans un param`tre eectif qui remplace temporairement
e
lappel de la fonction (fibonacci(x)) et qui est nalement utilis par linstruction qui a appel la
e
e
fonction (laectation dans le cas de linstruction y = fibonacci(x)). Cette variable temporaire
est ensuite dtruite automatiquement. Ainsi, linstruction y = fibonacci(x) est quivalente
e
e
a
` la squence dinstructions suivante :
e
TD3.6
Dnition :
e
def fibonacci(n) :
u, u1, u2 = 1, 1, 1
for i in range(2,n+1) :
u = u1 + u2
u2 = u1
u1 = u
return u
Appel :
>>> x = 9
>>> y = fibonacci(x)
>>> y
55
Appel quivalent :
e
>>> x = 9
>>> n = x
>>> u, u1, u2 = 1, 1, 1
>>> for i in range(2,n+1) :
...
u = u1 + u2
...
u2 = u1
...
u1 = u
...
>>> tmp = u
>>> del n, u, u1, u2, i
>>> y = tmp
>>> del tmp
>>> y
55
On commence par copier la valeur du param`tre eectif x dans le param`tre formel dentre n
e
e
e
(n = x) ; en Python, n est vraiment cre ` ce moment l` seulement. On excute ensuite tel
ee a
a
e
quel le code de la fonction fibonacci : les variables internes ` la fonction (u, u1, u2, i) sont
a
cres et manipules conformment ` la dnition de fibonacci. Linstruction return u
ee
e
e
a
e
117
provoque ensuite la cration dune variable temporaire tmp dans laquelle on copie la valeur du
e
param`tre formel de sortie u (tmp = u) et toutes les variables introduites dans le corps de la
e
fonction sont dtruites (del n, u, u1, u2, i). On aecte la valeur de tmp ` y (y = tmp) : cette
e
a
aectation ralise eectivement laectation souhaite (y = fibonacci(x)). Enn, la variable
e
e
temporaire tmp introduite au retour de la fonction fibonacci est dtruite (del tmp). A la
e
n, seules coexistent les deux variables x et y : toutes les autres variables (n, u, u1, u2, i et tmp)
ont t cres temporairement pour les besoins de lappel de la fonction, puis dtruites.
e e ee
e
Dans certains cas, le param`tre eectif occupe une trop grande place en mmoire pour
e
e
envisager de le recopier. Par exemple, une image satellite de 6000 6000 pixels cods sur 8
e
niveaux de gris occupe 36M o en mmoire ; la copier conduirait ` occuper 72M o ! Par ailleurs, on
e
a
peut vouloir eectuer un traitement sur limage originale et non traiter une de ses copies. Pour
remedier ` ces probl`mes lis au passage des param`tres par valeur, on utilisera le passage
a
e
e
e
par rfrence qui consiste ` transfrer la rfrence de la variable (son nom ou son adresse en
ee
a
e
ee
mmoire) plutt que sa valeur.
e
o
Dnition 3.14 : passage par reference
e
Le passage des param`tres par rfrence consiste ` copier la rfrence du param`tre eectif dans
e
ee
a
ee
e
le param`tre formel correspondant.
e
CHAPITRE 3. PROCEDURES ET FONCTIONS
118
def f(x):
assert type(x) is list
if len(x) > 0: x[0] = 5
return
>>>
>>>
>>>
[5,
t = [0,1,2]
f(t)
t
1, 2]
def g(x):
assert type(x) is list
y = [9,8,7]
x = y
x[0] = 5
return
>>>
>>>
>>>
[0,
t = [0,1,2]
g(t)
t
1, 2]
Les fonctions f() et g() ncessitent chacune un argument de type list (assert type(x) is
e
list). Cet argument sera donc pass par rfrence lors de lappel de ces fonctions : ` lintrieur
e
ee
a
e
de chacune delles, on manipulera une copie de la rfrence de la liste passe en argument (t
ee
e
dans les exemples de droite). La fonction f() cherche ` modier le premier lment de la liste
a
ee
(x[0] = 5) : elle aecte au premier lment de la liste nomme x (llment de rang 0 : x[0])
ee
e
ee
la valeur 5. Comme le param`tre formel x est une copie de la rfrence originale t, il rfrence
e
ee
ee
le mme tableau de valeurs [0,1,2] et la modication portera bien sur llment 0 du tableau
e
ee
original. A la sortie de la fonction f(), la liste t originale est bien modie. Quant ` elle, la
e
a
fonction g() cherche ` modier la rfrence de la liste x (x = y). En fait, elle modie la copie
a
ee
de la rfrence (x) mais pas la rfrence originale (t). Laectation suivante (x[0] = 5) modie
ee
ee
ainsi le premier lment du tableau de valeurs [9,8,7]. Mais, ` la sortie de la fonction g(),
ee
a
le tableau de valeurs [0,1,2] rfrenc par la liste t originale nest pas modi. Les mmes
ee
e
e
e
fonctionnements sont obtenus avec un dictionnaire comme le montrent les exemples ci-dessous.
def f(x):
assert type(x) is dict
x[0] = 5
return
>>>
>>>
>>>
{0:
d = {}
f(d)
d
5}
def g(x):
assert type(x) is dict
y = {0: 9, 1: 8, 2: 7}
x = y
x[0] = 5
return
>>> d = {}
>>> g(d)
>>> d
{}
3.3.2
119
Dans la dnition dune fonction, il est possible de dnir une valeur par dfaut pour chacun
e
e
e
des param`tres dentre. On peut dnir une valeur par dfaut pour tous les param`tres, ou
e
e
e
e
e
une partie dentre eux seulement ; dans ce cas, les param`tres sans valeur par dfaut doivent
e
e
prcder les autres dans la liste. On obtient ainsi une fonction qui peut tre appele avec tous
e e
e
e
ses param`tres ou une partie seulement des arguments attendus :
e
def f(x, y = 0, z = r):
return x,y,z
>>> f(1,2,t)
(1, 2, t)
>>>
(1,
>>>
(1,
>>> f()
Traceback ...
TypeError: f() takes at least 1 argument
(0 given)
f(1,2)
2, r)
f(1)
0, r)
De nombreuses fonctions des biblioth`ques standards poss`dent des arguments par dfaut. Cest
e
e
e
le cas par exemple de la fonction standard int() (voir annexe 3.5.2 page 153) ou encore de la
fonction log() du module math (voir gure 3.3 page 102).
>>> int(45)
45
>>> int(45,10)
45
>>> int(101101,2)
45
>>> int(45,23)
97
>>> int(45,23) == 4*23**1 + 5*23**0
True
A gauche, la fonction int() permet de transformer en un entier dcimal une cha de caract`res
e
ne
e
eme argument
`
(par exemple 45) qui reprsente un nombre crit dans la base spcie par le 2
e
e
e e
(par exemple 23). Par dfaut, cette base est la base dcimale (10). A droite, la fonction log()
e
e
calcule le logarithme dun nombre (par exemple 2.7182818284590451) dans la base spcie par
e e
eme argument (par exemple 10). Par dfaut, cette base est celle des logarithmes npriens
`
le 2
e
e e
(e).
TD3.7
Dans la plupart des langages de programmation, les arguments que lon transmet ` lappel
a
dune fonction doivent tre passs exactement dans le mme ordre que celui des param`tres qui
e
e
e
e
leur correspondent dans la dnition de la fonction. En Python, si les param`tres annoncs
e
e
e
CHAPITRE 3. PROCEDURES ET FONCTIONS
120
dans la dnition de la fonction ont reu chacun une valeur par dfaut, on peut faire appel ` la
e
c
e
a
fonction en fournissant les arguments correspondants dans nimporte quel ordre, ` condition de
a
dsigner nommment les param`tres correspondants.
e
e
e
def f(x = 0, y = 1):
return x,y
>>> f()
(0, 1)
>>> f(3)
(3, 1)
>>>
(3,
>>>
(0,
>>>
(8,
>>> f(3,4)
(3, 4)
f(y = 4, x = 3)
4)
f(y = 6)
6)
f(x = 8)
1)
La fonction f() a 2 param`tres dentre (x et y) qui admettent chacun une valeur par dfaut
e
e
e
(respectivement 0 et 1). On peut lappeler classiquement avec 0, 1 ou 2 arguments comme dans
les 3 appels de gauche (f(), f(3), f(3,4)). On peut aussi lappeler en nommant explicitement
les arguments comme dans les 3 exemples de droite (f(y = 4, x = 3), f(y = 6), f(x = 8)) ;
dans ce cas, lordre des param`tres na plus dimportance.
e
>>> def f(x = 0, y = 1):
...
return x,y
...
>>> x = 7
>>> f(x = x)
(7, 1)
3.3.3
Les noms des param`tres eectifs nont ainsi rien de commun avec les noms des param`tres
e
e
formels correspondants : il ne reprsente pas la mme variable en mmoire. . . mme sils ont le
e
e
e
e
mme nom !
e
Lorsquon dnit des variables ` lintrieur du corps dune fonction, ces variables ne sont
e
a
e
accessibles qu` la fonction elle-mme. On dit que ces variables sont des variables locales ` la
a
e
a
fonction : en quelque sorte, elles sont connes ` lintrieur de la fonction. Cest par exemple le
e a
e
cas des variables n, u, u1, u2 et i de la fonction fibonacci (voir section 3.2.6). Chaque fois que
la fonction fibonacci est appele, Python rserve pour elle en mmoire un nouvel espace de
e
e
e
noms . Les valeurs des variables locales n, u, u1, u2 et i sont ainsi stockes dans cet espace de
e
noms qui est inaccessible depuis lextrieur de la fonction. Ainsi par exemple, si nous essayons
e
dacher le contenu de la variable u juste apr`s avoir eectu un appel ` la fonction fibonacci,
e
e
a
121
Lespace de noms rserv lors de lappel de la fonction est automatiquement dtruit d`s que la
e
e
e
e
fonction a termin son travail (voir les appels quivalents en section 3.3.1).
e
e
Les variables dnies ` lextrieur dune fonction sont des variables globales . Leur valeur
e
a
e
est visible de lintrieur dune fonction, mais la fonction ne peut pas a priori la modier.
e
>>>
...
...
...
...
>>>
>>>
4
>>>
6
def f(x):
y = 3
x = x + y
return x
y = 6
f(1)
y
Si deux variables portent le mme nom ` lextrieur et ` lintrieur dune fonction, la priorit est
e
a
e
a
e
e
donne ` la variable locale ` lintrieur de la fonction ; ` lextrieur de la fonction, le probl`me
e a
a
e
a
e
e
ne se pose pas : la variable locale nexiste pas.
TD3.8
3.3.4
Appels rcursifs
e
La suite des nombres un de Fibonacci est dnie par la relation de rcurrence suivante
e
e
(exemple 3.4 page 104) :
u0 = 1 , u1 = 1 , un = un1 + un2 n N, n > 1
La relation de rcurrence exprime le nombre un ` lordre n en fonction des nombres un1 et
e
a
un2 , respectivement ` lordre (n 1) et (n 2). Ainsi, on dnit un directement en fonction
a
e
de un1 et de un2 . Cette criture est tr`s compacte et tr`s expressive ; en particulier, elle
e
e
e
ne fait pas intervenir de boucle comme dans le code de la fonction dnie en section 3.2.6. Il
e
x = 5
print(x)
y = f(x)
print(x)
z = g(x)
print(x)
t = h(x)
print(x)
2. >>>
>>>
?
>>>
>>>
?
>>>
>>>
?
>>>
>>>
?
x = 5
print(x)
x = f(x)
print(x)
x = g(x)
print(x)
x = h(x)
print(x)
CHAPITRE 3. PROCEDURES ET FONCTIONS
122
serait donc intressant de dnir la fonction fibonacci de mani`re aussi simple dans le langage
e
e
e
algorithmique.
Version itrative :
e
def fibonacci(n) :
u, u1, u2 = 1, 1, 1
for i in range(2,n+1) :
u = u1 + u2
u2 = u1
u1 = u
return u
Version rcursive :
e
def fibonacci(n) :
u = 1
if n > 1 :
u = fibonacci(n-1) + fibonacci(n-2)
return u
On retrouve ` gauche la version itrative dj` propose en section 3.2.6. A droite, la version
a
e
ea
e
est dite rcursive parce que dans le corps de la fonction fibonacci, on appelle la fonction
e
fibonacci elle-mme, et on lappelle mme 2 fois. Cette version rcursive est la traduction
e
e
e
directe de la formulation mathmatique.
e
123
20 milliards units de temps !) pour la mthode rcursive. La version itrative sera donc prfre
e
e
e
e
eee
a
` la version rcursive dans ce cas l` : il ny a pas photo !
e
a
Il ne faudrait pas conclure ` linutilit des processus rcursifs en arbre. Pour les processus
a
e
e
oprant sur des structures de donnes hirarchiques et non plus sur des nombres, la rcursivit
e
e
e
e
e
en arbre est un outil naturel et puissant1 . Mme pour les calculs numriques, les processus
e
e
rcursifs en arbre peuvent tre utiles a la comprhension et ` la conception dalgorithmes. Par
e
e
`
e
a
exemple, bien que la version rcursive de fibonacci soit beaucoup moins ecace que la version
e
itrative, elle sobtient presque directement, tant ` peine plus quune traduction en Python
e
e
a
de la dnition mathmatiques des nombres de Fibonacci. En revanche, pour formuler la version
e
e
itrative, il fallait avoir remarqu que le calcul pouvait tre revu sous la forme dune itration
e
e
e
e
avec 3 variables ; ce qui est bien moins direct et moins intuitif que la version rcursive.
e
Etat initial :
dpart
`
Ltude des structures de donnes arborescentes est aborde ` partir du 5eme semestre des enseignements
e
e
e a
dinformatique ` lENIB.
a
arrive
intermdiaire
arrive
Etat nal :
dpart
Les tours de Hano est un jeu imagin par le mathmaticien franais Edouard Lucas (1842
e
e
c
1891). Il consiste ` dplacer n disques de diam`tres dirents dune tour de dpart ` une
a e
e
e
e
a
tour d arrive en passant par une tour intermdiaire et ceci en un minimum de coups,
e
e
tout en respectant les r`gles suivantes :
e
on ne peut dplacer quun disque ` la fois,
e
a
on ne peut placer un disque que sur un autre disque plus grand que lui ou sur une tour
vide.
Dans ltat initial, les n disques sont placs sur la tour dpart . Dans ltat nal, tous les
e
e
e
e
disques se retrouvent placs dans le mme ordre sur la tour arrivee (gure 3.15). TD3.9
e
e
e
intermdiaire
Etat intermdiaire a :
e
dpart
intermdiaire
arrive
dpart
intermdiaire
arrive
CHAPITRE 3. PROCEDURES ET FONCTIONS
124
hanoi(0,i,d,a)
deplacer(2,d,i)
hanoi(1,a,d,i)
hanoi(0,a,i,d)
deplacer(1,a,i)
hanoi(0,d,a,i)
deplacer(3,d,a)
hanoi(1,i,a,d)
hanoi(0,i,d,a)
hanoi(0,a,i,d)
deplacer(2,i,a)
hanoi(1,d,i,a)
hanoi(0,d,a,i)
deplacer(1,d,a)
hanoi(0,i,d,a)
def hanoi(n,gauche,milieu,droit):
assert type(n) is int
assert n >= 0
if n > 0:
hanoi(n-1,gauche,droit,milieu)
deplacer(n,gauche,droit)
hanoi(n-1,milieu,droit,gauche)
return
>>> hanoi(3,d,i,a)
dplacer disque 1 de la tour
e
dplacer disque 2 de la tour
e
dplacer disque 1 de la tour
e
dplacer disque 3 de la tour
e
dplacer disque 1 de la tour
e
dplacer disque 2 de la tour
e
dplacer disque 1 de la tour
e
d
d
a
d
i
i
d
a
`
a
`
a
`
a
`
a
`
a
`
a
`
la
la
la
la
la
la
la
tour
tour
tour
tour
tour
tour
tour
a
i
i
a
d
a
a
hanoi(2,i,d,a)
deplacer(1,i,d)
def deplacer(n,gauche,droit):
print(dplacer disque, n,
e
de la tour, gauche,
` la tour, droit)
a
return
Lexcution dun appel ` la procdure hanoi sapparente ici encore ` un processus rcursif en
e
a
e
a
e
arbre : les 7 dplacements eectus lors de lappel hanoi(3,d,i,a) sont numrots dans
e
e
e e
leur ordre dapparition sur la gure 3.17 (les appels ` la fonction hanoi pour n = 0 ne font rien).
a
Mais toutes les fonctions rcursives ne conduisent pas ncessairement ` un processus rcursif en
e
e
a
e
arbre comme lexemple de la fonction factorielle le montre.
k) est
k=1
125
0! = 1
n! = n (n 1)! n N
Version itrative :
e
def factorielle(n) :
u = 1
for i in range(2,n+1) :
u = u * i
return u
Version rcursive :
e
def factorielle(n) :
u = 1
if n > 1 :
u = n * factorielle(n-1)
return u
On retrouve ` gauche la version itrative bien connue. A droite, la version rcursive est la traa
e
e
duction directe de la formulation mathmatique. Dans la version rcursive, le processus ncessite
e
e
e
que linterprteur garde une trace des multiplications ` raliser plus tard (gure 3.18). Le proe
a e
cessus cro puis dcro : la croissance se produit lorsque le processus construit une cha
t
e t
ne
doprations dires (ici, une cha de multiplications dires) et la dcroissance intervient
e
ee
ne
ee
e
lorsquon peut valuer les multiplications. Ainsi, la quantit dinformation quil faut mmoriser
e
e
e
pour eectuer plus tard les oprations dires cro linairement avec n : on parle de processus
e
ee
t e
rcursif linaire. Linterprtation dune fonction rcursive passe donc par une phase dexpansion
e
e
e
e
dans lesquels les appels rcursifs sont empils jusqu` arriver ` un appel de la fonction pour
e
e
a
a
lequel une condition darrt sera vrie, puis par une phase de contraction dans laquelle les
e
e e
rsultats des appels prcdemment empils sont utiliss. Par contre, dans la version itrative,
e
e e
e
e
e
le processus de calcul ne cro ni ne dcro : ` chaque tape, seules les valeurs courantes des
t
e t a
e
variables u et i sont ncessaires (il ny a pas doprations dires) et le temps requis pour
e
e
ee
calculer n! augmente linairement avec n (on passe n 2 fois dans la boucle).
e
TD3.10
Lorsquon parle de fonction rcursive, on fait rfrence ` une caractristique syntaxique :
e
ee
a
e
la fonction, dans sa propre dnition, se fait rf`rence ` elle-mme (elle sappelle elle-mme).
e
ee
a
e
e
Mais lorsquon parle de processus rcursif, linaire ou en arbre, on sintresse au droulement
e
e
e
e
du processus, et non ` la syntaxe de lcriture de la fonction. Ainsi, une fonction peut avoir une
a
e
dnition rcursive mais correspondre ` un processus itratif : cest le cas de la nouvelle version
e
e
a
e
de la fonction factorielle ci-dessous.
CHAPITRE 3. PROCEDURES ET FONCTIONS
126
def factorielle(n):
u = factIter(n,1,1)
return u
def factIter(n,i,fact):
u = fact
if i < n:
u = factIter(n,i+1,fact*(i+1))
return u
n
X
k=0
k=
n(n + 1)
2
factorielle(5)
(factIter(5,1,1))
(factIter(5,2,2))
(factIter(5,3,6))
(factIter(5,4,24))
(factIter(5,5,120))
120
La nouvelle fonction factorielle appelle une fonction auxiliaire factIter dont la dnition
e
est syntaxiquement rcursive (factIter sappelle elle-mme). Cette fonction ` 3 arguments :
e
e
a
lentier n dont il faut calculer la factorielle, un compteur i initialis ` 1 au premier appel de
e a
factIter par factorielle et incrment ` chaque nouvel appel, et un nombre fact initialis
e
ea
e
a
` 1 et multipli par la nouvelle valeur du compteur ` chaque nouvel appel. Le droulement
e
a
e
dun appel ` factIter montre quainsi, ` chaque tape, la relation (i ! == fact) est toujours
a
a
e
vrie. La fonction factIter arrte de sappeler elle-mme lorsque (i == n) et on a alors
e e
e
e
(fact == i ! == n !) qui est la valeur recherche. Ainsi, ` chaque tape, nous navons besoin
e
a
e
que des valeurs courantes du compteur i et du produit fact, exactement comme dans la version
itrative de la fonction factorielle : il ny a plus de cha doprations dires comme dans
e
ne
e
ee
la version rcursive de factorielle. Le processus mis en jeu ici est un processus itratif, bien
e
e
que la dnition de factIter soit rcursive.
e
e
TD3.11
Dans la fonction factIter, le rsultat de lappel rcursif est retourn par la fonction : on
e
e
e
parle alors de rcursivit terminale (ou rcursivit ` droite). Lexcution dun tel appel termine
e
e
e
ea
e
lexcution de la fonction.
e
127
Quel que soit le probl`me ` rsoudre, on a le choix entre lcriture dune fonction itrative et
e
a e
e
e
celle dune fonction rcursive. Si le probl`me admet une dcomposition rcurrente naturelle, le
e
e
e
e
programme rcursif est alors une simple adaptation de la dcomposition choisie. Cest le cas des
e
e
fonctions factorielle et fibonacci par exemple. Lapproche rcursive prsente cependant des
e
e
inconvnients : certains langages nadmettent pas la rcursivit (comme le langage machine !)
e
e
e
et elle est souvent coteuse en mmoire comme en temps dexcution. On peut pallier ces inu
e
e
convnients en transformant la fonction rcursive en fonction itrative : cest toujours possible.
e
e
e
Considrons une procdure f ` rcursivit terminale crite en pseudo-code :
e
e
a e
e
e
def f(x):
if cond: arret
else:
instructions
f(g(x))
return
x
cond
arret
instructions
x = g(x)
a,b
b == 0
return a
pass
a,b = b,a%b
def pgcd(a,b):
while not (b == 0):
pass
a,b = b,a%b
return a
>>> pgcd(12,18)
6
CHAPITRE 3. PROCEDURES ET FONCTIONS
128
3.4
3.4.1
Exercices complmentaires
e
Conna
tre
3.4. EXERCICES COMPLEMENTAIRES
129
CHAPITRE 3. PROCEDURES ET FONCTIONS
130
3.4.2
Comprendre
`
TD 3.14 : Passage des parametres
On consid`re les fonctions f, g et h suivantes :
e
def f(x):
y = x + 2
return y
def g(z):
v = 2*f(z)
return v
def h(a):
b = g(f(a))
return b
Quels sont les algorithmes quivalents (algorithmes o` il ny a plus dappels aux fonctions f,
e
u
g et h) aux appels suivants :
1. u = f(2)
3. u = g(2)
5. u = h(2)
2. u = f(t)
4. u = g(t)
6. u = h(t)
def g(x):
x = 2*f(x)
print(g, x)
return x
def h(x):
x = g(f(x))
print(h, x)
return x
3.4. EXERCICES COMPLEMENTAIRES
131
4. >>> x = 5
>>> print(x)
>>> print(x)
>>> x = x + 2
>>> print(x)
>>> f(x)
>>> print(x)
>>> x = 2 * (x + 2)
>>> print(x)
2. >>> x = 5
>>> g(x)
>>> print(x)
>>> print(x)
>>> h(x)
>>> y = f(x)
>>> print(x, y)
>>> print(x)
>>> z = 2*f(y)
>>> print(x, y, z)
3. >>> x = 5
>>> print(x)
>>> z = 2*f(f(x))
>>> print(x, z)
3.4.3
Appliquer
TD 3.16 : Suite geometrique
Dnir une fonction rcursive qui calcule la somme des n premiers termes dune suite gomtrique
e
e
e e
uk = abk .
`
TD 3.17 : Puissance entiere
Dnir une fonction rcursive qui calcule la puissance enti`re p = xn dun nombre entier x.
e
e
e
n
k=0
n!
ank bk .
k!(n k)!
CHAPITRE 3. PROCEDURES ET FONCTIONS
132
f (0, n) = n + 1
f (m, 0) = f (m 1, 1) si m > 0
f : N2 N
3.4.4
Analyser
`
TD 3.21 : Complement a 2
Dnir une fonction neg2 qui dtermine le complment ` 2 en binaire dun entier n cod sur k
e
e
e
a
e
bits.
(011100)2 (100100)2 :
(011100)2
(100011)2
+ (000001)2
= (100100)2
3.4. EXERCICES COMPLEMENTAIRES
133
# neg2(code)
>>> neg2([0,0,0,1,0,1,1,1])
[1, 1, 1, 0, 1, 0, 0, 1]
>>> neg2([1, 1, 1, 0, 1, 0, 0, 1])
[0, 0, 0, 1, 0, 1, 1, 1]
>>> for a in [0,1]:
...
for b in [0,1]:
...
for c in [0,1]:
...
add2([a,b,c],neg2([a,b,c]))
[0, 0, 0]
[1, 0, 0, 0]
[1, 0, 0, 0]
[1, 0, 0, 0]
[1, 0, 0, 0]
[1, 0, 0, 0]
[1, 0, 0, 0]
[1, 0, 0, 0]
1. Dnir une fonction ieee qui code un nombre rel x selon la norme IEEE 754 simple
e
e
prcision.
e
s
x = (1) (1 + m) 2
# ieee(x)
>>> ieee(0.0)
[0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
>>> ieee(0.625)
[0, 0, 1, 1, 1, 1, 1, 1, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
>>> ieee(3.1399998664855957)
[0, 1, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0, 0, 1, 1, 1,
0, 1, 0, 1, 1, 1, 0, 0, 0, 0,
>>> ieee(-4573.5)
[1, 1, 0, 0, 0, 1, 0, 1, 1,
0, 0, 0, 1, 1, 1, 0, 1, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0,
0, 0]
0,
0, 0]
1,
1, 0]
0,
0, 0]
(e127)
IEEE : www.ieee.org
Institute of Electrical and Electronics Engineers
CHAPITRE 3. PROCEDURES ET FONCTIONS
134
2. Dnir une fonction real qui dcode un nombre rel x cod selon la norme IEEE 754
e
e
e
e
simple prcision.
e
x = (1)s (1 + m) 2(e127)
# real(code)
>>> real(ieee(0.625))
0.625
>>> real(ieee(3.1399998664855957))
3.1399998664855957
>>> real(ieee(-4573.5))
-4573.5
f(x)
f(a)
f(b)
0
f(x)
f(a)
f(b)
a
b
rectangles
f(a)
f(b)
a
b
trapzes
Simpson
On testera ces direntes mthodes avec la fonction f (x) = sin(x) sur [0, ].
e
e
1. Mthode des rectangles : subdivisons lintervalle dintgration de longueur ba en n parties
e
e
ba
gales de longueur x =
e
. Soient x1 , x2 , . . ., xn les points milieux de ces n intervalles.
n
Les n rectangles forms avec les ordonnes correspondantes ont pour surface f (x1 )x,
e
e
f (x2 )x, . . ., f (xn )x. Laire sous la courbe est alors assimile ` la somme des aires de
e a
3.4. EXERCICES COMPLEMENTAIRES
135
I=
a
Cest la formule dite des rectangles qui repose sur une approximation par une fonction en
escalier.
e
e
Ecrire une fonction rectangle integration qui calcule lintgrale dnie I dune fonction
f sur [a, b] ` lordre n par la mthode des rectangles.
a
e
2. Mthode des trap`zes : subdivisons lintervalle dintgration de longueur b a en n parties
e
e
e
ba
gales de longueur x =
e
. Les abscisses des points ainsi dnis sont a, x1 , x2 ,
e
n
. . ., xn1 , b et les trap`zes construits sur ces points et les ordonnes correspondantes ont
e
e
x
x
x
pour aire
(f (a) + f (x1 )),
(f (x1 ) + f (x2 )), . . .,
(f (xn1 ) + f (b)). Laire sous
2
2
2
la courbe est alors assimile ` la somme des aires de ces trap`zes, soit
e a
e
b
f (x)dx
I=
a
f (a) + f (b)
+ f (x1 ) + f (x2 ) + + f (xn1 ) x
2
S=
2
(x2 + x + )dx = (x)3 + 2(x)
3
x
CHAPITRE 3. PROCEDURES ET FONCTIONS
136
o` les constantes et sont dtermines en crivant que les points (x, y0 ), (0, y1 ) et
u
e
e
e
(x, y2 ) satisfont lquation de la parabole. On obtient ainsi :
e
(x)2
y0 =
+ (x) +
y1 =
y2 = (x)2 + (x) +
et S =
y0 2y1 + y2
2(x)2
y2 y0
=
2(x)
= y1
x
(y0 + 4y1 + y2 ).
3
x
(y0 + 4y1 + y2 )
3
x
S2 =
(y2 + 4y3 + y4 )
3
x
Par suite, il vient : S3 =
(y4 + 4y5 + y6 )
3
.
.
.
=
x
(yn2 + 4yn1 + yn )
Sn/2 =
3
do`
u
n1
b
x
I=
f (xi ) + 2
f (a) + 4
f (x)dx
3
a
S1
i=1,3,5...
n2
f (xi ) + f (b)
i=2,4,6...
Cest la formule dite de Simpson qui repose sur une approximation de f par des arcs de
parabole.
Ecrire une fonction simpson integration qui calcule lintgrale dnie I dune fonction
e
e
f sur [a, b] ` lordre n par la mthode de Simpson.
a
e
TD 3.24 : Traces de courbes parametrees
Une courbe paramtre dans le plan est une courbe o` labscisse x et lordonne y sont des
e e
u
e
fonctions dun param`tre qui peut tre le temps t ou un angle par exemple. La courbe se
e
e
prsente donc sous la forme x = f (t), y = g(t). Les tableaux ci-dessous en donnent quelques
e
exemples.
3.4. EXERCICES COMPLEMENTAIRES
droite
cercle
ellipse
hyperbole
x = x0 + t
y = y0 + t
x = x0 + r cos()
y = y0 + r sin()
x = x0 + a cos()
y = y0 + b cos()
a
x = x0 +
cos()
y = y0 + b tan()
137
x = x0 + r( sin())
y = y0 + r(1 cos())
cyclo
de
picyclo
e
de
hypercyclo
de
limaon de Pascal
c
spirale logarithmique
R+r
r
R+r
y = y0 + (R + r) sin() r sin
r
Rr
x = x0 + (R r) cos() + r cos
r
Rr
x = y0 + (R r) sin() + r sin
r
x = x0 + (R + r) cos() r cos
x = x0 + (a cos() + b) cos()
y = y0 + (a cos() + b) sin()
x = x0 + ke cos()
y = y0 + ke sin()
Ecrire une fonction drawCurve qui permettent le trac de telles courbes paramtres (gure
e
e e
3.19). On utilisera les instructions ` la Logo pour raliser ces tracs (voir annexe 3.5.1 page
a
e
e
152).
3.4.5
Fig. 3.19 : Courbes parametrees
CHAPITRE 3. PROCEDURES ET FONCTIONS
138
1. u = f(t)
x =
y =
tmp
del
u =
del
t
x + 2
= y
x, y
tmp
tmp
2. u = g(t)
z =
x =
y =
tmp
del
v =
tmp
del
u =
del
t
z
x + 2
= y
x, y
2*tmp
= v
v, z
tmp
tmp
x
x = x + 2
x
x = 2*(x+2)
x
3. u = h(t)
a =
x =
y =
tmp
del
z =
del
x =
y =
tmp
del
v =
tmp
del
b =
del
tmp
del
u =
del
t
a
x + 2
= y
x, y
tmp
tmp
z
x + 2
= y
x, y
2*tmp
= v
v, z
tmp
tmp
= b
a, b
tmp
tmp
3.4. EXERCICES COMPLEMENTAIRES
2. >>> x = 5
3.
>>>
5
>>>
f 7
>>>
(5,
>>>
f 9
>>>
(5,
>>>
>>>
5
>>>
f 7
f 9
>>>
(5,
4. >>> x = 5
>>> x
5
>>> f(x)
f 7
7
>>> x
5
>>> g(x)
f 7
g 14
14
>>> x
5
>>> h(x)
f 7
f 9
g 18
h 18
18
>>> x
5
y = f(x)
x, y
7)
z = 2*f(y)
x, y, z
7, 18)
x = 5
x
z = 2*f(f(x))
x, z
18)
a bk = a
s=
k=0
139
bn+1 1
b1
def sommeGeometrique(a,b,n):
"""
s = sommeGeometrique(a,b,n)
est la somme des n premiers termes dune suite
gomtrique a*b^k (k in [0,n])
e e
"""
assert type(n) is int and n >= 0
if n == 0: s = 1
else: s = sommeGeometrique(a,b,n-1) + (a * b**n)
return s
p = xn
def puissance(x,n):
""""
y = puissance(x,n)
est la puissance enti`re de x de degr n
e
e
"""
assert type(n) is int and n >= 0
if n == 0: p = 1
else: p = x*puissance(x,n-1)
return p
CHAPITRE 3. PROCEDURES ET FONCTIONS
140
TD 3.18 : Coecients du binme.
o
(a + b)n =
k=0
n!
xnk y k
k!(n k)!
def coefficientBinome(n,p):
"""
c = coefficientBinome(n,p)
est le p-i`me coefficient du bin^me (a+b)**n
e
o
"""
assert type(n) is int and type(p) is int
assert n >= 0 and p >= 0 and p <= n
if p == 0 or n == 0 or n == p: c = 1
else: c = coefficientBinome(n-1,p) + coefficientBinome(n-1,p-1)
return c
f (0, n) = n + 1
f (m, 0) = f (m 1, 1) si m > 0
f : N2 N
def ackerman(m,n):
"""
y = ackerman(m,n)
"""
assert type(n) is int and type(m) is int
assert n >= 0 and m >= 0
if m == 0: a = n + 1
elif: n == 0: a = ackerman(m-1,1)
else: a = ackerman(m-1,ackerman(m,n-1))
return a
3.4. EXERCICES COMPLEMENTAIRES
TD 3.20 : Addition binaire.
141
TD 3.21 : Complment ` 2.
e
a
def add2(code1,code2):
"""
sum2 = add2(code1,code2)
additionn binaire sum2 = code1 + code2
>>> add2([1,0,1],[1])
[1, 1, 0]
>>> add2([1,0,1],[1,0])
[1, 1, 1]
>>> add2([1,0],[1,0,1])
[1, 1, 1]
>>> add2([1,0,1],[1,1])
[1, 0, 0, 0]
"""
assert type(code1) is list
assert type(code2) is list
sum2 = []
diffLen = len(code1) - len(code2)
if diffLen > 0:
for i in range(diffLen): insert(code2,0,0)
else:
for i in range(-diffLen): insert(code1,0,0)
for i in range(len(code1)): append(sum2,0)
carry = 0
for i in range(len(code1)-1,-1,-1):
value = code1[i] + code2[i] + carry
if value >= 2:
sum2[i] = value - 2
carry = 1
else:
sum2[i] = value
carry = 0
def neg2(code):
"""
neg = neg2(code)
complment ` 2 dun entier binaire
e
a
>>>
[1,
>>>
[0,
neg2([0,0,0,1,0,1,1,1])
1, 1, 0, 1, 0, 0, 1]
neg2([1, 1, 1, 0, 1, 0, 0, 1])
0, 0, 1, 0, 1, 1, 1]
>>>
...
...
...
[0,
[1,
[1,
[1,
[1,
[1,
[1,
[1,
"""
for a in [0,1]:
for b in [0,1]:
for c in [0,1]:
add2([a,b,c],neg2([a,b,c]))
0, 0]
0, 0, 0]
0, 0, 0]
0, 0, 0]
0, 0, 0]
0, 0, 0]
0, 0, 0]
0, 0, 0]
if carry == 1: insert(sum2,0,1)
carry = 1
for i in range(len(code)): append(neg,int(not code[i]))
for i in range(len(code)):
value = neg[len(code)-1-i] + carry
if value >= 2:
neg[len(code)-1-i] = value - 2
carry = 1
else:
neg[len(code)-1-i] = value
carry = 0
return sum2
return neg
CHAPITRE 3. PROCEDURES ET FONCTIONS
142
TD 3.22 : Codage-dcodage des rels.
e
e
def ieee(x):
"""
ieee_code = ieee(x)
code le rel x selon la norme IEEE 754 simple prcision
e
e
>>> ieee(0.0)
[0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
>>> ieee(0.625)
[0,
0, 1, 1, 1, 1, 1, 1, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
>>> ieee(3.1399998664855957)
[0,
1, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0, 0, 1, 1, 1,
>>> ieee(-4573.5)
[1,
1, 0, 0, 0, 1, 0, 1, 1,
0, 0, 0, 1, 1, 1, 0, 1, 1, 1,
"""
assert type(x) is float
ieee_code = []
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0]
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
k_exponent = 8
k_significand = 23
k_ieee = 32
bias = code(127,2,k_exponent)
x_int = int(abs(x))
x_frac = abs(x) - x_int
expo_2 = 0
for i in range(k_ieee): ieee_code.append(0)
3.4. EXERCICES COMPLEMENTAIRES
# calcul du signe
sign = int(x < 0)
# calcul de la mantisse
i = 0
significand = []
while (x_int != 0) and (i < k_significand):
significand.insert(0,x_int%2)
x_int = x_int/2
i = i + 1
if len(significand) > 0 and
significand[0] == 1:
del significand[0]
expo_2 = len(significand)
i = len(significand)
while (x_frac != 0) and (i < k_significand):
x_frac = x_frac * 2
x_int = int(x_frac)
x_frac = x_frac - x_int
if (x_int == 0) and (i == 0):
expo_2 = expo_2 - 1
else:
significand.append(x_int)
i = i + 1
if abs(x) < 1 and len(significand) > 0 and
significand[0] == 1:
del significand[0]
expo_2 = expo_2 - 1
for i in range(len(significand),k_significand):
significand.append(0)
# calcul de lexposant
exponent = code(abs(expo_2),2,k_exponent)
if expo_2 >= 0: exponent = add2(bias,exponent)
elif expo_2 < 0: exponent = sub2(bias,exponent)
143
# calcul du code IEEE 754 simple prcision
e
if x == 0.0:
ieee_code = []
for i in range(k_ieee): ieee_code.append(0)
else:
ieee_code[0] = sign
ieee_code[1:9] = exponent
ieee_code[9:32] = significand
return ieee_code
#----------------------------------------------def sub2(code1,code2):
"""
substract = sub2(code1,code2)
soustraction binaire substract = code1 - code2
"""
assert type(code1) is list
assert type(code2) is list
assert len(code1) == len(code2)
substract = []
for i in range(len(code1)): append(substract,0)
carry = 0
for i in range(len(code1)-1,-1,-1):
if code1[i] < (code2[i] + carry):
substract[i] = code1[i] + 2 - (code2[i] + carry)
carry = 1
else:
substract[i] = code1[i] - (code2[i] + carry)
carry = 0
return substract
CHAPITRE 3. PROCEDURES ET FONCTIONS
144
TD 3.23 Intgration numrique.
e
e
1. Mthode des rectangles.
e
b
I=
a
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> fabs ( rec tang le_in te g r a t i o n ( sin ,0. ,2* pi ,100000)) < 1. e -6
True
>>> fabs ( rec tang le_in te g r a t i o n ( sin ,0. , pi ,100000) - 2.) < 1. e -6
True
>>> fabs ( rec tang le_in te g r a t i o n ( sin ,0. , pi /2 ,100000) - 1) < 1. e -6
True
>>> fabs ( rec tang le_in te g r a t i o n ( cos ,0. , pi ,100000)) < 1. e -6
True
>>> fabs ( rec tang le_in te g r a t i o n ( cos , - pi /2 , pi /2 ,100000) - 2) < 1. e -6
True
"""
assert type ( x1 ) is float
assert type ( x2 ) is float
assert x1 <= x2
20
21
22
23
24
25
26
27
28
integral = 0.0
width = ( x2 - x1 )/ n
x = x1 + width /2
while x < x2 :
integral = integral + f ( x )
x = x + width
integral = integral * width
return integral
3.4. EXERCICES COMPLEMENTAIRES
145
f (x)dx
I=
a
f (a) + f (b)
+ f (x1 ) + f (x2 ) + + f (xn1 ) x
2
2
3
4
5
"""
int gration de f ( x ) entre x1 et x2
e
par la m thode des n trap` zes
e
e
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> fabs ( tra pezo id_in tegr ation ( sin ,0. ,2* pi ,100000)) < 1. e -6
True
>>> fabs ( tra pezo id_in tegr ation ( sin ,0. , pi ,100000) - 2.) < 1. e -6
True
>>> fabs ( tra pezo id_in tegr ation ( sin ,0. , pi /2 ,100000) - 1) < 1. e -6
True
>>> fabs ( tra pezo id_in tegr ation ( cos ,0. , pi ,100000)) < 1. e -6
True
>>> fabs ( tra pezo id_in tegr ation ( cos , - pi /2 , pi /2 ,100000) - 2) < 1. e -6
True
"""
assert type ( n ) is int
assert type ( x1 ) is float
assert type ( x2 ) is float
assert x1 <= x2
22
23
24
25
26
27
28
29
30
integral = ( f ( x1 ) + f ( x2 ))/2
width = ( x2 - x1 )/ n
x = x1 + width
while x < x2 :
integral = integral + f ( x )
x = x + width
integral = integral * width
return integral
CHAPITRE 3. PROCEDURES ET FONCTIONS
146
3. Mthode de Simpson.
e
f (x)dx
I=
a
x
f (a) + 4
3
n1
n2
f (xi ) + 2
i=1,3,5...
f (xi ) + f (b)
i=2,4,6...
def simpson_integration (f , x1 , x2 , n ):
"""
int gration de f ( x ) entre x1 et x2
e
par la m thode de Simpson
e
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
integral = f ( x1 ) + f ( x2 )
width = ( x2 - x1 )/ n
for i in range (1 ,n ,2):
integral = integral + 4* f ( x1 + i * width )
for i in range (2 ,n ,2):
integral = integral + 2* f ( x1 + i * width )
integral = integral * width /3
return integral
3.4. EXERCICES COMPLEMENTAIRES
147
def drawCurve (( fx , fy ) , t1 , t2 , dt ):
"""
trace une courbe param tr e pour t dans [ t1 , t2 ] par pas de dt
e e
pour les fonctions x = fx ( t ) et y = fy ( t )
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
values = []
t = t1 + dt
while t < t2 :
append ( values , t )
t = t + dt
up ()
goto ( fx ( t1 ) , fy ( t1 ))
down ()
for t in values :
goto ( fx ( t ) , fy ( t ))
return
CHAPITRE 3. PROCEDURES ET FONCTIONS
148
def cx(t):
x0 = -10
r = 40
return x0 + r*cos(t)
def cy(t):
y0 = 5
r = 40
return y0 + r*sin(t)
Nous pourrons alors appeler la fonction drawCurve avec comme premier argument un
appel ` la fonction parametric circle qui sera remplace par le doublet de fonctions
a
e
anonymes :
- pour un cercle de rayon r = 40 centr en (10, 5) :
e
drawCurve(parametric circle(10,5,40),0.,2*pi,pi/100)
- pour un cercle de rayon r = 20 centr en (0, 34) :
e
drawCurve(parametric circle(0,20,-34),0.,2*pi,pi/100)
- et de mani`re gnrale pour un cercle de rayon r centr en (x0 , y0 ) :
e
e e
e
drawCurve(parametric circle(x0,y0,r),0.,2*pi,pi/100)
Nous donnons ci-dessous 9 exemples de fonctions pour dnir des familles de courbes
e
paramtres : droites, cercles, ellipses, hyperboles, cyclo
e e
des, picyclo
e
des, hypocyclo
des,
limaons de Pascal et spirales algorithmiques.
c
3.4. EXERCICES COMPLEMENTAIRES
Droite paramtrique
e
1
2
3
4
5
6
7
Cercle paramtrique
e
1
2
3
4
5
6
7
def parametric_circle ( x0 , y0 , r ):
"""
cercle param trique
e
x = x0 + r * cos ( theta ) , y = y0 + r * sin ( theta )
"""
return lambda ( theta ): x0 + r * cos ( theta ) ,
lambda ( theta ): y0 + r * sin ( theta )
Ellipse paramtrique
e
1
2
3
4
5
6
7
def parametric_ellipse ( x0 , y0 ,a , b ):
"""
ellipse param trique
e
x = x0 + a * cos ( phi ) , y = y0 + b * sin ( phi )
"""
return lambda ( phi ): x0 + a * cos ( phi ) ,
lambda ( phi ): y0 + b * sin ( phi )
Hyperbole paramtrique
e
1
2
3
4
5
6
7
def parametric_hyperbola ( x0 , y0 ,a , b ):
"""
hyperbole param trique
e
x = x0 + a / cos ( theta ) , y = y0 + b * tan ( theta )
"""
return lambda ( theta ): x0 + a / cos ( theta ) ,
lambda ( theta ): y0 + b * tan ( theta )
149
CHAPITRE 3. PROCEDURES ET FONCTIONS
150
Cyclo paramtrique
de
e
1
2
3
4
5
6
7
def parametric_cycloid ( x0 , y0 , r ):
"""
cyclo de param trique
e
x = x0 + r *( phi - sin ( phi )) , y = y0 + r *(1 - cos ( phi ))
"""
return lambda ( phi ): x0 + r *( phi - sin ( phi )) ,
lambda ( phi ): y0 + r *(1 - cos ( phi ))
Epicyclo paramtrique
de
e
1
2
3
4
5
6
7
8
e
x = x0 + ( R + r )* cos ( theta ) - r * cos ( theta *( R + r )/ r ) ,
x = y0 + ( R + r )* sin ( theta ) - r * sin ( theta *( R + r )/ r )
"""
return lambda ( theta ): x0 + ( R + r )* cos ( theta ) - r * cos ( theta *( R + r )/ r ) ,
lambda ( theta ): y0 + ( R + r )* sin ( theta ) - r * sin ( theta *( R + r )/ r )
Hypercyclo paramtrique
de
e
1
2
3
4
5
6
7
8
def p ar am e tr i c_ hy p er c yc lo i d ( x0 , y0 ,R , r ):
"""
hypercyclo de param trique
e
x = x0 + (R - r )* cos ( theta ) + r * cos ( theta *( R - r )/ r ) ,
x = y0 + (R - r )* sin ( theta ) + r * sin ( theta *( R - r )/ r )
"""
return lambda ( theta ): x0 + (R - r )* cos ( theta ) + r * cos ( theta *( R - r )/ r ) ,
lambda ( theta ): y0 + (R - r )* sin ( theta ) + r * sin ( theta *( R - r )/ r )
3.4. EXERCICES COMPLEMENTAIRES
151
Limaon de Pascal
c
1
2
3
4
5
6
7
8
def pascal_snail ( x0 , y0 ,a , b ):
"""
lima on de Pascal
c
x = x0 + ( a * cos ( theta ) +
y = y0 + ( a * cos ( theta ) +
"""
return lambda ( theta ): x0
lambda ( theta ): y0
b )* cos ( theta )
b )* sin ( theta )
+ ( a * cos ( theta ) + b )* cos ( theta ) ,
+ ( a * cos ( theta ) + b )* sin ( theta )
Spirale logarithmique
1
2
3
4
5
6
7
8
def logarithmic_spiral ( x0 , y0 , k ):
"""
spirale logarithmique
x = x0 + k * exp ( theta )* cos ( theta )
y = y0 + k * exp ( theta )* sin ( theta )
"""
return lambda ( theta ): x0 + k * exp ( theta )* cos ( theta ) ,
lambda ( theta ): y0 + k * exp ( theta )* sin ( theta )
Remarque : Ce procd qui consiste ` passer une fonction lambda en argument dune
e e
a
fonction aurait pu tre utilis dans le cas des fonctions dintgration numrique du
e
e
e
e
TD 3.23 prcdent.
e e
Exemples : >>> f = lambda(x): 3*x + 5
>>> simpson_integration(f,-1.,1.,100)
10.0
>>> g = lambda(x): sin(cos(x))
>>> simpson_integration(g,-pi/2.,pi/2.,10000)
1.7864874819500629
CHAPITRE 3. PROCEDURES ET FONCTIONS
152
3.5
Annexes
3.5.1
Instructions Logo
Logo is the name for a philosophy of education and a continually evolving family of programming languages
that aid in its realization (Harold Abelson, Apple Logo, 1982). This statement sums up two fundamental
aspects of Logo and puts them in the proper order. The Logo programming environments that have been
developed over the past 28 years are rooted in constructivist educational philosophy, and are designed to
support constructive learning. [. . .] Constructivism views knowledge as being created by learners in their
own minds through interaction with other people and the world around them. This theory is most closely
associated with Jean Piaget, the Swiss psychologist, who spent decades studying and documenting the learning
processes of young children.
Logo Foundation : http://el.media.mit.edu/logo-foundation
3.5. ANNEXES
3.5.2
153
Les principales fonctions prdnies en Python sont listes dans les tableaux ci-dessous,
e e
e
extraits du Python 2.5 Quick Reference Guide [10].
Function
abs(x)
all(iterable)
any(iterable)
bool([x])
chr(i)
cmp(x,y)
complex(real[, image])
dict([mapping-or-sequence])
dir([object])
divmod(a,b)
enumerate(iterable)
eval(s[, globals[, locals]])
execfile(file[, globals[,locals]])
filter(function,sequence)
float(x)
globals()
help([object])
hex(x)
id(object)
Result
Returns the absolute value of the number x.
Returns True if bool(x) is True for all values x in the iterable.
Returns True if bool(x) is True for any values x in the iterable.
Converts a value to a Boolean, using the standard truth testing procedure. If x is false or omitted, returns False ; otherwise
returns True.
Returns one-character string whose ASCII code is integer i.
Returns negative, 0, positive if x <, ==, > to y respectively.
Creates a complex object (can also be done using J or j sux,
e.g. 1+3J).
Returns a new dictionary initialized from the optional argument
(or an empty dictionary if no argument). Argument may be a
sequence (or anything iterable) of pairs (key,value).
Without args, returns the list of names in the current local symbol table. With a module, class or class instance object as arg,
returns the list of names in its attr. dictionary.
Returns tuple (a//b, a%b).
Iterator returning pairs (index, value) of iterable, e.g.
List(enumerate(Py)) [(0, P), (1, y)].
Evaluates string s, representing a single python expression, in
(optional) globals, locals contexts.
Example : x = 1 ; assert eval(x + 1) == 2
Executes a file without creating a new module, unlike import.
Constructs a list from those elements of sequence for which
function returns true. function takes one parameter.
Converts a number or a string to oating point.
Returns a dictionary containing the current global variables.
Invokes the built-in help system. No argument interactive
help ; if object is a string (name of a module, function, class,
method, keyword, or documentation topic), a help page is printed on the console ; otherwise a help page on object is generated.
Converts a number x to a hexadecimal string.
Returns a unique integer identier for object.
154
Function
input([prompt])
int(x[, base])
len(obj)
list([seq])
locals()
map(function, sequence)
oct(x)
open(filename[,mode=r,[bufsize]])
ord(c)
range([start,] end [, step])
raw input([prompt])
reload(module)
repr(object)
round(x, n=0)
str(object)
sum(iterable[, start=0])
tuple([seq])
type(obj)
xrange(start [, end [, step]])
Result
Prints prompt if given. Reads input and evaluates it.
Converts a number or a string to a plain integer. Optional base
parameter species base from which to convert string values.
Returns the length (the number of items) of an object (sequence,
dictionary).
Creates an empty list or a list with same elements as seq. seq
may be a sequence, a container that supports iteration, or an
iterator object. If seq is already a list, returns a copy of it.
Returns a dictionary containing current local variables.
Returns a list of the results of applying function to each item
from sequence(s).
Converts a number to an octal string.
Returns a new le object. filename is the le name to be opened.
mode indicates how the le is to be opened (r, w, a,
+, b, U). bufsize is 0 for unbuered, 1 for line buered,
negative or omitted for system default, >1 for a buer of (about)
the given size.
Returns integer ASCII value of c (a string of len 1).
Returns list of ints from >= start and < end. With 1 arg, list
from 0..arg-1. With 2 args, list from start..end-1. With 3
args, list from start up to end by step.
Prints prompt if given, then reads string from std input (no
trailing n).
Re-parses and re-initializes an already imported module.
Returns a string containing a printable and if possible evaluable
representation of an object. object (using backquotes).
Returns the oating point value x rounded to n digits after the
decimal point.
Returns a string containing a nicely printable representation of
an object.
Returns the sum of a sequence of numbers (not strings), plus the
value of parameter. Returns start when the sequence is empty.
Creates an empty tuple or a tuple with same elements as seq.
Returns a type object representing the type of obj.
Like range(), but doesnt actually store entire list all at once.
Good to use in for loops when there is a big range and little
memory.
3.5. ANNEXES
3.5.3
155
Fonctions en Python
Arguments are passed by value, so only arguments representing a mutable object can be
modied (are inout parameters).
Use return to return None from the function, or return value to return a value. Use a
tuple to return more than one value, e.g. return 1,2,3.
Keyword arguments arg=value specify a default value (evaluated at function denition
time). They can only appear last in the param list, e.g. foo(x, y=1, s=).
Pseudo-arg *args captures a tuple of all remaining non-keyword args passed to the function, e.g. if def foo(x, *args) : ... is called foo(1, 2, 3), then args will contain
(2,3).
Pseudo-arg **kwargs captures a dictionary of all extra keyword arguments, e.g. if def
foo(x, **kwargs) : ... is called foo(1, y=2, z=3), then kwargs will contain {y :2,
z :3}. if def foo(x, *args, **kwargs) : ... is called foo(1, 2, 3, y=4, z=5),
then args will contain (2, 3), and kwargs will contain {y :4, z :5}.
args and kwargs are conventional names, but other names may be used as well.
*args and **kwargs can be forwarded (individually or together) to another function,
e.g. def f1(x, *args, **kwargs) : f2(*args, **kwargs).
CHAPITRE 3. PROCEDURES ET FONCTIONS
156
3.5.4
Lutilitaire pydoc
Cette annexe est un extrait du site ociel Python concernant pydoc : http://docs.python.org
/lib/module-pydoc.html. La gure 3.20 ci-contre illustre son utilisation.
Fig. 3.20 : Documentation en Python
pydoc est test ici avec lexemple qui nous a servi de
e
l rouge tout au long de la section 3.2.
$ pydoc fibo
Help on module fibo :
NAME
fibo
FILE
/home/info/S1/cours/fonctions/fibo.py
FUNCTIONS
fibonacci(n)
u = fibonacci(n)
est le nombre de Fibonacci
a
` lordre n si n :int >= 0
>>> fibonacci(0)
1
>>> fibonacci(2)
2
>>> fibonacci(9)
55
Chapitre 4
Structures linaires
e
Sommaire
4.1
4.2
Informatique
S1
4.3
Initiation ` lalgorithmique
a
structures linaires
e
4.4
Jacques TISSEAU
4.5
enib c 2009
4.6
tisseau@enib.fr
enib c 2009
Algorithmique
1/13
,
157
Introduction . . . . . . . . . . . . . . . .
4.1.1 Types de donnes . . . . . . . . .
e
4.1.2 Collections . . . . . . . . . . . . .
Squences . . . . . . . . . . . . . . . . . .
e
4.2.1 N-uplets . . . . . . . . . . . . . .
4.2.2 Cha
nes de caract`res . . . . . .
e
4.2.3 Listes . . . . . . . . . . . . . . . .
4.2.4 Piles et les . . . . . . . . . . . .
4.2.5 Listes multidimensionnelles . . .
Recherche dans une squence . . . . . .
e
4.3.1 Recherche squentielle . . . . . .
e
4.3.2 Recherche dichotomique . . . . .
Tri dune squence . . . . . . . . . . . . .
e
4.4.1 Tri par slection . . . . . . . . . .
e
4.4.2 Tri par insertion . . . . . . . . .
4.4.3 Tri rapide . . . . . . . . . . . . . .
Exercices complmentaires . . . . . . . .
e
4.5.1 Conna
tre . . . . . . . . . . . . . .
4.5.2 Comprendre . . . . . . . . . . . .
4.5.3 Appliquer . . . . . . . . . . . . . .
4.5.4 Analyser . . . . . . . . . . . . . .
4.5.5 Evaluer . . . . . . . . . . . . . . .
4.5.6 Solutions des exercices . . . . . .
Annexes . . . . . . . . . . . . . . . . . . .
4.6.1 Type abstrait de donnes . . . .
e
4.6.2 Codes ASCII . . . . . . . . . . . .
4.6.3 Les squences en Python . . . .
e
4.6.4 Les chiers en Python . . . . . .
4.6.5 Mthode dlimination de Gauss
e
e
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
158
158
160
162
163
164
165
167
168
170
171
172
173
174
175
177
180
180
182
183
184
184
185
193
193
194
194
198
199
CHAPITRE 4. STRUCTURES LINEAIRES
158
4.1
Introduction
Un algorithme est une suite ordonne dinstructions qui indique la dmarche ` suivre pour
e
e
a
rsoudre une srie de probl`mes quivalents. Les deux chapitres prcdents concernaient la struce
e
e
e
e e
turation des algorithmes, soit en contrlant le ux dinstructions ` laide dinstructions de base
o
a
appropries (chapitre 2), soit en factorisant des squences dinstructions au sein de fonctions et
e
e
procdures (chapitre 3). Par contre, ils ne sintressaient pas explicitement aux donnes manie
e
e
pules par ces algorithmes. Ce sera lobjet de ce chapitre daborder la structuration des donnes
e
e
manipules par les algorithmes.
e
Exemple 4.1 : Distance entre 2 points du plan
Soient deux points du plan M1 et M2 respectivement de coordonnes (x1 , y1 ) et (x2 , y2 ). La
e
distance d entre ces 2 points est classiquement calcule par d = (x2 x1 )2 + (y2 y1 )2 dont
e
on dduit limplmentation informatique suivante :
e
e
def distance(x1,y1,x2,y2) :
return sqrt((x2-x1)**2 + (y2-y1)**2)
>>> distance(0,0,1,1)
1.4142135623730951
4.1.1
Types de donnes
e
En informatique, une donne est la reprsentation dune information sous une forme convene
e
tionnelle adapte ` son exploitation. Une variable est alors un objet informatique qui associe
e a
un nom ` cette reprsentation (section 2.2.1 page 42) et qui, selon les langages, est implicitea
e
ment ou explicitement type. On distingue classiquement les types de base comme les boolens
e
e
4.1. INTRODUCTION
159
(type bool, {False,True}), les entiers (type int, en fait un sous-ensemble des nombres
relatifs Z) et les rels (type float, en fait un sous-ensemble des nombres rationnels Q) des
e
types structurs qui sont des regroupements de types tels que les listes (type list, exemple :
e
[0,3.14,[4,True]]), les n-uplets (type tuple, exemple : (0,3.14,[4,(True,8)]) ou les dictionnaires (type dict, exemple : {a : [1,2,3], b : 5}).
CHAPITRE 4. STRUCTURES LINEAIRES
160
4.1.2
Collections
prdcesseur
successeur
A linverse du tas de chaussures, les collections informatiques seront structures pour faciliter
e
et optimiser la recherche dun lment en leur sein. Les lments peuvent tre de dirents types,
ee
ee
e
e
mais les oprations que lon eectue sur les collections doivent tre indpendantes des types de
e
e
e
donnes des lments.
e
ee
On distingue classiquement 3 grands types de collections : les squences, les arbres et les
e
graphes.
4.1. INTRODUCTION
161
les n-uplets (type tuple, exemples : (), (1,2,3), (a,2,(1,2,3))) et les listes (type list,
exemples : [], [a,b,c,d,e], [1,e,(1,2,[x,y])]).
Dnition 4.4 : arbre
e
Un arbre est une collection dlments, appels nuds , organiss de faon hirarchique `
ee
e
e
c
e
a
partir dun nud particulier, appel la racine de larbre.
e
prdcesseur
Dans un arbre (gure 4.4), chaque lment a un seul prdecesseur (sauf la racine de larbre
ee
e
qui na pas de prdecesseur) et peut avoir plusieurs successeurs (on appelle feuille de larbre
e
un nud qui na pas de successeurs). Larbre est dit n-aire si chaque nud a au plus n
successeurs ; si n = 2, on parle darbre binaire. Les rpertoires dun syst`me dexploitation en
e
e
informatique, la classication des esp`ces animales en biologie ou le tableau nal dun tournoi
e
de tennis constituent des exemples connus de structures arborescentes.
Exemple 4.3 : Tableau final dun tournoi de football
Dans lexemple de la gure 4.5 ci-contre, les nuds de larbre sont les rencontres (exemples :
le quart de nale Portugal/Turquie, la demi-nale Pays-Bas/Italie). Il sagit dun arbre binaire
dont la racine est la nale France/Italie. Les quarts de nale sont les feuilles de cet arbre binaire.
successeurs
En Python, les ensembles (type set) et les dictionnaires (type dict) sont implments sous
e
e
forme darbres.
Dnition 4.5 : graphe
e
Un graphe est une collection dlments, appels sommets , et de relations entre ces sommets.
ee
e
Dans un graphe (gure 4.6), chaque lment peut avoir plusieurs prdcesseurs et plusieurs
ee
e e
successeurs. Un mme lment peut tre ` la fois prdcesseur et successeur dun autre sommet
e
ee
e
a
e e
(y compris de lui-mme). On parle de graphe orient lorsque les relations entre sommets sont
e
e
des paires ordonnes de sommets (les relations sont alors appeles arcs du graphe) ; on parle
e
e
de graphe non orient si ce sont des paires non orientes (les relations sont alors appeles
e
e
e
artes du graphe). Un graphe est facilement reprsentable par un schma (gure 4.7) o` les
e
e
e
u
sommets sont des points et les arcs, des `ches entre deux points (ou les artes, des traits entre
e
e
deux points). Un circuit lectronique, une toile daraigne ou internet sont des exemples de tels
e
e
graphes.
Les graphes permettent de manipuler plus facilement des objets et leurs relations. Lensemble
des techniques et outils mathmatiques mis au point en Thorie des Graphes permettent
e
e
prdcesseurs
a
successeurs
CHAPITRE 4. STRUCTURES LINEAIRES
162
de dmontrer certaines proprits des graphes, den dduire des mthodes de rsolution, des
e
ee
e
e
e
algorithmes. . .
`
Exemple 4.4 : Carte routiere
Dans la carte routi`re de la gure 4.8, les villes sont les sommets dun graphe non orient dont
e
e
les artes sont les routes qui m`nent dune ville ` lautre. Sur un tel graphe, on peut se poser
e
e
a
des questions telles que :
Quel est le plus court chemin (en distance ou en temps) pour se rendre dune ville ` une
a
autre ?
Comment optimiser le circuit dun voyageur de commerce de telle mani`re quil passe une
e
et une seule fois par toutes les villes de son secteur ?
Dans ce chapitre, nous ne nous intresserons quaux structures linaires : les squences. Les
e
e
e
structures arborescentes et les graphes seront abords ` partir du semestre 4 dans les cours
e a
dinformatique de lENIB.
4.2
Squences
e
Comme en Python, nous distinguerons ici les n-uplets (type tuple), les cha
nes de caract`res
e
(type str) et les listes (type list) comme autant de variantes de squences. Quelle que soit
e
la variante considre, il sera toujours possible de dterminer le type (type(s)) et la longueur
ee
e
(len(s)) dune squence s, de tester lappartenance dun lment x ` la squence s (x in s),
e
ee
a
e
daccder ` un lment par son rang i dans la squence (s[i]) et de concatner 2 squences s1
e
a
ee
e
e
e
et s2 (s1 + s2).
>>> s = 1,7,2,4
>>> type(s)
<type tuple>
>>> len(s)
4
>>> 3 in s
False
>>> s[1]
7
>>> s + (5,3)
(1, 7, 2, 4, 5, 3)
>>> s = 1724
>>> type(s)
<type str>
>>> len(s)
4
>>> 3 in s
False
>>> s[1]
7
>>> s + 53
172453
>>> s = [1,7,2,4]
>>> type(s)
<type list>
>>> len(s)
4
>>> 3 in s
False
>>> s[1]
7
>>> s + [5,3]
[1, 7, 2, 4, 5, 3]
Les variantes tuple, str et list di`rent par leur syntaxe et par le fait quune liste est
e
4.2. SEQUENCES
163
4.2.1
>>> s = 1724
>>> type(s)
<type str>
>>> s[1] = 3
Traceback ...
TypeError : str object
does not support item
assignment
>>> s[1]
7
>>> s = [1,7,2,4]
>>> type(s)
<type list>
>>> s[1] = 3
>>> s
[1, 3, 2, 4]
>>> s[1]
3
Remarque 4.3 : Attention ! Par convention, les indices des lments dans une squence commencent ` 0.
ee
e
a
Le premier lment a pour indice 0 (s[0]), le deuxi`me
ee
e
lindice 1 (s[1]), le troisi`me lindice 2 (s[2]) et ainsi de
e
suite jusquau dernier qui a lindice n-1 (s[n-1]) si n est
le nombre dlments dans la squence (n == len(s)).
ee
e
Remarque 4.4 : La section 4.6.3 page 194 prsente les
e
principales oprations sur les squences en Python.
e
e
N-uplets
>>> s = (5)
>>> type(s)
<type int>
>>> s = (5,)
>>> type(s)
<type tuple>
>>> s = (5,)+()+(6,7,9)
>>> s
(5, 6, 7, 9)
>>>
>>>
(6,
>>>
(6,
>>>
(5,
>>>
(7,
s = (5,6,7,9)
s[1:3]
7)
s[1:]
7, 9)
s[:2]
6)
s[-2:]
9)
TD4.2
Les n-uplets sont souvent utiliss pour regrouper sous une mme variable plusieurs vae
e
riables logiquement relies entre elles comme dans lexemple des points du plan de lexemple
e
4.1 page 158. Ils servent galement ` retourner plusieurs objets dans une fonction comme dans
e
a
CHAPITRE 4. STRUCTURES LINEAIRES
164
les exemples de la fonction standard divmod de la section 3.5.2 page 153 ou encore des dnitions
e
de courbes paramtriques du TD 3.24 page 136.
e
TD4.3
4.2.2
Cha
nes de caract`res
e
`
Dnition 4.7 : cha de caracteres
e
ne
Une cha de caract`res est une squence non modiable de caract`res.
ne
e
e
e
Remarque 4.5 : Lordinateur stocke toutes les
donnes sous forme numrique (ensemble de bits). En
e
e
particulier, les caract`res ont un quivalent numrique :
e
e
e
le code ASCII (American Standard Code for Information
Interchange). Le code ASCII de base code les caract`res
e
sur 7 bits (128 caract`res : de 0 ` 127, voir section 4.6.2
e
a
page 194).
En Python, les fonctions standard ord et chr permettent
de passer du caract`re au code ASCII et inversement.
e
>>> chr(101)
>>> ord(e)
e
101
>>> chr(233)
>>> ord()
e
e
233
Dun point de vue syntaxique, une cha de caract`res est une suite quelconque de caract`res
ne
e
e
dlimite soit par des apostrophes (simple quotes : ...), soit par des guillemets (double quotes :
e
e
"..."). On peut ainsi utiliser des guillemets pour dlimiter une cha dans laquelle il y a des
e
ne
apostrophes (exemple : "cest a !"), ou utiliser des apostrophes pour dlimiter une cha qui
c
e
ne
contient des guillemets (exemple : "hello" dit-il.). Pour sa part, le caract`re antislash (\)
e
permet dcrire sur plusieurs lignes une cha qui serait trop longue pour tenir sur une seule
e
ne
ou bien dinsrer, ` lintrieur dune cha
e
a
e
ne, un certain nombre de caract`res spciaux comme
e
e
les sauts ` la ligne (\n), les apostrophes (\), les guillemets (\"). . . En Python, pour insrer
a
e
plus aisment des caract`res spciaux dans une cha
e
e
e
ne, sans faire usage de lantislash, ou pour
faire accepter lantislash lui-mme dans la cha on peut dlimiter la cha ` laide de triples
e
ne,
e
ne a
apostrophes (...) ou de triples guillemets ("""...""").
>>> s = cha^ne entre sur \
e
... plusieurs lignes
>>> s
cha^ne entre sur plusieurs lignes
e
>>> s = cha^ne entre \n sur 1 ligne
e
>>> print(s)
cha^ne entre
e
sur 1 ligne
On acc`de aux caract`res individuels dune cha de caract`res par leur rang dans la cha
e
e
ne
e
ne,
un caract`re individuel tant vu lui-mme comme une cha ` un seul caract`re.
e
e
e
ne a
e
>>>
>>>
t
>>>
...
d e
s = des caract`res
e
s[9]
for c in s : print(c),
s
c a r a c t ` r e s
e
>>> s[4:9]
carac
>>> s[len(s)-1]
s
>>> s[:4] + mo + s[9] + s[-1]
des mots
TD4.5
4.2. SEQUENCES
165
Les cha
nes de caract`res, et leurs oprations associes, sont videmment tr`s utiles pour
e
e
e
e
e
manipuler du texte comme peut le faire un traitement de textes par exemple.
TD4.6
4.2.3
Listes
s = [1,3,5,7]
s[2]
s[len(s)-1]
for c in s : print(c),
5 7
>>> s[1:3]
[3,5]
>>> s[1:3] = [2,4]
>>> s
[1, 2, 4, 7]
>>> s[len(s):len(s)] = [8,9]
>>> s
[1, 2, 4, 7, 8, 9]
Pour crer une liste, on peut explicitement le faire ` la main, comme ci-dessus avec linstruce
a
tion s = [1,3,5,7], mais ce nest raisonnable que pour de petites listes. On peut galement
e
utiliser la fonction prdnie range pour gn`rer une liste dentiers successifs (voir section 2.4.2
e e
e e
page 56). Si range est appele avec un seul argument, la liste contiendra un nombre de valeurs
e
gal ` largument fourni, en commenant ` partir de 0 (range(n) gn`re les nombres de 0 ` n-1 :
e
a
c
a
e e
a
[0,1,2,...,n-1]). On peut aussi utiliser range avec 2 ou 3 arguments : range(debut,fin,pas),
debut et pas tant optionnels. Largument debut est la premi`re valeur ` gnrer (debut = 0
e
e
a e e
par dfaut), largument pas est lincrment (pas = +1 par dfaut) qui permet de passer dune
e
e
e
valeur ` la suivante ([debut, debut + pas, debut + 2*pas,...]) et largument obligatoire
a
fin est la borne maximale (valeur fin exclue) des nombres ` gnrer.
a e e
range(5)
1, 2, 3, 4]
range(2,5)
3, 4]
>>>
[0,
>>>
[5,
TD4.7
>>>
[0,
>>>
[2,
`
TD 4.6 : Caracteres, mots, lignes dune cha
ne
Dnir une fonction qui compte le nombre de caract`res,
e
e
le nombre de mots et le nombres de lignes dune cha
ne
de caract`res.
e
range(0,5,2)
2, 4]
range(5,0,-2)
3, 1]
La fonction range est frquemment utilise dans les boucles pour rpter un nombre de fois
e
e
e e
CHAPITRE 4. STRUCTURES LINEAIRES
166
et
et
et
et
et
et
s[i:j] = []
s[len(s):len(s)] = [x]
s[len(s):len(s)]= x
s[i:i] = [x]
del s[s.index(x)]
x = s[i] ; del s[i] ; return x
TD 4.9 : Selection delements
1. Dnir une fonction qui cre une liste t compose
e
e
e
des lments dune autre liste s qui vrient une
ee
e
certaine condition p (p(s[i]) == True).
2. Dnir une fonction qui supprime dune liste s les
e
lments qui ne vrient pas une certaine condiee
e
tion p.
connu ` lavance les instructions de la boucle. Mais dune mani`re plus gnrale, on utilisera les
a
e
e e
fonctions dajout (append) ou dinsertion (insert) dlments pour crer de nouvelles listes par
ee
e
programme.
On dispose en eet pour les listes des oprations prconises pour les collections (section
e
e
e
4.1.2 page 160) et que lon retrouve dans le tableau de la page 195 :
dterminer le nombre dlments de la liste s,
e
ee
len(s)
tester lappartenance dun lment x ` la liste s,
ee
a
x in s
ajouter un lment x ` la liste s,
ee
a
s.append(x)
et plus gnralement insrer un lment x au rang i dans la liste s,
e e
e
ee
s.insert(i,x)
supprimer llment de rang i de la liste s.
ee
del(s[i])
TD4.8
>>>
>>>
[2,
>>>
[1,
s.reverse()
s
1, 1, 2, 1]
s.sort()
1, 1, 2, 2]
Comme nous lavons dj` voqu ` loccasion du passage des param`tres par rfrence lors
eae
ea
e
ee
de lappel dune fonction (section 3.3.1 page 115), le nom du liste est en fait une rfrence sur
ee
cette liste. Ainsi, si s est une liste, linstruction t = s ne fait que copier la rfrence de la liste
ee
et non la liste elle-mme : t devient un alias de s et toute modication dun lment de t (ou
e
ee
de s) modie galement s (ou t). Pour copier la liste, il faudra dune mani`re ou dune autre
e
e
copier les lments un par un, comme ci-dessous ` droite par exemple.
ee
a
>>>
>>>
>>>
>>>
[9,
>>>
[9,
s = [1,2,3]
t = s
t[0] = 9
t
2, 3]
s
2, 3]
>>>
>>>
>>>
>>>
[1,
>>>
>>>
[9,
>>>
[1,
s = [1,2,3]
t = []
t[:0] = s[0:]
t
2, 3]
t[0] = 9
t
2, 3]
s
2, 3]
4.2. SEQUENCES
4.2.4
167
Piles et les
Dans de nombreux cas, les seules oprations ` eectuer sur les listes sont des insertions et
e
a
des suppressions aux extrmits de la liste. Cest le cas en particulier des piles (stack) et des
e
e
les (queue).
Exemple 4.5 : Pile dassiettes
Dans une pile dassiettes (gure 4.11), on ajoute des assiettes au sommet de la pile, et on les
rcup`re dans lordre inverse, en commenant par la derni`re ajoute.
e
e
c
e
e
Dans le cas des piles, on ajoute (on empile) et on supprime (on dpile) ` une seule extrmit.
e
a
e e
Une pile est ainsi base sur le principe dernier arriv, premier sorti (Lifo : Last In, First
e
e
Out) : le dernier lment ajout au sommet de la pile sera le premier ` tre rcupr. Les seules
ee
e
ae
e
ee
oprations ncessaires pour une pile sont ainsi :
e
e
tester si la pile p est vide,
ok = emptyStack(p)
accder au sommet x de la pile p,
e
x = topStack(p)
empiler un lment x au sommet de la pile p,
ee
pushStack(p,x)
dpiler llment x qui se trouve au sommet de la pile p.
e
ee
x = popStack(p)
TD4.10
CHAPITRE 4. STRUCTURES LINEAIRES
168
ok = emptyQueue(f)
x = topQueue(f)
pushQueue(f,x)
x = popQueue(f)
TD4.11
4.2.5
Listes multidimensionnelles
Un autre cas particulier de liste est celui o` les lments dune liste sont eux-mmes des listes.
u
ee
e
On parle alors de listes de listes (ou de tableaux de tableaux) ou de listes multidimensionnelles
(ou de tableaux multidimensionnels). Un damier, une image numrique ou encore une matrice
e
(gure 4.13) sont des exemples de tableaux bidimensionnels.
Dans lexemple ci-dessous, la liste s est compos de 3 listes (len(s) == 3) de longueurs
e
direntes. Un premier niveau de crochets donne acc`s ` un lment de la liste s (comme s[2]
e
e a
ee
par exemple) : cet lment est lui-mme une liste (la liste [6,7,8,9]) ; un deuxi`me niveau de
ee
e
e
crochets donne acc`s ` un lment de cette liste (comme s[2][1] par exemple). Dune mani`re
e a
ee
e
gnrale, il faudra autant de niveaux de crochets que de listes imbriques pour accder aux
e e
e
e
lments individuels.
ee
>>> s = [[4,5],[1,2,3],[6,7,8,9]]
>>> type(s)
<type list>
>>> len(s)
3
>>> type(s[2])
<type list>
>>>
[6,
>>>
7
>>>
3
s[2]
7, 8, 9]
s[2][1]
s[1][2]
4.2. SEQUENCES
169
accder aux lignes les unes apr`s les autres, la deuxi`me pour accder aux lments individuels
e
e
e
e
ee
de chaque ligne.
>>>
>>>
...
[4,
[1,
[6,
s = [[4,5],[1,2,3],[6,7,8,9]]
for c in s : print(c)
5]
2, 3]
7, 8, 9]
>>>
[6,
>>>
...
...
...
4 5
1 2
6 7
s[2]
7, 8, 9]
for c in s :
for e in c : print(e,end= )
print()
3
8 9
Dune mani`re gnrale, il faudra autant de boucles imbriques quil y a de listes imbriques
e
e e
e
e
pour parcourir lensemble des lments individuels.
ee
>>> s = [[[4,5],[1,2,3]], [[0],[10,11],[6,7,8,9]]]
>>> len(s)
2
>>> len(s[1])
3
>>> len(s[1][2])
4
>>> s[1][2][2]
8
>>> for c in s : print(c)
...
[[4, 5], [1, 2, 3]]
[[0], [10, 11], [6, 7, 8, 9]]
>>> for c in s :
...
for e in c : print(e),
...
print()
...
[4, 5] [1, 2, 3]
[0] [10, 11] [6, 7, 8, 9]
>>> for c in s :
...
for e in c :
...
for x in e :
print(x,end= )
...
print()
...
4 5 1 2 3
0 10 11 6 7 8 9
a00
a01
a0(m2)
a0(m1)
a10
a11
a1(m2)
a1(m1)
A = (aij ) =
a(n1)0 a(n1)1 a(n1)(m2) a(n1)(m1)
La matrice est dite carre quand n = m et symtrique quand i, j aij = aji .
e
e
Remarque 4.7 : Les n lignes dune matrice de dimensions (n, m) ont toutes la mme longueur m contrairee
ment au cas plus gnral des listes multidimensionnelles
e e
qui peuvent avoir des lignes de direntes longueurs.
e
CHAPITRE 4. STRUCTURES LINEAIRES
170
>>> n
2
>>> m
3
k=0
>>> a = [[1,2,3],[4,5,6]]
>>> b = [[-1,-2,-3],[-1,-2,-3]]
>>> additionMatrice(a,b)
[[0, 0, 0], [3, 3, 3]]
>>> additionMatrice(a,a)
[[2, 4, 6], [8, 10, 12]]
A
TD4.12
Les matrices sont utilises pour de multiples applications et servent notamment ` reprsenter
e
a
e
les coecients des syst`mes dquations linaires (voir TD 4.29 page 184 et annexe 4.6.5 page
e
e
e
199).
4.3
Remarque 4.8 : Lopration de recherche est tellee
ment importante quelle est aujourdhui toujours disponible dans les syst`mes dexploitation et dans les langages
e
de programmation. En Python, la mthode index eece
tue cette recherche pour les cha
nes et pour les listes. Il
est donc rarement ncessaire de la rdnir soi-mme ;
e
e e
e
nous le faisons ici pour des raisons pdagogiques.
e
En informatique, une des oprations essentielles est de retrouver une information stocke en
e
e
mmoire vive, sur un disque dur ou quelque part sur le rseau. Il sut pour sen convaincre
e
e
de penser au nombre de fois dans la journe o` lon recherche un numro de tlphone sur son
e u
e
ee
portable ou une information quelconque sur internet ` laide dun moteur de recherche.
a
Nous nous intresserons ici ` 2 mthodes de recherche dun lment dans une liste : la
e
a
e
ee
recherche squentielle et la recherche dichotomique.
e
4.3. RECHERCHE DANS UNE SEQUENCE
4.3.1
171
Recherche squentielle
e
La recherche squentielle dun lment x dans une liste t consiste ` comparer llment
e
ee
a
ee
recherch x successivement ` tous les lments de la liste t jusqu` trouver une correspondance.
e
a
ee
a
Autrement dit, on compare llment recherch x au premier lment de la liste t. Sils sont
ee
e
ee
identiques, on a trouv le rang de la premi`re occurence de x dans t ; sinon, on recommence la
e
e
recherche ` partir du deuxi`me lment. Et ainsi de suite. . . On en dduit la version rcursive
a
e
ee
e
e
ci-dessous gnralise ` une recherche entre deux rangs debut et fin de la liste t. Dans cette
e e
e a
version, nous avons choisi de retourner un couple de valeurs (ok,r) : ok est un boolen qui
e
teste si la recherche est fructueuse ou non et r est le rang de la premi`re occurence de llment
e
ee
recherch sil a eectivement t trouv.
e
ee
e
def recherche(t,x,debut,fin):
ok,r = False,debut
if r > fin: ok = False
else:
if t[r] == x: ok = True
else: ok,r = recherche(t,x,r+1,fin)
return ok,r
>>> s = [1,3,5,6,5,2]
>>> recherche(s,5,0,len(s)-1)
(True, 2)
>>> recherche(s,5,3,len(s)-1)
(True, 4)
>>> recherche(s,4,0,len(s)-1)
(False, 6)
TD4.13
La version itrative quivalente est donne ci-dessous en prcisant les prconditions dutilie
e
e
e
e
sation de lalgorithme.
Recherche squentielle
e
1
2
3
4
5
6
7
8
TD 4.13 : Annuaire telephonique
On consid`re un annuaire tlphonique stock sous la
e
ee
e
forme dune liste de couples (nom,tlphone) (exemple :
e e
[(jean,0607080910),(paul,0298000102)]).
1. Dnir une fonction qui retrouve dans un ane
nuaire tlphonique le numro de tlphone ` paree
e
ee
a
tir du nom.
2. Dnir la fonction inverse qui retrouve le nom `
e
a
partir du numro de tlphone.
e
ee
CHAPITRE 4. STRUCTURES LINEAIRES
172
Type de complexit
e
complexit constante
e
complexit logarithmique
e
complexit linaire
e
e
complexit quasi-linaire
e
e
complexit quadratique
e
complexit cubique
e
complexit polynomiale
e
complexit quasi-polynomiale
e
complexit exponentielle
e
complexit factorielle
e
au pire gale ` n, au mieux gale ` 1. En moyenne, on peut dmontrer (voir [9] ou [12]) quelle
e
a
e
a
e
vaut (1 q) n + (n + 1) q/2 si q est la probabilit que x soit dans t, quelle que soit sa position
e
dans la liste (toutes les places sont quiprobables). On retrouve bien c = n si q = 0. On a
e
galement c = (n + 1)/2 si q = 1 et c = (3n + 1)/4 si q = 1/2. Dans tous les cas, lordre de
e
grandeur de la complexit de la recherche squentielle est n, le nombre dlments dans la liste :
e
e
ee
on parle alors de complexit linaire, note O(n). Il sagit dune recherche linaire en fonction
e e
e
e
du nombre dlments dans la liste : si le nombre dlments est multipli par 100, le complexit
ee
ee
e
e
sera multiplie par 100 en moyenne, et donc le temps dexcution de la recherche galement.
e
e
e
4.3.2
Recherche dichotomique
Dans certains cas, la recherche dun lment x seectue dans une liste t trie. La mthode
ee
e
e
qui suit, dite recherche par dichotomie ou recherche dichotomique, utilise pleinement le fait que
les lments de la liste sont tris.
ee
e
Le principe de la recherche dichotomique consiste ` comparer x avec llment t[m] du milieu
a
ee
de la liste t :
si x == t[m], on a trouv une solution et la recherche sarrte ;
e
e
si x < t[m], x ne peut se trouver que dans la moiti gauche de la liste t puisque celle-ci est
e
trie par ordre croissant ; on poursuit alors la recherche de la mme mani`re uniquement
e
e
e
dans la moiti gauche de la liste ;
e
si x > t[m], x ne peut se trouver que dans la moiti droite de la liste t ; on poursuit alors
e
la recherche uniquement dans la moiti droite de la liste.
e
A chaque fois, on poursuit donc la recherche en diminuant de moiti le nombre dlments restant
e
ee
a
` traiter. En suivant ce principe de recherche, on est naturellement amen ` crire une version
eae
rcursive de lalgorithme de recherche dichotomique.
e
def dichotomie(t,x,gauche,droite):
ok, m = False, (gauche + droite)/2
if gauche > droite: ok = False
else:
if t[m] == x: ok = True
elif t[m] > x:
ok,m = dichotomie(t,x,gauche,m-1)
else:
ok,m = dichotomie(t,x,m+1,droite)
return ok,m
>>> s = [1,3,5,6,6,9]
>>> dichotomie(s,6,0,len(s)-1)
(True, 4)
>>> dichotomie(s,6,2,len(s)-1)
(True, 3)
>>> dichotomie(s,4,0,len(s)-1)
(False, 1)
TD4.14
4.4. TRI DUNE SEQUENCE
173
La version itrative quivalente est donne ci-dessous en prcisant les prconditions dutilie
e
e
e
e
sation de lalgorithme.
Recherche dichotomique
1
2
3
4
5
6
7
8
9
10
4.4
Pour retrouver une information, il est souvent plus ecace que les donnes soient pralae
e
blement tries : cest ce que nous avons constat avec la recherche par dichotomie de la section
e
e
prcdente. L` encore, pour sen convaincre, il sut de penser ` la recherche dun mot dans un
e e
a
a
dictionnaire ou dun nom dans un bottin.
Dans la suite, nous supposerons quil existe une relation dordre total, entre les lments
ee
de la liste, note et qui vrie les proprits habituelles de rexivit, dantisymtrie et de
e
e
ee
e
e
e
transitivit :
e
1. rexivit : x x
e
e
2. antisymtrie : (x y) and (y x) x = y
e
3. transitivit : (x y) and (y z) (x z)
e
La fonction rcursive enOrdre ci-dessous teste si la liste t est trie par ordre croissant de
e
e
ses lments entre les rangs debut et fin, en utilisant la relation dordre <= (t[debut] <=
ee
t[debut+1]).
CHAPITRE 4. STRUCTURES LINEAIRES
174
def enOrdre(t,debut,fin):
assert type(t) is list
assert 0 <= debut <= fin < len(t)
ok = False
if debut == fin: ok = True
else:
if t[debut] <= t[debut+1]:
ok = enOrdre(t,debut+1,fin)
return ok
TD4.15
Nous nous intresserons ici ` 3 mthodes de tri dune liste : le tri par slection, le tri par
e
a
e
e
insertion et le tri rapide.
4.4.1
Tri de la liste
[6,4,1,3,5,2] :
en gras, les valeurs
changes ` chaque
e
e
a
tape.
e
TD 4.16 : Tri dun annuaire telephonique
On consid`re un annuaire tlphonique stock sous la
e
ee
e
forme dune liste de couples (nom,tlphone) (exemple :
e e
[(paul,0607080910),(jean,0298000102)]).
Dnir une fonction qui trie un annuaire tlphonique
e
ee
par ordre alphabtique des noms.
e
>>> s = [3,1,2,3,1]
>>> enOrdre(s,0,len(s)-1)
False
>>> enOrdre(s,1,3)
True
>>> enOrdre(s,1,4)
False
Le tri par slection dune liste consiste ` rechercher le minimum de la liste ` trier, de le
e
a
a
mettre en dbut de liste en lchangeant avec le premier lment et de recommencer sur le reste
e
e
ee
de la liste (gure 4.16). La version rcursive ci-dessous trie la liste t par ordre croissant entre
e
les rangs debut et fin ; elle fait appel ` la fonction minimum qui retourne le rang du plus petit
a
lment de la squence t entre les rangs debut et fin.
ee
e
def triSelection(t,debut,fin):
assert type(t) is list
assert 0 <= debut <= fin < len(t)
if debut < fin:
mini = minimum(t,debut,fin)
t[debut],t[mini] = t[mini],t[debut]
triSelection(t,debut+1,fin)
return
def minimum(t,debut,fin):
assert type(t) is list
assert 0 <= debut <= fin < len(t)
mini = debut
for j in range(debut+1,fin+1):
if t[j] < t[mini]: mini = j
return mini
>>>
>>>
>>>
[0,
>>>
>>>
5
>>>
0
>>>
3
s = [5,4,3,2,1,0]
triSelection(s,0,len(s)-1)
s
1, 2, 3, 4, 5]
s = [5,4,3,2,1,0]
minimum(s,0,len(s)-1)
s[minimum(s,0,len(s)-1)]
s[minimum(s,0,2)]
TD4.16
4.4. TRI DUNE SEQUENCE
175
Tri par slection
e
1
2
3
4
5
6
7
8
4.4.2
`
Dans le tri par insertion, on trie successivement les premiers lments de la liste : ` la ieme
ee
a
eme lment ` son rang parmi les i 1 lments prcdents qui sont dj` tris
`
tape, on ins`re le i
e
e
ee
a
ee
e e
ea e
entre eux. Dans la version rcursive de la fonction triInsertion, on ins`re llment t[fin]
e
e
ee
dans la liste des lments prcdents dj` trie de debut ` (fin - 1).
ee
e e
ea e
a
def triInsertion(t,debut,fin):
assert type(t) is list
assert 0 <= debut <= fin < len(t)
if fin > debut:
triInsertion(t,debut,fin-1)
i = fin - 1
x = t[fin]
while i >= debut and t[i] > x:
t[i+1] = t[i]
i = i - 1
t[i+1] = x
return
>>>
>>>
>>>
[4,
>>>
>>>
>>>
[9,
s = [9,8,7,6,5,4]
triInsertion(s,0,len(s)-1)
s
5, 6, 7, 8, 9]
s = [9,8,7,6,5,4]
triInsertion(s,1,4)
s
5, 6, 7, 8, 4]
La procdure prcdente nest pas rcursive terminale et on ne peut donc pas utiliser la
e
e e
e
mthode de la section 3.3.4 page 127 pour la transformer en procdure itrative. Considrons
e
e
e
e
alors une procdure rcursive non terminale du type :
e
e
Tri de la liste
[6,4,1,3,5,2] :
en gras, les valeurs
insres dans la pare e
tie gauche ` chaque
a
tape.
e
CHAPITRE 4. STRUCTURES LINEAIRES
176
def f(x):
instruction_1
f(g(x))
instruction_2
return
O(n2 )
4.4. TRI DUNE SEQUENCE
4.4.3
177
Tri rapide
Les complexits des tris par slection et par insertion sont, soit en nombre dchanges de
e
e
e
valeurs, soit en nombre de comparaisons entre lments, quadratiques en O(n2 ). La mthode de
ee
e
tri rapide (quicksort) prsente ici a une complexit quasi-linaire en O(n log(n)).
e
e
e
e
Le principe du tri rapide est le suivant : on partage la liste ` trier en deux sous-listes telles que
a
tous les lments de la premi`re soient infrieurs ` tous les lments de la seconde. Pour partager
ee
e
e
a
ee
la liste en deux sous-listes, on choisit un des lments de la liste (par exemple le premier) comme
ee
pivot. On construit alors une sous-liste avec tous les lments infrieurs ou gaux ` ce pivot et
ee
e
e
a
une sous-liste avec tous les lments suprieurs au pivot (gure 4.17). On trie les deux sous-listes
ee
e
selon le mme processus jusqu` avoir des sous-listes rduites ` un seul lment (gure 4.18).
e
a
e
a
ee
def triRapide(t,debut,fin):
assert type(t) is list
assert 0 <= debut
assert fin <= len(t)
if debut < fin:
pivot = t[debut]
place = partition(t,debut,fin,pivot)
triRapide(t,debut,place-1)
triRapide(t,place+1,fin)
return
>>>
>>>
>>>
[4,
>>>
>>>
>>>
[9,
s = [9,8,7,6,5,4]
triRapide(s,0,len(s)-1)
s
5, 6, 7, 8, 9]
s = [9,8,7,6,5,4]
triRapide(s,1,4)
s
5, 6, 7, 8, 4]
def partition(t,debut,fin,pivot):
p,inf,sup = debut,debut,fin;
while p <= sup:
if t[p] == pivot:
p = p + 1
elif t[p] < pivot:
t[inf],t[p] = t[p],t[inf]
inf = inf + 1
p = p + 1
else:
t[sup],t[p] = t[p],t[sup]
sup = sup - 1
if p > 0: p = p - 1
return p
>>> s = [3,5,2,6,1,4]
>>> partition(s,0,len(s)-1,s[0]), s
(2, [1, 2, 3, 6, 5, 4])
Pour partitionner la liste, on a utilis 2 compteurs inf et sup qui partent des 2 extrmits de la
e
e
e
liste en voluant lun vers lautre. Le compteur de gauche inf part du dbut de la liste et lorsquil
e
e
atteint un lment suprieur au pivot, on arrte sa progression. De mme, le compteur de droite
ee
e
e
e
sup part de la n de la liste et sarrte lorsquil atteint un lment infrieur au pivot. On change
e
ee
e
e
alors ces deux lments (t[sup],t[inf] = t[inf],t[sup]) puis on continue ` faire progresser
ee
a
les compteurs et ` faire des changes jusqu` ce que les compteurs se croisent.
a
e
a
Ainsi, le tri rapide correspond au schma rcursif suivant :
e
e
pivot
ti > pivot
Tri de la liste
[6,4,1,3,5,2] :
en gras, les valeurs
des pivots ` chaque
a
tape.
e
CHAPITRE 4. STRUCTURES LINEAIRES
178
def f(x):
if cond:
instructions
f(g(x))
f(h(x))
return
`
On peut supprimer le 2eme appel rcursif (f(h(x))), qui est terminal, selon la mthode expose
e
e
e
en section 3.3.4 page 127. Ce qui donne :
def f(x):
while cond:
instructions
f(g(x))
x = h(x)
return
def triRapide(t,debut,fin):
assert type(t) is list
assert 0 <= debut
assert fin <= len(t)
while debut < fin:
pivot = t[debut]
place = partition(t,debut,fin,pivot)
triRapide(t,debut,place-1)
debut = place + 1
return
e
e
La suppression du 1er appel rcursif (f(g(x))) est moins immdiate car cet appel nest pas
terminal et la valeur des arguments x ne varie pas de mani`re aussi prvisible que pour le tri par
e
e
insertion (voir section 4.4.2 page 175). Comme suggr en section 4.4.2 page 176, on peut utiliser
ee
une pile pour sauvegarder les contextes dappel de la premi`re rcursivit (empiler(pile,x))
e
e
e
avant de les restaurer pour la deuxi`me rcursivit (x = depiler(pile)) :
e
e
e
def f(x):
pile = []
while True:
while cond:
instructions
empiler(pile,x)
x = g(x)
if not len(pile) == 0:
x = depiler(pile)
x = h(x)
else: return
return
def empiler(p,x):
assert type(p) is list
p.append(x)
return
def depiler(p):
assert type(p) is list
assert len(p) > 0
x = p[len(p)-1]
del p[len(p)-1]
return x
4.4. TRI DUNE SEQUENCE
179
>>>
>>>
>>>
[4,
>>>
>>>
>>>
[9,
s = [9,8,7,6,5,4]
triRapide(s,0,len(s)-1)
s
5, 6, 7, 8, 9]
s = [9,8,7,6,5,4]
triRapide(s,1,4)
s
5, 6, 7, 8, 4]
A notre niveau, on retiendra cependant la version rcursive, plus proche de la description du tri
e
rapide :
Tri rapide
1
2
3
4
5
6
7
8
9
10
TD4.19
CHAPITRE 4. STRUCTURES LINEAIRES
180
4.5
4.5.1
Exercices complmentaires
e
Conna
tre
4.5. EXERCICES COMPLEMENTAIRES
181
CHAPITRE 4. STRUCTURES LINEAIRES
182
(d) comparer llment recherch avec llment milieu de la liste et poursuivre de mme
ee
e
ee
e
dans la sous-liste de droite ou dans la sous-liste de gauche ` llment milieu.
a ee
10. Dans le tri par insertion
(a) on partage la liste ` trier en deux sous-listes telles que tous les lments de la premi`re
a
ee
e
soient infrieurs ` tous les lments de la seconde, puis on trie les deux sous-listes
e
a
ee
selon le mme processus jusqu` avoir des sous-listes rduites ` un seul lment.
e
a
e
a
ee
`
(b) on trie successivement les premiers lments de la liste : ` la ieme tape, on place le
ee
a
e
eme lment ` son rang parmi les i 1 lments prcdents qui sont dj` tris entre
`
i
ee
a
ee
e e
ea e
eux.
Remarque 4.14 : Parmi les 4 items de la question cicontre, un seul item dnit le tri par insertion, les 3
e
autres dnissent dautres mthodes de tri. Lesquelles ?
e
e
4.5.2
Comprendre
4.5. EXERCICES COMPLEMENTAIRES
183
def f(t,debut,fin):
m = (debut + fin)/2
while m > 0:
for i in range(m,fin+1):
j = i - m
while j >= debut:
print(m,i,j,t)
if t[j] > t[j+m]:
t[j],t[j+m] = t[j+m],t[j]
j = j - m
else: j = debut-1
m = m/2
return
4.5.3
Appliquer
`
TD 4.24 : Codes ASCII et cha
nes de caracteres
1. Ecrire un algorithme qui fournit le tableau des codes ASCII (annexe 4.6.2 page 194) associ
e
a
` une cha (exemple : bon [98, 111, 110]).
ne
2. Ecrire un algorithme qui donne la cha de caract`res associe ` un tableau de codes
ne
e
e a
ASCII (exemple : [98, 111, 110] bon).
CHAPITRE 4. STRUCTURES LINEAIRES
184
4.5.4
Analyser
a00 x0
a10 x0
a(n1)0 x0
+
a01 x1
+
a11 x1
+
+ a(n1)1 x1
+
+
+
+
+
a0(n1) x(n1)
+
a1(n1) x(n1)
+
+ a(n1)(n1) x(n1)
=
b0
=
b1
=
= b(n1)
Dnir une fonction solve(a,b) qui retourne le vecteur x solution du syst`me linaire A x = b
e
e
e
selon la mthode dlimination de Gauss dcrite en section 4.6.5 page 199.
e
e
e
4.5.5
Evaluer
4.5. EXERCICES COMPLEMENTAIRES
185
4.5.6
>>> liste(0)
[]
>>> liste(10)
[6, 7, 9, 8, 5, 4, 9, 1, 8, 9]
>>> nuplet(0)
()
>>> nuplet(10)
(6, 2, 3, 10, 9, 3, 4, 1, 3, 4)
3. Gnration de cha
e e
nes de caract`res.
e
def chaine(n):
assert type(n) is int and n >= 0
t =
for i in range(n):
t = t + chr(randint(32,127)
return t
>>> chaine(0)
>>> chaine(10)
kN K,-Phe
CHAPITRE 4. STRUCTURES LINEAIRES
186
s = [pi/2,pi,3*pi/2]
>>> application(sin,s)
[1.0, 1.2246063538223773e-16, -1.0]
La fonction prdnie map(f,t) fait la
e e
mme chose.
e
>>> s = [pi/2,pi,3*pi/2]
>>> map(sin,s)
[1.0, 1.2246063538223773e-16, -1.0]
f([4,2,1,2,3,5],0,5)
0 [4, 2, 1, 2, 3, 5]
1 [1, 2, 4, 2, 3, 5]
2 [1, 2, 4, 2, 3, 5]
0 [1, 2, 3, 2, 4, 5]
3 [1, 2, 3, 2, 4, 5]
0 [1, 2, 3, 2, 4, 5]
1 [1, 2, 3, 2, 4, 5]
2 [1, 2, 3, 2, 4, 5]
1 [1, 2, 2, 3, 4, 5]
3 [1, 2, 2, 3, 4, 5]
4 [1, 2, 2, 3, 4, 5]
>>> codeASCII(bon)
[98, 111, 110]
4.5. EXERCICES COMPLEMENTAIRES
187
1. Matrice.
def matrice(t):
ok = True
if type(t) is not list or t == []:
ok = False
elif type(t[0]) is not list:
ok = False
else:
i, n, m = 1, len(t), len(t[0])
while i < n and ok == True:
if type(t[i]) is not list:
ok = False
elif len(t[i]) != m:
ok = False
i = i + 1
return ok
>>> matrice(5)
False
>>> matrice([])
False
>>> matrice([5])
False
>>> matrice([[5]])
True
>>> matrice([[5,6],
[7]])
False
>>> matrice([[5,6,7],
[8,9]])
False
>>> matrice([[5,6,7],
[8,9,3]])
True
2. Matrice carre.
e
def matriceCarree(t):
assert matrice(t)
if len(t) > 0 and len(t[0]) == len(t):
ok = True
else: ok = False
return ok
3. Matrice symtrique.
e
>>> matriceCarree([[4,5,6],
[7,8,9]])
False
>>> matriceCarree([[5,6],
[8,9]])
True
>>> matriceCarree([[]])
False
CHAPITRE 4. STRUCTURES LINEAIRES
188
def matriceSymetrique(t):
assert matriceCarree(t)
ok,i = True,0
while i < len(t) and ok == True:
j = i + 1
while j < len(t[0]) and ok == True:
if t[i][j] != t[j][i]:
ok = False
else: j = j + 1
i = i + 1
return ok
>>> matriceSymetrique([[5,6],
[8,9]])
False
>>> matriceSymetrique([[5,6],
[6,9]])
True
>>> matriceSymetrique([[5,6,7],
[6,8,9],
[7,9,3]])
True
4. Matrice diagonale.
def matriceDiagonale(t):
assert matriceCarree(t)
ok,i = True,0
while i < len(t) and ok == True:
j = 0
while j < len(t[0]) and ok == True:
if i != j and t[i][j] != 0:
ok = False
else: j = j + 1
i = i + 1
return ok
>>> matriceDiagonale([[5,6],
[8,9]])
False
>>> matriceDiagonale([[5,0],
[0,9]])
True
>>> matriceDiagonale([[5,0,0],
[0,0,0],
[0,0,3]])
True
>>> multiplicationScalaire([[5,6],
[2,7]],3)
[[15, 18], [6, 21]]
4.5. EXERCICES COMPLEMENTAIRES
def transposee(t):
assert matrice(t)
s = []
for j in range(len(t[0])):
s.append([])
for i in range(len(t)):
s[j].append(t[i][j])
return s
189
>>> transposee([[1,2],[4,5]])
[[1, 4], [2, 5]]
>>> transposee([[1,2,3],[4,5,6]])
[[1, 4], [2, 5], [3, 6]]
>>> motif([1,2,3,2,3,4],[2,4],0,5)
(False, 5)
>>> motif([1,2,3,2,3,4],[2,3],0,5)
(True, 1)
>>> motif([1,2,3,2,3,4],[2,3],2,5)
(True, 3)
>>> motif([1,2,3,2,3,4],[2,3,4],0,5)
(True, 3)
>>>
[0,
>>>
[1]
>>>
[]
rechercheTout([1,2,1,5,1],1)
2, 4]
rechercheTout([1,2,1,5,1],2)
>>>
>>>
[4,
>>>
>>>
[9,
s = [9,8,7,6,5,4]
triBulles(s,0,len(s)-1)
5, 6, 7, 8, 9]
s = [9,8,7,6,5,4]
triBulles(s,1,4)
5, 6, 7, 8, 4]
rechercheTout([1,2,1,5,1],3)
CHAPITRE 4. STRUCTURES LINEAIRES
190
TD 4.29 : Mthode dlimination de Gauss.
e
e
def solve(a,b):
assert matriceCarree(a)
assert type(b) is list
assert len(a) == len(b)
if triangularisation(a,b) == True:
x = backsubstitutions(a,b)
else: x = []
return x
>>> a, b = [[4]], [1]
>>> solve(a,b)
[0.25]
>>> a, b = [[1,1],[1,-1]], [1,0]
>>> solve(a,b)
[0.5, 0.5]
>>> a = [[2,-1,2],[1,10,-3],[-1,2,1]]
>>> b = [2,5,-3]
>>> solve(a,b)
[2.0, 0.0, -1.0]
4.5. EXERCICES COMPLEMENTAIRES
191
def pivot(a,i0):
maxi = fabs(a[i0][i0])
r = i0
for i in range(i0+1,len(a)):
if fabs(a[i][i0]) > maxi:
maxi = fabs(a[i][i0])
r = i
return r
def substractRows(a,b,k,i):
q = 1.*a[k][i]/a[i][i]
a[k][i] = 0
b[k] = b[k] - q*b[i]
for j in range(i+1,len(a)):
a[k][j] = a[k][j] - q*a[i][j]
return
def triangularisation(a,b):
ok = True; i = 0
while i < len(a) and ok == True:
p = pivot(a,i)
if i != p:
a[i],a[p] = a[p],a[i]
b[i],b[p] = b[p],b[i]
if a[i][i] == 0: ok = False
else:
for k in range(i+1,len(a)):
substractRows(a,b,k,i)
i = i + 1
return ok
def backsubstitutions(a,b):
n = len(a); x = []
for k in range(n): x.append(0)
x[n-1] = 1.*b[n-1]/a[n-1][n-1]
for i in range(n-2,-1,-1):
x[i] = b[i]
for j in range(i+1,n):
x[i] = x[i] - a[i][j]*x[j]
x[i] = 1.*x[i]/a[i][i]
return x
>>> s = liste(1000)
>>> x = s[len(s)-1]
>>> mesureRecherche(rechercheSequentielle,s,x)
0.00062489509582519531
>>> s = liste(100000)
>>> x = s[len(s)-1]
>>> mesureRecherche(rechercheSequentielle,s,x)
0.046545028686523438
CHAPITRE 4. STRUCTURES LINEAIRES
192
TD 4.31 : Comparaison dalgorithmes de tri.
def mesureTri(f,t):
tmp = [x for x in t]
t0 = time()
f(tmp,0,len(t)-1)
dt = time() - t0
return dt
>>> s = liste(10000)
>>> mesureTri(triSelection,s)
23.040315866470337
>>> mesureTri(triInsertion,s)
22.086866855621338
>>> mesureTri(triRapide,s)
0.24324798583984375
4.6. ANNEXES
4.6
4.6.1
193
Annexes
Type abstrait de donnes
e
Nous nous intressons ici ` une description plus formelle du type abstrait de donnes Sequence
e
a
e
selon un formalisme logique inspir de [13]. On notera B lensemble des boolens ({0, 1}), E
e
e
lensemble des lments, S lensemble des squences, F lensemble des fonctions E E et P
ee
e
lensemble des fonctions E B. Le vocabulaire initial de la thorie des squences comprend
e
e
alors :
une constante [] qui reprsente la squence vide (on notera S = S {[]}) ;
e
e
un oprateur x s qui traduit linsertion dun lment x E en tte de la squence s S.
e
ee
e
e
Dans ce cadre, la dnition axiomatique des squences repose sur les 2 axiomes suivants :
e
e
1. [] est une squence : [] S,
e
2. x s est une squence : x E, s S, x s S.
e
Pour chaque opration considre, nous indiquerons sa signature, sa dnition axiomatique
e
ee
e
(souvent rcursive) et son quivalent Python.
e
e
head(s) : tte (premier lment) dune squence
e
ee
e
head : S E
, x = head(x s)
s[0]
tail(s) : queue dune squence (la squence sans son premier lment)
e
e
ee
tail : S E
, s = tail(x s)
s[1:len(s)]
x in s : appartenance dun lment ` une squence
ee
a
e
x = head(s)
in
: ESB ,
x in s
x in tail(s)
len(s) : longueur dune squence (nombre dlments)
e
ee
len([]) = 0
len
:SN
,
len(x s) = len(s) + 1
len(s)
concat(s1 , s2 ) (ou s1 + s2 ) : concatnation de deux squences
e
e
[] + s = s
concat: S S S ,
s1 + s2
s3 = (x s1 ) + s2 = x (s1 + s2 )
eme lment de la squence
`
ith(s, i) (ou si ) : i
ee
e
(x s)0 = x
ith
: S N E ,
(x s)i = si1 0 < i len(s)
s[i]
CHAPITRE 4. STRUCTURES LINEAIRES
194
caract`re
e
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
TAB
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
signication
Null
Start of heading
Start of text
End of text
End of transmission
Enquiry
Acknowledge
Bell
Backspace
Horizontal tabulation
Line Feed
Vertical tabulation
Form feed
Carriage return
Shift out
Shift in
Data link escape
Device control 1
Device control 2
Device control 3
Device control 4
Negative acknowledgement
Synchronous idle
End of transmission block
Cancel
End of medium
Substitute
Escape
File separator
Group separator
Record separator
Unit separator
4.6.2
Codes ASCII
Lordinateur stocke toutes les donnes sous forme numrique (ensemble de bits). En partie
e
culier, les caract`res ont un quivalent numrique : le code ASCII (American Standard Code for
e
e
e
Information Interchange). Le code ASCII de base code les caract`res sur 7 bits (128 caract`res,
e
e
de 0 ` 127).
a
Les codes 0 ` 31 sont des caract`res de contrle (gure 4.19).
a
e
o
Les codes 32 ` 47, de 58 ` 64, de 91 ` 96 et de 123 ` 126 sont des symboles de ponctuation.
a
a
a
a
32
58
:
59
;
33
!
60
<
34
"
61
=
35
#
62
>
36
$
63
?
37
%
64
@
38
&
39
40
(
41
)
42
*
43
+
91
[
92
\
93
]
94
^
95
96
44
,
123
{
45
-
46
.
124
|
47
/
125
}
126
~
4.6.3
Les principales oprations sur les squences en Python (list, tuple, str) sont listes dans
e
e
e
les tableaux ci-dessous, extraits du Python 2.5 Quick Reference Guide [10].
4.6. ANNEXES
Operation on sequences
(list, tuple, str)
x in s
x not in s
s1 + s2
s * n, n*s
s[i]
s[i :j[ :step]]
len(s)
min(s)
max(s)
Operation on list
s[i] = x
s[i :j [ :step]] = t
del s[i :j[ :step]]
s.count(x)
s.index(x[,start[,stop]])
s.append(x)
s.extend(x)
s.insert(i, x)
s.remove(x)
s.pop([i])
s.reverse()
s.sort([cmp ])
195
Result
True if an item of s is equal to x, else False
False if an item of s is equal to x, else True
the concatenation of s1 and s2
n copies of s concatenated
ith item of s, origin 0
Slice of s from i (included) to j(excluded). Optional step
value, possibly negative (default : 1)
Length of s
Smallest item of s
Largest item of s
Result
item i of s is replaced by x
slice of s from i to j is replaced by t
same as s[i :j] = []
returns number of is for which s[i] == x
returns smallest i such that s[i] == x. start and stop
limit search to only part of the list
same as s[len(s) : len(s)] = [x]
same as s[len(s) :len(s)]= x
same as s[i :i] = [x] if i>= 0. i == -1 inserts before
the last element
same as del s[s.index(x)]
same as x = s[i] ; del s[i] ; return x
reverses the items of s in place
sorts the items of s in place
196
Operation on str
s.capitalize()
s.center(width[,
fillChar= ])
s.count(sub[,start[,
end]])
s.decode([encoding[,
errors]])
s.encode([encoding[,
errors]])
s.endswith(suffix[,
start[,end]])
s.expandtabs([tabsize])
s.find(sub[,start[,
end]])
s.index(sub[,start[,
end]])
s.isalnum()
s.isalpha()
s.isdigit()
s.isspace()
Result
Returns a copy of s with its rst character capitalized, and
the rest of the characters lowercased
Returns a copy of s centered in a string of length width,
surrounded by the appropriate number of fillChar characters
Returns the number of occurrences of substring sub in string
s
Returns a unicode string representing the decoded version of
str s, using the given codec (encoding). Useful when reading
from a le or a I/O function that handles only str. Inverse
of encode
Returns a str representing an encoded version of s. Mostly
used to encode a unicode string to a str in order to print it
or write it to a le (since these I/O functions only accept
str). Inverse of decode
Returns True if s ends with the specied suffix, otherwise
return False.
Returns a copy of s where all tab characters are expanded
using spaces
Returns the lowest index in s where substring sub is found.
Returns -1 if sub is not found
like find(), but raises ValueError when the substring sub
is not found
Returns True if all characters in s are alphanumeric, False
otherwise
Returns True if all characters in s are alphabetic, False
otherwise
Returns True if all characters in s are digit characters, False
otherwise
Returns True if all characters in s are whitespace characters,
False otherwise
4.6. ANNEXES
s.istitle()
s.islower()
s.isupper()
separator.join(seq)
s.ljust/rjust/center(
width[,fillChar= ])
s.lower()
s.lstrip([chars])
s.partition(separ)
s.replace(old,new[,
maxCount=-1])
s.rfind(sub[ ,start[,
end]])
s.rindex(sub[,start[,
end]])
s.rpartition(separ)
s.rstrip([chars])
197
CHAPITRE 4. STRUCTURES LINEAIRES
198
s.split([separator[,
maxsplit]])
s.rsplit([separator[,
maxsplit]])
s.splitlines([keepends])
s.startswith(prefix[,
start[,end]])
s.strip([chars])
s.swapcase()
s.title()
s.translate(table[,
deletechars])
s.upper()
s.zfill(width)
4.6.4
Les principales oprations sur les chiers en Python (type file) sont listes dans le tableau
e
e
ci-dessous, extrait du Python 2.5 Quick Reference Guide [10].
open(filename[,mode=r,[bufsize]]) returns a new le object. filename is the le
name to be opened. mode indicates how the le is to be opened (r, w, a, +, b,
U). bufsize is 0 for unbuered, 1 for line buered, negative or omitted for system default, >1
for a buer of (about) the given size.
4.6. ANNEXES
Operation on file
f.close()
f.fileno()
f.flush()
f.isatty()
f.next()
f.read([size])
f.readline()
f.readlines()
for line in f : ...
f.seek(offset[,
whence=0])
f.tell()
f.truncate([size])
f.write(str)
f.writelines(list)
4.6.5
199
Result
Close le f
Get leno (fd) for le f
Flush le fs internal buer
True if le f is connected to a tty-like dev, else False
Returns the next input line of le f, or raises StopIteration
when EOF is hit
Read at most size bytes from le f and return as a string
object. If size omitted, read to EOF
Read one entire line from le f. The returned line has a
trailing n, except possibly at EOF. Return on EOF
Read until EOF with readline() and return a list of lines
read
Iterate over the lines of a le f (using readline)
Set le fs position
whence == 0 then use absolute indexing
whence == 1 then offset relative to current pos
whence == 2 then offset relative to le end
Return le fs current position (byte oset)
Truncate fs size. If size is present, f is truncated to (at
most) that size, otherwise f is truncated at current position
(which remains unchanged)
Write string str to le f
Write list of strings to le f. No EOL are added
CHAPITRE 4. STRUCTURES LINEAIRES
200
a00 x0
a10 x0
a(n1)0 x0
Fig. 4.20 : Pont de Wheatstone
i1
r1
i4
r4
r5 i5
i2
B
i3
r2
r3
D
E,r6
=
=
=
=
=
=
=
10
10
5
20
10
10
12V
+
+
+
+
+
a0(n1) x(n1)
+
a1(n1) x(n1)
+
+ a(n1)(n1) x(n1)
=
b0
=
b1
=
= b(n1)
(4.1)
i6
r1
r2
r3
r4
r5
r6
E
+
a01 x1
+
a11 x1
+
+ a(n1)1 x1
i4 = i1 + i5
i6 = i1 + i2
i2 = i3 + i5
10i1 = 10i2 + 10i5
10i5 = 5i3 20i4
12 10i6 = 10i2 + 5i3
x2 = 1
x0 + x1 +
2x0 + 4x1 + 8x2 = 10
4.6. ANNEXES
201
6x1 + 24x2 = 30
On obtient un nouveau syst`me linaire dans lequel seule la premi`re quation contient un terme
e
e
e e
`
en x0 . Lquation utilise (ici la 1ere quation) pour liminer une inconnue dans les quations
e
e
e
e
e
eme et 3eme quations) est appele lquation-pivot. Dans lquation-pivot
`
`
qui suivent (ici les 2
e
e e
e
choisie, le coecient de linconnue qui est limine dans les autres quations est appel le pivot
e
e
e
e
de lquation (ici a00 ).
e
La deuxi`me tape consiste ` liminer le terme en x1 de la troisi`me quation en utilisant
e
e
ae
e
e
`
la deuxi`me quation comme quation-pivot. On ram`ne ` 1 le coecient de x1 dans la 2eme
e
e
e
e a
quation en divisant lquation par 2 (a11 = 2), puis on la multiplie par 6 (a21 = 6) pour que les
e
e
`
`
`
2eme et 3eme quations aient le mme terme en x1 . Tout revient ` multiplier la 2eme quation
e
e
a
e
par 3 (a21 /a11 = 6/2 = 3) :
6x1 + 24x2 = 30
CHAPITRE 4. STRUCTURES LINEAIRES
202
`
`
`
Il reste ` soustraire la 2eme quation de la 3eme pour liminer le terme en x1 de la 3eme quation :
a
e
e
e
6x2 = 6
On obtient ainsi un syst`me triangulaire dquations linaires dont on peut calculer directement
e
e
e
eme quation : 6x = 6 x = 1. On porte cette valeur de x dans
`
la valeur de x2 par la 3
e
2
2
2
la deuxi`me quation, ce qui nous permet de calculer x1 : 6x1 + 18 1 = 24 x1 = 1. En
e
e
reportant les valeurs de x2 et x1 dans la premi`re quation, on en dduit la valeur de x0 :
e e
e
3x0 + 3 1 + 3 1 = 3 x0 = 1. On vrie simplement que les valeurs obtenues sont solutions
e
du syst`me initial :
e
1
1
1 1 1
x2 = 1
x0 + x1 +
2 4 8 1 = 10
2x0 + 4x1 + 8x2 = 10
33
1
3 9 27
3x0 + 9x1 + 27x2 = 33
Etude du cas gnral
e e
De mani`re gnrale, la mthode prcdente consiste ` rduire le syst`me de n quations
e
e e
e
e e
a e
e
e
a
` n inconnues ` un syst`me triangulaire quivalent qui peut tre ensuite rsolu facilement par
a
e
e
e
e
substitutions. En quelque sorte le syst`me (4.1) doit tre transform en un syst`me quivalent
e
e
e
e
e
du type :
a0(n1) x(n1) =
b0
a00 x0 + a01 x1 + a02 x2 + +
(1)
(1)
(1)
(1)
a11 x1 + a12 x2 + +
a1(n1) x(n1) = b1
(2)
+ a22 x2 + +
+
(2)
(2)
a2(n1) x(n1) = b2
=
(n2)
(n2)
a(n1)(n1) x(n1) = b(n1)
(4.2)
o` lindice suprieur dsigne le nombre dtapes ` la suite desquelles est obtenu le coecient
u
e
e
e
a
considr.
ee
Lquation de rang 0 du syst`me (4.1) est dabord divise par le coecient a00 de x0 (suppos
e
e
e
e
non nul). On obtient :
x0 +
a0(n1)
a01
a02
b0
x1 +
x2 + +
x(n1) =
a00
a00
a00
a00
(4.3)
4.6. ANNEXES
203
Cette quation (4.3) est alors multipli par a10 , coecient de x0 dans la deuxi`me quation du
e
e
e
e
syst`me (4.1). Le rsultat est ensuite soustrait de la deuxi`me quation du syst`me (4.1), ce
e
e
e
e
e
qui limine x0 dans la deuxi`me quation. Dune mani`re gnrale on multiplie la relation (4.3)
e
e
e
e
e e
e
par ai0 , coecient de x0 dans lquation de rang i du syst`me (4.1) et on retranche le rsultat
e
e
`
obtenu de cette mme ieme quation. A la n x0 est limin de toutes les quations, except de
e
e
e
e
e
e
la premi`re, et on obtient le syst`me ainsi transform :
e
e
e
a00 x0 +
a01 x1 +
(1)
a11 x1 +
(1)
a21 x1 +
(1)
a02 x2 + +
(1)
a12 x2 + +
(1)
a22 x2 + +
(1)
a0(n1) x(n1) =
(1)
a1(n1) x(n1) =
(1)
a2(n1) x(n1) =
(1)
b0
(1)
b1
(1)
b2
(1)
b3
(4.4)
a31 x1 +
a32 x2 + +
a3(n1) x(n1) =
+
+ +
=
(1)
(1)
(1)
(1)
a(n1)1 x1 + a(n1)2 x2 + + a(n1)(n1) x(n1) = b(n1)
(1)
Lquation de rang 1 dans le nouveau syst`me (4.4) devient alors lquation-pivot et a11 le pivot
e
e
e
de lquation. De la mme faon on limine x1 des quations du rang 2 au rang n 1 dans le
e
e
c
e
e
syst`me (4.4), et on obtient :
e
a00 x0 + a01 x1 +
(1)
a11 x1 +
a02 x2 + +
(1)
a12 x2 + +
(2)
a22 x2 + +
(2)
a0(n1) x(n1) =
(1)
a1(n1) x(n1) =
(2)
a2(n1) x(n1) =
(2)
b0
(1)
b1
(2)
b2
(2)
b3
a32 x2 + +
a3(n1) x(n1) =
+ +
=
(2)
(2)
(2)
a(n1)2 x2 + + a(n1)(n1) x(n1) = b(n1)
(4.5)
Lquation de rang 2 dans le nouveau syst`me (4.5) fait oce ` son tour dquation pivot, et ainsi
e
e
a
e
de suite jusqu` obtenir le syst`me triangulaire (4.2). Une fois obtenu ce syst`me triangulaire,
a
e
e
on calcule directement la valeur de x(n1) par la derni`re relation du syst`me triangulaire.
e
e
En portant cette valeur dans la relation prcdente, on calculera x(n2) , et ainsi de suite en
e e
remontant le syst`me triangulaire (4.2). A chaque tape k, on a donc les relations suivantes :
e
e
CHAPITRE 4. STRUCTURES LINEAIRES
204
1. Triangularisation
(k1)
(k)
a
(k1)
a
ij = a(k1) ip
apj
ij
(k1)
app
(k1)
aip
(k)
(k1)
b
i
= bi
(k1) b(k1)
p
app
2. Remonte par substitutions
e
x
(n1) =
xi
Remarque 4.15 : Cette mthode est connue sous le
e
nom de mthode dlimination de Gauss (galement
e
e
e
connue sous le nom de mthode de triangularisation
e
de Gauss ou mthode du pivot de Gauss). Elle fut
e
nomme ainsi en lhonneur du mathmaticien allemand
e
e
Johann Carl Friedrich Gauss (17771855), mais elle
est connue des Chinois depuis au moins le 1er si`cle de
e
notre `re. Elle est rfrence dans le livre chinois Jiuze
ee
e
hang suanshu o` elle est attribue ` Chang Tsang
u
e a
`
chancelier de lempereur de Chine au 2eme si`cle avant
e
notre `re [4].
e
p < i (n 1)
p j (n 1)
b(n1)
a(n1)(n1)
n1
bi
=
avec
e
k : tape
p : rang du pivot
avec 0 i < (n 1)
aij xj
j=i+1
aii
Jusqu` prsent, on a admis que le pivot au cours du processus de triangularisation tait non
a e
e
nul (app = 0). Si ce nest pas le cas, on doit permuter lquation-pivot avec une autre ligne dans
e
laquelle le pivot est dirent de 0. Il se peut galement que le pivot, sans tre nul, soit tr`s petit
e
e
e
e
et lon a intrt l`-aussi ` interchanger les lignes comme pour le cas dun pivot nul. En fait, pour
ee a
a
augmenter la prcision de la solution obtenue, on a toujours intrt ` utiliser la ligne qui a le
e
ee a
plus grand pivot.
Jeu de tests
Lalgorithme de rsolution de tels syst`mes linaires pourra tre test ` laide des syst`mes
e
e
e
e
ea
e
suivants :
Test
Syst`me A x = b
e
Solution
A
b
exacte
4
1
1/4
1
1
1
1
1/2
2
1 1
0
1/2
2 1
2
2
2
1 10 3 5 0
3
1
2
1
3
1
4.6. ANNEXES
205
Test
Syst`me A x = b
e
Solution
A
b
exacte
10 7 8 7
32
1
7 5 6 5
23
1
8 6 10 9
33
1
7 5 9 10
31
1
10
7 8.1 7.2
32
23
7.08 5.04
6
5
33
8 5.98 9.89
9
6.99 4.99
9 9.98
31
10 7 8 7
32.01
7 5 6 5
22.99
8 6 10 9
33.01
7 5 9 10
30.99
Test
1
0
1 2
0
1
0
1
1 /2
0 /2
1
1
0
1
1
0
1
10 10
0
0
0
10
0
0
2
4
8 3
0
0
4 12 2
2 /4
3 /8
3 2 /4
2
3
2
3 2
Syst`me A x = b
e
A
1
0
0
0
0 1
1
0 1
0
0
0 10
0
5 20 10
0
5
0
0 10
0
0
0
0
16 4
32 5
64 6 128 7
0
0
0
0
32 3
80 4 192 5 448 6
4 /16 5 /32 6 /64 7 /128
3 /2 5 4 /16 3 5 /16 7 6 /64
4
5
6
7
4 3
5 4
6 5
7 6
b
0
0
0
0
0
12
4
4
0
0
2
2
1
0
206
Annexe A
Grands classiques
Algorithmes
Cette annexe recense quelques algorithmes historiques dont les principales vertus aujourdhui sont dordre pdagogique. A ce titre, tout informaticien dbutant doit tre capable de les
e
e
e
rednir lui-mme. Pour simplier la lecture de ces algorithmes, ils sont prsents sous forme de
e
e
e
e
fonctions Python pour lesquelles les descriptions, les prconditions et les tests unitaires sont
e
volontairement omis.
Spcication :
e
fibonacci
n:int
u:int
[n >= 0]
n:int
[n >= 0]
[i in 2..n]
u1:int
u2:int
i:int
[else]
207
u = u1 + u2
u2 = u1
u1 = u
i = i + 1
u:int
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
208
209
210
211
212
213
214
214
215
216
216
217
217
218
219
219
220
221
221
208
Algorithme dEuclide
Remarque A.1 : Voir aussi les exemples 2.3 page 45,
2.9 page 51, 2.13 page 55, la gure 2.16 page 56 et le TD
2.15 page 56.
Lalgorithme dEuclide concerne le calcul du plus grand commun diviseur (pgcd) de 2 entiers.
Le pgcd de 2 entiers a et b peut se calculer en appliquant la relation de rcurrence pgcd(a, b) =
e
pgcd(b, a%b) jusqu` ce que le reste (a%b) soit nul. Cette rcurrence se traduit par lalgorithme
a
e
rcursif suivant :
e
def pgcd(a,b):
if b == 0: d = a
else: d = pgcd(b,a%b)
return d
>>> pgcd(0,9)
9
>>> pgcd(12,18)
6
def pgcd (a , b ):
while b != 0:
r = a % b
a = b
b = r
return a
Coecients du binme
o
Remarque A.2 :
3.18 page 131.
Il sagit ici de dvelopper le binme (a + b)n et de dterminer les coecients des termes
e
o
e
ank bk .
n
Remarque A.3 : Le coecient binomial
(ou
k
k
Cn , combinaison de k parmi n) se lit k parmi n .
(a + b) =
k=0
n
k
n
nk k
b =
k=0
n!
ank bk
k!(n k)!
La formule de Pascal lie les coecients binomiaux entre eux selon la relation de rcurrence :
e
n
k
n1
k
n1
k1
n
0
n
n
=1
Elle permet un calcul rapide des coecients pour les petites valeurs de n sans division ni multiplication. Elle est utilise pour construire ` la main le triangle de Pascal (remarque A.4) et cest
e
a
encore elle que est implmente dans la version rcursive du calcul des coecients du binme.
e
e
e
o
209
def coefBinome(n,k):
if k == 0 or n == 0 or n == k:
c = 1
else:
c = coefBinome(n-1,k) + coefBinome(n-1,k-1)
return c
>>> coefBinome(2,1)
1
>>> coefBinome(7,4)
35
>>> coefBinome(14,7)
3432
n (n 1) (n k + 2) (n k + 1)
n!
=
k!(n k)!
1 2 3k
def coefBinome (n , k ):
num , den = 1 , 1
for i in range (1 , k +1):
num = num *( n - i +1)
den = den * i
c = num / den
return c
Conversion en base b
Un entier n en base b est reprsent par une suite de chires (rm rm1 . . . r1 r0 )b o` les ri
e
e
u
i=m
ri bi .
n = rm bm + rm1 bm1 + . . . + r1 b1 + r0 b0 =
ri bi
i=0
Nous choisirons ici de reprsenter un tel nombre par une liste [rm , rm1 , . . . , r1 , r0 ]. Lalgoe
rithme de conversion consiste ` diviser successivement le nombre n par la base b (n = bq +r) tant
a
210
que le quotient q nest pas nul. Lordre inverse des restes des direntes divisions (du dernier au
e
premier reste, crits de gauche ` droite) donne la reprsentation du nombre n en base b.
e
a
e
n
n
n
n
=
=
=
=
q 0 b + r0 = q 0 b1 + r0 b0
(q1 b1 + r1 )b1 + r0 b0 = q1 b2 + r1 b1 + r0 b0
(q2 b1 + r2 )b2 + r1 b1 + r0 b0 = q2 b3 + r2 b2 + r1 b1 + r0 b0
...
i=m
ri bi
n = 0 bm+1 + rm bm + . . . + r2 b2 + r1 b1 + r0 b0 =
i=0
n = (rm rm1 . . . r1 r0 )b
>>>
[2,
>>>
[1,
>>>
[3,
>>>
[1,
>>>
[1,
conversion(23,10)
3]
conversion(23,2)
1, 1, 0, 1]
conversion(23,5)
4]
conversion(23,12)
11]
conversion(23,16)
7]
def conversion (n , b ):
code = []
if n == 0:
code = [0]
while n != 0:
code . insert (0 , n % b )
n = n/b
return code
La courbe de von Koch est lune des premi`res courbes fractales ` avoir t dcrite par le
e
a
ee e
mathmaticien sudois Helge von Koch (1870-1924). On peut la crer ` partir dun segment de
e
e
e a
droite, en modiant rcursivement chaque segment de droite de la faon suivante :
e
c
1. on divise le segment de droite en trois segments de longueurs gales,
e
2. on construit un triangle quilatral ayant pour base le segment mdian de la premi`re
e
e
e
e
tape,
e
3. on supprime le segment de droite qui tait la base du triangle de la deuxi`me tape.
e
e
e
211
Avec les instructions ` la Logo (voir annexe 2.6.1 page 91), on obtient lalgorithme rcursif
a
e
ci-dessous pour dessiner de telles courbes (gure A).
def kock (n , d ):
if n == 0: forward ( d )
else :
kock (n -1 , d /3.)
left (60)
kock (n -1 , d /3.)
right (120)
kock (n -1 , d /3.)
left (60)
kock (n -1 , d /3.)
return
Crible dEratosth`ne
e
`
Le crible dEratosth`ne (mathmaticien grec du 3eme si`cle avant JC) est un algorithme pour
e
e
e
trouver tous les nombres premiers infrieurs ` un certain entier naturel donn n. On forme une
e
a
e
liste avec tous les entiers naturels compris entre 2 et n (range(2,n+1)) et on supprime les uns
apr`s les autres, les entiers qui ne sont pas premiers de la mani`re suivante : on commence par
e
e
le dbut de la liste et d`s que lon trouve un entier qui na pas encore t supprim, il est dclar
e
e
ee
e
e
e
premier, on le supprime ainsi que tous les autres multiples de celui-ci et on recommence tant
que la liste nest pas vide. Lalgorithme rcursif suivant le gnralise ` toutes listes, tries par
e
e e
a
e
ordre croissant, dentiers suprieurs ou gaux ` 2.
e
e
a
212
>>> crible(range(2,14))
[2, 3, 5, 7, 11, 13]
>>> crible(range(2,100))
[2, 3, 5, 7, 11, 13, 17, 19, 23,
29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97]
>>> crible(range(2,14,3))
[2, 5, 11]
def crible ( t ):
i = 0
while i < len ( t ):
j = i +1
while j < len ( t ):
if t [ j ]% t [0] == 0: del t [ j ]
else : j = j + 1
i = i + 1
return t
Les dveloppements limits des fonctions usuelles scrivent sous la forme de dveloppements
e
e
e
e
n
en srie enti`re
e
e
sin(x)
(1)k
uk =
k=0
k=0
x2k+1
x3
x5
x2n+1
=x
+
+ . . . + (1)n
(2k + 1)!
6
120
(2n + 1)!
Ces dveloppements font souvent intervenir les fonctions puissance et factorielle qui sont tr`s
e
e
gourmandes en temps de calcul ; on cherche alors ` viter leur utilisation en sappuyant sur
ae
213
une relation de rcurrence entre les uk . Ainsi, pour la fonction sinus :
e
uk+1 = (1)k+1
x2(k+1)+1
x2k+1
x2
x2
= (1)k
= uk
(2(k + 1) + 1)!
(2k + 1)! (2k + 2)(2k + 3)
(2k + 2)(2k + 3)
def sinus (x , n ):
u = x
y = u
for k in range (0 , n +1):
u = -(( x * x )/((2* k +2)*(2* k +3)))* u
y = y + u
return y
>>> sinus(pi/6,3)
0.50000000002027989
>>> sinus(pi/2,3)
1.0000035425842861
>>> sinus(pi,3)
0.0069252707075050518
>>> sinus(pi/6,7)
0.49999999999999994
>>> sinus(pi/2,7)
1.0000000000000437
>>> sinus(pi,7)
2.2419510632012503e-08
>>> sinus(pi/6,70)
0.49999999999999994
>>> sinus(pi/2,70)
1.0000000000000002
>>> sinus(pi,70)
2.4790606856821868e-16
Remarque A.8 :
1
sin( ) =
6
2
Rappels :
sin( ) = 1
2
sin() = 0
Fonction factorielle
La fonction factorielle qui calcule le produit des n premiers entiers positifs est simplement
dnie par la relation de rcurrence :
e
e
0! = 1
n! = n (n 1)! n N
n! =
k
k=1
214
>>> factorielle(0)
1
>>> factorielle(5)
120
>>> factorielle(10)
3628800
def factorielle ( n ):
u = 1
for i in range (2 , n +1):
u = u * i
return u
Fonction puissance
Remarque A.10 : Voir aussi lexemple 2.11 page 54
et le TD 3.17 page 131.
x = x x x x . On
k=1
n fois
>>> puissance(2,0)
1
>>> puissance(2,20)
1048576
def puissance (x , n ):
p = x
for k in range (1 , n ):
p = p*x
return p
215
Nombres de Fibonacci
Les nombres de Fibonacci sont donns par la suite dnie par la relation de rcurrence
e
e
e
ci-dessous :
f0 = f1 = 1
fn = fn1 + fn2 n > 1
Les 10 premiers nombres de la suite de Fibonacci valent donc successivement f0 = 1, f1 = 1,
f2 = 2, f3 = 3, f4 = 5, f5 = 8, f6 = 13, f7 = 21, f8 = 34, et f9 = 55.
`
Le neme nombre de Fibonacci peut donc se calculer de mani`re rcursive en appliquant
e
e
simplement la dnition de la suite de Fibonacci.
e
def fibonacci(n):
if n < 2: f = 1
else: f = fibonacci(n-1) + fibonacci(n-2)
return f
`
neme
def fibonacci ( n ):
f , f1 , f2 = 2 ,1 ,1
for i in range (3 , n +1) :
f2 = f1
f1 = f
f = f1 + f2
return f
Palindrome
Un palindrome est une squence dont lordre des lments reste le mme quon la parcourt du
e
ee
e
premier au dernier ou du dernier au premier. Ainsi, [1,2,2,1], "kayak" sont des palindromes
au mme titre que lexpression arithmtique 1234+8765=9999=5678+4321. Dans les cha
e
e
nes de
caract`res, si lon ne prend pas en compte la casse (minuscules ou majuscules), les espaces, les
e
signes de ponctuation et les signes diacritiques (accents, cdilles), alors "engage le jeu que
e
je le gagne" et "A man, a plan, a canal : Panama" sont galement des palindromes.
e
216
1
2
3
4
5
6
def palindrome ( t ):
n , i , ok = len ( t ) , 0 , True
while i < n /2 and ok == True :
if t [ i ] != t [n -1 - i ]: ok = False
else : i = i + 1
return ok
Produit de matrices
Remarque A.12 :
r1
aik bkj
ci,j =
k=0
def produitMatrice (a , b ):
c = []
n ,r , m = len ( a ) , len ( a [0]) , len ( b [0])
for i in range ( n ):
c . append ([])
for j in range ( m ):
x = 0
for k in range ( r ):
x = x + a [ i ][ k ]* b [ k ][ j ]
c [ i ]. append ( x )
return c
>>> a = [[1,2],[3,4]]
>>> b = [[2,1],[-1,-2]]
>>> produitMatrice(a,b)
[[0, -3], [2, -5]]
>>> a = [[1,2,3,4]]
>>> b = [[1],[2],[3],[4]]
>>> produitMatrice(a,b)
[[30]]
217
Recherche dichotomique
Il sagit dun algorithme de recherche dun lment x dans une liste t dj` trie. Le principe
ee
ea e
de la recherche dichotomique consiste ` comparer x avec llment t[m] du milieu de la liste t
a
ee
trie :
e
si x == t[m], on a trouv une solution et la recherche sarrte ;
e
e
si x < t[m], x ne peut se trouver que dans la moiti gauche de la liste t puisque celle-ci est
e
trie par ordre croissant ; on poursuit alors la recherche de la mme mani`re uniquement
e
e
e
dans la moiti gauche de la liste ;
e
si x > t[m], x ne peut se trouver que dans la moiti droite de la liste t ; on poursuit alors
e
la recherche uniquement dans la moiti droite de la liste.
e
def rec h e r c h e D i c h o t o m i q u e (t , x ):
ok , m = False , ( gauche + droite )/2
while gauche <= droite and not ok :
m = ( gauche + droite )/2
if t [ m ] == x : ok = True
elif t [ m ] > x : droite = m - 1
else : gauche = m + 1
return ok , m
Recherche squentielle
e
La recherche squentielle dun lment x dans une liste t consiste ` comparer llment
e
ee
a
ee
recherch x successivement ` tous les lments de la liste t jusqu` trouver une correspondance.
e
a
ee
a
Algorithme A.13 Recherche squentielle
e
1
2
3
4
5
218
6
7
8
Tours de Hano
dpart
intermdiaire
arrive
intermdiaire
Les tours de Hano est un jeu qui consiste ` dplacer n disques de diam`tres dirents
a e
e
e
dune tour de dpart ` une tour d arrive en passant par une tour intermdiaire et
e
a
e
e
ceci en un minimum de coups, tout en respectant les r`gles suivantes :
e
on ne peut dplacer quun disque ` la fois,
e
a
on ne peut placer un disque que sur un autre disque plus grand que lui ou sur une tour
vide.
Dans ltat initial, les n disques sont placs sur la tour dpart . Dans ltat nal, tous les
e
e
e
e
disques se retrouvent placs dans le mme ordre sur la tour arrivee .
e
e
e
arrive
Etat nal :
dpart
1
2
3
4
5
6
>>> hanoi(3,d,i,a)
dplacer disque 1 de la tour
e
dplacer disque 2 de la tour
e
dplacer disque 1 de la tour
e
dplacer disque 3 de la tour
e
dplacer disque 1 de la tour
e
dplacer disque 2 de la tour
e
dplacer disque 1 de la tour
e
d
d
a
d
i
i
d
a
`
a
`
a
`
a
`
a
`
a
`
a
`
la
la
la
la
la
la
la
tour
tour
tour
tour
tour
tour
tour
a
i
i
a
d
a
a
219
Tri bulles
Dans le tri bulles, on parcourt la liste en commenant par la n, en eectuant un change `
c
e
a
chaque fois que lon trouve deux lments successifs qui ne sont pas dans le bon ordre.
ee
Algorithme A.15 Tri bulles
1
2
3
4
5
6
7
>>> s = [9,8,7,6,5,4]
>>> triBulles(s,1,4)
[9, 5, 6, 7, 8, 4]
Tri fusion
Dans le tri fusion, on partage la liste ` trier en deux sous-listes que lon trie, et on interclasse
a
(on fusionne) ces deux sous-listes.
Algorithme A.16 Tri fusion
1
2
3
4
5
6
7
La fusion consiste ` construire, ` partir des deux sous-listes tries (la premi`re de lindice
a
a
e
e
debut ` lindice k, la deuxi`me de lindice k+1 ` lindice fin) une liste elle-mme trie des indices
a
e
a
e
e
debut ` fin et contenant lensemble des lments des deux sous-listes dorigine.
a
ee
Remarque A.17 :
220
1
2
3
4
5
6
7
8
9
>>> s = [4,5,6,1,2,3]
>>> fusion(s,1,2,4)
[4, 1, 2, 5, 6, 3]
`
Dans le tri par insertion, on trie successivement les premiers lments de la liste : ` la ieme
ee
a
`
tape, on ins`re le ieme lment ` son rang parmi les i 1 lments prcdents qui sont dj`
e
e
ee
a
ee
e e
ea
tris entre eux.
e
221
Tri rapide
Le principe du tri rapide est le suivant : on partage la liste ` trier en deux sous-listes telles que
a
tous les lments de la premi`re soient infrieurs ` tous les lments de la seconde. Pour partager
ee
e
e
a
ee
la liste en deux sous-listes, on choisit un des lments de la liste (par exemple le premier) comme
ee
pivot. On construit alors une sous-liste avec tous les lments infrieurs ou gaux ` ce pivot et
ee
e
e
a
une sous-liste avec tous les lments suprieurs au pivot. On trie les deux sous-listes selon le
ee
e
mme processus jusqu` avoir des sous-listes rduites ` un seul lment.
e
a
e
a
ee
Algorithme A.19 Tri rapide
1
2
3
4
5
6
7
222
8
9
10
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> s = [3,6,5,4,1,2]
>>> partition(s,1,4,4), s
(2, [3, 1, 4, 5, 6, 2])
Annexe B
Travaux dirigs
e
Le planning prvisionnel de la section 1.6.3 page 34 permet de visualiser la rpartition des 7
e
e
sances de travaux diriges organises au cours des 15 semaines du cours dInformatique S1 de
e
e
e
lENIB. Dans cette annexe, on prcise pour chaque TD
e
1. les objectifs recherchs,
e
2. les exercices de TD ` prparer avant la sance,
a e
e
3. les exercices complmentaires pour sexercer.
e
TD 1
Objectifs
1. Prise en main de lenvironnement informatique (syst`me dexploitation Linux, environnee
ment de programmation Python, site Web) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1h30
2. Exploitation des instructions de base : aectation et tests (chapitre 2, sections 2.2 et 2.3
page 46) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1h30
223
ANNEXE B. TRAVAUX DIRIGES
224
Exercices de TD
Affectation
TD 2.1
TD 2.2
TD 2.3
TD 2.4
Unit de pression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
Suite arithmtique (1). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
Permutation circulaire (1). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Squence daectations (1). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
42
44
45
45
47
47
48
49
49
50
51
Tests
TD
TD
TD
TD
TD
TD
TD
Exercices complmentaires
e
Comprendre
TD 2.26
TD 2.27
TD 2.28
TD 2.29
TD 2.30
TD 2.31
TD 2.32
Unit de longueur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
Permutation circulaire (2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Squence daectations (2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
Circuits logiques (2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Alternative simple et test simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Racines du trinome. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Squences de tests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
66
66
66
67
70
70
70
Appliquer
TD 2.35
TD 2.36
TD 2.37
TD 2.38
TD 2.39
Figures gomtriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e e
Suites numriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
Calcul vectoriel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Prix dune photocopie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Calcul des impts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
o
72
73
73
73
73
225
Analyser
TD 2.42 Dessins gomtriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
e e
TD 2.43 Police dassurance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
TD 2
Objectifs
1. Exploitation des instructions de base : boucles (chapitre 2, section 2.4) . . . . . . . . . . . . . . 3h
Exercices de TD
Boucles
TD
TD
TD
TD
TD
TD
TD
TD
TD
TD
TD
TD
TD
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23
2.24
53
54
55
56
56
58
58
58
59
60
61
62
62
Exercices complmentaires
e
Comprendre
TD 2.33 Racine carre enti`re. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
e
e
TD 2.34 Excutions dinstructions itratives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
e
e
Appliquer
TD 2.40 Dveloppements limits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
e
e
ANNEXE B. TRAVAUX DIRIGES
226
TD 3
Objectifs
1. Exploitation des instructions de base : aectation, tests et boucles imbriqus (chapitre 2
e
en entier) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3h
Exercices de TD
Il sagit dun TD rcapitulatif sur les instructions de base, aussi les exercices ` prparer font partie des exercices
e
a e
complmentaires des TD prcdents.
e
e e
TD 4
Objectifs
1. Spcier et implmenter des fonctions (chapitre 3, section 3.2) . . . . . . . . . . . . . . . . . . . . . . 3h
e
e
Exercices de TD
TD
TD
TD
TD
TD
3.1
3.2
3.3
3.4
3.5
100
101
112
113
114
227
Exercices complmentaires
e
Analyser
TD 3.20
TD 3.21
TD 3.22
TD 3.23
TD 3.24
Addition binaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Complment ` 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
a
Codage-dcodage des rels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
e
Intgration numrique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
e
Tracs de courbes paramtres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
e e
132
132
133
134
136
TD 5
Objectifs
1. Spcier et implmenter des fonctions (chapitre 3, section 3.2) . . . . . . . . . . . . . . . . . . . . . . 3h
e
e
Exercices de TD
Il sagit dun TD rcapitulatif sur la dnition des fonctions, aussi les exercices ` prparer font partie des exercices
e
e
a e
complmentaires des TD prcdents.
e
e e
e
e
TD 3.23 Intgration numrique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
TD 3.24 Tracs de courbes paramtres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
e
e e
TD 6
Objectifs
1. Appeler des fonctions itratives ou rcursives (chapitre 3, section 3.3) . . . . . . . . . . . . . . . 3h
e
e
Exercices de TD
TD
TD
TD
TD
3.6
3.7
3.8
3.9
116
119
121
123
ANNEXE B. TRAVAUX DIRIGES
228
131
131
131
132
TD 7
Objectifs
1. Manipulation de squences (chapitre 4, section 4.2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3h
e
Exercices de TD
N-uplets
TD 4.2 Oprations sur les n-uplets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
TD 4.3 Pgcd et ppcm de 2 entiers. (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
`
Cha
nes de caracteres
TD 4.4 Oprations sur les cha
e
nes de caract`res. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
TD 4.5 Inverser une cha
ne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TD 4.6 Caract`res, mots, lignes dune cha
e
ne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Listes
TD 4.7 Oprations sur les listes. (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
TD 4.8 Oprations sur les listes. (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
TD 4.9 Slection dlments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e
ee
163
163
164
164
165
165
166
166
229
Piles et files
TD 4.10 Oprations sur les piles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
e
TD 4.11 Oprations sur les les. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
e
Listes multidimensionnelles
TD 4.12 Produit de matrices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Exercices complmentaires
e
Comprendre
TD 4.21 Gnration de squences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
e e
e
TD 4.22 Application dune fonction ` tous les lments dune liste. . . . . . . . . . . . . . . . 182
a
ee
TD 4.23 Que fait cette procdure ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
e
Appliquer
TD 4.24 Codes ASCII et cha
nes de caract`res. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
e
TD 4.25 Oprations sur les matrices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
e
Analyser
TD 4.26
TD 4.27
TD 4.28
TD 4.29
184
184
184
184
Evaluer
TD 4.30 Comparaison dalgorithmes de recherche. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
TD 4.31 Comparaison dalgorithmes de tri. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
230
Annexe C
Contrles types
o
Cette annexe propose des exemples corrigs de contrles dautoformation (CAF) et de
e
o
contrles de comptences (DS) tels quils sont programms au cours du semestre S1 (voir le
o
e
e
planning prvisionnel en section 1.6.3 page 34). Lesprit de ces contrles est rsum dans le
e
o
e
e
chapitre 1 dintroduction ` la section 1.3.3 page 14.
a
Quel que soit le type de contrle, un exercice cherche ` valuer un objectif particulier. Aussi,
o
ae
la notation exprimera la distance qui reste ` parcourir pour atteindre cet objectif (gure C) :
a
0
1
2
3
:
:
:
:
Ainsi, et pour changer de point de vue sur la notation, le contrle est russi lorsquon a 0 ! Il
o
e
ny a pas non plus de 1/2 point ou de 1/4 de point : le seul barme possible ne comporte que 4
e
niveaux : 0, 1, 2 et 3. On ne cherche donc pas ` grappiller des points :
a
on peut avoir 0 (objectif atteint) et avoir fait une ou deux erreurs bnignes en regard de
e
lobjectif recherch ;
e
on peut avoir 3 (objectif non atteint) et avoir quelques lments de rponse corrects mais
ee
e
sans grand rapport avec lobjectif.
231
Sommaire
CAF1 : calculs boolens . . . . . . . . . . . . . . . . . .
e
CAF2 : codage des nombres . . . . . . . . . . . . . .
CAF3 : recherche dun lment . . . . . . . . . .
ee
DS1 : instructions de base . . . . . . . . . . . . . . . .
DS2 : procdures et fonctions . . . . . . . . . . . .
e
232
234
236
239
243
0
1
2
3
Remarque C.1 : Une absence ` un contrle conduit `
a
o
a
la note 4 ( la cible nest pas vise ).
e
ANNEXE C. CONTROLES TYPES
232
abcd
(a b) (c d)
ab+cd
(a + b) + (c + d)
a+b+c+d
associativit
e
De Morgan
De Morgan
associativit
e
b
0
0
1
1
0
0
1
1
c (a b) (b c)
1
1
0
1
1
1
0
1
0
1
1
1
0
0
1
1
0
1
0
1
0
1
1
1
u
1
1
0
1
0
0
0
1
c
1
0
1
0
1
0
1
0
a (c a)
1
1
1
1
1
1
1
1
0
0
0
1
0
0
0
1
t
1
1
1
1
1
1
1
1
233
Etablir la table de vrit du circuit logique ci-dessous o` a, b et c sont les entres, x et y les
e e
u
e
sorties.
a
b
c
a
0
0
0
0
1
1
1
1
b
0
0
1
1
0
0
1
1
c (b c) (b c) (a (b c))
0
0
0
0
1
0
1
0
0
0
1
0
1
1
0
0
0
0
0
0
1
0
1
1
0
0
1
1
1
1
0
0
x
0
1
1
0
1
0
0
1
y
0
0
0
1
0
1
1
1
0
0
0
00
0
0
1
01
0
1
0
01
0
1
1
10
1
0
0
01
1
0
1
10
1
1
0
10
1
1
1
11
ANNEXE C. CONTROLES TYPES
234
Lors dun codage en binaire sur k bits, seuls les nombres entiers relatifs n tels
que 2k1 n < 2k1 peuvent tre reprsents (n [2k1 ; 2k1 [).
e
e
e
Application numrique : k = 4 : [241 ; 241 [ = [8; +8[
e
2. Coder lentier n = (93)10 sur k = 8 chires en base b = 2 en utilisant la reprsentation
e
du complment ` 2.
e
a
n = (93)10 =
(10100011)2
+ (n) = (+93)10 =
(01011101)2
0 =
(0)10 =
1(00000000)2
`
Le bit de poids fort (le 9eme bit ` partir de la droite : 1) est perdu.
a
235
ANNEXE C. CONTROLES TYPES
236
1
2
3
4
5
6
def rechercheKieme (t ,x , k ):
"""
recherche la ki` me occurrence de x dans le tableau t
e
-> ( found , index )
( found == False and index == len ( t )) or
( found == True and 0 <= index < len ( t ))
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
237
1
2
3
4
def g (t ,x ,k , d ):
assert type ( t ) is list
assert type ( k ) is int and k > 0
assert d in [0 ,1]
5
6
7
8
9
10
11
12
13
14
15
16
17
return ok , i
ANNEXE C. CONTROLES TYPES
238
239
a
289
289
289
289
289
289
289
289
x
1
1024
256
64
16
4
1
1
z
289
289
33
33
33
33
0
0
t
1
1
768
320
144
68
35
35
y
0
0
384
160
72
34
17
17
print a,x,z,t,y
289 =
a.
Calcul de
Dans cette section, on se propose de calculer selon la mthode des rectangles.
e
Selon cette mthode, on calcule ` partir de lexpression de la surface S dun cercle de rayon
e
a
unit. On approche la surface du quart de cercle par n rectangles daire Ai = yi /n.
e
ANNEXE C. CONTROLES TYPES
240
1
x
k
et yk =
n
k2
n2
k2
. La surface du 1/4 de
n2
n
1
n
k=0
1
n
n
k=0
k2
1 2.
n
Dans cette section, on recherche le zro dune fonction f continue sur un intervalle [a, b] telle
e
que f (a).f (b) < 0 (il existe donc une racine de f dans ]a, b[ que nous supposerons unique).
241
Ecrire un algorithme qui dtermine le zro de cos(x) dans [1, 2] selon la mthode des tane
e
e
gentes.
Indications : soit xn une approximation de la racine c recherche : f (c) = f (xn ) + (c
e
xn )f (xn ) ; comme f (c) = 0, on a : c = xn f (xn )/f (xn ). Posons xn+1 = xn f (xn )/f (xn ) :
on peut considrer que xn+1 est une meilleure approximation de c que xn . On recommence le
e
procd avec xn+1 et ainsi de suite jusqu` ce que |xn+1 xn | soit infrieur ` un certain seuil s.
e e
a
e
a
Remarque C.3 :
Remarque C.4 :
Lcriture du multiplicande seectue de droite `
e
a
gauche (exemple : 352 scrira donc 253).
e
Lcriture du multiplicateur seectue de bas en haut
e
(exemple :
3
5
2
scrira donc
e
2
5
3
).
ANNEXE C. CONTROLES TYPES
242
sa position, en transfrant les dizaines de chaque somme partielle ` la diagonale suivante et en les
e
a
ajoutant ` ce qui y gure.
a
La somme que tu obtiendras sera le rsultat.
e
7
8
8
4
2
7
6
2
4
2
1
0
6
8
4
4
2
1
0
0
8
4
2
8
3
0
0
0
2
6
3
7
6
1
0
0
2 4
1 2
0 1
243
= 2
3 15 35 63
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n
k=1
4k 2
4k 2 1
def pi ( n ):
"""
y = pi ( n )
calcule pi ` l ordre n
a
>>> abs ( pi (1) - math . pi ) < 1.
True
>>> abs ( pi (100) - math . pi ) < 1./100
True
>>> abs ( pi (10000000) - math . pi ) < 1. e -7
True
"""
assert type ( n ) is int and n > 0
y = 2.
for k in range (1 , n +1):
u = 4* k * k
y = y * u /( u -1)
return y
Remarque C.5 :
ANNEXE C. CONTROLES TYPES
244
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def code (n ,b , k ):
"""
c = code (n ,b , k )
code n en base b sur k chiffres
>>> code (23 ,2 ,8)
[0 , 0 , 0 , 1 , 0 , 1 , 1 , 1]
>>> code (23 ,2 ,7)
[0 , 0 , 1 , 0 , 1 , 1 , 1]
>>> code (23 ,5 ,5)
[0 , 0 , 0 , 4 , 3]
>>> code (23 ,21 ,2)
[1 , 2]
>>> code (23 ,25 ,6)
[0 , 0 , 0 , 0 , 0 , 23]
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
"""
assert type ( n ) is int and n >= 0
assert type ( b ) is int and b > 1
assert type ( k ) is int and k > 0
c = []
for i in range ( k ): c . append (0)
q = n
i = k -1
while q > 0 and i >= 0:
r = q%b
q = q/b
c[i] = r
i = i - 1
return c
245
Quinconce
Dnir une procdure qui dessine n m cercles de rayon r disposs en quinconce sur n
e
e
e
ranges de m cercles chacune. On utilisera les instructions de trac ` la Logo.
e
ea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def quinconce (n ,m , r ):
"""
quinconce (n ,m , r )
trace n rang es de m cercles de rayon r
e
dispos es en quinconce
e
>>> quinconce (5 ,10 ,10)
"""
assert type ( n ) is int and n > 0
assert type ( m ) is int and m > 0
assert type ( r ) is int and r > 0
for i in range ( n ) :
x0 = r *( i %2)
y0 = 2* i * r
for j in range ( m ) :
up ()
goto ( x0 +2* j *r , y0 )
down ()
circle ( r )
return
Remarque C.6 :
ANNEXE C. CONTROLES TYPES
246
Coecients de Kreweras
On consid`re la fonction g ci-dessous.
e
1
2
3
4
5
6
7
8
9
10
11
12
13
def g (n , m ):
assert type ( n ) is int
assert type ( m ) is int
assert 0 <= m and m <= n
if n == 0 and m == 0:
c = 1
else :
if m == 0: c = 0
else :
c = 0
for i in range (1 , m +1):
c = c + g (n -1 ,n - i )
return c
n
n
n
n
n
n
n
=
=
=
=
=
=
=
0
1
2
3
4
5
6
:
:
:
:
:
:
:
1
0
0
0
0
0
0
1
1 1
1 2 2
2 4 5 5
5 10 14 16 16
16 32 46 56 61 61
247
2. Vrier que 12.*g(5,5)/g(6,6) est une bonne approximation de .
e
>>> 2.*6*g(5,5)/g(6,6)
3.1475409836065573
>>> 2.*12*g(11,11)/g(12,12)
3.1416005461074121
def g(x):
x = 4*f(x)
print g, x
return x
def h(x):
x = 3*g(f(x))
print h, x
return x
2. >>> x = 2
>>> print x
2
>>> x = f(x)
f 4
>>> print x
4
>>> x = g(x)
f 8
g 32
>>> print x
32
>>> x = h(x)
f 64
f 128
g 512
h 1536
>>> print x
1536
ANNEXE C. CONTROLES TYPES
248
1
2
3
4
5
6
7
8
9
10
11
def f ( n ):
for p in range ( n +1):
num = 1
den = 1
for i in range (1 , p +1) :
num = num *( n - i +1)
den = den * i
c = num / den
print c , # - - - - - - - - - - - - affichage
print
# - - - - - - - - - - - - affichage
return
1
2
3
4
5
6
1
3 1
6 4 1
10 10 5 1
15 20 15 6 1
e
Le pi`me coecient du binme (x + y)n avec 0 p n.
o
Index
Ackerman, 132
Bloom, 11
De Morgan, 48
Dijkstra, 177
Dreyfus, 4
`
Eratosthene, 211
Euclide, 208
Gauss, 199
Hoare, 177
Moore, 27
Perret, 4, 31
Simpson, 136
Von Koch, 210
Von Neumann, 5, 257
arbre, 161
bit, 8
boucle
boucles imbriques, 59
e
condition darrt, 97
e
invariant, 98
itration conditionnelle, 52
e
parcours de squence, 58
e
calcul Shadok, 25, 30
cha de caract`res, 164
ne
e
codes ASCII, 194
collection de donnes, 160
e
compilateur, 9
contrle, voir valuation
o
e
aectation, 43
algorithme
complexit, 7, 172
e
dnition, 6
e
ecacit, 7
e
robustesse, 7
rutilisabilit, 7, 100
e
e
validit, 6
e
algorithmique, 6
alternative, voir test
250
INDEX
valuation des enseignements, 16, 33
e
notation, 15
planning des valuations, 34
e
qcm, voir contrle dattention
o
le, 167
fonction
appel quivalent, 116
e
description, 111
dnition, 102
e
espace de noms, 120
implmentation, 104
e
invariant, 108
ordre des param`tres, 120
e
param`tre dentre, 106
e
e
param`tre de sortie, 106
e
param`tre eectif, 116
e
param`tre formel, 115
e
param`tre par dfaut, 119
e
e
passage par rfrence, 117
ee
passage par valeur, 117, 130
postcondition, 108
prcondition, 107
e
qcm, 128
rcursivit, 122
e
e
rcursivit non terminale, 126
e
e
rcursivit terminale, 126
e
e
spcication, 104
e
for, 58
graphe, 161
if, 47
if ... else, 48
INDEX
multiplication arabe, 23, 29
multiplication ` la russe , 23, 29
a
n-uplet, 163
norme IEEE 754, 133
octet, 8, 27
oprateurs boolens, 47
e
e
ordinateur, 4, 31
pile, 167
procdure, 103
e
programmation, 8
compilation, 10
interprtation, 10
e
semi-compilation, 10
pdagogie
e
apprendre en faisant, 19
mthodes de travail
e
appropriation, 17, 19
participation, 17, 18
prparation, 16, 18
e
objectifs comportementaux, 12
pdagogie de lerreur, 12
e
pdagogie par lexemple, 12
e
pdagogie par objectifs, 12
e
pdagogie par probl`mes, 12
e
e
taxonomie de Bloom, 11
recherche dans une squence
e
recherche dun motif, 184
recherche dichotomique, 172, 217
recherche squentielle, 171, 217
e
rcursivit, 122
e
e
rptition, voir boucle
e e
251
squence, 160
e
Fifo, 167
Lifo, 167
cha de caract`res, 164
ne
e
le, 167
liste, 165
n-uplet, 163
pile, 167
test, 46
alternative multiple, 50
alternative simple, 49
test simple, 47
tri dune squence
e
tri bulles, 184, 219
tri fusion, 219
tri par insertion, 175, 220
tri par slection, 174, 221
e
tri rapide, 177, 221
tri shell, 186
type abstrait de donnes, 159, 193
e
type de donnes, 159
e
variable
dnition, 42
e
nom de variable, 42
porte, 120, 130
e
type, 159
variable globale, 121
variable locale, 120
while, 52
Dnitions
e
aectation, 43
algorithme, 6
algorithmique, 6
alternative multiple, 50
alternative simple, 49
arbre, 161
invariant, 108
invariant de boucle, 98
itration conditionnelle, 52
e
langage de programmation, 9
liste, 165
logiciel, 4
bit, 8
matriel, 4
e
n-uplet, 163
octet, 8
param`tre dentre, 106
e
e
param`tre de sortie, 106
e
param`tre eectif, 116
e
param`tre formel, 115
e
passage par rfrence, 117
ee
passage par valeur, 117
pile, 167
postcondition, 108
procdure, 103
e
programmation, 9
prcondition, 107
e
DEFINITIONS
rcursivit non terminale, 126
e
e
rcursivit terminale, 126
e
e
rutilisabilit dun algorithme, 7
e
e
spcication dun algorithme, 104
e
squence, 57, 160
e
test simple, 47
type, 159
validit dun algorithme, 6
e
variable, 42
253
Exercices
Python, 11, 13, 18
damier, 61
dessin dtoiles, 53, 59
e
dessins gomtriques, 74
e e
dessins sur la plage, 13, 22
division chinoise, 24
division enti`re, 56
e
dcodage base b dcimal, 112
e
e
dveloppements limits, 73
e
e
environnement de travail, 18
excutions dinstructions itratives, 71
e
e
gure gomtrique, 62, 72
e e
fonction dAckerman, 132
fonction factorielle, 54, 62
fonction porte, 49
254
EXERCICES
255
site Web, 14
spcication et implmentations, 114
e
e
stockage de donnes, 22
e
suite arithmtique, 44, 126
e
suite gomtriques, 131
e e
suites numriques, 73
e
slection dlments, 166
e
ee
squence daectations, 45, 66
e
squences de tests, 70
e
tables de vrit, 74
e e
tours de Hano 123
,
tri bulles, 184
tri dun annuaire, 174
tri par insertion, 176
unit de longueur, 66
e
unit de pression, 42
e
units dinformation, 9
e
valeurs par dfaut, 119
e
zro dune fonction, 75
e
Algorithmes
algorithme dEuclide, 45, 51, 55, 208
palindrome, 215
permutation circulaire, 66
permutation de nombres, 45
polygones rguliers, 22, 28
e
produit de matrices, 216
valeur absolue, 49
zro dune fonction, 75, 89
e
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
257
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
5
5
6
7
8
8
9
11
14
15
17
23
24
24
25
26
26
27
31
31
32
32
258
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
ALGORITHMES
Dnition de lacadmie (4) . . . . .
e
e
Mots rservs en Python . . . . . .
e
e
Types de base en Python . . . . . .
Dnition de lacadmie (5) . . . . .
e
e
Principales aectations en Python .
Flux dinstructions . . . . . . . . . .
Dnition de lacadmie (6) . . . . .
e
e
Le test simple . . . . . . . . . . . . .
Principaux oprateurs Python . . .
e
Lalternative simple . . . . . . . . .
Aiguillage if ... else . . . . .
if ... else imbriqus . . . . .
e
Lalternative multiple . . . . . . . .
Dnition de lacadmie (7) . . . . .
e
e
Boucle while . . . . . . . . . . . . .
Euclide . . . . . . . . . . . . . . . .
Boucle for . . . . . . . . . . . . . .
Blocs dinstructions . . . . . . . . .
Nid dabeilles . . . . . . . . . . . . .
Invariant de boucle . . . . . . . . . .
Rutilisabilit dun algorithme . . .
e
e
Encapsulation . . . . . . . . . . . . .
Module math de Python . . . . . .
Mtaphore de la bo de cubes . . .
e
te
Mots rservs en Python . . . . . .
e
e
Param`tres dune fonction . . . . . .
e
Fonction fibonacci (1) . . . . . . .
Robustesse dun algorithme . . . . .
Linstruction assert en Python . .
Dnition de lAcadmie (8) . . . . .
e
e
Fonction fibonacci (2) . . . . . . .
Le module doctest . . . . . . . . .
Fonction fibonacci (3) . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
42
43
43
44
44
46
46
47
47
48
49
49
50
52
52
56
58
59
60
97
100
101
102
103
105
106
107
107
107
108
108
109
112
ALGORITHMES
3.14
3.15
3.16
3.17
3.18
3.19
3.20
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
4.16
4.17
4.18
4.19
4.20
259
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
122
123
123
124
125
137
156
158
160
160
161
161
161
162
162
165
167
167
167
168
168
174
175
177
177
194
200
260
ALGORITHMES
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
gar et un piton
e e
e
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
261
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
6
8
12
19
42
45
45
48
49
49
49
51
51
52
54
54
55
58
59
60
60
62
262
2.19
2.20
3.1
3.2
3.3
3.4
3.5
3.6
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
ALGORITHMES
Nombres de Fibonacci . . . . . . . . .
Enfoncer un clou . . . . . . . . . . . .
Numration en base b . . . . . . . . .
e
Nombres fractionnaires . . . . . . . . .
Calcul de sin(/2) . . . . . . . . . . .
Nombres de Fibonacci . . . . . . . . .
Tours de Hano . . . . . . . . . . . . .
Fonction factorielle . . . . . . . . . . .
Distance entre 2 points du plan . . . .
Tas de chaussures . . . . . . . . . . . .
Tableau nal dun tournoi de football
Carte routi`re . . . . . . . . . . . . . .
e
Pile dassiettes . . . . . . . . . . . . .
File dattente de voitures . . . . . . .
Echiquier . . . . . . . . . . . . . . . .
Addition de 2 matrices . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
62
95
100
101
102
104
123
124
158
160
161
162
167
167
168
170
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
263
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
6
7
9
11
13
13
13
14
14
15
15
15
16
17
17
18
18
20
21
22
22
22
264
1.24
1.25
1.26
1.27
1.28
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23
2.24
2.25
2.26
2.27
2.28
ALGORITHMES
Tracs de polygones rguliers .
e
e
La multiplication ` la russe
a
La multiplication arabe . . . .
La division chinoise . . . . . . .
Le calcul Shadok . . . . . . . .
Unit de pression . . . . . . . .
e
Suite arithmtique (1) . . . . .
e
Permutation circulaire (1) . . .
Squence daectations (1) . .
e
Oprateurs boolens drivs (1)
e
e
e e
Circuit logique (1) . . . . . . .
Lois de De Morgan . . . . . . .
Maximum de 2 nombres . . . .
Fonction porte . . . . . . .
Ouverture dun guichet . . . .
Catgorie sportive . . . . . . .
e
Dessin dtoiles (1) . . . . . . .
e
Fonction factorielle . . . . . . .
Fonction sinus . . . . . . . . .
Algorithme dEuclide . . . . . .
Division enti`re . . . . . . . . .
e
Achage inverse . . . . . . . .
Parcours inverse . . . . . . . .
Suite arithmtique (2) . . . . .
e
Dessin dtoiles (2) . . . . . . .
e
Oprateurs boolens drivs (2)
e
e
e e
Damier . . . . . . . . . . . . .
Trace de la fonction factorielle
Figure gomtrique . . . . . . .
e e
QCM (2) . . . . . . . . . . . .
Unit de longueur . . . . . . .
e
Permutation circulaire (2) . . .
Squence daectations (2) . .
e
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
22
23
23
24
25
42
44
45
45
47
47
48
49
49
50
51
53
54
55
56
56
58
58
58
59
60
61
62
62
63
66
66
66
ALGORITHMES
2.29
2.30
2.31
2.32
2.33
2.34
2.35
2.36
2.37
2.38
2.39
2.40
2.41
2.42
2.43
2.44
2.45
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
265
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
67
70
70
70
71
71
72
73
73
73
73
73
74
74
75
75
97
100
101
112
113
114
116
119
121
123
125
126
126
128
130
130
131
266
3.17
3.18
3.19
3.20
3.21
3.22
3.23
3.24
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
4.16
4.17
4.18
4.19
4.20
4.21
4.22
4.23
4.24
4.25
ALGORITHMES
Puissance enti`re . . . . . . . . . . . . . . . . . . . . . . .
e
Coecients du binme . . . . . . . . . . . . . . . . . . . .
o
Fonction dAckerman . . . . . . . . . . . . . . . . . . . . .
Addition binaire . . . . . . . . . . . . . . . . . . . . . . .
Complment ` 2 . . . . . . . . . . . . . . . . . . . . . . .
e
a
Codage-dcodage des rels . . . . . . . . . . . . . . . . . .
e
e
Intgration numrique . . . . . . . . . . . . . . . . . . . .
e
e
Tracs de courbes paramtres . . . . . . . . . . . . . . .
e
e e
Distance de 2 points de lespace . . . . . . . . . . . . . . .
Oprations sur les n-uplets . . . . . . . . . . . . . . . . .
e
Pgcd et ppcm de 2 entiers (2) . . . . . . . . . . . . . . . .
Oprations sur les cha
e
nes . . . . . . . . . . . . . . . . . .
Inverser une cha . . . . . . . . . . . . . . . . . . . . . .
ne
Caract`res, mots, lignes dune cha . . . . . . . . . . . .
e
ne
Oprations sur les listes (1) . . . . . . . . . . . . . . . . .
e
Oprations sur les listes (2) . . . . . . . . . . . . . . . . .
e
Slection dlments . . . . . . . . . . . . . . . . . . . . .
e
ee
Oprations sur les piles . . . . . . . . . . . . . . . . . . .
e
Oprations sur les les . . . . . . . . . . . . . . . . . . . .
e
Produit de matrices . . . . . . . . . . . . . . . . . . . . .
Annuaire tlphonique . . . . . . . . . . . . . . . . . . . .
ee
Recherche dichotomique . . . . . . . . . . . . . . . . . . .
Liste ordonne . . . . . . . . . . . . . . . . . . . . . . . .
e
Tri dun annuaire tlphonique . . . . . . . . . . . . . . .
ee
Complexit du tri par slection . . . . . . . . . . . . . . .
e
e
Tri par insertion . . . . . . . . . . . . . . . . . . . . . . .
Comparaison dalgorithmes (1) . . . . . . . . . . . . . . .
QCM (4) . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gnration de squences . . . . . . . . . . . . . . . . . . .
e e
e
Application dune fonction ` tous les lments dune liste
a
ee
Que fait cette procdure ? . . . . . . . . . . . . . . . . . .
e
Codes ASCII et cha
nes de caract`res . . . . . . . . . . .
e
Oprations sur les matrices . . . . . . . . . . . . . . . . .
e
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
131
131
132
132
132
133
134
136
158
163
163
164
164
165
165
166
166
168
168
170
171
172
174
174
175
176
179
180
182
182
182
183
183
ALGORITHMES
4.26
4.27
4.28
4.29
4.30
4.31
267
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
184
184
184
184
184
185
268
ALGORITHMES
Rfrences
ee
[1] Harold Abelson, Gerald Jay Sussman, and Julie Sussman. Structure et interprtation des
e
programmes informatiques. InterEditions, 1989.
Autre approche de lalgorithmique fonde sur la programmation fonctionnelle.
e
cit page 2.
e
[2] Jean-Luc Chabert, Evelyne Barbin, Michel Guillemot, Anne Michel-Pajus, Jacques Borowczyk, Ahmed Djebbar, and Jean-Claude Martzlo. Histoire dalgorithmes : du caillou ` la
a
puce. Belin, 1994.
Regard historique sur quelques algorithmes dont celui de la multiplication arabe.
cit page 23.
e
sous le titre Fang cheng (la disposition rectangulaire) dcrit la mthode dlimination de Gauss .
e
e
e
cit page 204.
e
REFERENCES
270
Ouvrage de vulgarisation sur la complexit.
e
cit page 21.
e
[8] Pierre Florent, Michelle Lauton, and Grard Lauton. Outils et mod`les mathmatiques,
e
e
e
volume 3. Vuibert, 1977.
Ouvrage dintroduction ` lalg`bre linaire dont le chapitre 4 traite de la rsolution numrique des syst`mes
a
e
e
e
e
e
algbriques linaires non homog`nes.
e
e
e
cit pages 169,200.
e
[9] Christine Froidevaux, Marie-Christine Gaudel, and Mich`le Soria. Types de donnes et
e
e
algorithmes. McGraw-Hill, 1990.
Bonne introduction aux types abstraits de donnes et ` la complexit des algorithmes.
e
a
e
cit pages 172,173.
e
[12] Donald Ervin Knuth. The art of computer programming, volume 1-Fundamental algorithms,
2-Seminumerical Algorithms, 3-Searching and sorting. Addison-Wesley, 1997.
La rfrence en algorithmique. Deux autres volumes sont en prparation : 4-Combinatorial Algorithms et
ee
e
5-Syntactic Algorithms. Pour la petite histoire, D.E. Knuth est galement lauteur de TEX (prononcer tech
e
comme dans technologie), syst`me logiciel de composition de documents utilis pour gnrer le document
e
e
e e
que vous tes en train de lire cr ` partir de 1977 pour rpondre ` la mauvaise qualit typographique
e
ee a
e
a
e
de la deuxi`me dition de The art of computer programming.
e
e
cit pages 172,173.
e
[13] Zohar Manna and Richard Waldinger. The logical basis for computer programming, volume
1 : Deductive reasoning. Addison-Wesley, 1985.
REFERENCES
271
Ouvrage sur les types abstraits de donnes prsents ` laide dun formalisme logique rigoureux.
e
e
e a
cit pages 159, 193.
e