Académique Documents
Professionnel Documents
Culture Documents
الجمهوريـــة التونسيـــة
Ministère de l’Enseignement Supérieur, de la Recherche
وزارة التعلين العالي و البحث العلمي
Scientifique
UNIVERSITE DE GABES
Institut Supérieur des Sciences Appliquées et de جامعة قابس
Technologie de Gabès المعهد العالي للعلىم التطبيقيت والتكنىلىجيا بقابس
CHAPITRE I:
Rappel des notions algorithmiques
1. Introduction
Un algorithme est une suite d'opérations que devra effectuer pour arriver en un temps fini, à un
résultat désiré à partir d'une situation donnée. Cette suite sera formée d'actions élémentaires
appelées instructions.
Pour développer un algorithme résolvant un problème donné, deux approches sont possibles :
l’approche descendante et l’approche ascendante.
Dans ce cours nous nous intéresserons à l'approche descendante vue que l’approche descendante est
systématique et permet d’arriver rapidement à un squelette d’algorithme.
L’approche descendante consiste à décomposer le problème initial en sous problèmes de plus petite
taille et ainsi de suite jusqu’à arriver à des problèmes solubles.
1
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
b) Le type réel :
Domaine des valeurs : Désigne les valeurs des nombres réels, codé sur 6 Octets
Les opérateurs utilisés sur les réels : +, *, - , / , > , < , <>, >= , <=, = .
2
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
4.2. Affectation
L’opération d’affectation attribue une valeur à une variable. Elle permet soit d’initialiser la variable à
une valeur donnée soit de modifier la valeur courante d’une variable par une autre valeur.
syntaxe algorithmique : Identificateur valeur
3
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
N.B : Pour la forme simple complète, si la valeur de la condition est Vrai les instructions du
Traitement-1 seront exécutées alors que si cette valeur est fausse les instructions du Traitement-2
seront exécutées.
4
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
{Init }….
Selon Sélecteur Faire
Valeur(s)1 : Traitement 1
Valeur(s)2 : Traitement 2
……...……
Valeur(s)n : Traitement n
Sinon
Traitement n+1
Fin Selon
Le sélecteur est une variable de type scalaire discret (entier, caractère, booléen, énuméré,
intervalle).
Plusieurs valeurs peuvent entraîner dans un même traitement. Nous pouvons alors énumérer ces
valeurs en les séparants par des virgules, avant de décrire le traitement à entreprendre comme
nous pouvons utiliser des intervalles pour le type entier caractères.
La partie « Sinon » est facultative.
Remarque :
vi : valeur initiale du compteur
vf : valeur finale du compteur
Le compteur est une variable de type scalaire (Entier, caractère ou booléen).
Le traitement de la boucle « Pour » s’arrête lorsque le compteur atteint la valeur finale (vf).
Dans la boucle « Pour simple », à chaque répétition, le compteur sera automatiquement
incrémenté (augmenté) d’une unité (compteur compteur +1)
Dans la boucle « Pour avec pas », à chaque répétition, le compteur sera automatiquement :
- incrémenté (augmenté) d’une pas=p ( compteur compteur +p si vi < vf )
- décrémenté (retranché) d’une pas=p ( compteur compteur -p si vi > vf )
5
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Saisie Affichage
Remarque :
Cet ordre d’itération permet de répéter le traitement un ou plusieurs fois.
En effet lorsque la condition est vérifiée la boucle s’arrête, sinon elle ré-exécute le traitement.
Il doit y avoir une action dans le traitement qui modifie la valeur de la condition.
La structure itérative à condition d’arrêt répéter jusqu'à peut remplacer la structure itérative
complète. Mais le contraire n’est pas valable.
6
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Syntaxe :
Au niveau de l’algorithme
{init}
Tant que (non arrêt) faire
Instruction 1
Instruction 2
……..
Instruction n
Fin Tant que
Remarque :
Le paramètre de la condition doit être initialisé par lecture ou par affectation avant la boucle,
car si l’initialisation n’a pas été faite, le traitement itératif risque de ne pas être exécuté.
Il doit y avoir une action dans le traitement qui modifie la valeur de la condition.
Contrairement au Répéter jusqu’à, on remarque que la condition est d’abord testée, puis si elle
est satisfaite, l’action est exécutée (la condition précède toujours l’action).
RETENONS :
Pour les structures itératives à condition d’arrêt, le traitement de la boucle « REPETER » s’exécute
dans tous les cas au moins une fois alors que pour la boucle « TANT QUE », on peut tomber dans un
cas où le traitement correspondant ne s’exécute pas aucune fois et ceci si dès la première évaluation
la condition est fausse.
Bibliographie :
1. http://4bts.blogspot.com/p/algorithme_1021.html
2. https://fr.scribd.com/document/89884054/Cours-Algorithme
3. https://sites.google.com/site/mahdhaouibrahim/resolutions
4. http://www.kiteb.net/education/informatique/programmation/scientifiques/fiches/fiche-
scalaire-intervalle-tableau.pdf
5. http://xn--webducation-dbb.com/?media_dl=1555
7
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
CHAPITRE II:
1. Introduction
Python est développé depuis 1989 par Guido van Rossum et de nombreux contributeurs. Un
classement des langages de programmation les plus populaires, par
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Classement de TIOBE
Avril 2017 Avril 2016 Langage de programmation Evaluation Changement
1 1 Java 15.568% -5.28%
2 2 C 6.966% -6.94%
3 3 C++ 4.554% -1.36%
4 4 C# 3.579% -0.22%
5 5 Python 3.457% +0.13%
6 6 PHP 3.376% +0.38%
7 10 Visual Basic .NET 3.251% +0.98%
8 7 JavaScript 2.851% +0.28%
9 11 Delphi/Object Pascal 2.816% +0.60%
10 8 Perl 2.413% -0.11%
11 9 Ruby 2.310% -0.04%
12 15 Swift 2.287% +0.81%
1
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
portables, mais on doit utiliser des compilateurs différents et, d'un système à l'autre,
certaines instructions ne sont pas compatibles, voire se comportent différemment.
Il est possible d’entrer une expression longue de plus d’une ligne (ou de forcer des passages à
la ligne ne devant pas être interprétés comme des demandes d’évaluation) avec le caractère \.
2
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Python n’est pas un outil de calcul formel. Il faut donc toujours initialiser une variable
avant de l’utiliser :
Une même variable (en fait un même identificateur) peut être successivement lié à des
valeurs de types différents (entiers, chaînes de caractère, etc.). Il n’y a donc pas lieu de
préciser au préalable le type de valeur que l’on désire placer dans telle ou telle variable (tout
cela est réalisé au moment de l’évaluation : c’est ce qu’on appelle le typage dynamique).
3
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
4
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
5
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Il est courant d’avoir à incrémenter une variable. L’instruction i = i+1 sera avantageusement
remplacée par i += 1. On dit que += est un opérateur avec assignation.
Voici la liste des opérateurs avec assignation de Python. Leur portée va bien au delà des types
numériques : ils s’appliquent à tous les types sur lesquels l’opération (addition, produit, etc.) a
un sens.
Quand le module math a été chargé, on obtient le détail des fonctions qu’il contient en tapant
help(math). Voici l’essentiel des fonctions du module math, évaluées en un argument x
quelconque :
6
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
7
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
L’exemple précédent est important. Les listes Python sont des objets composites (formés
d’éléments a priori disparates mais rassemblés dans une même structure). Si on modifie un
élément d’une liste, Python ne modifie pas l’adresse de celle-ci (en fait, il modifie
seulement l’adresse de l’élément concerné dans cette liste). Cela explique qu’après
l’instruction y = x (à l’issue de laquelle x et y pointent sur une même liste en mémoire), la
modification y[0] = 999 semble répercutée sur la liste contenue dans la variable x (tout
simplement car les variables x et y continuent à pointer sur la même adresse). L’instruction
y = x n’a donc pas associé à y une nouvelle copie de la liste associée à x, elle a fait pointer
y et x sur une même adresse (toute modification d’un des deux éléments x[k] ou y[k] sera
donc “répercutée” sur l’autre). Si on veut créer une copie d’une liste qui soit indépendante
de l’original, on procédera de la façon suivante :
8
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Remarque : l’expression x[:] est un cas particulier de la syntaxe x[a:b] qui renvoie la liste
des éléments de l’objet x situés de la position a (incluse) à la position b (exclue). Par défaut a
vaut 0 (c’est le début de l’objet x) et b vaut la longueur de cet objet. Ainsi x[:] envoie
donc la totalité de l’objet x (mais cette copie est indépendante de l’original).
4. Programmation Python
4.1. Entrée au clavier (input) et affichage à l’écran (print)
Les interactions d’un script avec l’utilisateur se feront essentiellement par l’attente de
données entrées au clavier, et par l’affichage de résultats ou de messages à l’écran.
L’expression input(message) affiche message à l’écran (sans passer à la ligne), attend que
l’utilisateur valide par “Entrée” une réponse au clavier, et renvoie cette réponse sous forme
de chaîne de caractères.
On peut bien sûr directement convertir la réponse reçue par input en un type particulier (int
et float notamment) :
La fonction print permet d’afficher des informations à l’écran. Il s’agit le plus souvent de
messages informatifs qui peuvent intervenir à tout moment de l’exécution du script.
Il est possible d’afficher successivement plusieurs objets sur une même ligne (ils sont alors
séparés par un espace, mais on peut préciser un autre séparateur avec l’option sep=). Un
affichage par print se termine par un passage à la ligne (mais on peut préciser un autre mode
de terminaison avec l’option end=)
9
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Exemple :
Ecrire un programme qui saisi un nombre et teste si l’entier est nul, pair ou impair.
10
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Application
Ecrire un programme qui saisi trois entiers a, b et c et résout l’équation de second degré
ax2+bx+c= 0.
Le bloc qui fait suite à l’instruction while peut contenir deux instructions
particulières, souvent attachées à un test if :
break provoque la sortie immédiate de la clause while.
continue ramène à l’évaluation de la condition (ce qui restait du bloc après
continue est donc ignoré).
Exemple :
On appelle suite de Syracuse une suite d’entiers naturels définie de la manière suivante :
On part d’un nombre entier plus grand que zéro; s’il est pair, on le divise par 2 ; s’il
est impair, on le multiplie par 3 et on ajoute 1. En répétant l’opération, ….
11
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Exercice 2 :
Modifier le programme précédant en ajoutant 3 niveaux de difficulté (difficile (4 tentatives),
Moyen (7 tentatives) ou facile (12 tentatives)).
Le joueur choisi un niveau de difficulté, un nombre d’essai lui est alors attribué, si ce dernier
épuise ses essais il aurait échoué et un message sera affiché.
Remarque: On lui indiquera à chaque fois le nombre de tentatives restantes.
12
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Exemple :
- l’intervalle range(7) représente la succession des valeurs 0, 1, 2,3, 4, 5, 6
- l’intervalle range(1,7) représente la succession des valeurs 1, 2, 3, 4, 5, 6
- l’intervalle range(1,7,2) représente la succession des valeurs 1, 3, 5
- l’intervalle range(7,2) est vide (ici le pas a sa valeur par défaut, c’est-à-dire 1)
- l’intervalle range(7,2,-1) représente la succession des valeurs 7, 6, 5, 4, 3
13
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Application
Écrire un programme python qui affiche tous les nombres cubiques formés de trois digits
exemples 153 = 13 + 53 + 33
14
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Les chaînes de caractères sont délimitées par des guillemets doubles ("abc") ou
simples ('abc').
Les listes sont des successions d’objets (eux-mêmes séparés par des virgules),
délimitées par des crochets [ et ]. Elles peuvent contenir des objets de type
quelconque. Un exemple de liste est [1,'a',[3.14,'xyz']].
Les tuples sont des successions d’objets (séparés par des virgules), délimitées par des
parenthèses ( et ). Les tuples peuvent contenir des objets de type quelconque. Un
exemple de tuple est : (1,'a',[3.14,'xyz']).
Remarquons que les fonctions intégrées list, tuple et str permettent de passer d’un type de
séquence à l’autre :
15
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Par exemple, si on pose x = y = [5, 2, 9], on définit deux variables x et y contenant en fait
l’adresse d’une unique liste. On peut poser x[0] = 10 : on mute donc la liste dont le contenu
est maintenant [10, 2, 9], mais dont l’adresse ne change pas en mémoire. Les variables x et y
pointent donc toujours vers la même adresse, à laquelle on trouve la liste [10,2,9].
16
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
17
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
18
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Tout comme les listes et les tuples, les chaînes sont itérables, et peuvent donc être parcourues
dans une boucle for. Voici quelques exemples d’opérations possibles sur les chaînes de
caractères :
Les chaînes possèdent un très grand nombre de méthodes qui leur sont propres ; ces méthodes
ont souvent un comportement par défaut qui peut être personnalisé en précisant la valeur de
paramètres facultatifs. Comme il est impossible de tout citer, voici une simple sélection :
19
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
6. Les dictionnaires
Les dictionnaires sont des structures mutables, non ordonnées, formées d’enregistrements du
type clé :valeur Le seul moyen d’accéder à une valeur particulière est par l’intermédiaire de
sa clé. Les dictionnaires peuvent être formés :
- en évaluant l’expression dict() ou {}. On obtient le dictionnaire vide
- en délimitant par { et } une séquence de paires clé :valeur : {clé1:val1, clé2:val2,...,
clén:valn}
- en évaluant par exemple : dict([[clé1,val1],[clé2,val2],...,[clén,valn]])
- en ajoutant des paires clé :valeur à un dictionnaire existant. On a ici une différence
essentielle avec les listes, pour lesquelles il est seulement possible de modifier un
élément existant ou d’ajouter un élément supplémentaire à la fin de la liste avec la
méthode append
- en “compréhension”, par exemple D = {x:x*2 for x in range(10)}
Voici quelques méthodes applicables à un objet dic de type dictionnaire. On note ici cle une
clé et val une valeur :
20
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
7. Les ensembles
Les objets de type “ensemble” (set dans le language Python) sont des structures de données
qui modélisent la notion mathématique d’ensemble. Un ensemble (au sens Python) peut
contenir des valeurs de type quelconque, et une même valeur ne peut apparaître qu’une seule
fois. On ne peut pas y accéder par un indice : on peut juste savoir si une valeur est ou n’est
pas élément de l’ensemble. On forme un ensemble par la séquence de ses éléments (valeurs),
encadrée par { et }, ou en utilisant le constructeur set. Les objets de type “ensemble” sont
mutables. Voici quelques méthodes applicables à un objet ens de type ensemble (set). On note
elt une valeur susceptible d’appartenir ou d’être ajoutée à l’ensemble ens :
Les objets de type “ensemble” ont des méthodes pour les opérations ensemblistes usuelles :
21
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Bibliographie :
1. http://thegalsengeek.com/tag/python/
2. http://sdz.tdct.org/sdz/apprenez-a-programmer-en-python.html
3. https://openclassrooms.com/courses/apprenez-a-programmer-en-python/qu-est-ce-que-
python
4. http://master-en-informatique-python.blogspot.com/
5. http://csapstaff.ednet.ns.ca/pmannick/INFO/Python/Apprendre-Python-Ch1.pdf
6. https://fr.slideshare.net/BadrBelhajja/apprennez-programmer-en-python
22
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
CHAPITRE III:
1. Introduction
Afin de faciliter la résolution des problèmes complexes et/ou de grandes tailles, il est
souvent préférable de les décomposer en sous problèmes indépendants et de taille réduite. Ces
derniers sont à leur tour décomposés selon le besoin. La décomposition s’arrête aux sous
problèmes relativement simples à résoudre. Par la suite, on associe à chaque sous problème un
module assurant sa résolution. Un module peut être une procédure ou une fonction.
L’algorithme résolvant le problème initial présentera un ensemble d’appels aux modules
envisagés. Une telle approche s’appelle analyse modulaire.
Le recours à cette méthode de résolution présente des avantages indéniables tels que :
Présenter des solutions claires en évitant la redondance des codes dans un programme.
Simplifier la résolution du problème initial en supposant que les différents modules
prévus sont déjà résolus.
Se concentrer sur la résolution d’un sous problème à la fois.
Détecter facilement les parties à consulter ou à modifier.
Réutiliser des modules en les définissants dans une bibliothèque.
𝑝 𝑛!
𝐶𝑛 =
𝑝! 𝑛 − 𝑝 !
Solution :
Déterminer et afficher le nombre de combinaison de p objets parmi n
Méthode de calcul :
C=F1/ (F2*F3)
n et p deux entiers avec (n>=p et p>0)
1
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Constations :
- on remarque la redondance de la partie calcul de la factorielle
On peut éviter cette redondance en définissant un module permettant de calculer la
factorielle de n’importe quel entier naturel et d’appeler ce module autant de fois que
nécessaire.
- Le module crée est appelée sous-programme.
- Un sous programme peut être une procédure ou une fonction
- Une procédure est un sous programme qui peut produire plusieurs résultats alors
qu’une fonction est un sous-programme qui ne produit qu’un seul résultat de type
simple.
Le sous programme qu’on va le crée, va calculer un résultat de type simple. Pour cela
on peut le désigner par une fonction.
2.2. Définition
Une fonction est un sous programme qui retourne une valeur d’un type identique à celui
de la fonction. Une fonction a donc un type : c’est un type simple (entier, réel, booléen,
caractère, chaîne de caractères).
Fonction paramétrée
FONCTION Nom_F (pf1, pf2 : type1; pf3 : type2 ;…): type_résultat
VAR /* déclaration des variables locales */
Début
….. /* les instructions de la fonction */
…..
…..
Retour (Résultat)
Fin
Fonction non paramétrée
FONCTION Nom_Fonction( ): type_résultat
VAR /* déclaration des variables locales */
Début
….. /* les instructions de la fonction */
…..
…..
Retour (Résultat)
Fin
2
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Solution d’Activité 1 :
Algorithme combinaison
Var
N, P, Fact, Fact1, Fact2, Fact3: entier // N, P, Fact, Fact1, Fact2 et Fact3 sont des
Objets globaux
Début
Répéter
Ecrire (″ Introduire Deux entiers ″)
Lire (N, P)
Jusqu’à (N>P) et (P>0)
Fact1 Factoriel (N) // N et P sont des paramètres effectifs
Fact2 Factoriel (P)
Fact3 Factoriel (N – P)
Fact Fact1 / (Fact2 * Fact3)
Ecrire (″ la combinaison de ″, N, ″ par″, P, ″ est ″, Fact)
Fin
Remarque :
Dans le corps d’une fonction on doit trouver obligatoirement l’instruction suivante :
Retour (résultat)
L’appel d’une fonction peut se faire de différentes manières:
Dans une instruction d’écriture :
o Exemple : Ecrire (abs(a))
Dans une instruction d’affectation :
o Exemple : LLong(Ch)
Dans une expression :
o Exemple : Delta carré(b)- 4*a*c
Dans une condition :
o Exemple : Si Abs(a)>Abs(b) alors traitement1 fin si
Dans une boucle :
o Exemple : Pour i de 1 à long(Ch) faire
Traitement1
Fin pour
3
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Les paramètres effectifs sont les paramètres qui figurent (dans le programme appelant) au
niveau de l’appel du sous-programme.
Remarque :
Lors de l’appel du sous-programme les paramètres effectifs viennent remplacer les
paramètres formels. Cette substitution de paramètres s’appelle passage de
paramètres.
Les paramètres effectifs et les paramètres formels doivent s’accorder de point de vue
nombre et ordre et doivent être de mêmes types.
Un paramètre formel peut être déclaré par le nom de son paramètre effectif ou par un
nom différent.
3.2. Définition
Les procédures sont des sous-programmes qui peuvent avoir plusieurs résultats.
Le nombre des résultats retournés par une procédure est appartient à [0..n]
Le seul cas ou la procédure retourne 0 résultat c’est le cas de procédure d’affichage.
Une fonction est un cas particulier de procédure.
4
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 &T1
Solution d’Activité2 :
ALGORITHME affichage
Var
mot1, mot2 : chaine
n, m : entier
Début
Écrire (‘’donner mot1’’), Lire (mot1)
Écrire (‘’donner mot2’’), Lire (mot2)
Répéter
Ecrire (‘’combien de fois tu veux afficher mot1’’), Lire(n)
Jusqu'à (n>0)
Répéter
Ecrire (‘’combien de fois tu veux afficher mot2’’), Lire(m)
Jusqu'à (m>0)
AFFICHE (mot1, n)
AFFICHE (mot2, m)
Fin
Bibliographie :
1. http://slideplayer.fr/slide/482395/
2. http://www.kiteb.net/education/informatique/programmation/scientifiques/fiches/fiche-
sous-programmes.pdf
3. http://aidescolaire.3oloum.org/t43-les-fonctions-explication-simple-et-detaillee
5
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
CHAPITRE IV:
1. Introduction
En Python, une fonction sert à isoler une instruction, ou un bloc d'instructions qui sera
marqué par un nom et pourra être dans un programme pour être exécuté, avec des paramètres
(arguments), qui pourront varier selon les appels. Une fonction peut renvoyer son résultat
pour être utilisé dans le programme (affection à une variable, utilisation dans une expression,
affichage …). Une fonction peut aussi définir un simple sous-programme.
En Python, les fonctions et les procédures ont la même syntaxe avec le mot clef def
suivie par le nom du sous-programme.
2. Vocabulaire et syntaxe
2.1. Le mot clef def
En Python, pour déclarer un sous-programme, on écrit le mot clef def suivi du nom de la
fonction, de la liste des paramètres formels entre parenthèses et des deux-points qui
clôturent la ligne. Lors de l’appel du sous-programme, les paramètres formels vont recevoir
les valeurs des expressions (ou paramètres effectifs) qui leur correspondront dans l’ordre
défini par la fonction.
Le mot clef return suivie d’une (des) valeur(s) permet d’indiquer la (les) valeur(s) à
retourner.
Si le sous-programme défini a une seule valeur, après le mot clef return ; alors il
correspond bien à la définition d’une fonction en algorithmique (Le nombre des
résultats retournés par une fonction est égal à 1).
Si le sous-programme défini a plusieurs valeurs, après le mot clef return, séparées par
des virgules ; alors il correspond bien à la définition d’une procédure en algorithmique
(Le nombre des résultats retournés par une procédure est appartient à [0..n]).
Un sous-programme retourne 0 résultat c’est le cas de fonction d’affichage ; dans ce
cas on ne trouve pas le mot clef return.
Quelque soit le sous-programme correspond à une fonction ou à une procédure
algorithmique, on va l’appeler en Python une fonction.
Fonction paramétrée
def nom_fonction (pf1, pf2,…):
Bloc d’instructions
return valeur1, valeur2,…
Fonction non paramétrée
def nom_fonction ( ):
Bloc d’instructions
return valeur1, valeur2,…
1
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
>>> Maximum(6)
8
2
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Il y a possibilité de déclarer comme globale une variable définie à l’intérieur d’une fonction,
pour cela il faut utiliser le mot clé global avant le nom de la variable lors de l’affectation.
Exemple :
>>> def test(a=5,b=3):
global somme
somme=a+b
return somme
>>> test()
>>> somme
……………………………………
4. Gestion des erreurs
Python lève des exceptions quand il trouve une erreur dans le code (comme une erreur de
syntaxe) ou dans l'opération que vous lui demandez de faire.
Exemple :
>>>an = input () #On demande à l'utilisateur de saisir l'année
>>>an = int (an) #On essaye de convertir l'année en un entier
Si l'utilisateur donne une valeur inconvertible en entier (une lettre par exemple), le
programme s’arrête. En effet, il lève une exception et Python stoppe l'exécution du
programme. Dans ce cas, Python permet de tester une partie de code. S'il ne retourne aucune
erreur, Python continue. Sinon, on peut lui demander d'exécuter une autre action (par
exemple, redemander à l'utilisateur de saisir l'an).
3
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
>>>try :
resultat = numer/ denom
except NameError :
print("La variable numer ou denom n'a pas été définie.")
except TypeError :
print("La variable numer ou denom possède un type incompatible
avec la division.")
except ZeroDivisionError :
print("La variable denom est égale à 0.")
else :
print("Le résultat est", resultat )
Dans un bloc try, else va permettre d'exécuter une action si aucune erreur ne survient dans le
bloc.
5. Documentation des fonctions
Une approche de l’écriture du logiciel de haute qualité consiste à écrire des tests pour
chaque fonction au début de son développement et à faire tourner ces tests fréquemment
durant le processus de développement.
L’utilisateur peut écrire au préalable un cahier des charges directement dans les chaînes de
documentation (docstring) du module (de la fonction, etc.). Cette manière de procéder porte le
nom de programmation dirigée par la documentation.
La syntaxe de la définition d’une fonction sera donc comme suit :
def nom_de_la_fontion(pf,…):
"""Description"""
instrutions
return résultat
4
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
La chaîne de caractères entre les """ est facultative. Elle permet de définir la description qui
sera donnée dans la page d’aide associée à cette fonction. Exemple :
La docstring de la fonction parfait est une copie quasiment conforme du cahier des charges
(ne pas oublier les >>> en tête des instructions à tester, y compris les résultats attendus).
Si on veut savoir ce que calcule cette fonction, on peut rajouter la ligne help(parfait).
L’exécution du programme nous ouvre alors la page d’aide de la fonction parfait:
Help on function parfait in module __main__:
parfait(n)
Détermine si un nombre est parfait,
c'est à dire somme de ses diviseurs propres
>>> parfait(100)
False
>>> parfait(496)
True
Remarque :
Le module doctest fournit un outil pour examiner un module et valider les tests immergés
dans les chaînes de documentation du programme.
L’instruction doctest.testmod() a pour effet :
– lecture du docstring et exécution des instructions commençant par >>> ;
– comparaison des résultats avec les résultats attendus ;
– affichage d’un message d’erreur s’il n’y a pas coïncidence.
6. Notion de complexité et ses classes
Il est important de pouvoir juger un algorithme (ou le programme qui en résulte) par
rapport à un autre algorithme qui résout le même problème. Il existe plusieurs critères sur
lesquels on peut se baser pour pouvoir qualifier un algorithme :
Est-ce qu’il fait ce que nous lui demandons de faire ?
Est-ce qu’il est muni d’une documentation qui décrit comment l’utiliser et comment il
fonctionne ?
Est-ce que le code est facilement lisible ?
6.1. Activités
Activité 1 : Proposer en Python deux programmes différents pour vérifier la
primalité d’un entier n?
Activité 2 : Proposer en Python deux programmes différents pour calculer xn?
5
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Solution Activité 1 :
Considérons la fonction est_premier(n) qui permet de déterminer si l'entier naturel n est
premier.
Programme naïf : ce programme consiste à diviser n par tous les entiers qui lui sont
inférieurs. Si un de ces entiers est un diviseur de n, n n'est pas premier.
from time import *
def est_premier(n) :
a=time()
for i in range(2, n):
if n% i == 0 :
print(time()-a, "sec")
return (False)
print(time()-a, "sec")
return(True)
print(est_premier(2**31-1))
Résultat d’exécution:
>>> 554.3090000152588 sec
True
Programme rapide : Nos connaissances en arithmétique nous assurent que si nombre n'est
pas premier, un de ses diviseurs est inférieur à n. La fonction est_premier devient alors :
from time import *
def est_premierrapide(n) :
a=time()
for i in range(2, int(n**(1/2))+1) :
if n% i == 0 :
print(time()-a, "sec")
return (False)
print(time()-a, "sec")
return(True)
print(est_premierrapide(2**31-1))
Résultat d’exécution:
>>> 0.009999990463256836 sec
True
6
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Solution Activité 2 :
Considérons la fonction puissance(x,n) qui calcule xn.
Programme naïf : xn = x*x*………….*x
Conclusion :
Dans l’étude de complexité d’un algorithme on ne mesure pas la durée en heures, minutes,
secondes, ...:
cela impliquerait d'implémenter les algorithmes qu'on veut comparer ;
de plus, ces mesures ne seraient pas appropriées car le même algorithme sera plus
rapide sur une machine plus puissante.
L’étude de complexité consiste donc à utiliser des unités de temps abstraites proportionnelles
au nombre d'opérations effectuées.
On pourra par la suite adapter ces quantités en fonction de la machine sur laquelle
l'algorithme s'exécute.
7
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
6.2. Définitions
La complexité d’un programme est généralement en relation directe avec ses
performances. Il s’agit du temps d’exécution et de l’espace mémoire nécessaires pour
l’exécution ; ces deux critères désignent complexité temporelle et complexité spatiale.
Complexité temporelle : c'est le nombre d'opérations élémentaires effectuées par une
machine qui exécute le programme et le temps nécessaire pour chaque opération.
Complexité spatiale : c'est le nombre de positions mémoire utilisées par une machine
qui exécute le programme.
Ces deux complexités dépendent de la machine utilisée mais aussi des données traitées. En
pratique, toutes les opérations élémentaires n'ont pas le même temps d'exécution : une
multiplication demande plus de temps qu'une addition. Pour simplifier, on ne comptera ici que
le nombre d'opérations à réaliser sans tenir compte de leurs différences.
N.B. : On va considérer dans ce cours la complexité temporelle car la complexité spatiale est
étroitement liée aux caractéristiques techniques de l’ordinateur sur lequel le programme
s’exécute. De plus, on cherche à déterminer une mesure pour la complexité temporelle
indépendamment des caractéristiques techniques de l’ordinateur, du langage de
programmation, du compilateur et des détails d’implémentation. Donc on ne peut utiliser une
unité de temps (par exemple la milliseconde) pour exprimer la complexité temporelle car ce
genre d’unité est étroitement lié aux caractéristiques techniques de la machine. Il est
important que l’unité utilisé indique la complexité de l’algorithme utilisé indépendamment de
la machine sur laquelle sera exécuté le programme résultant.
Notations:
Dn : l’ensemble des données de taille n
T(n) : le nombre d’opérations sur un jeu de données de taille n
8
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
9
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Soit T(n) est le nombre d’opérations effectuées. On dit que T(n) est en O(f(n)) s’il existe deux
constantes positives c et n0 telles que T(n) ≤ c × f(n) pour tout n>n0. Où f est en générale une
combinaison de polynômes, exponentielles ou logarithmes.
10
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
11
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
o Cas d'un traitement itératif : Le temps d’exécution d'une boucle est la somme du
temps pour évaluer le corps et du temps pour évaluer la condition. En général, ce
temps est la multiplication du nombre d'itérations de la boucle par le plus grand temps
possible pour une exécution du corps.
Exemple: T(n)=5n3-6n2+4
On remplace les constantes multiplicatives par 1,
1n3-1n2+4
On annule les constantes additives,
1n3-1n2
On conserve le terme dominant,
n3-n2
Solution : T(n) = O(n3)
Exercice : Calcul de la complexité de la fonction factorielle
12
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Bibliographie :
1. https://s03a5674be0a5c3e6.jimcontent.com/download/ve
2. https://issuu.com/jeebeezebee/docs/223267-apprenez-a-programmer-en-pyt
3. https://openclassrooms.com/courses/apprenez-a-programmer-en-python/pas-a-pas-
vers-la-modularite-1-2
4. https://fr.wikibooks.org/wiki/Programmation_Python/Fonctions_originales
5. https://fr.slideshare.net/BENSAAOUD/1-analyseetmesuredesperformances
6. http://docplayer.fr/7041493-Structures-de-donnees-et-algorithmes-fondamentaux.html
7. https://www.academia.edu/6152917/08_02_2014_1_CHAPITRE_4_Complexit%C3%
A9_des_algorithmes_La_O-Notation_Partie_1
8. http://www.fsg.rnu.tn/imgsite/cours/complexit%C3%A9.pdf
9. https://fr.slideshare.net/sanaaroussi3/chapitre-ii-complexit-et-optimali
13
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
CHAPITRE V:
LA RECURSIVITE
1. Définition
Un algorithme est dit récursif s'il est représenté en fonction de lui-même. La récursivité
est un principe puissant permettant de définir une entité à l'aide d'une partie de celle-ci. Alors,
chaque appel successif travaille sur un ensemble d'entrées toujours plus affinée, en se
rapprochant de plus en plus de la solution d'un problème.
Prenons un exemple classique : le calcul de la factorielle. On définit, pour n ≥ 0,
𝑛
n! = 𝑖=1 𝑖 . Informatiquement, on peut donc définir la fonction factorielle selon
l’environnement de développement Python comme suit:
def Fact(n) :
f=1
for i in range(1,n+1) :
f=f*i
return(f)
1 𝑠𝑖 𝑛 = 0
𝑛! =
𝑛 ∗ 𝑛 − 1 ! 𝑠𝑖𝑛𝑜𝑛
En reprenant quasiment mot par mot cette dernière définition, on obtient la fonction Python
suivante :
def Fact_rec(n) :
if n==0 :
return(1)
else :
return(n*Fact_rec(n-1))
1
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exemple:
4!= Fact_rec(4)=4*Fact_rec(3)
Fact_rec(3)=3*Fact_rec(2)
Fact_rec(2)=2*Fact_rec(1) Condition terminale :
Fact_rec(1)=1*Fact_rec(0) => n = = 0
Fact_rec(0) = 1
if p==0 or p==n:
return(1)
else :
return(Combinaisons(n-1,p)+ Combinaisons(n-1,p-1))
2
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exemple : la définition de la parité d'un entier peut être représentée de la façon suivante :
𝑣𝑟𝑎𝑖 𝑠𝑖 𝑛 = 0 𝑓𝑎𝑢𝑥 𝑠𝑖 𝑛 = 0
𝑝𝑎𝑖𝑟 𝑛 = 𝑒𝑡 𝑖𝑚𝑝𝑎𝑖𝑟 𝑛 =
𝑖𝑚𝑝𝑎𝑖𝑟 𝑛 − 1 𝑠𝑖𝑛𝑜𝑛 𝑝𝑎𝑖𝑟 𝑛 − 1 𝑠𝑖𝑛𝑜𝑛
def pair(n) :
if n==0 :
return(True)
return(impair(n-1))
def impair(n) :
if n==0 :
return(False)
return(pair(n-1))
𝑛+1 𝑠𝑖 𝑚 = 0
𝐴 𝑚, 𝑛 = 𝐴 𝑚 − 1,1 𝑠𝑖 𝑚 > 0 𝑒𝑡 𝑛 = 0
𝐴 𝑚 − 1, 𝐴 𝑚, 𝑛 − 1 𝑠𝑖𝑛𝑜𝑛
En Python:
def Ackermann(m,n) :
if m==0 :
return(n+1)
if n==0 :
return(Ackermann(m-1,1))
return(Ackermann(m-1, Ackermann(m,n-1)))
>>> Ackermann(3,4)
125
3
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Suite arithmétique :
𝑐𝑜𝑛𝑠𝑡𝑎𝑛𝑡𝑒 𝑠𝑖 𝑛 = 0
𝑇 𝑛 = 𝑇 𝑛 = 𝑟 ∗ 𝑛 + 𝑇(0)
𝑇 𝑛 − 1 + 𝑟 𝑠𝑖𝑛𝑜𝑛
Suite arithmético-géométrique :
𝑐𝑜𝑛𝑠𝑡𝑎𝑛𝑡𝑒 𝑠𝑖 𝑛 = 0
𝑇 𝑛 = 𝑇 𝑛 = 𝑎𝑛 ∗ 𝑇 0 − 𝑟 + 𝑟
𝑎 ∗ 𝑇 𝑛 − 1 + 𝑏 𝑠𝑖𝑛𝑜𝑛
𝑏
Tel que : 𝑟 =
1−𝑎
Relation de récurrence de forme :
𝑛
𝑇 𝑛 = 𝑎∗𝑇 − 𝑓 𝑛 𝑎𝑣𝑒𝑐 𝑓 𝑛 = 𝑐 ∗ 𝑛𝑘
𝑏
𝑘
o Si 𝑎 > 𝑏 𝑇 𝑛 = Ο(𝑛𝑙𝑜𝑔 𝑏 (𝑎) )
𝑘
o Si 𝑎 = 𝑏 𝑇 𝑛 = Ο(𝑛𝑘 𝑙𝑜𝑔𝑏 (𝑛))
𝑘
o Si 𝑎 < 𝑏 𝑇 𝑛 =Ο 𝑓 𝑛 = Ο(𝑛𝑘 )
Si n est nul, il n’y a rien à faire d’autre que de retourner 1, ce qui se fait avec une opération
élémentaire. Sinon, il faut multiplier le résultat de fact_rec(n-1) par n, ce qui prend donc 1
appel récursif, et 1 opération arithmétique, soit 2 opérations élémentaires.
On a donc :
1 𝑠𝑖 𝑛 = 0
𝑇 𝑛 =
2 + 𝑇 𝑛 − 1 𝑠𝑖𝑛𝑜𝑛
Il s’agit d’une suite arithmétique de raison 2, dont le terme générale est 2n. On vérifie que
T(n) = 2n + 1 est la solution de cette récurrence, on déduit donc que T(n) = O(n)
4
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
On explique ici comment calculer le coût d’une fonction récursive, à savoir le nombre
d’opérations élémentaires qu’elle effectue.
def u(n):
if n == 0:
return 2.
else:
x = u(n-1)
return 0.5 * (x + 3. / x)
1 𝑠𝑖 𝑛 = 0
𝑇 𝑛 =
𝑇 𝑛 − 1 + 5 𝑠𝑖𝑛𝑜𝑛
En effet, dans le cas n = 0, il n’y a rien à faire d’autre que de retourner 1. Et dans le cas n > 0,
on fait d’une part un appel récursif sur la valeur n−1, d’où T(n−1) opérations avec une
opération d’affectation, puis trois opérations arithmétiques (une multiplication, une addition et
une division) avec une opération de return. Il s’agit d’une suite arithmétique de raison 5, dont
le terme général est : T(n) = 5n+1
Si en revanche on avait écrit la fonction u plus naïvement, avec deux appels récursifs u(n-1),
c’est-à-dire :
def u(n):
if n == 0:
return 2.
else:
return 0.5 * (u(n-1) + 3. / u(n-1))
5
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
1 𝑠𝑖 𝑛 = 0
𝑇 𝑛 =
𝑇 𝑛 − 1 + 𝑇 𝑛 − 1 + 4 𝑠𝑖𝑛𝑜𝑛
En effet, il convient de prendre en compte le coût T(n − 1) des deux appels à u(n-1). Il s’agit
maintenant d’une suite arithmético-géométrique, dont le terme général est : T(n) = 5*2n − 4.
Il s’agit donc, d’une complexité exponentielle : O(2n).
- Inconvénients :
Il faut faire attention à ne pas faire trop d’appels récursifs imbriqués
Il faut faire attention à ne pas faire plusieurs fois les même calculs, sous peine
de voir la complexité exploser.
Lorsque deux solutions sont équivalentes, l’une en récursif, l’autre en itératif,
il est en général préférable d’utiliser la version itérative.
- Avantages :
Dans l’ensemble, il est plus facile de prouver un algorithme récursif que son
équivalent itératif.
L’écriture d’un programme récursif est souvent plus claire (plus
mathématique), que son équivalent itératif.
Parfois, et c’est là où la récursivité est vraiment importante, il n’est pas du tout
aisé de transformer un algorithme récursif en algorithme itératif. C’est en
général le cas des algorithmes « diviser pour régner ».
Bibliographie :
1. https://fr.slideshare.net/chahrawoods/cours-algorithmique-et-complexite-complet
2. https://fr.slideshare.net/sanaaroussi3/chapitre-iii-rcursivit-et-paradigme-diviser-pour-
rgner
3. http://prepa.blois.free.fr/INFO/wa_files/INF0_MP_01.pdf
4. https://fr.scribd.com/doc/46954197/Calcul-Numerique-Applique-Maths-Algorithme-
Edition-Edp-Sciences
6
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
CHAPITRE Vi:
1. Introduction
Dans ce chapitre, nous allons manipuler des algorithmes sur deux traitements très utiles en
informatique qui sont la recherche et le tri. Nous allons les appliquer pour des itérables en
Python.
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
………………………………………………………………………………………………………………………………………………………………….
2ème solution
On peut procéder autrement en utilisant la construction return à l’intérieur de la boucle for
pour interrompre son exécution.
def appartient(x, a):
for y in a:
if y == x:
return True
return False
1
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
3ème solution
On va maintenant écrire une fonction de recherche légèrement différente, qui renvoie le
premier indice d’apparition de x dans la liste s. On utilise alors enumerate pour parcourir
simultanément les indices et les valeurs correspondantes. La construction return fait sortir de la
fonction dès que la valeur x est trouvée.
Si on sort de la boucle, on renvoie None pour signaler un échec de la recherche.
def indice(x, s):
for i, y in enumerate(s):
if y == x:
return i
return None
Complexité de la recherche séquentielle
On note que dans le pire des cas, les fonctions appartient et indice précédentes parcourent
toute la liste et effectuent donc n comparaisons, où n est la longueur de la liste. Il s’agit donc,
d’une complexité linéaire : O(n).
Exemple :
On suppose par exemple que l’on cherche la valeur x = 9 dans la liste a= [1, 3, 5, 6, 9, 12, 14].
La recherche s’effectue ainsi :
Seules trois comparaisons ont été nécessaires pour trouver la valeur. C’est une application du
principe "diviser pour régner".
2
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Le code est :
def recherche_dichotomique(x, a):
"""
renvoie, si elle existe, la position d'une occurrence de x dans a
supposé trié, et None sinon
"""
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………
On teste si le mot m apparaît à la position i avec une seconde boucle, qui compare les
caractères de m et de t un à un. On utilise une variable j pour cela et on s’arrête, soit lorsque j
atteint len(m), soit lorsque les caractères diffèrent :
j = 0
while j < len(m) and m[j] == t[i + j]:
j += 1
3
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Le code complet :
def recherche_mot(m, t):
"""
renvoie, si elle existe, la position de la première occurrence du mot
m dans le texte t et renvoie None sinon
"""
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………….
4
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
L 14 2 47 10 18 13 5
0 1 2 3 4 5 6
Etape 1
- Chercher la valeur maximale dans L (de l’élément numéro 1 à l’élément numéro 7 : cette
valeur étant 47 et son indice est 2).
- Permuter l’élément d’indice 2 avec l’élément d’indice 0.
L 47 2 14 10 18 13 5
0 1 2 3 4 5 6
Etape 2
- chercher la valeur maximale dans L (de l’élément numéro 2 à l’élément numéro 7 : cette valeur
étant 18 et son indice est 4).
- Permuter l’élément d’indice 1 avec l’élément d’indice 4.
L 47 18 14 10 2 13 5
0 1 2 3 4 5 6
Remarque :
La liste comporte une partie triée composée de deux premiers éléments et une partie non encore
triée qui comporte le reste des éléments de L.
L 47 18 14 10 2 13 5
0 1 2 3 4 5 6
Etape 3
- chercher la valeur maximale dans L (de l’élément numéro 3 à l’élément numéro 7 : cette valeur
étant 14 et son indice est 2).
- Puisque la valeur maximale correspond au premier élément de la partie non triée de la liste L,
nous n’avons pas besoin de réaliser l’action de permutation.
L 47 18 14 10 2 13 5
0 1 2 3 4 5 6
Etape 4
- chercher la valeur maximale dans L (de l’élément numéro 4 à l’élément numéro 7 : cette valeur
étant 13 et son indice est 5).
- Permuter l’élément d’indice 3 avec l’élément d’indice 5.
5
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Etape 5
- chercher la valeur maximale dans L (de l’élément numéro 5 à l’élément numéro 7 : cette valeur
étant 10 et son indice est 5).
- Permuter l’élément d’indice 4 avec l’élément d’indice 5.
Etape 6
- chercher la valeur maximale dans L (de l’élément numéro 6 à l’élément numéro 7 : cette valeur
étant 5 et son indice est 6).
- Permuter l’élément d’indice 5 avec l’élément d’indice 6.
L 47 18 14 13 10 2 5
0 1 2 3 4 5 6
Liste triée
6
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
l'idée est de vérifier si lors du dernier parcours aucune permutation n'a été faite ce qui signifie
que la liste est devenue trié.
Exemple :
On se propose d’utiliser la méthode de tri à bulles pour trier une liste L en ordre croissant.
Considérons la liste L contenant les 7 éléments suivants :
L 14 2 47 10 18 13 5
0 1 2 3 4 5 6
Soit une variable booléenne Echange qu’on initialise à faux et qui revient vrai à chaque fois que
nous réalisons une permutation. Faux
Passage 1 Echange
- On compare 14 et 2. Puisque 14>2, on permute 14 et 2 et on met vrai dans la variable
Echange.
Vrai
L 2 14 47 10 18 13 5
0 1 2 3 4 5 6
Echange
- On compare 14 et 47. Puisque 14<47, on ne fait rien.
Vrai
L 2 14 47 10 18 13 5
0 1 2 3 4 5 6 Echange
L 2 14 10 18 47 13 5 Vrai
0 1 2 3 4 5 6
Echange
- On compare 47 et 13. Puisque 47>13, on permute 47 et 13 et on met vrai dans la
variable Echange.
Vrai
L 2 14 10 18 13 47 5
0 1 2 3 4 5 6 Echange
- On compare 47 et 5. Puisque 47>5, on permute 47 et 5 et on met vrai dans la variable
Echange.
Vrai
L 2 14 10 18 13 5 47
0 1 2 3 4 5 6 Echange
Puisqu’on a atteint la fin de la liste et la variable Echange a comme valeur vrai alors on recommence un
nouveau passage jusqu'à ce qu’on fasse un passage complet de liste sans effectuer aucune permutation.
N.B :
Dans le passage numéro 2 on travaille sur n-1 éléments
Dans le passage numéro 3 on travaille sur n-2 éléments
………..
def tri_bulle(L) :
Echange = True
passage = 0
while Echange == True :
Echange = False
passage = passage + 1
for i in range(0,len(L)-passage):
if L[i] > L[i + 1]:
Echange = True
# On echange les deux elements
L[i],L[i+1] = L[i+1],L[i]
return(L)
L 2 14 4 3 18 13 5
0 1 2 3 4 5 6
On commence par le deuxième élément puisque si la liste contient un seul élément, il est considéré comme
trié.
Etape 1
- On compare L[1] avec L[0] avec le souci de la garder triée.
- Puisque L[1]>L[0], donc les deux premiers éléments sont déjà en ordre.
L 2 14 4 3 18 13 5
0 1 2 3 4 5 6
On passe à l’étape 2
Etape 2
- On compare L[2] avec L[1] avec le souci de la garder triée.
- Puisque L[2]<L[1], donc on permute L[2] par L[1]
L 2 4 14 3 18 13 5
0 1 2 3 4 5 6
- On compare L[1] avec L[0] avec le souci de la garder triée.
- Puisque L[1]>L[0], donc les deux premiers éléments sont déjà en ordre.
L 2 4 14 3 18 13 5
0 1 2 3 4 5 6
On passe à l’étape 3
Etape 3
- On compare L[3] avec L[2] avec le souci de la garder triée.
8
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
L 2 4 3 14 18 13 5
0 1 2 3 4 5 6
L 2 3 4 14 18 13 5
0 1 2 3 4 5 6
L 2 3 4 14 18 13 5
0 1 2 3 4 5 6
On passe à l’étape 4
…
et ainsi de suite jusqu'à avoir une liste triée…..
Code en python : ordre croissant
def tri_insertion(L) :
for i in range(1, len(L)) :
j = i
while j > 0 and L[j] < L[j-1]:
L[j],L[j-1] = L[j-1],L[j]
j -= 1
return(L)
tri_fusion([2, 5])
[2] [5]
9
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
tri_fusion([2])
-->[2]
tri_fusion([5])
-->[5]
‘’’fusion’’’ de [2] et [5] : [2, 5]
-->[2, 5]
‘’’fusion’’’ de [1, 6] et [2, 5] : [1, 2, 5, 6]
-->[1, 2, 5, 6]
tri_fusion([4, 7, 3])
[4] [7, 3]
tri_fusion([4])
-->[4]
tri_fusion([7, 3])
[7] [3]
tri_fusion([7])
-->[7]
tri_fusion([3])
-->[3]
‘’’fusion’’’ de [7] et [3] : [3, 7]
-->[3, 7]
‘’’fusion’’’ de [4] et [3, 7] : [3, 4, 7]
-->[3, 4, 7]
‘’’fusion’’’ de [1, 2, 5, 6] et [3, 4, 7] : [1, 2, 3, 4, 5, 6, 7]
-->[1, 2, 3, 4, 5, 6, 7]
Code en python : ordre croissant
def fusion(L1, L2) :
if L1 == [ ] : return L2
if L2 == [ ] : return L1
if L1[0] < L2[0] :
return [L1[0]] + fusion(L1[1:], L2)
else :
return [L2[0]] + fusion(L1, L2[1:])
Tfusion(n) = O(n)
def tri_fusion(L) :
if len(L) <= 1 : return L
L1 = [L[x] for x in range(len(L)//2)]
L2 = [L[x] for x in range(len(L)//2, len(L))]
return fusion(tri_fusion(L1),tri_fusion(L2))
T(n) = 2 T(n/2) + Tfusion(n)
Calcul de la complexité :
L’algorithme tri_fusion est de type « diviser pour régner ». Alors l’étude de sa complexité se
base sur ses trois phases:
Diviser : cette étape consiste au calcul du milieu de l’intervalle [d,f], sa complexité est en O(1).
Régner : l’algorithme résout récursivement deux sous-problèmes de tailles (n/2), d’où une
complexité en 2*T(n/2).
Combiner : la complexité de l’algorithme de fusion qui est de O(n) pour la construction d’une
liste solution de taille n.
T(n) = 2 T(n/2) + O(n)
10
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
a = 2, b = 2, k = 1 (2ème cas)
O(T(n)) = O(n log2n)
11
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Le cas pire intervient quand le partitionnement produit une région à n-1 éléments et une à 1
élément.
Vu que la complexité du partitionnement est de l’ordre de O(n) et que T(1) = O(1), la
récurrence pour le temps d’exécution est : T(n) = T(n-1) +O(n)
et on obtient : T(n) = O(n²)
Meilleur cas :
Le meilleur cas est quand le partitionnement produit deux parties de longueur (n/2.)
La récurrence est alors définie par : T(n) = 2 T(n / 2) + O(n)
ce qui donne d’après le théorème de résolution des récurrences : T(n) = O(n log(n))
Bibliographie :
1. https://openclassrooms.com/courses/un-peu-de-recherche-ne-peut-faire-que-du-bien
2. https://fr.scribd.com/doc/291545781/Cours-Python-pdf
3. https://fr.scribd.com/document/70358138/Tut-Oriel-Python
4. http://shuxue.free.fr/Acces_cours/IPT/IPT_cours_complexite_2015_2016_PCSI.pdf
5. https://fr.scribd.com/document/268947032/Algorithme-et-Programmation
6. http://apcpedagogie.com/cours-et-tutoriels/les_cours/cours-de-
programmation/algorithme/algorithme-de-tri/
7. http://slideplayer.fr/slide/482390/
8. http://wwwdi.supelec.fr/liesse/html/exercices_td1.html
9. https://fr.wikipedia.org/wiki/Tri_fusion
12
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
CHAPITRE VII:
Manipulation des fichiers
Python
1. Introduction
Jusqu'à présent, nous n'avons travaillé que sur des données rentrées par l'utilisateur (input).
Evidemment, un programme doit être capable d'aller chercher des informations dans un
fichier (fichier texte par exemple) et écrire des résultats dans un (autre) fichier.
Python propose un objet Fichier < file > et un ensemble de méthodes pour lire et écrire
depuis/dans un fichier.
Le module shutil
Ce module fournit des fonctions de copie.
copy(src,dest) Copie complète du fichier(y compris les droits)
copyfile(src,dest) Copie complète du fichier sans les droits
1
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
2
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Exemple:
fich=open("test.txt","w")
# opérations sur le fichier….
fich.close()
Fichier texte
fich=open("test.txt","w")
fich.write("Salut ceci \n est mon premier fichier texte créé
depuis Python!!!!")
fich.close()
3
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Deux méthodes sont utiles pour l’extraction des données strip() et split()
strip():enlève le caractère de saut de ligne
split():retourne une liste contenant les chaines séparés selon les espace sinon préciser
le séparateur
Exemple :
>>> ch="kj, kj kj , kjkjk kjk , kjkj\n"
>>> ch.strip()
…………………………………………………………………………………………………………………………………………
>>> ch.strip().split()
…………………………………………………………………………………………………………………………………………
>>> ch.strip().split(',')
……………………………………………………………………………………………………………………………………….
Dans cet exemple, trois valeurs numériques sont enregistrées. Comme vous avez remarqué,
on ne peut pas les distinguer dans la chaîne de caractères résultante lors la lecture du fichier.
Il existe plusieurs solutions pour ce type de problèmes. L’une des meilleures est d’importer
un le module pickle.
Voici comment il s’utilise:
4
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Nous pouvons remarquer dans cet exemple que le module pickle permet d’enregistrer des
données en gardant leur type. Les contenus des trois variables a, b et c sont sauvegardés dans
le fichier donnees_test, et ensuite régulièrement restitués, avec leur type, dans les variables j,
k et l. Vous pouvez donc mémoriser importe quel type de données.
Attention: les fichiers traités à l’aide des fonctions du module pickle sont des fichiers
binaires. Pour cette raison, ils doivent obligatoirement êt re ouverts comme tels à l’aide de la
fonction open(). Vous utiliserez l’argument 'wb' pour ouvrir un fichier binaire en écriture
(comme à la 3eme ligne de notre exemple), et l’argument 'rb' pour ouvrir un fichier binaire
en lecture (comme à la 8eme ligne de notre exemple).
La fonction dump() du module pickle a deux arguments: le premier est la variable à
enregistrer, le second est l’objet fichier concerné. La fonction pickle.load() effectue le travail
inverse, c’est-à-dire la restitution de chaque variable avec son type.
Bibliographie :
1. https://python.developpez.com/cours/TutoSwinnen/?page=Chapitre9
2. Samia Darragi, Cours Python, IPEST, 2014-2015
3. https://openclassrooms.com/courses/apprenez-a-programmer-en-python/les-fichiers-2
5
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
CHAPITRE VIII:
Système de numération
1. Introduction
Dans une machine, toutes les informations sont codées sous forme d’une suite de ‘‘0’’ et
de ‘‘1’’ (langage binaire). Les programmeurs ne préfèrent pas l’implémentation en langage
binaire car elle n’est pas assez facile. Il faut donc avoir une étape de traduction pour que
l’ordinateur puisse exécuter les instructions correspondantes aux informations qu’on peut lui
donner. Cette traduction est une opération de codage établissant une bijection entre une
information et une suite de ‘0’ et de ‘1’ qui sont représentables en machine.
Le but de ce chapitre est donc, de :
- Connaître la notation binaire des nombres (entiers et réels) et les opérations
élémentaires effectuées sur ces nombre en binaire
- Savoir la représentation d’un nombre dans une base B (2, 8, 10, 16, …)
- Connaître les limites de la représentation : erreurs d’arrondi et de débordement de la
mémoire.
n n-1 n-2 … 4 3 2 1 0
Les cases du schéma représentent les bits, le chiffre marqué en dessous d’une case
indique la puissance de 2 à laquelle est associé ce bit (ou le rang du bit). Le bit de rang
0 consiste au bit de poids faible. Le bit de rang n consiste au bit de poids fort.
En octal, B=8, ai 0; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 :8 chiffres ;
En hexadécimal, B = 16, ai 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; A; B; C; D; E; F (on utilise
les 6 premières lettres comme des chiffres) :16 chiffres.
N.B. C’est un système très souvent utilisé en informatique.
1
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exercice:
1) Donnez les représentations binaires des nombres entiers suivants : 4 10,7 10, 25 10
2
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
2) Donnez les représentations octales des nombres entiers suivants :15 10, 2410, 6510
3) Donnez les représentations hexadécimaux des nombres entiers suivants : 2710, 3110,
25610
3
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exercices:
1) Donnez les représentations décimales des nombres binaires : 1001012, 10112 :
1001012 =……………………………………………………………………………………...
10112 =………………………………………………………..………………………………
15 8=…………………...………………………………………………………………………..
3) Donnez les représentations décimales des nombres hexadécimaux : 2A16, D5416, 1B16:
2A16=…………………………………………………………………………………………….
D5416=…………………………………………………………………..……………………….
1B16 =……………………………………………………………………………………………
Exercice:
Convertissez les nombres binaires suivants :
1101111102 en nombre octal,
100001102 en nombre hexadécimal.
110111110 2=…………………………………………………………………………………
10000110 2=………………………………………………………………………………….
4
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exemples :
1) soit le nombre octal 6412 8 8 = 23
6 4 1 2
1 1 0 1 0 0 0 0 1 0 1 0
6412 8=110100001010 2
Exercices:
1) Convertissez les nombres octaux suivants en nombres binaires : 1138, 108, 53628.
113 8=…………………………………………………………………………………………..
10 8=…………………………………………………………………………………………
969 16=………………………………………………………………………………………
Base 10
Base 16 Base 8
Base 2
5
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exercice :
752 8= ……………….16
110110 8= ……………….16
Additionneur binaire
6
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exemple (Addition)
Addition binaire (8 bits) :
7
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Soustracteur binaire
La table de soustraction sur 2 bits est la suivante:
a b s r
0 - 0 = 0 0
0 - 1 = 1 1
1 - 0 = 1 0
1 - 1 = 0 0
Les relations donnant la somme et la retenue sur trois bits sont les suivantes :
Soit deux nombres A (A= an-1 ... a0) et B (B= bn-1 ... b0) et soit à réaliser l'opération A-B.
a b r s r1
0 0 0 = 0 0
0 0 1 = 1 1
0 1 0 = 1 1
0 1 1 = 0 1
1 0 0 = 1 0
1 0 1 = 0 0
1 1 0 = 0 0
1 1 1 = 1 1
3.4. La division binaire
La division est la plus complexe des 4 opérations arithmétiques. Le principe de la
division décimale classique est fondé sur le principe d'essais successifs. Par exemple, pour
diviser 11 par 4, on doit d'abord s'apercevoir que 11 est supérieur à 4 et ce demander combien
de fois 4 va dans 11. Si l'on fait un essai initial avec 3, la multiplication 3*4=12 nous indique
que le choix est mauvais (12>11). Il faut recommencer avec 2 etc...
Compte tenu du moins grand nombre de possibilité d'essais, ce principe d'essais successifs et
en fait beaucoup plus simple dans la division binaire.
Exemple :
1011 100
- 10,11
100
-------
0011
-
000
----------
0110
-
100
----------
0100
-
100
-----------
0000
8
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Truc :
9
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
La mantisse (les bits situés après la virgule) est codé sur les bits (23 ou 52) restants.
10
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Exemple 1:
Soit à coder la valeur 525,5 en simple précision:
Exemple 2:
Soit à coder la valeur -0,625 en simple précision :
Bibliographie :
1. http://www.memoireonline.com/12/13/8266/m_Codage-et-transmission-des-donnees-dans-un-
reseau11.html
2. http://rmdiscala.developpez.com/cours/LesChapitres.html/Cours1/Chap1.3.htm
3. http://www.fsr.ac.ma/cours/informatique/elbenani/Codage.pdf
4. http://jacquesvladimir.blogspot.com/
5. http://www.commentcamarche.net/contents/100-representation-des-nombres-entiers-et-reels
6. http://docplayer.fr/12703130-Microprocesseurs-et-microcontroleurs.html
11
ISSAT Gabès AU : 2016/2017 Sections : MP1, PC1 & T1
Annexe
12
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
CHAPITRE IX:
Simulation numérique
I. Généralités
Python fournit plusieurs fonctions dans des modules spécialisées. Ce qui demande de ne pas
encombrer la mémoire de fonctions dont on ne se servira pas. On peut donc importer les modules
contenant les fonctions qu’on a besoin.
Pour se servir d’une fonction fct d’un module mod, il nécessite l’import de cette fonction, ou
tout le module avant son utilisation.
>>>import mod
>>>mod.fct
Certains noms de module sont longs, ou seront utilisés très souvent. On peut, au moment de
l’import du module, créer un alias, qui sera utilisé lors de l’appel des fonctions de ce module au
lieu du nom complet:
>>>import mod as al
>>>al.fonct
Dans ce chapitre, nous nous intéressons en particulier aux modules numpy, scipy (spécifiques
pour le calcul scientifique) et matplotlib (spécifique pour le dessin de courbe 2D/3D).
1
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
La fonction np.zeros crée un tableau composé uniquement de zéros de type float, le nombre
d’éléments étant passé en paramètre. Il est possible de modifier le type des éléments en utilisant
le paramètre facultatif dtype.
>>> np.zeros(6)
………………………………………………………………………………………………………………………………………………………………
>>> np.zeros(6, dtype = int)
………………………………………………………………………………………………………………………………………………………………
La fonction np.ones fonctionne comme np.zeros sauf que les éléments sont tous égaux à 1.
>>> np.ones(3, dtype = int)
………………………………………………………………………………………………………………………………………………………………
>>> 5 * np.ones(3)
………………………………………………………………………………………………………………………………………………………………
La fonction np.arange(d,f,pas) fonctionne comme range mais renvoie un objet de type
numpy.ndarray :
>>> x = np.arange(0, 1, 0.3)
>>> x
array([0., 0.3, 0.6, 0.9])
Les fonctions size, shape, len et ndim retournent respectivement le nombre d’éléments d’un
vecteur et la dimension.
>>> v=np.array([-1,3.,0,-2,5,8,0,22,0,-5])
>>> np.size(v)
10
>>> np.shape(v)
(10,)
>>> len(v)
10
>>> np.ndim(v)
1
Création de tableaux bidimensionnels
La fonction np.array permet de transformer une liste de listes Python en tableau
bidimensionnel numpy :
>>> np.array([[1, 2], [3, 4]])
array([[1, 2],
[3, 4]])
Les fonctions np.zeros et np.ones fonctionnent comme dans le cas monodimensionnel, sauf le
paramètre sera un couple d’entiers formé par le nombre de lignes et le nombre de colonnes.
>>> np.zeros((2, 3))
…………………………………………………………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………………………………………………..
La fonction np.eye renvoie la matrice identité (les coefficients de la diagonale principale sont
égaux à 1, les autres à 0) et elle a un seul paramètre entier, qui représente son ordre.
>>> np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
2
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
La fonction np.diag a comme paramètre une liste [t0, . . . , tn−1] (ou un tableau numpy) et
renvoie la matrice diagonale ayant les éléments ti sur la diagonale et des zéros ailleurs :
>>> np.diag([5, 7, 2])
array([[5, 0, 0],
[0, 7, 0],
[0, 0, 2]])
Accès à un élément
L’accès à un élément ou une tranche d’éléments pour un tableau monodimensionnel se fait
comme pour les listes:
>>> v=np.array([-1,3.,0,-2,5,8,0,22,0,-5])
>>> v[0]
-1.0
>>> v[-1]
-5.0
>>> v[2:]
array([ 0., -2., 5., 8., 0., 22., 0., -5.])
>>> v[:3]
array([-1., 3., 0.])
>>> v[4:8]
array([ 5., 8., 0., 22.])
Accès à un élément pour un tableau bidimensionnel :
>>> m = np.array([[3, 8, 1],[2, 7, 3]])
>>> m[1] # ligne 1
array([2, 7, 3])
>>> m[1, 2] = 50 # ligne 1 colonne 2
>>> m
array([[3, 8, 1],
[2, 7, 50]])
Opérateurs vectorialisés
Si vous travaillez avec des tableaux numpy, les opérations usuelles (+, −, *, /, **) se font
coefficient par coefficient.
>>> a = np.array([[1, 2] , [3, 4]])
>>> b = np.eye(2)
>>> a
array([[1, 2],
[3, 4]])
>>> b
array([[1., 0.],
[0., 1.]])
>>> a + b
array([[2., 2.],
[3., 5.]])
>>> a – b
array([[0., 2.],
[3., 3.]])
>>> a * b
array([[1., 0.],
[0., 4.]])
3
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Vous pouvez aussi ajouter (soustraire ou multiplier) une constante à un tableau numpy, dans
ce cas l’opération se fait coefficient par coefficient.
>>> 3 + a
array([[4, 5],
[6, 7]])
Attentions :
- L’opérateur + de numpy n’est pas du tout le même que celui des listes Python. Avec les
listes cet opérateur consiste à une concaténation, avec les tableaux numpy il s’agit d’une
addition terme à terme.
- Les opérateurs *, /, ** de numpy ne correspondent pas aux opérations matricielles
mathématiques. Ils effectuent simplement un produit (ou une division ou une mise à la
puissance) coefficient par coefficient.
Slicing, vues, copies
Vous pouvez sélectionner une sous-matrice en ne conservant que certaines lignes
consécutives et/ou certaines colonnes consécutives.
Un intervalle d’indices est représenté comme suit :
debut:fin:pas : les indices entre debut inclus et fin exclu, séparés par la valeur pas;
debut:fin : tous les indices entre debut inclus et fin exclu) ;
debut: : tous les indices depuis debut inclus ;
:fin : tous les indices jusqu’à fin exclu;
: : tous les indices;
i : seulement l’indice i.
La syntaxe matrice[intervalle d'indices de lignes, intervalle d'indices de colonnes] permet de
créer une sous-matrice correspondant aux lignes et aux colonnes sélectionnées.
>>> m = np.array([[1, 2, 5, 3], [4, 7, 2, 4], [3, 1, 2, 6]])
>>> m
array([[1, 2, 5, 3],
[4, 7, 2, 4],
[3, 1, 2, 6]])
>>> m[ : : 2, : ] # lignes d’indices pairs
array([[1, 2, 5, 3],
[3, 1, 2, 6]])
>>> m[1 : , 1 : 3] # lignes 1 et suivantes, colonnes 1 et 2
array([[7, 2],
[1, 2]])
>>> m[ : , 2] # colonne 2
array([5,2,2])
Une sous-matrice ainsi obtenue s’appelle une vue. Les coefficients ne sont pas recopiés.
>>> a = m[1 : , 1 :]
>>> a
array([[7, 2, 4],
[1, 2, 6]])
>>> a[0, 0] = 20
>>> m
array([[1, 2, 5, 3],
[4, 20, 2, 4]
[3, 1, 2, 6]])
4
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Si on veut une duplication des éléments d’une matrice numpy, on utilise la fonction np.copy :
>>> a = np.copy(m[1 : , 1 :])
>>> a[0, 0] = 20
>>> m
array([[1, 2, 5, 3],
[4, 7, 2, 4]
[3, 1, 2, 6]])
shape, reshape, concatenate
L’attribut shape est un n-uplet où n est le nombre d’entrées du tableau numpy. Dans le cas
monodimensionnel, l’attribut shape est un 1-uplet contenant le nombre d’éléments. Dans le cas
bidimensionnel, l’attribut shape est un couple (nombre de lignes, nombre de colonnes).
La méthode reshape permet de reconstituer un tableau numpy et de retourner un nouveau
tableau, dont la géométrie est un uplet passé en paramètre.
La méthode concatenate du module numpy permet d’assembler les vecteurs et les matrices
et de les concaténer. Par défaut l’assemblage se fait selon la 1 ère dimension (les lignes, donc
assemblage vertical).
>>> vecteur = np.array([1, 5, 2, 7, 3, 8])
>>> vecteur.shape
(6, )
>>> matrice = np.concatenate((vecteur, vecteur+1, 2*vecteur))
>>> matrice
array([1, 5, 2, 7, 3, 8, 2, 6, 3, 8, 4, 9, 2, 10, 4, 14, 6, 16])
>>> matrice.shape
(18, )
>>> p = matrice.reshape(2, 9)
>>> p
array([[ 1, 5, 2, 7, 3, 8, 2, 6, 3],
[ 8, 4, 9, 2, 10, 4, 14, 6, 16]])
>>> p.shape
(2, 9)
>>>a=np.arange(15).reshape(3,5)
>>>a
numpy.rank(matrice A) array([[ 0, 1, 2, 3, 4],
Rang d’une [ 5, 6, 7, 8, 9],
Valeur de retour : le rang de la
matrice matrice A [10, 11, 12, 13, 14]])
>>>np.rank(a)
2
numpy.linalg.inv(matrice A) >>>from numpy.linalg import inv
Inverse Valeur de retour : A-1 (provoque >>>inv([[1,2],[3,4]])
d’une une erreur si A n’est pas array([[-2. , 1. ],
matrice inversible) [ 1.5, -0.5]])
5
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Syntaxe Exemple
numpy.linalg.det(matrice A) >>>from numpy.linalg import det
Déterminant Valeur de retour : le déterminant >>>det([[1,2],[3,4]])
de A, de type float -2.0000000000000004
numpy.trace(matrice A) >>> np.trace([[1,2],[3,4]])
Trace 5
Valeur de retour : la trace de A
résolution de x +2y = 2
numpy.linalg.solve(matrice A,
Résolution 3x +4y = 8
vecteur B)
d’un système Valeur de retour : le vecteur X
>>>from numpy.linalg import solve
de Cramer >>>solve([[1,2],[3,4]],[2,8])
solution de AX = B array([ 4., -1.])
>>>from numpy.linalg import
Puissance numpy.linalg.matrix_power(matri matrix_power
d’une ce A, entier n) >>>matrix_power([[1,2],[3,4]], -2)
matrice Valeur de retour : An array([[ 5.5 , -2.5 ],
[-3.75, 1.75]])
>>> np.transpose([[1,2],[3,4]])
array([[1, 3],
[2, 4]])
Transposée
numpy.transpose(matrice A) Autre possibilité :
d’une Valeur de retour : t A >>> A = np.array([[1,2],[3,4]])
matrice >>> A.T
array([[1, 3],
[2, 4]])
>>>from numpy.linalg import eigvals
les valeurs >>> eigvals(A)
numpy.linalg.eigvals (matrice A)
propres array([-0.37228132, 5.37228132])
>>>from numpy.linalg import eig
>>> eig(A)
les vecteurs (array([-0.37228132, 5.37228132]),
numpy.linalg.eig(matrice A)
propres array([[-0.82456484, -0.41597356],
[ 0.56576746,-0.90937671]]))
Fonction Rôle
Trace la ligne brisée entre les points dont les abscisses sont dans la
plt.plot(X,Y, label='nom') liste X et les ordonnées dans la liste Y. Le label sert à identifier la
courbe
plt.title("titre") Définit le titre du graphe (affiché en haut)
plt.grid( ) Affiche une grille en pointillés pour une meilleure lisibilité
Affiche une légende en associant à chaque courbe son label.
plt.legend(loc= ...) L’option loc précise l’emplacement de légende, qui peut être un
nombre (1,2, ..) ou un texte ('upper left')
plt.savefigure('nom.ext') Sauvegarde le graphe dans un fichier de ce nom. L'extension
définit le format. Voir l'aide pour savoir les formats acceptés
plt.show( ) Affichage à l'écran de la figure
6
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Tracés de fonction
Le traçage d’une courbe représentative d’une fonction consiste à définir une liste d’abscisses
puis de construire la liste des ordonnées correspondantes.
L’exemple ci-dessous trace la courbe de x →sin(x) sur [0, 3π].
import math
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return math. sin(x)
X = np. arange (0, 3*
math.pi,0.01)
Y = [ f(x) for x in X ]
plt.plot(X, Y)
plt.show ()
7
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Exemple 2 :
8
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
9
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Exemple 1:
Le cas de f(x) = x2 − 2 est simple et démonstratif !
f(1) = -1 < 0 < 2 = f(2), donc l équation f(x) = 0 possède une solution dans [1, 2].
La valeur médiane de cet intervalle est 1.5.
f(1) = -1 < 0 < 0.25 = f (1.5), donc l’équation f(x) = 0 possède une solution dans
[1, 1.5].
Exemple 2:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import bisect
def f(x):
return x**2-2
x=np.linspace(-2,2,100)
plt.plot(x,f(x),"b")
r1=bisect (f,-2,-1) # racine de f dans [-2, -1]
r2=bisect (f, 0,2) # racine de f dans [0, 2]
racines= [r1, r2]
10
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
b) Approche Newton :
La méthode de Newton est une méthode connu pour la résolution approchée d’une équation
f(x)=0.
Elle permet de définir la suite U dont son premier terme U0, par la relation de récurrence :
Un=Un-1-f (Un-1) / f’ (Un-1)
Programme en Python :
Recherche approchée de solution d’une équation par newton
Cette méthode déjà disponible sous python ; La fonction newton (f, u0, fprime) du module
scipy.optimize permet de calculer, en commençant par u0, une racine de f(x)=0 par la méthode
de Newton (fprime : la dérivée de f).
11
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
12
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
On remplace la fonction f par la fonction en escalier qui prend sur chaque segment de la
subdivision, la même valeur à l’extrémité gauche (méthode de rectangle à gauche) de ce segment
que f. cela revient donc à interpoler la fonction f sur le segment [ai, ai+1] par le polynôme de la
grange de degré 0 qui vaut f(ai). l’air du rectangle de base [ai, ai+1] est f(ai).(ai+1-ai), donc :
Programme en Python :
Calcul approché d’une intégrale : Méthode des rectangles
def rectangle (f, a, b, n):
int_rect = 0
h = (b-a)/n
t = a
for k in range(n):
int_rect += h*f(t)
t += h
return int_rect
13
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Programme en Python :
Calcul approché d’une intégrale : Méthode des trapèzes
Le module Scipy contient un sous-module qui est complètement dédié aux intégrations :
scipy.integrate.
La fonction quad :
La fonction quad (f, a, b) du module scipy.integrate permet d’intégrer la fonction f(x) sur
l’intervalle [a : b].
Elle retourne un couple contenant la valeur de l’intégrale et une estimation de l’erreur maximale
produite lors de l’intégration. Si la fonction f a plus d’une variable, les valeurs des autres seront
définies par l’argument optionnel args.
Exemple 1:
Si on veut intégrer f(x,y,z) avec y=1 et z=2, on notera : scipy.integrate.quad (f, a, b, args=(1,2)).
N.B. : La variable d’intégration doit être le premier argument de la fonction.
Exemple 2 :
14
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
La fonction trapz :
La fonction trapz(fx,x) du module scipy.integrate consiste à calculer l’intégral d’une fonction f
par méthode des trapèzes à partir d’une série fx des valeurs de f prise en des points x.
Exemple :
Le but est de calculer puis tracer des valeurs approchées de y entre 0 et 2 pour 5 valeurs
régulièrement espacées.
15
ISSAT Gabès AU : 2016/2017 Sections : BG1, MP1, PC1 & T1
Bibliographie :
1. https://fr.scribd.com/doc/291545781/Cours-Python-pdf
2. http://docplayer.fr/10308708-Numpy-tableaux-de-donnees-multi-dimensionnels-et-matplotlib-
visualisation-en-2d-et-3d-pour-python.html
3. https://fr.scribd.com/document/336148659/cours-MPSI-IPT
4. http://docplayer.fr/17617895-Analyse-scientifique-avec-python.html
5. http://mp2.rupprecht.fr/info_mp/Scipy.pdf
6. http://docplayer.fr/22649926-Ins1-introduction-a-numpy-et-scipy-1-numpy-2-scipy-la-base-a-
importer-pas-necessairement-tous-ensembles-mais-tous-vont-servir-dans-ce-chapitre.html
7. http://docplayer.fr/398723-Les-equations-differentielles.html
8. http://matplotlib.org/1.4.2/_sources/examples/mplot3d/scatter3d_demo.txt
16