Introduction A L'algorithmique Et A La Programmation Avec Python
Introduction A L'algorithmique Et A La Programmation Avec Python
Laurent Signac
https://deptinfo-ensip.univ-poitiers.fr
27 septembre 2017
Algorithmique et Programmation avec Python
2
Table des matières
II Algorithmique et programmation 15
5 À quoi sert un algorithme ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6 Algorithme d’Euclide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
7 Poser les problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8 Types, affectations, expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
9 Fonctions et procédures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
10 Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
11 Boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
12 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
13 Notation pointée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
14 Affectation, mode de passage des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
15 Récursivité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
16 Résoudre des problèmes : méthode de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
17 Récursivité et Logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3
Algorithmique et Programmation avec Python
Notations
Dans ce support de cours, les programmes sont généralement typographiés en police machine à écrire et encadrés,
alors que les algorithmes n’ont pas de cadre et utilisent une police sans empattements.
Sauf si une indication contraire est donnée, le langage utilisé est Python. On différencie les «sessions shell» par la
présence du prompt >>>. En l’absence de prompt, il s’agit généralement d’un programme à entrer dans un éditeur de
texte et à exécuter ensuite (l’interface Idle convient très bien pour faire tout ceci).
Introduction
L’informatique, telle que nous la connaissons aujourd’hui résulte à la fois des progrès théoriques, amorcés dans les
années 30 par les travaux de Turing, et des progrès technologiques, liés à l’électronique, avec en particulier l’invention
du transistor dans les années 40.
Depuis, ces deux facettes, science théorique et défis technologiques progressent de conserve.
L’objet de ce cours est de présenter l’ère numérique sous l’angle du codage des informations, puis celle des ordinateurs
sous celui des algorithmes et de la programmation.
Ressources
La dernière version de ce fichier est disponible ici : https://deptinfo-ensip.univ-poitiers.fr/FILES/PDF/python1a.
pdf
Les ressources Web associées à ce cours sont :
— Sur Updago : Algorithmique et Programmation Python
— https://deptinfo-ensip.univ-poitiers.fr/ENS/doku
Les introduction à Python sont nombreuses sur le Web, et certaines sont de très bonne qualité :
— Le cours de Bob Cordeau :
http://perso.limsi.fr/pointal/python:courspython3
— Le cours de Pierre Puiseux :
http://web.univ-pau.fr/~puiseux/enseignement/python/python.pdf
Voici ceux qui ont été utilisés lors de l’écriture de ce cours 1 :
— Le Goff, Vincent, Apprenez à Programmer en Python, Le livre du Zéro
— Puiseux, Pierre, Le Langage Python, Ellipses TechnoSup
— Chazallet, Sébastien, Python 3 – Les fondamentaux du langage, Eni
— Zelle, John, Python Programming, Franklin, Beedle, and Associates
— Lee, Kent D., Python Programming Fundamentals, Springer
— Summerfield, Mark, Programming in Python 3, Addison Wesley, 2e ed.
Les parties du cours qui ne concernent pas précisément Python sont issues de nombreux ouvrages impossibles à tous
mentionner ici et de quelques années de pratique.
Licence
Ce travail est mis à disposition sous licence Creative Commons by nd (paternité, pas de modification).
http://creativecommons.org/licenses/by-nd/3.0
4
Chapitre I
1 Ordinateur ?
Les machines électroniques nous entourent désormais : de la simple calculatrice aux super-ordinateurs, en passant par
les smartphones, les tablettes et les micro-ordinateurs. À partir de quel degré de complexité avons-nous affaire à un
ordinateur ?
Comme nous allons le voir, les ordinateurs actuels sont à peu près calqués sur un modèle datant des années 50, le
modèle de Von Neumann. Si nous devions retenir deux caractéristiques des ordinateurs, ce serait que :
— un ordinateur doit être programmable
— son programme doit être enregistré dans sa mémoire.
Par voie de conséquence, une simple calculatrice de poche n’est pas vraiment un ordinateur, alors que les modèles
programmables plus perfectionnés en sont. De même que les tablettes et les smartphones...
5
Algorithmique et Programmation avec Python
Pourquoi le binaire ?
Il y a une raison théorique et une raison technique à l’utilisation du binaire :
— on ne peut pas faire plus simple que 2 symboles. Avec un seul symbole, plus rien ne fonctionne (on a un seul
codage de longueur fixe, la taille de l’écriture d’un nombre, écrit en unaire est proportionnelle au nombre, et
non pas à son logarithme).
— les deux symboles 0 et 1 sont transposables électroniquement par : le courant passe ou ne passe pas (système
assez robuste)
On représente donc toutes les informations sous forme de bits (binary digit = chiffre binaire). La quantité d’infor-
mation est justement le nombre de bits nécessaires pour représenter cette information.
Unités
— le bit (binary digit) est l’unité d’information : 0 ou 1
— l’octet est un groupe de 8 bits (attention, octet se dit byte en anglais)
Tout le reste.... dépend du contexte. En particulier, le préfixe «kilo» correspond dans le système international au
multiplicateur 103 , mais conventionnellement, il était utilisé en informatique pour le multiplicateur 210 . La vérité 2
est que, maintenant, nous devrions utiliser les préfixes du si pour le multiplicateur 103 (symboles k,M,G...) et
d’autres préfixes (kibi, mébi, gibi,... symboles ki,Mi,Gi...) pour les multiplicateurs 210 , 220 , 230 ...Il en est de même
pour les débits (bits/seconde, puis kbits par seconde etc...). Dans les symboles, le «o» de octet est parfois remplacé
par le «B» de byte, à ne pas confondre avec le «b» de bit...
Enfin, l’explorateur Windows utilise le symbole Ko pour 210 octets (alors que ce devrait être 103 octets) et l’utilitaire
gnu du -k utilise aussi des kilos de 1024 octets (encore qu’il a une option supplémentaire permettant d’utiliser les
kilos du si).
Dans le doute, partez du principe que si on vous vend de la mémoire (disque dur, mémoire flash...) sa taille est
indiqué en utilisant le si...
où v(ci ) est la valeur associée au chiffre (symbole) ci . La valeur du symbole 9 en base 10 est par exemple neuf.
Généralement, pour une base b inférieure à 10, on reprend les même chiffres qu’en base 10, avec les mêmes valeurs
(mais on n’utilise que les b premiers chiffres). Pour une base b supérieure à 10, on ajoute aux chiffres ordinaires d’autres
symboles, comme des lettres. La base 16 utilise par exemple les 16 chiffres suivantes : 0, 1, 2, ..., 9, A, B, C, D, E, F .
Voici quelques exemple, la base est indiquée en indice à la fin du nombre. En l’absence de cet indication, c’est la base
10 qui est utilisée.
1011010|2 = 1 × 26 + 0 × 25 + 1 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20 = 90
5A|16 = 5 × 161 + 10 × 160 = 90
Pour passer de la base 10 à la base 2, on peut procéder par divisions successives (par 2). Voici comment trouver
l’écriture binaire de 90 :
90 = 2 × 45 +0
45 = 2 × 22 +1
22 = 2 × 11 +0
11 = 2 × 5 +1
5 =2×2 +1
2 =2×1 +0
1 =2×0 +1
La séquence des restes successifs, lue du dernier au premier donne : 1011010 qui est l’écriture en base 2 de 90.
On peut procéder de même en base 16 (en faisant des divisions par 16). Les restes sont alors entre 0 et 15, ce qui
correspond bien aux valeurs des chiffres de la base 16.
Les nombres non-entiers sont codés de la même manière. Chaque chiffre placé après la virgule est associé à une
puissance négative de la base :