Merging Result Compressed
Merging Result Compressed
Elaboré par :
-- Avril 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année MP-PC-T des Instituts
Préparatoires aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
Le document présent comporte un rappel sur les notions de base associées à Python comme
la manipulation des itérables, les structures de contrôle, les fichiers mais également sur la
récursivité et la complexité algorithmique.
I Introduction
Python est un langage de programmation multi-paradigmes (procédural, orienté objet et fonctionnel) et
dynamiquement typé. Sa version standard est libre et est disponible sur le site officiel de Python « python.org ».
La version Pyton3.X est adoptée par le programme officiel du cycle préparatoire. Cette version inclut un grand
nombre de modules pré-programmés fournis d’office, tels que math, cmath, random, etc., mais n'inclut pas les
modules tels que numpy, scipy et matplotlib qu'il faut importer explicitement au besoin. Un module regroupe des
ensembles de variables et de fonctions apparentées, que l’on appelle également bibliothèque.
Anaconda est une solution comportant l’interpréteur Python livré avec plusieurs environnements de développement
intégrés (IDLE, spyder, Jupyter) et inclut une panoplie de modules (numpy, scipy et matplotlib) mais qui nécessite
beaucoup de ressources.
II Variable et affectation
Une variable est une référence associée à un objet déjà créé en mémoire. Elle n'a pas de type et n'est pas déclarée.
Toute variable doit être affectée avant son utilisation. L'identificateur (nom) de la variable ne peut contenir que des
caractères alphanumériques et le caractère '_' et ne débutant pas par un chiffre.
On obtient le type d'un objet à l'aide de la fonction type(objet) et son adresse mémoire désignant son identité à
l'aide de id(objet).
III Opérateurs
Affectation v = valeur x = 5
v1=v2=v3= valeur x = y= z = t = 5
v1,v2,v3=valeur1,valeur2,valeur3 x, y, z = 1, '2', 5
Parenthèses () (x+y)*2 #donne 6
Opérations arithmétiques
Puissance x**y # ou pow(x,y) 1j**2 #donne -1+0j
Signes +;-
Opérateurs relationnels
Comparaison d’identité is
is not
Opérateurs logiques
Produisent un booléen and ; or ; not
(bool)
Opérateurs avec assignation
Produisent le même x += y # x = x + y
résultat que l'affectation x -= y # x = x y
du résultat de l'opération x *= y # x = x * y
effectuée
x /= y # x = x / y
x //= y # x = x // y
x %= y # x = x % y
x **= y # x = x ** y
IV Classes élémentaires
Les classes élémentaires sont immuables (non modifiables). Les opérations appliquées aux instances de ces classes
génèrent de nouvelles instances comme le montre l'exemple suivant :
>>> x=5
>>> id(x)
2053437424
>>> x+=1 # x référence une nouvelle instance
>>> id(x)
2053437440
V Opérations d'entrée/sortie
VI Structures de contrôle
Un bloc de code est un groupe d’instructions Python indentées précédées par ":". Un bloc peut en inclure d'autres.
Expression conditionnelle
Python offre la possibilité de expr1 if cond1 else #maximum de 2 valeurs x ,y
former des expressions dont expr2 m = x if x > y else y
l’évaluation est soumise à
une condition. Le résultat #les éléments négatifs de L1 sont
est l’évaluation de remplacés par 0 dans L2 (voir
expression1 si la condition l’itérable liste dans la section VII)
est True, et celle de L1=[-1,0,5,3]
expression2 sinon. expr1 if cond1 else L2=[0 if x<0 else x for x in L]
Cette construction ne permet expr2 if cond2 else
pas l’utilisation du mot expr3 x=int(input("?"))
réservé elif mais on peut ">0" if x>0 else "<0" if x<0 else "=0"
emboîter deux expressions
conditionnelles.
Un intervalle défini par range, également considéré comme une séquence, est un itérable ou conteneur formé
par une succession d’entiers.
range(debut, fin, pas) génère l’intervalle [debut, fin [ par pas entier relatif égal à pas.
Une chaîne est une séquence non modifiable et ordonnée de caractères. Le tableau suivant résume les
principales opérations applicables aux chaînes.
Une liste est une séquence, ordonnée et modifiable, d’éléments éventuellement hétérogènes séparés par une
virgule et délimitée par une paire de crochets.
Le tableau suivant résume les principales fonctions/méthodes applicables aux listes.
Un tuple est une séquence, ordonnée et non modifiable, d’éléments éventuellement hétérogènes séparés par
une virgule. Le tableau suivant résume les principales fonctions/méthodes applicables aux tuples :
Un ensemble est une collection d'éléments distincts non ordonnés et encadrés par des accolades. La classe
set représente la notion d’ensemble en mathématique. Un ensemble doit impérativement comporter des
éléments non modifiables. La création d'ensembles de listes, de dictionnaires ou d'ensembles déclenche une
erreur. Le tableau suivant résume les principales fonctions/méthodes applicables aux ensembles.
Un dictionnaire est une structure modifiable et non ordonnée d'associations (clé : valeur). Les clés sont
impérativement des objets non modifiables. L'utilisation de listes, de dictionnaires ou d'ensembles comme
clé déclenche une erreur. Les valeurs sont des objets de classes quelconques.
Exemple
Exemple
X Les sous-programmes
Une fonction est un bloc d’instructions indentées (corps de la fonction) destiné à réaliser une opération. Elle peut
recevoir des paramètres et renvoie éventuellement un résultat. L’appel d’une fonction Python retourne toujours un
objet, par défaut None. Dans le corps de la fonction ce retour est spécifié à l’aide de l’instruction return.
Le tableau suivant résume les concepts de base associés aux fonctions Python.
On n'est jamais à l'abri d'une erreur quand on manipule des fichiers et qu'on oublie de les fermer. Le mot réservé
with du langage python, permet d'éviter cette situation et dont voici sa syntaxe générale :
with open (mon_fichier, mode) as variable :
# Opérations de manipulation du fichier
XIII La récursivité
Une fonction récursive est une fonction dont le corps contient un ou plusieurs appels à elle-même.
Un traitement récursif nécessite de déterminer :
le cas trivial ou encore le cas d'arrêt
le traitement récurrent et de s'assurer que ce dernier atteindra le cas d'arrêt (terminaison).
Dans le tableau suivant, on donne deux exemples de problèmes résolus de façon récursive.
Problème Démarche Solution récursive
def factorielle(n):
Calcul de la On raisonne par récurrence sur n if n<=1:
factorielle de n Cas trivial : 0 ! = 1 return 1 #cas trivial
𝒏 else:
𝒏! = 𝒊 𝑛! = 𝑛 × (𝑛 − 1)! return n*factorielle(n-1)
𝒊 𝟏
Tri Fusion Le tri fusion est un tri récursif qui def fusion_Rec(L1,L2):
applique le principe "diviser pour if L1==[]:
régner". return L2
Pour une liste L, le principe du tri fusion if L2==[]:
est le suivant : return L1
si L est de taille 1, elle est triée et on if L1[0]<L2[0]:
la retourne (cas trivial) ; return [L1[0]]+fusion_Rec(L1[1:],L2)
sinon on divise L en deux sous-listes else:
L1 et L2 presque égales ( return [L2[0]]+fusion_Rec(L1,L2[1:])
L1[0:len(L)//2] et L2[len(L)//2:
len(L)] ) : def tri_fusion_Rec(L):
on applique récursivement if len(L)<=1:
l’algorithme de tri par fusion à L1 return L
puis à L2 L1=[L[x] for x in range (len(L)//2)]
on fusionne les L1 et L2 triées. (La L2=[L[x] for x in range (len(L)//2,
fusion est également effectuée de len(L))]
manière récursive où le cas trivial Return fusion_Rec(tri_fusion_Rec(L1,
est l'épuisement de l'une des 2 listes tri_fusion_Rec(L2))
et on retourne l'autre).
Le temps d’exécution d’un programme dépend fortement de la machine qui l’exécute, du langage dans lequel il
est écrit et de l’algorithme sous-jacent. Pour des données de grandes tailles, l’algorithme est la cause
déterminante du temps d’exécution d’un programme. Des méthodes rationnelles permettent de calculer le coût
d’un programme exprimé en nombre d’opérations élémentaires exécutées par la machine afin d’obtenir le
résultat final. Généralement, ce nombre est fonction de la taille n des données à traiter.
Le coût se calcule comme suit :
Coût d’une opération élémentaire op = 1.
Coût d'une séquence de k instructions p_1 ; p_2 ; … p_k = ∑𝒌𝒊 𝟏 𝒄𝒐û𝒕(𝒑𝒊 ) .
Coût d'une structure conditionnelle simple if c: p else : q <= coût(c) + max(coût(q),coût(p)).
Coût d'une structure conditionnelle complète if c_1: p_1 elif c_2 : p_2 … elif c_i : p_i … else : p_k+1
= (∑𝒌𝒊 𝟏 𝒄𝒐û𝒕(𝒄𝒊 )) + 𝐦𝐚𝐱 𝒄𝒐û𝒕(𝒑𝒊 ).
𝟏 𝒊 𝒌 𝟏
Coût d'une boucle for i in iterable : p_i = ∑ ∈ é 𝑐𝑜û𝑡(𝑝𝑖)
Coût d'une boucle while c : p est le plus difficile à exprimer (nombre d'itérations non connu à priori)
majorer le nombre de répétitions => NombreRépétitions*( 𝑐𝑜û𝑡(𝑐)+ 𝑐𝑜û𝑡(𝑝))+1* 𝑐𝑜û𝑡(𝑐)
Exemple : Calcul xn
- Approche naïve :
def puiss1(x,n):
r = 1 #1 affectation
for i in range(n): # n affectations
r*= x # 1 affectation + 1 multiplication
return r # 1 retour
Bibliographie et Netographie
Ouvrages
Learning Python, Mark Lutz, Edition O’Reilly, Juin 2013, ISBN: 9781449355722.
Informatique pour tous en classes préparatoires aux grandes écoles, Benjamin Wack & al., Edition Eyrolles,
Août 2013, ISBN: 978-2-212-13700-2.
Supports de Cours
Support de Cours de H.Filali et H.Bouzidi, Rappel, pour 2ème année préparatoire sections MP-PC-T, IPEIM,
Année universitaire 2019-2020.
Support de Cours de Laila Hammami pour 1ère année préparatoire sections MP-PC-T, IPEIN, Année
universitaire 2019-2020.
Support de Cours de W.Meftah, Rappel, pour 2ème année préparatoire sections MP-PC-T, IPEIS, Année
universitaire 2019-2020.
Sites Web :
https://www.python-course.eu/
https://www.ics.uci.edu/~brgallar/index.html
Elaboré par :
-- Mai 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année MP-PC-T des Instituts
Préparatoires aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
I I NTRODUCTION
En programmation procédurale, on s'intéresse aux étapes nécessaires pour résoudre un problème donné. Ces étapes
sont modélisées par des tâches plus ou moins complexes, appelées procédures/fonctions qui manipulent les données
du problème sans beaucoup de contrôle pour aboutir au résultat final. Le programme est donc un enchainement de
ces tâches.
En programmation OO, on modélise le problème par un ensemble d'objets du monde réel qui interagissent entre eux
à travers des messages. L'objet est donc l'entité principale.
L'objet encapsule ses propres données et les traitements relatifs à ses données dans une même entité. Le programme
est un ensemble d'objets et des interactions entre ces objets.
II C LASSE ET O BJET
II.1 Définitions
Concrètement un objet est une entité du monde réel. Une personne, une voiture, une forme géométrique, une
image, une feuille, etc.
En python, toutes les entités manipulées sont des objets (entier, fichier, module, etc)
Une feuille de papier par exemple, possède une couleur, une longueur et une largeur et on peut la plier, la
déchirer, la couper, etc.
Un exemplaire d'un objet s'appelle une instance. Une feuille de papier de couleur rouge de longueur 21 cm et de
largeur 17 cm est une instance de l'objet.
Deux instances possèdent chacune des valeurs d'attributs différentes mais se partagent les mêmes méthodes de
l'objet. Il n'y a aucune interférence entre les objets d'une même classe.
Une classe est une entité qui permet la création des objets (instances) ayant les mêmes propriétés.
Pour pouvoir manipuler un objet (accéder à ses propriétés ou invoquer l'une de ses méthodes), on utilise
l’opérateur point.
Un attribut d’objet est défini au niveau de la méthode constructeur. La valeur d’un attribut d’objet est
propre à chaque objet. L’accès à l’attribut est donné par : nom_Objet.nom_attribut
Le constructeur d’objet
Le constructeur est une méthode particulière appelée lors de la création d'un nouvel objet permettant
d’initialiser ses attributs.
Le constructeur se définit dans une classe comme une fonction avec deux particularités :
o le nom de la méthode doit être __init__ ;
o la méthode doit accepter au moins un paramètre de nom self qui apparaît en premier.
Le paramètre self
Le paramètre self représente en fait l'objet cible, c'est-à-dire que c'est une variable qui référence l'objet
en cours de création et permettant d’accéder à ses attributs et fonctionnalités.
Les méthodes
Une méthode est une fonction qui agit principalement sur une instance de la classe. Elle doit accepter au
moins le paramètre self figurant en première position.
L’appel d’une méthode se fait par : nom_Objet.nom_méthode (autres paramètres)
Syntaxe de la création :
class nom_classe:
#définition des attributs de classe
(attribut de valeur commune pour toutes les instances)
nom_attr = valeur
Exemple
Soit la classe Compte_bancaire définie par:
◦ Les attributs:
◦ Attributs de classe : nombank
◦ Attributs d’objet : NumeroCompte, NomProprietaire, solde
◦ Les méthodes: AfficherSolde, Retrait, Dépôt
Elle est créée ainsi :
# création de la classe Compte_Bancaire CompteBc
class compteBc:
nombank= 'amenbank '
def __init__(self, N, A, S) #le paramètre self désigne l’objet lui-même
self.num=N
self.nom=A
self.sold=S
def retrait(self,x):
if self.sold>=x:
self.sold= self.sold-x
else:
raise Exception('retrait impossible')
def depot(self,x):
self.sold+=x
def AfficherSolde (self):
print('compte au nom de ', self.nom, 'a pour solde',self.sold)
Exemple
Soit compte1 une instance de la classe Compte_bancaire dont les données sont les suivantes :
◦ NumeroCompte : 512017
◦ NomProprietaire : mohamed
◦ solde : 1500
III.1 Définition
C’est le mécanisme qui permet de construire une classe « fille », ou sous-classe, à partir d’une classe « mère ». La
classe fille ainsi obtenue hérite toutes les propriétés et toutes les fonctionnalités de son ancêtre. La classe « fille »
peut éventuellement ajouter des méthodes/attributs propres à elle et redéfinir les méthodes qui ont été héritées de
sa classe mère. La classe fille est une spécialisation de la classe mère.
L’héritage se fait ainsi selon la syntaxe suivante :
class nom_sous_classe(nom_classe_mère):
#définir les attributs et les méthodes de la sous_classe
III.2 Exemple 1
Nous proposons ci-après un exemple d’héritage entre la classe mère Point et la classe fille PointColoré :
class Point:
def __init__(self,a,b):
self.x=a
self.y=b
def Affiche(self):
print('Point',(self.x, self.y))
def deplacer(self, dx, dy) :
self.x += dx
self.y += dy
class PointColoré(Point):
def __init__(self,a,b,col):
Point.__init__(self,a,b) # ou bien super().__init__(a,b)
self.couleur = col
def Affiche(self):
print('PointColoré',(self.x, self.y,self.couleur))
III.3 Exemple 2
Comme exemple d’héritage à partir d’une classe native Python, nous proposons de définir une classe nommée
ListOfStr permettant de stocker dans une liste uniquement des valeurs de type str. La classe doit déclencher
une exception pour toute tentative d’insertion/substitution d'un élément par une valeur qui n’est pas un str.
class ListOfStr(list):
def __repr__(self):
return "ListOfStr(({}))".format(super().__repr__())
IV P OLYMORPHISME ET SURCHARGE
Quand ce concept est appliqué aux méthodes spéciales, on l’appelle surcharge. Une méthode spéciale est en fait
une méthode dont le nom est donné par __nom__, exécutée sans appel explicite. Elle a un comportement par
défaut. On peut citer comme exemples :
__init__ : appelée lors de la création d’une instance de classe par nom_obj=nomClasse(paramètres)
__str__ : appelée par print(obj)
__add__ : appelée par obj1 + obj2
Exemple 1
La classe Etudiant hérite de la classe Personne.
class Personne:
def __init__ (self,nom):
self.nom=nom
def affiche(self):
print("je suis une personne")
class Etudiant(Personne):
def __init__(self,nom,cne):
super().__init__(nom)
self.cne=cne
def affiche(self):
print("je suis un étudiant")
Exemple 2 :
Il s’agit des méthodes calcul du périmètre et de l’aire dans les classes Carré et Disque.
class Carre :
” ” ” Un carré est modélisé par son coin supérieur gauche et une arête ” ” ”
def __init__ ( self, P, a ) :
self. coin = P
self.arete=a
def perimetre ( self ) :
return 4 * self.arete
def aire ( self ) :
return self.arete** 2
class Disque :
” ” ” Un disque est modélisé par son centre et son rayon ” ” ”
def __init__(self, c, r ) :
self.centre = c
self.rayon = r
def perimetre ( self ) :
return 2 * pi * self.rayon
def aire ( self ) :
return pi * self.rayon **2
Exemple 3
La méthode spéciale __add__ (l’opérateur +) est surchargée dans des différentes classes (float, complex, str,..) :
>>> x1 = 3 ; x2 = 5.1 ; x2 + x1 #float.__add__(x2, x1)
8.1
>>>z1 = 3+4j; z2 = 2-3j; z2 + z1 #complex.__add__(z2,z1)
5+1j
>>> s1 = « ali » ; s2 = « med » ; s2 + s1 #str.__add__(s2, s1)
“medali”
>>> t1 = (5,2); t2 = (3,); t2 +t1 #tuple.__add__(t2, t1)
(3, 5, 2)
Pour afficher les informations relatives à un objet, en utilisant le nom de l’objet (représentation sur le shell) ou
en utilisant la commande print(), il faut surcharger la méthode spéciale __repr__ :
def __repr__(self):
return #la chaine qu’on veut afficher
Exemple
class point:
def __init__(self,a,b):
self.x=a
self.y=b
def __repr__(self):
return (str((self.x , self.y)))
>>>p=point(2,3)
>>>p # l’exécution de l’évaluation de p fait appel à __repr__
(2,3)
>>>print(p) # l’exécution de print fait appel à la méthode __repr__
(2,3)
Pour donner une représentation textuelle informelle à un objet, il suffit de surcharger la méthode spéciale
__str__ :
def __str__(self):
return #la chaine qu’on veut afficher
Exemple1 :
class point:
def __init__(self,a,b):
self.x=a
self.y=b
def __str__(self):
return 'point'+str((self.x , self.y))
>>>p=point(2,3)
>>>p #sans redéfinir __repr__ l’exécution renvoie la référence de l’objet
<__main__.point object at 0x033DAB10>
>>>print(p) # l’exécution de print fait appel à la méthode __str__
point(2,3)
Exemple2 :
class point:
def __init__(self,a,b):
self.x=a
self.y=b
def __repr__(self):
return ( str((self.x , self.y)))
def __str__(self):
return 'point'+str((self.x , self.y))
>>>p=point(2,3)
>>>p # l’exécution de l’évaluation de p fait appel à __repr__
(2,3)
>>>print(p) # l’exécution de print fait appel à la méthode __str__
point(2,3)
La surcharge d’opérateurs permet la redéfinition et l’utilisation des opérateurs en fonction de la classe. Par
exemple, l’utilisation de l’opérateur + pour additionner deux objets de même type.
Python associe à chaque opérateur une méthode spéciale qu’on peut surcharger, on cite dans la suite quelques
exemples :
On rappelle qu’une pile est une structure de données qui suit le principe d’une pile d’assiettes, ˝ le dernier
arrivé est le premier servi˝, on parle du mode LIFO (Last In First Out). L’insertion ou la suppression d’un
élément ne peut se faire qu’à une seule extrémité, appelée sommet de la pile.
Une pile est définie par les opérations suivantes :
Empiler: permet l’ajout d’un élément au sommet de la pile ;
Dépiler: permet la suppression de l’élément au sommet de la pile si elle n’est pas vide ;
Vérifier si une pile est vide ou non.
V.1.2 Implémentation d’une classe Pile
On rappelle qu’une file est une structure de données qui suit le principe d’une file d’attente, ˝ le premier arrivé
est le premier servi˝, on parle du mode FIFO (First In First Out).
class File :
def __init__(self) :
self.liste=[ ]
def enfiler (self, v) :
self.liste.append(v)
def defiler(self) :
if not self.est_vide( ):
return self.liste.pop(0 )
def est_vide( self) :
return self.liste ==[ ]
#en utilisant une file intermédiaire #sans utiliser une file intermédiaire
def Inverser(p) : def Inverser(p) :
f1=file() p1=pile( )
while not p.est_vide( ): p2=pile( )
f1.enfier (p.depiler( )) while not p.est_vide( ):
while not f1.est_vide( ) : p1.empiler (p.depiler( ))
p.empiler( f1.defiler()) while not p1.est_vide( ) :
p2.empiler(p1.depiler())
while not p2.est_vide( ) :
p.empiler(p2.depiler())
VI E XERCICES D ’ APPLICATION
VI.1 Exercice 1
On s’intéresse à ordonner les éléments d’une file d’entiers dans l’ordre croissant. On suppose définie la classe
file, définir les méthodes suivantes :
4. Une méthode prix_vente qui permet de calculer et retourner le prix de vente d’un article. Ce prix est calculé
à partir du prix d’achat de l’article et d’un pourcentage P en appliquant la formule suivante :
prix de vente= prix d’achat + prix d’achat × P.
Le pourcentage P est un paramètre de la méthode et admet par défaut la valeur 20%.
B- Classe ArticleEnPromo :
Définir la classe ArticleEnPromo qui hérite de la classe Article en écrivant :
1. Une méthode constructeur __init__ qui permet de définir les mêmes attributs de la classe Article et
d’initialiser l’attribut remise qui représente le taux de la remise accordée. Cette méthode prend en paramètre
self, un article et le taux de remise.
2. Une méthode prix_ventePromo qui permet de retourner le prix de vente après la promotion.
C- Classe Stock :
Définir la classe Stock sachant que cette classe admet un attribut LS de type liste. Chaque élément de LS est une
sous-liste qui comprend un article et la quantité en stock correspondante.
Pour cela, écrire:
1. Une méthode constructeur __init__ qui permet d’initialiser l’attribut LS par une liste vide.
2. Une méthode de représentation __repr__ qui permet d’afficher le contenu du stock. L’affichage sera fait
ligne par ligne où chaque ligne est de la forme suivante :
(référence,désignation,prix_achat) : quantité en stock.
3. Une méthode rechercher_article qui permet, à partir de la référence, de chercher un article dans le stock.
Elle retourne la désignation, le prix de vente et la quantité en stock de cet article s’il existe et None sinon.
4. Une méthode ajouter_article qui permet d’ajouter un nouvel article en stock.
5. Une méthode maj_qtstock qui permet, à partir de la référence d’un article et d’une quantité qt, de mettre à
jour la quantité en stock d’un article existant. Cette méthode prend de plus un paramètre type_maj de type
entier, il est égal à 1 dans le cas d’un ajout et -1 dans le cas d’une réduction.
6. Une méthode supprimer_article qui, à partir de la référence d’un article, permet de le supprimer.
7. Une méthode articles_prix qui permet de retourner la liste des articles dont le prix de vente est compris
entre prix1 et prix2.
8. Une méthode articles_promo_qt qui permet de créer et retourner une liste de tuples où chaque tuple
comprend l’article qui sera en promotion ainsi que son prix de vente initial et son prix de vente après
promotion.
Les articles qui seront en promotion sont ceux dont la quantité en stock est inférieure à une valeur qt_min.
Le taux de remise et la valeur qt_min sont donnés en paramètres.
9. Soit StockE un dictionnaire qui contient les stocks de n magasins d’une enseigne. Les clés de StockE sont
représentées par des entiers identifiant les différents magasins et les valeurs sont les stocks correspondants.
10.Ecrire un programme python qui permet de :
saisir une référence ref d’un article.
pour chaque magasin, afficher la quantité en stock de l’article identifié par la référence ref.
déterminer et afficher la quantité totale en stock de cet article.
# Question 2
def permutation_circulaire(f,n):
if not f.est_vide():
for i in range(n):
f.enfiler(f.defiler())
# Question 3
def Inserer_Elt(F,elt):
if F.est_vide():
F.enfiler(elt)
else:
n=Taille(F)
ne=0
for i in range(n):
x=F.defiler()
ne+=1
if x<elt:
F.enfiler(x)
else:
break
F.enfiler(elt)
if x>elt:
F.enfiler(x)
if n-ne>0:
permutation_circulaire(F,n-ne)
# Question 4
def Ordonner_file(F):
FO=file()
while not F.est_vide():
e=F.defiler()
Inserer_Elt(FO,e)
return FO
class Article:
def __init__(self,ref,dsg,prix_a):
self.ref=ref
self.dsg=dsg
self.prix_a=prix_a
def __repr__(self):
return'('+str(self.ref)+','+self.dsg+','+str(self.prix_a)+')'
def set_article(self,type_modif,modif,):
if type_modif==1:
if type(modif)!=int:
raise ValueError('erreur de type')
self.ref=modif
elif type_modif==2:
if type(modif)!=str:
raise ValueError('erreur de type')
self.dsg=modif
elif type_modif==3:
if type(modif)!=float:
raise ValueError('erreur de type')
self.prix_a=modif
def prix_vente(self,pourcentage=20):
return self.prix_a*(1+pourcentage/100)
class ArticleEnPromo(Article):
def __init__(self,A,remise):
Article.__init__(self,A.ref,A.dsg,A.prix_a)
self.remise=remise
def prix_ventePromo(self):
return self.prix_vente()*(1-self.remise/100)
class Stock:
def __init__(self):
self.LS=[]
def __repr__(self):
ch=''
for i in self.LS:
ch=ch+str(i[0])+':'+str(i[1])+'\n'
return ch
def recherche_article(self,ref):
for i in self.LS:
if i[0].ref==ref:
return i[0].dsg,i[0].prix_vente(),i[1]
return None
def ajouter_article(self,A,qt):
self.LS.append([A,qt])
def maj_qtstock(self,ref,qt,type_maj):
for i in self.LS:
if i[0].ref==ref:
if type_maj==1:
i[1]+=qt
else:
i[1]-=qt
break
def supprimer_Articles(self,ref):
for i in range(len(self.LS)):
if self.LS[i][0].ref==ref:
self.LS.pop(i)
def articles_prix(self,p1,p2):
L=[]
for i in self.LS:
pv=i[0].prix_vente()
Ouvrages :
INFORMATIQUE Programmation et calcul scientifique en Python et Scilab, Thierry,Audibert & Amar Oussalah,
Edition ellipses,2014, ISBN:978-2-7298-84710
Apprendre à programmer avec Python , Gérard Swinnen, Edition Eyrolles, ISBN :978-2-212-13434-6
Supports de Cours
Support de Cours de H.Latrach POO, pour 2ème année préparatoire MP-PC, IPEIT, Année universitaire 2019-
2020.
Sites Web :
https://courspython.com/classes-et-objets.html
https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python
https://developpement-informatique.com/article/152/polymorphisme-en-python
Elaboré par :
-- Avril 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année MP-PC-T des Instituts
Préparatoires aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
Le document présent comporte un rappel sur les notions de base associées à Python comme
la manipulation des itérables, les structures de contrôle, les fichiers mais également sur la
récursivité et la complexité algorithmique.
I Introduction
Python est un langage de programmation multi-paradigmes (procédural, orienté objet et fonctionnel) et
dynamiquement typé. Sa version standard est libre et est disponible sur le site officiel de Python « python.org ».
La version Pyton3.X est adoptée par le programme officiel du cycle préparatoire. Cette version inclut un grand
nombre de modules pré-programmés fournis d’office, tels que math, cmath, random, etc., mais n'inclut pas les
modules tels que numpy, scipy et matplotlib qu'il faut importer explicitement au besoin. Un module regroupe des
ensembles de variables et de fonctions apparentées, que l’on appelle également bibliothèque.
Anaconda est une solution comportant l’interpréteur Python livré avec plusieurs environnements de développement
intégrés (IDLE, spyder, Jupyter) et inclut une panoplie de modules (numpy, scipy et matplotlib) mais qui nécessite
beaucoup de ressources.
II Variable et affectation
Une variable est une référence associée à un objet déjà créé en mémoire. Elle n'a pas de type et n'est pas déclarée.
Toute variable doit être affectée avant son utilisation. L'identificateur (nom) de la variable ne peut contenir que des
caractères alphanumériques et le caractère '_' et ne débutant pas par un chiffre.
On obtient le type d'un objet à l'aide de la fonction type(objet) et son adresse mémoire désignant son identité à
l'aide de id(objet).
III Opérateurs
Affectation v = valeur x = 5
v1=v2=v3= valeur x = y= z = t = 5
v1,v2,v3=valeur1,valeur2,valeur3 x, y, z = 1, '2', 5
Parenthèses () (x+y)*2 #donne 6
Opérations arithmétiques
Puissance x**y # ou pow(x,y) 1j**2 #donne -1+0j
Signes +;-
Opérateurs relationnels
Comparaison d’identité is
is not
Opérateurs logiques
Produisent un booléen and ; or ; not
(bool)
Opérateurs avec assignation
Produisent le même x += y # x = x + y
résultat que l'affectation x -= y # x = x y
du résultat de l'opération x *= y # x = x * y
effectuée
x /= y # x = x / y
x //= y # x = x // y
x %= y # x = x % y
x **= y # x = x ** y
IV Classes élémentaires
Les classes élémentaires sont immuables (non modifiables). Les opérations appliquées aux instances de ces classes
génèrent de nouvelles instances comme le montre l'exemple suivant :
>>> x=5
>>> id(x)
2053437424
>>> x+=1 # x référence une nouvelle instance
>>> id(x)
2053437440
V Opérations d'entrée/sortie
VI Structures de contrôle
Un bloc de code est un groupe d’instructions Python indentées précédées par ":". Un bloc peut en inclure d'autres.
Expression conditionnelle
Python offre la possibilité de expr1 if cond1 else #maximum de 2 valeurs x ,y
former des expressions dont expr2 m = x if x > y else y
l’évaluation est soumise à
une condition. Le résultat #les éléments négatifs de L1 sont
est l’évaluation de remplacés par 0 dans L2 (voir
expression1 si la condition l’itérable liste dans la section VII)
est True, et celle de L1=[-1,0,5,3]
expression2 sinon. expr1 if cond1 else L2=[0 if x<0 else x for x in L]
Cette construction ne permet expr2 if cond2 else
pas l’utilisation du mot expr3 x=int(input("?"))
réservé elif mais on peut ">0" if x>0 else "<0" if x<0 else "=0"
emboîter deux expressions
conditionnelles.
Un intervalle défini par range, également considéré comme une séquence, est un itérable ou conteneur formé
par une succession d’entiers.
range(debut, fin, pas) génère l’intervalle [debut, fin [ par pas entier relatif égal à pas.
Une chaîne est une séquence non modifiable et ordonnée de caractères. Le tableau suivant résume les
principales opérations applicables aux chaînes.
Une liste est une séquence, ordonnée et modifiable, d’éléments éventuellement hétérogènes séparés par une
virgule et délimitée par une paire de crochets.
Le tableau suivant résume les principales fonctions/méthodes applicables aux listes.
Un tuple est une séquence, ordonnée et non modifiable, d’éléments éventuellement hétérogènes séparés par
une virgule. Le tableau suivant résume les principales fonctions/méthodes applicables aux tuples :
Un ensemble est une collection d'éléments distincts non ordonnés et encadrés par des accolades. La classe
set représente la notion d’ensemble en mathématique. Un ensemble doit impérativement comporter des
éléments non modifiables. La création d'ensembles de listes, de dictionnaires ou d'ensembles déclenche une
erreur. Le tableau suivant résume les principales fonctions/méthodes applicables aux ensembles.
Un dictionnaire est une structure modifiable et non ordonnée d'associations (clé : valeur). Les clés sont
impérativement des objets non modifiables. L'utilisation de listes, de dictionnaires ou d'ensembles comme
clé déclenche une erreur. Les valeurs sont des objets de classes quelconques.
Exemple
Exemple
X Les sous-programmes
Une fonction est un bloc d’instructions indentées (corps de la fonction) destiné à réaliser une opération. Elle peut
recevoir des paramètres et renvoie éventuellement un résultat. L’appel d’une fonction Python retourne toujours un
objet, par défaut None. Dans le corps de la fonction ce retour est spécifié à l’aide de l’instruction return.
Le tableau suivant résume les concepts de base associés aux fonctions Python.
On n'est jamais à l'abri d'une erreur quand on manipule des fichiers et qu'on oublie de les fermer. Le mot réservé
with du langage python, permet d'éviter cette situation et dont voici sa syntaxe générale :
with open (mon_fichier, mode) as variable :
# Opérations de manipulation du fichier
XIII La récursivité
Une fonction récursive est une fonction dont le corps contient un ou plusieurs appels à elle-même.
Un traitement récursif nécessite de déterminer :
le cas trivial ou encore le cas d'arrêt
le traitement récurrent et de s'assurer que ce dernier atteindra le cas d'arrêt (terminaison).
Dans le tableau suivant, on donne deux exemples de problèmes résolus de façon récursive.
Problème Démarche Solution récursive
def factorielle(n):
Calcul de la On raisonne par récurrence sur n if n<=1:
factorielle de n Cas trivial : 0 ! = 1 return 1 #cas trivial
𝒏 else:
𝒏! = 𝒊 𝑛! = 𝑛 × (𝑛 − 1)! return n*factorielle(n-1)
𝒊 𝟏
Tri Fusion Le tri fusion est un tri récursif qui def fusion_Rec(L1,L2):
applique le principe "diviser pour if L1==[]:
régner". return L2
Pour une liste L, le principe du tri fusion if L2==[]:
est le suivant : return L1
si L est de taille 1, elle est triée et on if L1[0]<L2[0]:
la retourne (cas trivial) ; return [L1[0]]+fusion_Rec(L1[1:],L2)
sinon on divise L en deux sous-listes else:
L1 et L2 presque égales ( return [L2[0]]+fusion_Rec(L1,L2[1:])
L1[0:len(L)//2] et L2[len(L)//2:
len(L)] ) : def tri_fusion_Rec(L):
on applique récursivement if len(L)<=1:
l’algorithme de tri par fusion à L1 return L
puis à L2 L1=[L[x] for x in range (len(L)//2)]
on fusionne les L1 et L2 triées. (La L2=[L[x] for x in range (len(L)//2,
fusion est également effectuée de len(L))]
manière récursive où le cas trivial Return fusion_Rec(tri_fusion_Rec(L1,
est l'épuisement de l'une des 2 listes tri_fusion_Rec(L2))
et on retourne l'autre).
Le temps d’exécution d’un programme dépend fortement de la machine qui l’exécute, du langage dans lequel il
est écrit et de l’algorithme sous-jacent. Pour des données de grandes tailles, l’algorithme est la cause
déterminante du temps d’exécution d’un programme. Des méthodes rationnelles permettent de calculer le coût
d’un programme exprimé en nombre d’opérations élémentaires exécutées par la machine afin d’obtenir le
résultat final. Généralement, ce nombre est fonction de la taille n des données à traiter.
Le coût se calcule comme suit :
Coût d’une opération élémentaire op = 1.
Coût d'une séquence de k instructions p_1 ; p_2 ; … p_k = ∑𝒌𝒊 𝟏 𝒄𝒐û𝒕(𝒑𝒊 ) .
Coût d'une structure conditionnelle simple if c: p else : q <= coût(c) + max(coût(q),coût(p)).
Coût d'une structure conditionnelle complète if c_1: p_1 elif c_2 : p_2 … elif c_i : p_i … else : p_k+1
= (∑𝒌𝒊 𝟏 𝒄𝒐û𝒕(𝒄𝒊 )) + 𝐦𝐚𝐱 𝒄𝒐û𝒕(𝒑𝒊 ).
𝟏 𝒊 𝒌 𝟏
Coût d'une boucle for i in iterable : p_i = ∑ ∈ é 𝑐𝑜û𝑡(𝑝𝑖)
Coût d'une boucle while c : p est le plus difficile à exprimer (nombre d'itérations non connu à priori)
majorer le nombre de répétitions => NombreRépétitions*( 𝑐𝑜û𝑡(𝑐)+ 𝑐𝑜û𝑡(𝑝))+1* 𝑐𝑜û𝑡(𝑐)
Exemple : Calcul xn
- Approche naïve :
def puiss1(x,n):
r = 1 #1 affectation
for i in range(n): # n affectations
r*= x # 1 affectation + 1 multiplication
return r # 1 retour
Bibliographie et Netographie
Ouvrages
Learning Python, Mark Lutz, Edition O’Reilly, Juin 2013, ISBN: 9781449355722.
Informatique pour tous en classes préparatoires aux grandes écoles, Benjamin Wack & al., Edition Eyrolles,
Août 2013, ISBN: 978-2-212-13700-2.
Supports de Cours
Support de Cours de H.Filali et H.Bouzidi, Rappel, pour 2ème année préparatoire sections MP-PC-T, IPEIM,
Année universitaire 2019-2020.
Support de Cours de Laila Hammami pour 1ère année préparatoire sections MP-PC-T, IPEIN, Année
universitaire 2019-2020.
Support de Cours de W.Meftah, Rappel, pour 2ème année préparatoire sections MP-PC-T, IPEIS, Année
universitaire 2019-2020.
Sites Web :
https://www.python-course.eu/
https://www.ics.uci.edu/~brgallar/index.html
Elaboré par :
-- Avril 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année MP-PC-T des Instituts
Préparatoires aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
Pour les différentes bibliothèques, quelques fonctions seulement parmi les plus utilisées
sont décrites. Aussi, toutes les applications présentées sont données juste à titre d’exemple
et ne constituent en aucun cas un ensemble complet.
I Introduction
Python offre une panoplie de bibliothèques intéressantes pour, entre autres, la simulation numérique et le calcul
scientifique. Dans ce but, nous exposerons dans ce qui suit les principales fonctionnalités de Numpy, Matplotlib
et Scipy. Nous présenterons ensuite des applications liées au traitement d’image et à la cryptographie, en plus de
plusieurs exercices d’application avec leurs corrigés.
>>>import numpy as np
>>>a=np.array([1,4,5,8])
>>>b=np.array([[1,2],[3,4],[5,6]],dtype=float)
>>>c=np.array([[[1,2],[1,2]],[[1,2],[1,2]]])
>>>print(a)
[1 4 5 8]
>>>print(b)
[[ 1. 2.]
[ 3. 4.]
[ 5. 6.]]
>>>print(c)
[[[1 2]
[1 2]]
[[1 2]
[1 2]]]
>>>c[1,1,1]
2
Nous limiterons notre propos aux tableaux uni et bi-dimensionnel appelés aussi vecteurs et matrices.
II.1.1 Vecteurs
En Python la fonction numpy.array permet de créer un vecteur qui est un tableau à une dimension. Pour
créer un vecteur il suffit de passer l'itérable contenant les éléments comme argument.
Les fonctions size retourne le nombre d’éléments d’un vecteur et la fonction ndim retourne la dimension
qui est 1 dans le cas d’un vecteur (2 pour une matrice).
Les fonctions empty, zeros, ones, arange, linspace permettent aussi la création de vecteurs
particuliers.
Empty Construit un vecteur non initialisé (le contenu est totalement np.empty(taille)
imprédictible ou aléatoire).
Exemple
>>>v1=np.linspace(-1,1,10)
>>>print(v1)
[-1. -0.77777778 -0.55555556 -0.33333333 -0.11111111 0.11111111
0.33333333 0.55555556 0.77777778 1. ]
>>>v2=np.arange(10)
>>>print(v2)
[0 1 2 3 4 5 6 7 8 9]
>>>type(v2)
<type 'numpy.ndarray'>
>>>v3=np.arange(2,10,2)
>>>print(v3)
[2 4 6 8]
>>>v4=np.zeros(8);v5=np.ones(6,dtype=int)
>>>print(v4);print(v5)
[ 0. 0. 0. 0. 0. 0. 0. 0.]
[1 1 1 1 1 1]
1
Les opérations sur les vecteurs sont possibles avec les opérateurs classiques de Python, tels que décrit ci-
dessous.
>>>u=np.array([1,2,3,4]);v=np.array([5,6,7,8])
>>>u+v
>>>v-u
>>>u*2
>>>v**3
>>>u*v
>>>v/u
II.1.2 Matrices
Pour créer une matrice en Python, qui est un tableau à deux dimensions, il suffit de passer un itérable
d'itérables (liste de listes, liste de tuples, tuple de tuples, etc.) comme argument à la fonction array.
Les fonctions size, shape et ndim retournent respectivement le nombre d’élément, nombre de
lignes/colonnes et la dimension. Par exemple :
La fonction reshape permet de redimensionner un vecteur ou une matrice, comme décrit ci-après :
>>>m1=np.reshape(np.arange(10),(2,5))
#ou bien m1 = np.arange(10).reshape((2,5))
>>>print(m1)
[[0 1 2 3 4]
[5 6 7 8 9]]
>>>m.reshape(2,3)
array([[ 1.2, 2.5, 3.2],
[ 1.8, 1.1, 4.3]])
Les fonctions empty, zeros, ones, eye et diag permettent de créer des matrices particulières.
ones Construit une matrice dont les éléments sont tous 1 np.ones((l,c))
Exemple
>>>m2=np.zeros((2,4));m3=np.ones((3,3),dtype=int);
>>>m4=np.eye(4); m5=np.diag([1,2,3])
>>> print('m2=',m2);print('m3=',m3);print('m4=',m4);print('m5=',m5)
m2= [[0. 0. 0. 0.]
[0. 0. 0. 0.]]
m3= [[1 1 1]
[1 1 1]
[1 1 1]]
m4= [[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
m5= [[1 0 0]
[0 2 0]
[0 0 3]]
L’accès à un élément d’une matrice se fait à l’aide d’indexage 𝐴[𝑖, 𝑗] où 𝑖 désigne la ligne et 𝑗 la colonne. On
peut également récupérer une partie d’une matrice : ligne, colonne et sous-matrice. Par exemple :
>>>A=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype=int)
>>>A[1,0];A[2,2]
4
9
>>>A[0,:];A[:,1]
array([1, 2, 3])
array([2, 5, 8])
>>>A[0:1,:];A[:,1:2]
array([[1, 2, 3]])
array([[2],
[5],
[8]])
Les opérations algébriques sur les matrices sont possibles avec les opérateurs classiques de Python.
>>>A+A
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
>>>A-A
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>>A*2
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
Pour le produit matriciel, il faut utiliser la fonction dot, comme l’exemple suivant :
La trace et la transposé s’obtiennent avec les fonctions trace et transpose. Par exemple :
Le déterminant, le rang, l’inverse, les valeurs propres et les vecteurs propres s’obtiennent respectivement par
les fonctions det, matrix_rank, inv, eigvals et eig du module numpy.linalg. Par exemple :
>>>np.linalg.det(A)
6.66133814775e-16
>>>np.linalg.matrix_rank(A)
2
>>>np.linalg.inv(A)
[[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]
[ 9.00719925e+15 -1.80143985e+16 9.00719925e+15]
[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]]
>>>np.linalg.eigvals(A)
[ 1.61168440e+01 -1.11684397e+00 -1.30367773e-15]
>>>np.linalg.eig(A)
(array([ 1.61168440e+01, -1.11684397e+00, -1.30367773e-15]),
array([[-0.23197069, -0.78583024, 0.40824829],
[-0.52532209, -0.08675134, -0.81649658],
[-0.8186735 , 0.61232756, 0.40824829]]))
Pour finir, la fonction solve du module numpy.linalg permet de résoudre le système linéaire 𝐴 ⋅ 𝑥 = 𝑏
>>>print(np.linalg.solve(A,np.array([1,0,1])))
[ -9.00719925e+15 1.80143985e+16 -9.00719925e+15]
Cette fonction peut être utilisée de nombreuses manières différentes, pour obtenir des résultats assez fins.
L’idée générale est de lui donner en argument deux tableaux de nombres, décrivant respectivement les
abscisses et les ordonnées des points à tracer. Sans autre option, ces points sont reliés par des segments
bleus, en traits pleins.
Exemple 1
Les options graphiques permettent notamment de modifier le type de segment (pointillés, sans segment),
d’afficher ou non un marqueur au niveau de chaque point et de changer la couleur de ces objets.
Exemple 2
On peut enfin appeler plusieurs fois la fonction plot successivement. Les tracés sont alors superposés.
Exemple 3
Pour tracer une fonction, on trace en fait des cordes de cette fonction, à partir d’une subdivision de
l’intervalle considéré. La fonction linespace() de la bibliothèque numpy permet de créer automatiquement
de telles subdivisions, avec un nombre de points à régler manuellement.
Exemple
Pour tracer le graphe de la fonction 𝑥 ↦ 𝑥 sur [0,1] avec une subdivision en 100 segments, donc en utilisant
101 points, on peut utiliser le code suivant :
II.3.1 Présentation
Scipy est une bibliothèque numérique d’algorithmes et de fonctions mathématiques, basée sur les tableaux,
complétant ou améliorant (en termes de performance) les fonctionnalités de la bibliothèque numpy.
La librairie Scipy contient de nombreuses boîtes à outils consacrées aux méthodes de calcul scientifique :
- Fonctions spéciales : scipy.special (fonctions de Bessel, erf, gamma, etc.)
- Intégration numérique : scipy.integrate (intégration numérique ou d’équations différentielles)
- Méthodes d’optimisation : scipy.optimize (minimisation, moindres-carrées, zéros d’une fonction)
- Interpolation : scipy.interpolate
- Transformées de Fourier : scipy.fftpack
- Traitement de signal : scipy.signal (convolution, corrélation, filtrage, ondelettes, etc.)
- Algèbre linéaire : scipy.linalg
- Statistiques : scipy.stats (fonctions et distribution statistiques)
- Traitement d’images multidimensionnelles : scipy.ndimage
- Entrées/Sorties : scipy.io
Ce module propose des fonctions qui permettent de déterminer des valeurs approchées des zéros d’une
fonction :
- fsolve : déterminer la racine d’une équation scalaire ou vectorielle.
- bisect : permet d’implémenter la méthode de recherche par dichotomie.
- newton : permet d’implémenter la méthode de recherche newton.
Exemple
L’extension scipy.integrate propose des fonctions pour calculer des intégrales simples, doubles ou
même triples et aussi de résoudre des équations différentielles de premier ou second ordre.
Exemple
import math
import scipy.integrate as spi
h = lambda x:math.cos(x)
y=spi.quad(h,0.0,math.pi/2.0)
>>>y
(0.9999999999999999, 1.1102230246251564e-14)
La fonction odeint résout numériquement des équations différentielles avec des conditions initiales de la
forme : = 𝑓(𝑦(𝑡), 𝑡)
La représentation graphique des solutions de cette résolution peut être donnée par :
Les appareils photographiques numériques sont actuellement omniprésents via des supports variés comme les
téléphones portables ou les tablettes numériques. Ils permettent le stockage d’un grand nombre d’images et ils
proposent également des options de retouches.
La suite présente quelques aspects du traitement mathématique et informatique des images numériques.
Pixel :
Le terme pixel provient de l’abréviation anglaise « PiCture ELement » qui signifie élément d’image. Un
pixel est l’unité de base qui permet de mesurer la définition d’une image numérique.
Image numérique :
Une image numérique est une matrice de n lignes et p colonnes dont les coefficients sont les valeurs des
pixels. Donc, il est possible d’avoir facilement accès à la grille des pixels et de faire des traitements
matriciels directs sur les images.
Image en niveau de gris :
Dans le cas des images numériques en niveaux de gris, la valeur du pixel est généralement enregistrée dans
l’ordinateur ou l’appareil photo numérique sous forme de nombres entiers entre 0 et 255 soit 256 valeurs
possibles pour chaque pixel. La valeur 0 est attribué au noir, 255 correspond au blanc et les pixels entre 0 et
255 représentent les niveaux de gris (ou nuances de gris).
Image couleur :
Une image couleur est en fait la réunion de trois images : une rouge, une verte et une bleue.
Chaque pixel est alors représenté par un triplet (Red, Green, Blue), chacun étant un entier codé sur 8 bits.
Exemple :(255,0,0) correspond à un pixel rouge, (0,255,0) représente un pixel vert, (0,0,255) est le pixel
bleu. Par additivité (255,0,255) devient le pixel magenta.
Remarque : Sur une image en niveaux de gris, chaque pixel est ou bien noir (0) ou bien blanc (255) ou bien
possède un niveau de gris entre les deux. Cela signifie que les trois composantes R, G, B ont la même valeur.
Dans la suite de cette partie, les traitements ne s’appliquent qu’à des images en niveaux de gris, il est possible
d’opérer sur des images couleurs en appliquant les traitements proposés sur chacune des trois couleurs du
triplet.
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>check=np.zeros((8,8,3),dtype='uint8') #exemple pour image couleur
>>>check[:,1:,::2]=255
>>>plt.imshow(check)
>>>plt.show()
Contraste :
Le contraste peut être modifié par l’application de fonctions mathématiques. Par exemple, en remplaçant la
valeur de chaque pixel par sa racine carrée, l’image assombrie alors qu’elle s’éclaircit si la valeur du pixel
est remplacée par son carré. Ces fonctions ont pour effet de diminuer le contraste.
Une autre idée consiste à faire un réajustement linéaire des valeurs des pixels selon :
𝑓: [0,256[ → [0,256[
𝑦 = 𝑥 + 0,4. (𝑥 − 127) 𝑠𝑖 𝑦 ∈ [0,255]
𝑥 ↦ 0 𝑠𝑖 𝑦 < 0
255 𝑠𝑖 𝑦 > 255
Il s’agit d’augmenter l’écart entre la valeur du pixel et la valeur moyenne (127) pour une image dont les
valeurs sont comprises entre 0 et 255. Cette fonction permet d’augmenter le contraste, les "noirs" sont plus
noirs et les "blancs" plus blancs.
2. Ecrire le script de la fonction Python permettant de modifier le contraste d’une image donnée.
5. Ecrire le script de la fonction Python permettant de filtrer une image donnée en utilisant la méthode de
moyennage.
En effectuant cette opération pour chaque pixel, on supprime une partie du bruit, car ce bruit est constitué de
fluctuations aléatoires, qui sont diminuées par un calcul de moyennes.
Le moyennage des pixels est très efficace pour enlever le bruit dans les images, malheureusement il détruit
également une grande partie de l’information de l’image. On peut en effet s’apercevoir que les images
obtenues par moyennage sont floues. Ceci est en particulier visible près des contours, qui ne sont pas nets.
Afin de réduire ce flou, il faut remplacer le moyennage par une opération un peu plus complexe, que l’on
nomme médiane. Etant donné la valeur a d’un pixel, et les valeurs b, c, d, e, f, g, h, i, on commence par les
classer par ordre croissant.
La médiane des neuf valeurs a, b, c, d, e, f, g, h, i est la 5ème valeur de ce classement (c’est-à-dire la valeur
centrale de ce classement).
6. Ecrire le script de la fonction Python permettant de filtrer une image donnée en utilisant la méthode de
médiane.
Détection de contours :
Pour localiser des objets dans les images, il est nécessaire de détecter les bords de ces objets. Ces bords
correspondent à des zones de l’image où les valeurs des pixels changent rapidement.
Afin de savoir si un pixel avec une valeur a est le long d’un bord d’un objet, on prend en compte les valeurs
b, c, d, e de ses quatre voisins (deux horizontalement et deux verticalement), qui sont disposés par rapport à
a. Notons que l’on utilise ici seulement les 4 voisins qui ont un coté commun avec le pixel considéré, ce qui
est différent du calcul de moyennes et de médianes où l’on utilisait 8 voisins. Ceci est important afin de
détecter aussi précisément que possible les bords des objets.
IV Application à la cryptographie
IV.1 Définition
La cryptographie est une des disciplines de la cryptologie s'attachant à protéger des messages (assurant
confidentialité, authenticité et intégrité) en s'aidant souvent de secrets ou clés. Elle se distingue de la
stéganographie qui fait passer inaperçu un message dans un autre message alors que la cryptographie rend un
message inintelligible à autre que qui-de-droit. Elle est utilisée depuis l'Antiquité, mais certaines de ses
méthodes les plus importantes, comme la cryptographie asymétrique, datent de la fin du XXe siècle.
Le chiffrement est la conversion des données d’un format lisible à un format codé qui peut uniquement être
lu ou traité qu’après déchiffrement.
Les principes du chiffrement se basent sur la notion d’algorithmes de chiffrement et de « clés ». Lorsque
l’information est envoyée, elle est chiffrée à l’aide d’un algorithme et peut être décodée uniquement à l’aide
de la clé appropriée.
Quelques méthodes qui sont utilisées pour coder et décoder les informations sont présentées dans la suite.
IV.2.1 Principe
ou bien comme le disent deux célèbres Gaulois : « Ils sont fous ces romains ! ».
En fait César, pour ses communications importantes à son armée, cryptait ses messages (ce que l’on appelle
le chiffrement de César). Le chiffrement de César est un décalage des lettres : pour crypter un message, A
devient D, B devient E, C devient F,...
𝐴 ↔ 𝐷 𝐵 ↔ 𝐸 𝐶 ↔ 𝐹…𝑊 ↔ 𝑍 𝑋 ↔ 𝐴 𝑌 ↔ 𝐵 𝑍 ↔ 𝐶
Pour déchiffrer le message de César, il suffit de décaler les lettres dans l’autre sens, D se déchiffre en A, E en
B,...
Pour ce faire, nous associons à chacune des 26 lettres majuscules (ou minuscules) de A à Z (de a à z) un
entier de 0 à 25.
Le chiffrement de César est simplement une addition dans ℤ/26ℤ. Fixons un entier k qui est le décalage (par
exemple k = 3 dans l’exemple de César ci-dessus) et définissons la fonction de chiffrement de César de
décalage k qui va de l’ensemble ℤ/26ℤ dans lui-même :
ℤ/26ℤ → ℤ/26ℤ
𝐶 :
𝑥 ↦𝑥+𝑘
Pour déchiffrer, il suffit d’aller dans l’autre sens, c’est-à-dire ici de soustraire. La fonction de déchiffrement
de César de décalage k est :
ℤ/26ℤ → ℤ/26ℤ
𝐷 :
𝑥 ↦ 𝑥−𝑘
Exemple
FLEN veut envoyer des messages secrets à FELTEN. Ils se sont d’abord mis d’accord sur une clé secrète k,
par exemple k = 11. Alice veut envoyer le message "COUCOU" (ou "coucou") à Bruno. Elle transforme
"COUCOU" (ou "coucou") en "2 14 20 2 14 20". Elle applique la fonction de chiffrement 𝐶 (𝑥) = 𝑥 +
11 à chacun des nombres qui donne "13 25 5 13 25 5" ce qui correspond au mot crypté "NZFNZF" (ou
"nzfnzf"). Elle transmet le mot crypté à Bruno, qui selon le même principe applique la fonction de
déchiffrement 𝐷 (𝑥) = 𝑥 − 11 affin de récupérer le message de départ.
IV.3.1 Principe
Ecrire une fonction nommée chiffreVigenere permettant de chiffrer un message clair donné avec une clé
clef donnée en utilisant le chiffrement de Vigenère.
IV.4.1 Principe
Le chiffrement RSA (nommé par les initiales de ses trois inventeurs) est un algorithme de cryptographie
asymétrique, très utilisé dans le commerce électronique et plus généralement pour échanger des données
confidentielles sur Internet. Cet algorithme a été décrit en 1977 par Rivest, Shamir et Adelman.
Le cryptage/décryptage RSA est fondé sur l'utilisation d'une paire de clés composée d'une clé publique pour
crypter et d'une clé privée pour décrypter des données confidentielles.
La création des clés s’effectue de la manière suivante. Soient p et q deux grands nombres premiers.
calculer l’indicatrice 𝑧 = (𝑝 − 1) ∗ (𝑞 − 1) ;
calculer 𝑛 = 𝑝 ∗ 𝑞 ;
choisir un grand entier c, premier avec z ;
calculer l’entier 𝑑 = 𝑐 ( )
𝑚𝑜𝑑 𝑧. (notons que l’inverse modulaire est calculé par l’algorithme
d’Euclide étendu)
La clé publique est le tuple (𝑛, 𝑐) et la clé privée est le tuple (𝑛, 𝑑)
On suppose avoir déjà défini la fonction python invmod qui calcule l’inverse modulaire de deux entiers
premiers entre eux avec l’algorithme d’Euclide étendu.
def invmod(n,p):
n1,p1,u1,u2)=(n,p,1,0)
while p1>0:
q=n1/p1
(n1,p1,u1,u2)=(p1,n1-q*p1,u2,u1-q*u2)
return u1%p
>>> invmod(39,53)
34
1. Ecrire une fonction python, nommée clefRSA, qui prend en entrée deux grands nombres p et q
(supposés premiers) et retourne les deux clés (publique et privée).
2. Ecrire une fonction python, nommée cryptDecryptE, qui prend un entier a et une clé CL et retourne
l’entier crypté (ou décrypté) associé à a.
3. Ecrire une fonction python, nommée cryptDecryptList, qui prend une liste d’entiers L et une clé
CL et retourne la liste image de L par cryptDecryptE.
𝑎 , 𝑥 + 𝑎 , 𝑥 + ⋯……+𝑎 , 𝑥 =𝑏
⎧
𝑎 , 𝑥 + 𝑎 , 𝑥 + ⋯……+ 𝑎 , 𝑥 =𝑏
⎨⋮
⎩𝑎 , 𝑥 +𝑎 , 𝑥 + ⋯……+ 𝑎 , 𝑥 =𝑏
Dans cette méthode, et pour chaque composante 𝑥 du vecteur x, on construit une nouvelle matrice que l’on
obtient en remplaçant les composantes de la colonne i de la matrice A par les composantes du vecteur b. la
composante 𝑥 est calculée par division du déterminant de cette nouvelle matrice par celui de A. (Il est
nécessaire que le déterminant de A ne soit pas nul)
𝑎 , ……𝑎 , 𝑏 𝑎 , ………𝑎 ,
⋮⋮⋮
⋮⋮⋮
𝑎 , ……𝑎 , 𝑏 𝑎 , ……𝑎 ,
𝑥 =
𝑑𝑒𝑡( 𝐴)
1) Ecrire une fonction python, nommée METHODE1, qui permet de résoudre le système d’équations
(𝐴𝑥 = 𝑏) par l’utilisation de la formule de CRAMER.
𝑥 = 𝑎 𝑏
𝑎 , 𝑥 + 𝑎 , 𝑥 + ⋯……+ 𝑎 , 𝑥 =𝑏
⎧
𝑎 , 𝑥 + ⋯………+ 𝑎 , 𝑥 =𝑏
⎨⋮
⎩𝑎 , 𝑥 =𝑏
et en supposant qu’aucun des termes 𝑎 , 0 ≤ 𝑖 ≤ 𝑛 − 1, n’est nul, on peut résoudre le système comme suit :
𝑏
⎧𝑥 =
⎪ 𝑎 ,
⎨ 𝑏 −∑ 𝑎 𝑥
⎪𝑥 = 𝑖 = 𝑛 − 2, 𝑛 − 1, … … ,0
⎩ 𝑎
Pour pouvoir utiliser cette méthode, il faut rendre le système triangulaire supérieur. Pour cela, on procède
comme suit :
Etape1
- On vérifie que l’élément 𝑎 , est non nul sinon on permute la ligne d’indice 0 avec la première ligne du
système à premier coefficient non nul.
- On applique la relation 𝐿 ← 𝐿 − , 𝐿 sur les coefficients des lignes d’indices 1 à 𝑛 − 1 ( 𝐿
,
représente les coefficients de la ligne i de A).
Etape k
- On vérifie que l’élément 𝑎 est non nul sinon on permute la ligne d’indice k avec la première ligne
(parmi les lignes de k+1 à n du système) qui présente un coefficient d’indice colonne k non nul.
- On applique la relation 𝐿 ← 𝐿 − 𝐿 sur les coefficients des lignes de k+1 à 𝑛 − 1 (𝐿 représente les
coefficients de la ligne i de A).
L’étape 1 permet de rendre nul les coefficients de 𝑎 , à 𝑎 , de la première colonne de la matrice. Il faut
donc ré-appliquer cette démarche, au reste de la matrice, étape par étape, jusqu’à obtenir une matrice
triangulaire supérieure.
3) En supposant qu’aucun des termes 𝑎 , 0 ≤ 𝑖 ≤ 𝑛 − 1, n’est nul, Ecrire une fonction python, nommée
TRIANGLE, qui permet de rendre le système triangulaire supérieure.
4) Ecrire une fonction python, nommée METHODE3, qui permet de résoudre le système d’équations
(𝐴𝑥 = 𝑏) par utilisation de la méthode dite directe.
1 0 0 … 0 𝑢 , 𝑢 , … 𝑢 , 𝑢 ,
𝑙 , 1 0 … 0 0 𝑢 , … 𝑢 , 𝑢 ,
⎛ ⎞ ⎛ ⎞
𝐿=⎜ 𝑙 , 𝑙 , 1 … 0⎟ 𝑈 = ⎜ 0 0 … 𝑢 , 𝑢 , ⎟
⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮
⎝𝑙 , 𝑙 , 𝑙 , … 1⎠ ⎝ 0 0 0 … 𝑢 , ⎠
Les déterminations des coefficients de L et de U sont liées et sont donnés par l’algorithme suivant :
- Le coefficient 𝑢 , =𝑎 , ;
- La première ligne de U est la première ligne de A et la première colonne de L est formée par les pivots
𝑙, = , .
,
Le coefficient 𝑢 , =𝑎 , −∑ 𝑙 , 𝑢 , .
5) En supposant que la matrice A du système est inversible, écrire une fonction python, nommée
decomp_LU, qui permet de décomposer une matrice A en deux matrices L et U.
Deux équations au lieu d’une, cela paraît plus compliqué mais ici, les matrices L et U sont triangulaires et
dans ce cas la résolution est rapide.
𝑧 =𝑏
L’algorithme de détermination de z est :
𝑧 = 𝑏 −∑ 𝐿, 𝑧1≤𝑖 ≤𝑛−1
2.x0 1.x1 1
S 1.x0 2.x1 1.x2 2
1.x1 2.x2 3
8) Définir la matrice A du système S.
9) Définir le vecteur b du système S.
10) Ecrire les instructions Python permettant la résolution du système S par les différentes méthodes de
résolutions présentées en I, II, et III, IV et celle de Python et d'indiquer la méthode la plus rapide pour
la résolution de ce système.
PARTIE A
On désire implémenter un module de fonctions python permettant la recherche approchée d'un zéro d'une
fonction dans un intervalle fixé, par plusieurs méthodes avec une précision de calcul 𝜀.
- Si 𝑓(𝑐) est du signe opposé à 𝑓(𝑎), la racine appartient à l'intervalle [𝑎, 𝑐],
Méthode de Newton
La méthode de Newton consiste à calculer une suite de valeurs (𝑥 )convergeant vers la racine 𝛼 de
l'équation 𝑓(𝑥) = 0. Cette méthode est applicable à la double condition : la fonction doit être dérivable et
la dérivée ne doit pas s'annuler au voisinage de 𝛼.
𝑓(𝑥 )
𝑥 =𝑥 −
𝑓′(𝑥 )
𝑓(𝑥 )
𝑥 =𝑥 −
𝑓′(𝑥 )
.
.
𝑓(𝑥 )
𝑥 =𝑥 −
𝑓′(𝑥 )
En supposant que la solution appartienne à un intervalle [𝑎, 𝑏] fixé et que < 1∀𝑥 ∈ [𝑎, 𝑏], alors la suite
définie par 𝑥 = 𝑔(𝑥 ) ∀𝑥 ∈ [𝑎, 𝑏] converge vers la racine 𝛼 quand 𝑛 tend vers l'infini.
Le processus s'arrête lorsque la différence |𝑥 − 𝑥 | ≤ 𝜀, 𝑥 est alors une valeur approchée de 𝛼.
On définit l'abscisse 𝑐comme intersection de l'axe des 𝑥 et de la corde joignant les points 𝑀 𝑒𝑡 𝑀 tels que
𝑀 = 𝑎, 𝑓(𝑎) et 𝑀 = 𝑏, 𝑓(𝑏)
𝑎𝑓(𝑏) − 𝑏𝑓(𝑎)
𝑐=
𝑓(𝑏) − 𝑓(𝑎)
- Si 𝑓(𝑐) est du signe opposé à 𝑓(𝑎), la racine appartient à l'intervalle [𝑎, 𝑐].
Il suffit de répéter le processus jusqu'à ce que la précision 𝜀 demandée soit atteinte. Cette précision est
atteinte lorsque f c .
Travail demandé
NB : Pour toutes les questions, les vérifications de continuité, de dérivabilité et de monotonie des fonctions
ne sont pas demandées.
3. Ecrire une fonction nommée dicho qui permet de calculer, par la méthode des dichotomies, une valeur
Simulation numérique et Applications
Révision Informatique, Concours MP-PC-T 2020
28
7. Ecrire une fonction nommée creer qui retourne une matrice M contenant un nombre de lignes égal au
nombre de méthodes de recherche. Chacune de ces lignes contient dans l’ordre : le numéro de la
méthode et les valeurs nb, xn et ibf. Ces valeurs seront extraites à partir du résultat obtenu par appel des
fonctions associées à chacune des méthodes.
On désire réorganiser le contenu de la matrice M obtenu par l’appel de la fonction creer de la question 7 de
telle sorte que les lignes dont ibf vaut 0 (c'est-à-dire recherche fructueuse) seront placées au début de la
matrice. Ces lignes seront par la suite triées selon la valeur associée à nb dans M, de la plus petite vers la
plus grande.
8. Ecrire une fonction nommée organiser qui permet de retourner une matrice M quelconque réorganisée
selon le principe présenté ci-dessus.
On demande d’utiliser, pour la programmation du tri, la méthode dite par sélection et qui consiste dans une
première étape à chercher la valeur la plus petite associée à nb dans la partie de M à trier et à permuter la
ligne correspondante avec la première ligne. L’étape suivante consiste à trier la matrice M diminuée de sa
première ligne c'est-à-dire de chercher dans la matrice diminuée la valeur associée à nb la plus petite puis
de permuter la ligne correspondante avec la première ligne de la matrice diminuée. Cette même opération
sera répétée pour le reste de la matrice jusqu’à ce que le tri souhaité soit effectué.
9. En supposant que les valeurs de a, b, eps et kmax sont déjà saisies, écrire le script python permettant
d’afficher le nom de la méthode (si elle existe) ayant effectué le minimum d’itérations pour le calcul du
zéro de 𝑓 ainsi que le résultat de la recherche.
1. Binarisation
import numpy as np
def Binariser(M,s):
n,p=np.shape(M)
M1=np.zeros((n,p))
for i in range(n):
for j in range(p):
if M[i,j]>s:
M1[i,j]=255
return M1
A=plt.imread("source.png")
B=Binariser(A,127)
plt.imshow(B)
plt.show()
plt.imsave("cible.png")
2. Contraste
f=lambda x:x-0.4*(x-127)
def Contraste(M):
n,p=np.shape(M)
M1=np.empty((n,p))
for i in range(n):
for j in range(p):
y=f(M[i,j])
if y>255:
M1[i,j]=255
elif y<0:
M1[i,j]=0
else:
M1[i,j]=y
return M1
def Negatif(M):
n,p=np.shape(M)
M1=np.empty((n,p))
for i in range(n):
for j in range(p):
M1[i,j]=255-M[i,j]
return M1
def Transformer(M):
R,V,B=M[:,:,0], M[:,:,1], M[:,:,2]
M1=0.21*R + 0,71*V + 0.07*B
return M1
def Filtrer_moy(M):
n,p=np.shape(M)
M1=M[:,:]
for i in range(1,n-1):
for j in range(1,p-1):
I=M[i-1:i+2,j-1,j+2]
return M1
def Filtrer_mediane(M):
n,p=np.shape(M)
M1=M[:,:]
for i in range(1,n-1):
for j in range(1,p-1):
I=M[i-1:i+2,j-1,j+2]
L.sort()
M1[i,j]=L[4]
return M1
7. Détection de contours
def Detecter_contours(M):
n,p=np.shape(M)
M1=M[:,:]
for i in range(1,n-1):
for j in range(1,p-1):
I=M[i-1:i+2,j-1,j+2]
l=int(np.sqrt((I[1,0]-I[0,1])**2+(I[1,2]-I[2,1])**2))
if l==0:
M1[i,j]=0
elif l>200:
M1[i,j]=255
return M1
#Chiffrement Cesar
Lmajus=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
Lminus=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
def C(x,k):
y=x+k
if y>26:
y-=26
return y
def D(x,k):
y=x-k
if y<0:
y+=26
return y
def Chiffre_cesar(msg,clef):
msg1=""
for c in msg:
if c in Lmajus:
e=Lmajus.index(c)
e1=C(e,clef)
msg1+=Lmajus[e1]
elif c in Lminus:
e=Lminus.index(c)
e1=C(e,clef)
msg1+=Lminus[e1]
else:
msg1+=c
return msg1
def Dechiffre_cesar(msg,clef):
msg1=""
for c in msg:
if c in Lmajus:
e=Lmajus.index(c)
e1=D(e,clef)
msg1+=Lmajus[e1]
elif c in Lminus:
e=Lminus.index(c)
Simulation numérique et Applications
Révision Informatique, Concours MP-PC-T 2020
33
e1=D(e,clef)
msg1+=Lminus[e1]
else:
msg1+=c
return msg1
>>> Chiffre_cesar("COUCOU",11)
'NZFNZF'
>>> Dechiffre_cesar("NZFNZF",11)
'COUCOU'
>>> Chiffre_cesar("J'aime ecouter la radio toute la journee",20)
"D'ucgy ywionyl fu luxci niony fu diolhyy"
>>> Dechiffre_cesar("D'ucgy ywionyl fu luxci niony fu diolhyy",20)
"J'aime ecouter la radio toute la journee"
def Attaque_cesar(msg):
for k in range(1,26):
print(Dechiffre_cesar(msg,k))
>>> Attaque_cesar("NZFNZF")
MYEMYE
LXDLXD
KWCKWC
JVBJVB
IUAIUA
HTZHTZ
GSYGSY
FRXFRX
EQWEQW
DPVDPV
COUCOU
BNTBNT
AMSAMS
ZLRZLR
YKQYKQ
XJPXJP
WIOWIO
VHNVHN
UGMUGM
TFLTFL
SEKSEK
RDJRDJ
QCIQCI
PBHPBH
OAGOAG
#Chiffrement Vigenère
def Chiffre_vigenere(msg,mot):
msg1=""
mot=mot.upper()
i=0
for c in msg:
if c in Lmajus:
e=Lmajus.index(c)
e1=C(e,Lmajus.index(mot[i]))
msg1+=Lmajus[e1]
elif c in Lminus:
e=Lminus.index(c)
e1=C(e,Lmajus.index(mot[i]))
msg1+=Lminus[e1]
else:
msg1+=c
i+=1
if i>len(mot)-1:
i=0
return msg1
def Dechiffre_vigenere(msg,mot):
msg1=""
mot=mot.upper()
i=0
for c in msg:
if c in Lmajus:
e=Lmajus.index(c)
e1=D(e,Lmajus.index(mot[i]))
msg1+=Lmajus[e1]
elif c in Lminus:
e=Lminus.index(c)
e1=D(e,Lmajus.index(mot[i]))
msg1+=Lminus[e1]
else:
msg1+=c
i+=1
if i>len(mot)-1:
i=0
return msg1
#Chiffrement RSA
def invmod(n,p):
(n1,p1,u1,u2)=(n,p,1,0)
while p1>0:
q=n1/p1
(n1,p1,u1,u2)=(p1,n1-q*p1,u2,u1-q*u2)
return u1%p
def clef_RSA(p,q):
z=(p-1)*(q-1)
n=p*q
c=z+1
d=invmod(c,z)
return (n,c),(n,d)
def CryptDecryptE(e,CL):
return (e**CL[1])%CL[0]
def CryptDecryptList(L,CL):
def Codage(ch):
def Decodage(L):
ch=""
for e in L:
ch+=chr(e)
return ch
def CryptageC(ch,CL):
return CryptDecryprtList(Codage(ch),CL)
def DecryptageC(L,CL):
return Decodage(CryptDecryptList(L,CL))
import numpy as np
def METHODE1(A,b):
n=len(b)
x=np.empty(n)
for i in range(n):
A1=A[:,:]
for k in range(n):
A1[k,i]=b[k]
x[i]=np.linalg.det(A1)/ np.linalg.det(A)
return x
def METHODE2(A,b):
n=len(b)
x=np.empty(n)
IA=np.linalg.inv(A)
for i in range(n):
x[i]=sum(IA[i,j]*b[j] for j in range(n))
return x
def TRIANGLE(A):
n=len(A)
for k in range(1,n):
for i in range(k,n):
pivot=A[i,k-1]/ A[k-1,k-1]
for j in range(k-1,n)
A[i,j]=A[i,j] - pivot*A[k-1,j]
return A
def METHODE3(A,b):
n=len(b)
x=np.empty(n)
x[n-1]=b[n-1]/A[n-1,n-1]
for i in range(n-2,-1,-1):
x[i]=(b[i]-sum(A[i,j]*x[j] for j in range(i+1,n)))/A[i,i]
return x
def decomp_LU(A):
n=len(b)
L=np.eye(n)
U=np.zeros((n,n))
U[0,0]=A[0,0]
for i in range(1,n):
U[0,i]=A[0,i]
L[i,0]=A[i,0]/ A[0,0]
U[i,i]= A[i,i]-sum(L[i,k]*U[k,i] for k in range(i))
for j in range(i+1,n):
U[i,j]= A[i,j]-sum(L[i,k]*U[k,j] for k in range(i))
L[j,i]= (A[j,i]-sum(L[k,i]*U[j,k] for k in range(i)))/U[i,i]
U[n-1,n-1]= A[n-1,n-1]-sum(L[n-1,k]*U[k,n-1] for k in range(n-1))
return L,U
def METHODE4(A,b):
n=len(b)
x=np.empty(n)
L,U=decomp_LU(A)
z=np.empty(n)
z[0]=b[0]
for i in range(1,n):
z[i]=b[i]-sum(L[i,j]*z[j] for j in range(i))
x[n-1]=z[n-1]
for i in range(n-2,-1,-1):
x[i]=(z[i]-sum(U[i,j]*x[j] for j in range(i+1,n)))/U[i,i]
return x
def METHODE5(A,b):
return np.linalg.solve(A,b)
A=np.array([[2,-1,0],[-1,2,-1],[0,-1,2]])
b=np.array([1,2,3])
ibf=1
return nb,xn,ibf
def newton(a,b,eps,kmax):
nb=0
x0=(a+b)/2
while 1:
nb+=1
xn=x0-f(x0)/fprime(x0)
if abs(xn-x0)<=eps:
break
else:
x0=xn
if nb<kmax:
ibf=0
else:
ibf=1
return nb,xn,ibf
g=lambda x:f(x)-x
def success(a,b,eps,kmax):
nb=0
x0=(a+b)/2
while 1:
nb+=1
xn=g(x0)
if abs(xn-x0)<=eps:
break
else:
x0=xn
if nb<kmax:
ibf=0
else:
ibf=1
return nb,xn,ibf
def falsi(a,b,eps,kmax):
nb=0
while 1:
nb+=1
xn=(a*f(b)-b*f(a))/(f(b)-f(a))
if f(a)*f(xn)<0:
b=xn
elif f(a)*f(xn):
a=xn
if abs(f(xn))<=eps:
break
if nb<kmax:
ibf=0
else:
ibf=1
return nb,xn,ibf
import numpy as np
def creer(a,b,eps,kmax):
M=np.empty((4,4))
t1=dicho(a,b,eps,kmax)
t2=newton(a,b,eps,kmax)
t3=success(a,b,eps,kmax)
t4=falsi(a,b,eps,kmax)
for i in range(4):
M[i,0]=i+1
for j in range(1,4):
M[0,j]=t1[j-1]
M[1,j]=t2[j-1]
M[2,j]=t3[j-1]
M[3,j]=t4[j-1]
return M
def organiser(M):
nl=np.shape(M)[0]
i,j=0,nl-1
while 1:
while M[i,3]==0 and i<=nl-1:
i+=1
while M[j,3]==1 and j>=0:
j-=1
if i<j:
M[i,:],M[j,:]= M[j,:],M[i,:]
i+=1
j-=1
else:
break
nlz=i-1
for i in range(nlz-1):
im=i
for j in range(i+1,nlz):
if M[j,1]<M[im,1]:
im=j
M[i,:],M[im,:]= M[im,:],M[i,:]
return M
M=creer(a,b,eps,kmax)
M=organiser(M)
d={1:”dichotomie”, 2:”newton”, 3:”approximation successive”, 4:”regula falsi”}
if M[0,3]==1:
print(“aucune méthode”)
else :
print(“la méthode{} a effectué le minimum d’itérations avec un nombre
d’itéartions égal à {}”.format(d[M[0,0]],M[0,1]))
Bibliographie et Netographie
Ouvrages :
Learning Python, Mark Lutz, Edition O’Reilly, Juin 2013, ISBN: 9781449355722.
Informatique pour tous en classes préparatoires aux grandes écoles, Benjamin Wack& al., Edition Eyrolles,
Août 2013, ISBN: 978-2-212-13700-2.
Supports de Cours
Support de Cours de M.Hammami, Simulation numérique, pour 2ème année préparatoire des sections MP-PC-
T, IPEIEM, Année universitaire 2019-2020.
Sites Web :
https://www.python-course.eu/
https://www.ics.uci.edu/~brgallar/index.html
https://www.scipy.org/
https://numpy.org/
https://matplotlib.org/
Elaboré par :
-- Mai 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année MP-PC-T des Instituts
Préparatoires aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
Le document présent comporte les concepts de base associés aux bases de données
relationnelles. Il expose ainsi la représentation et la manipulation des tables et relations,
ainsi que l’accès à la base à travers les requêtes exprimées en algèbre relationnelle ou en
SQL. L’utilisation de la bibliothèque Python SQLite3 est également présentée. Des exercices
d’application avec leurs corrigés sont intégrés à la fin.
Bases de données
[Tapez ici]
Bases de données
[Tapez ici]
Bases de données
4
Révision Informatique, Concours MP-PC-T 2020
I I NTRODUCTION
Une base de données relationnelle (BDR) est une base de données où l'information est organisée selon le modèle
relationnel. Les données sont organisées en tables et manipulées par des opérateurs algébriques. Dans ce qui suit,
les notions de base associées aux BDR sont présentées afin de pouvoir créer et alimenter une base de données avec
Python et écrire des requêtes en langage algébrique ou langage SQL.
Exemple
● La relation Etudiant ayant pour attributs Numéro, Nom, prénom, adresse, âge, département.
● Chaque attribut possède un domaine.
● Une relation a au moins une clé et peut en avoir plusieurs clés : ce sont les clés candidates.
● Parmi les clés candidates, le concepteur choisit une et une seule clé primaire.
● Par convention, on représente la clé primaire en la soulignant dans l’énoncé de la relation
Bases de données
5
Révision Informatique, Concours MP-PC-T 2020
Exemple
Bases de données
6
Révision Informatique, Concours MP-PC-T 2020
C’est un langage abstrait, avec des opérations qui travaillent sur une (ou plusieurs) relation(s) pour définir une
nouvelle relation sans changer la (ou les) relation(s) originale(s).
III.1 Projection
La projection d'une relation R1 est la relation R2 obtenue en supprimant les attributs de R1 non mentionnés.
La projection permet d’éliminer des attributs d’une relation. Elle correspond à un découpage vertical :
Exemple :
Bases de données
7
Révision Informatique, Concours MP-PC-T 2020
Exemple :
III.3 Jointure
La jointure de deux relations R1 et R2 est une relation R3 dont les n-uplets sont obtenus en concaténant les n-
uplets de R1 avec ceux de R2 et en ne gardant que ceux qui vérifient la condition de liaison
On notera : R3 = R1 ⋈ R2 (condition).
Remarques
Le schéma de la relation résultante de la jointure est la concaténation des schémas des opérandes (s'il y a des
attributs de même nom, il faut les renommer).
Les n-uplets de R1 ⋈ R2 (condition) sont tous les couples (u1,u2) d'un n-uplet de R1 avec un n-uplet de R2 qui
satisfont "condition".
La jointure de deux relations R1 et R2 est le produit cartésien des deux relations, suivi d'une restriction.
Bases de données
8
Révision Informatique, Concours MP-PC-T 2020
Exemple :
Requête : Donner les identifiants des clients ayant acheté un produit de marque Apple.
Réponse en AR : R1 = σPRODUIT (marque = 'Apple')
R2 = R1 ⋈ VENTE (R1.IdPro = VENTE.IdPro)
RESUL = πR2 (IdCli)
III.4 Union
L'union de deux relations R1 et R2 de même schéma est une relation R3 de schéma identique qui a pour n-uplets
les n-uplets de R1 et/ou R2.
On notera : R3 = R1 ∪ R2
Requête : Donner les identifiants des clients de Nice et les clients de Paris.
Réponse en AR : R1 = σClient (ville= 'Nice')
R2 = σClient (ville='paris')
R3 = R1 ∪ R2
RESUL = πR3 (IdPro)
Bases de données
9
Révision Informatique, Concours MP-PC-T 2020
III.5 Intersection
L’intersection entre deux relations R1 et R2 de même schéma est une relation R3 de schéma identique ayant
pour n-uplets les n-uplets communs à R1 et R2. On notera : R3 = R1 ∩ R2.
Exemple :
Requête : Donner les identifiants des produits de marque Apple et de prix < 2000
Réponse en AR : R1 = σPRODUIT (marque = Apple')
R2 = σPRODUIT (prix < 2000)
R3 = R1∩R2
RESUL = πR3 (IdPro)
III.6 Différence
La différence entre deux relations R1 et R2 de même schéma est une relation R3 de schéma identique ayant
pour n-uplets les n-uplets de R1 n'appartenant pas à R2. On notera : R3 = R1 − R2.
Exemple :
Requête : Donner les identifiants des clients n'ayant acheté que des produits de marque Apple
Réponse en AR : R1 = VENTE ⋈ PRODUIT (VENTE.IdPro = PRODUIT.IdPro)
R2 = σR1 (marque = 'Apple')
R3 = πR2 (IdCli)
R4 = σR1 (marque ≠ 'Apple')
R5 = πR4 (IdCli)
RESUL = R3 − R5
Bases de données
10
Révision Informatique, Concours MP-PC-T 2020
IV.1 Introduction
SQL est un langage standard pour accéder aux bases de données. Il est composé de plusieurs sous-langages,
dont :
○ Le Langage de Définition des données (LDD) pour la création et la suppression d’objets dans la base de
données. Il comporte les commandes SQL : CREATE, DROP, ALTER.
○ Le Langage de Manipulation des données (LMD) pour la recherche, l'insertion, la mise à jour et la
suppression de données. Il comporte les commandes SQL : SELECT, INSERT, UPDATE, DELETE.
La commande CREATE TABLE crée la définition d'une table selon la syntaxe suivante :
CREATE TABLE table (
-- définition des colonnes
colonne type [ NOT NULL [UNIQUE] ]
[ DEFAULT valeur ]
[ PRIMARY KEY ]
[ REFERENCES table ]
[ CHECK condition ] ,
... ,
-- contraintes de table
[ PRIMARY KEY (liste de colonnes) ],
[ UNIQUE (liste de colonnes) ] ,
[ FOREIGN KEY (liste de colonnes) REFERENCES table )
Bases de données
11
Révision Informatique, Concours MP-PC-T 2020
Exemple
Pour l’exemple associé au magasin (section II.4) :
● CREATE TABLE client (
IdCli CHAR(4) PRIMARY KEY ,
nom CHAR(20) ,
ville CHAR(30) ,
CHECK (ville IN ('Nice', 'Paris', 'Rome', 'Tunis') ) )
● CREATE TABLE produit (
IdPro CHAR(6) PRIMARY KEY ,
nom CHAR(30) NOT NULL UNIQUE ,
marque CHAR(30) ,
prix DEC(6,2) ,
qstock SMALLINT CHECK (qstock BETWEEN 0 AND 100)
)
● CREATE TABLE vente (
IdCli CHAR(4) NOT NULL REFERENCES client ,
IdPro CHAR(6) NOT NULL ,
date DATE NOT NULL ,
qte SMALLINT CHECK (qte BETWEEN 1 AND 10) ,
-- contrainte de table
PRIMARY KEY (IdCli, IdPro, date) ,
FOREIGN KEY (IdPro) REFERENCES produit
)
IV.2.2 Suppression / Modification de Table
Suppression d’une table : Toute table peut être supprimée à l’aide de DROP. Par exemple :
DROP TABLE Vente
Ajout d’une colonne : Pour ajouter une colonne à une table, on utilise ALTER. Par exemple :
ALTER TABLE client ADD COLUMN tel CHAR(16)
A l’exécution de cette commande, la table possède une nouvelle colonne qui ne contient que des
valeurs NULL pour toutes les lignes.
On ne peut ajouter une colonne obligatoire (NOT NULL) que si la table est vide ou si cette colonne
possède une valeur par défaut (DEFAULT).
Bases de données
12
Révision Informatique, Concours MP-PC-T 2020
La commande INSERT permet d'ajouter de nouvelles lignes à une table selon la syntaxe suivante :
INSERT
INTO table [ (liste de colonnes) ]
{VALUES (liste de valeurs) | requête}
Remarques :
● Dans le cas où la liste de colonnes n'est pas spécifiée tous les attributs de la table cible doivent être
fournis dans l'ordre de déclaration.
● Si seulement certaines colonnes sont spécifiées, les autres sont insérées avec la valeur NULL.
● Une insertion à partir d'une requête permet d'insérer plusieurs lignes dans la table cible à partir
d'une autre table.
Exemples
- Insertion d'une seule ligne
Pour ajouter le client ('TN100', 'Ali', Tunis') dans la table client :
INSERT
INTO client (IdCli, nom, ville)
VALUES ('TN100', 'Ali', 'Tunis')
- Insertion de plusieurs lignes
Pour ajouter dans une table « temp » de même schéma que la table Vente avec toutes les ventes qui sont
antérieures au 01-Jan-2019 :
INSERT
INTO temp (IdCli, IdPro, date, qte)
SELECT V.no_cli, V.IdPro, V.date, V.qte
FROM vente V
WHERE V.date < '01-jan-2019'
Bases de données
13
Révision Informatique, Concours MP-PC-T 2020
La commande UPDATE permet de changer des valeurs d'attributs des lignes existantes, selon la syntaxe
suivante :
UPDATE table
SET liste d'affectations
[ WHERE qualification ]
Remarque : L'absence de clause WHERE signifie que les changements doivent être appliqués à toutes les
lignes de la table cible.
Exemple
La commande SELECT (projection en AR) permet de rechercher des données à partir de plusieurs tables ; le
résultat est présenté sous forme d'une table réponse.
Exemples
Bases de données
14
Révision Informatique, Concours MP-PC-T 2020
On peut introduire dans la clause FROM un synonyme (alias) à un nom de table, en le plaçant
immédiatement après le nom de la table.
Les noms de table ou les synonymes peuvent être utilisés pour préfixer les noms de colonnes dans le
SELECT.
SELECT P.nom, P.marque, P.prix
FROM produit P
● Q2 : Donner les différentes marques de produit :
SELECT P.marque
FROM produit P
Pour éliminer les doublons, il faut spécifier DISTINCT.
Bases de données
15
Révision Informatique, Concours MP-PC-T 2020
● Q7 : Lister les produits dont le prix est compris entre 50 dinars et 120 dinars
SELECT *
FROM produit P
WHERE P.prix BETWEEN 50 AND 120
Le prédicat BETWEEN teste l'appartenance à un intervalle.
Bases de données
16
Révision Informatique, Concours MP-PC-T 2020
Q14 : Donner les noms des clients qui ont acheté le produit de nom 'PS1'.
SELECT C.nom
FROM client C , produit P, vente V
WHERE V.IdCli = C.IdCli
AND V.IdPro = P.IdPro
AND P.nom = 'PS1‘
ou bien :
SELECT C.nom
FROM VENTE V join produit P
ON V.IdPro = P.IdPro
join Client C
ON V.IdCli = C.IdCli
WHERE P.nom = 'PS1‘
Q15 : Donner les noms des clients de la même ville que Ali.
SELECT C2.nom
FROM client C1 JOIN client C2
ON C1.ville = C2.ville
WHERE C1.nom = ‘Ali'
AND C2.nom <> ‘Ali‘
Cet exemple utilise, pour le couplage des villes, la jointure de la table Client avec elle-même (auto-
jointure).
Pour pouvoir distinguer les références ville dans les 2 copies, il faut introduire 2 alias différents C1 et C2
de la table client.
Bases de données
17
Révision Informatique, Concours MP-PC-T 2020
– dans des prédicats de comparaison (=, <>, <, <=, >, >=)
– dans des prédicats IN
– dans des prédicats EXISTS
Une sous-requête dans un prédicat de comparaison doit se réduire à une seule valeur ("singleton select").
Une sous-requête dans un prédicat IN doit représenter une table à colonne unique.
Q16 : Donner les noms des clients qui ont acheté le produit d'identifiant 'SHP1'
❏ Avec sous-requête
SELECT C.nom
FROM client C
WHERE IdCli IN
(
SELECT V.IdCli
FROM vente V
WHERE V.IdPro = 'SHP1'
)
❏ Avec jointure
SELECT C.nom
FROM client C , vente V
WHERE C.IdCli = V.IdCli
AND V.IdPro = 'SHP1'
Q17 : Donner les noms des produits qui n'ont pas été acheté
SELECT P.nom
FROM produit P
WHERE NOT EXISTS
( SELECT *
FROM vente V
WHERE V.IdPro = P.IdPro )
Le prédicat EXISTS permet de tester si le résultat d'une sous-requête est vide ou non.
Bases de données
18
Révision Informatique, Concours MP-PC-T 2020
Les opérations ensemblistes d’union, intersection ou différence peuvent être exprimées en SQL, en
connectant SELECT avec UNION, INTERSECT ou EXCEPT.
Q18 : Donner les numéros des produits de marque IBM ou ceux achetés par le client d'identifiant
'100'.
SELECT P.IdPro
FROM produit P
WHERE P.marque = 'IBM'
UNION
SELECT V.IdPro
FROM vente V
WHERE V.IdCli = ‘100'
SQL fournit des fonctions de calcul opérant sur l'ensemble des valeurs d'une colonne de table :
– COUNT : nombre de valeurs
– SUM : somme des valeurs
– AVG : moyenne des valeurs
– MAX : plus grande valeur
– MIN : plus petite valeur
Q19 : Donner le nombre total de clients.
SELECT COUNT ( IdCli )
FROM client
Bases de données
19
Révision Informatique, Concours MP-PC-T 2020
On peut faire précéder l'argument du mot clé DISTINCT pour indiquer que les valeurs redondantes
doivent être éliminées avant application de la fonction.
La fonction spéciale COUNT (*) compte toutes les lignes dans une table.
Q22 : Donner les noms des produits moins chers que la moyenne des prix de tous les produits
SELECT P1.nom
FROM produit P1
WHERE P1.prix <
(
SELECT AVG ( P2.prix )
FROM produit P2
)
Cet exemple montre un "singleton select " pour calculer la moyenne des prix.
Bases de données
20
Révision Informatique, Concours MP-PC-T 2020
La clause LIMIT est à utiliser dans une requête SQL pour spécifier le nombre maximum de résultats que
l’on souhaite obtenir.
Q25 : Donner le nom et la marque des deux plus chers produits.
SELECT P.nom, P.marque
FROM produit P
Order by P.prix DESC
Limit 2
WHERE qualification
V SQLITE
SQLite est un système de gestion de base de données (SGBD) qui sauvegarde la base sous forme d'un fichier multi-
plateforme. C’est une bibliothèque qui fournit une base de données légère sur disque ne nécessitant pas de processus
serveur distinct et permet d’accéder à la base de données à l’aide d’une variante du langage de requête SQL Il
permet ainsi une gestion simple et rapide des bases de données.
Les bases créées avec cette librairie sont enregistrées sous forme de fichier .db, .sq3.
Un fichier .db/.sq3 s'ouvre en créant un objet de type Connection :
conn = sqlite3.connect('magasin.sq3')
Un curseur est ensuite créé à partir de l'objet Connection. Ce curseur représente un canal entre la base de données
et le script Python :
cur = conn.cursor()
Bases de données
21
Révision Informatique, Concours MP-PC-T 2020
Pour exécuter des commandes dans la base, on crée des requêtes SQL sous forme de chaînes de caractères.
Ensuite, on l’exécute à partir de la fonction execute() :
requete = 'SELECT * FROM vente'
cur.execute(requete)
Lorsque le travail prévu est terminé, il est nécessaire d’enregistrer les modifications faites sur la base :
conn.commit()
▪ En passant un dictionnaire :
data = {"name" : "ramzi", "city" : "Tunis"}
cur.execute("""INSERT INTO client(nom,ville) VALUES(:name, :city)""", data)
Bases de données
22
Révision Informatique, Concours MP-PC-T 2020
On peut récupérer toutes les lignes de la même recherche en utilisant la fonction fetchall() :
lignes = cur.fetchall() # Le résultat est une liste de tuples
Bases de données
23
Révision Informatique, Concours MP-PC-T 2020
VI E XERCICES D ’A PPLICATION
VI.1 Exercice 1
Soit les relations suivantes de la société Gavasoft :
Exemple
12. Ecrire le/les instructions permettant d’ajouter ce nouvel employé dans la base de données.
Bases de données
24
Révision Informatique, Concours MP-PC-T 2020
13. Ecrire une fonction Employes(ville) qui prend en paramètre le lieu ville d’un département et qui retourne
la liste des employés de la ville donnée.
14. Ecrire une fonction getVilles ( ) qui retourne la liste des villes de tous les départements.
15. Ecrire les instructions nécessaires permettant de sauvegarder les renseignements des employés de
chaque ville dans des fichiers. Chaque fichier sera nommé par le nom de la ville. Par exemple
‘Creteil.txt’ comporte dans chaque ligne les données d’un employé séparées par un point-virgule.
VI.2 Exercice 2
On considère le schéma relationnel suivant qui modélise une application sur la gestion de livres et de disques
dans une médiathèque.
Bases de données
25
Révision Informatique, Concours MP-PC-T 2020
Partie SQL:
4. Créer la table Dept (NumD s’incrémente automatiquement)
CREATE TABLE `Dept` (
`NumD` INTEGER PRIMARY KEY AUTOINCREMENT,
`NomD` TEXT,
`Lieu` TEXT
);
5. Ajouter le département ‘RH’ situé à Paris
Insert into Dept(nomD , Lieu ) values(‘RH , ‘Paris’)
6. Attacher tous les doyens à ce nouveau département ‘RH’
Update Emp set numD = 3 where fonction = ‘Doyen’
7. Donner la liste des employés ayant une commission (non NULL) classé par commission décroissante
Select nomE
From Emp
Where Comm is not NULL
Order by comm desc
8. Donner la moyenne des salaires des employés travaillant à laval
Select avg(salaire)
From emp
Bases de données
26
Révision Informatique, Concours MP-PC-T 2020
Ou bien :
Select avg(salaire)
From emp
Join dept
ON emp.numD = dept.numD
Where lieu = ‘laval’
9. Donner la liste des employés gagnant plus que la moyenne des salaires de l’entreprise
Select *
From emp
Where salaire > (select avg(salaire)
From emp
)
10.Donnez le nombre d’employés par département
Select count(*)
From Emp
Group by numD
11.Donnez le lieu de département dont le nombre d’employés dépasse 100
Select lieu
From Dept
Join Emp
On Dept.NumD = Emp.NumD
Group by Dept.NumD
Having count(*) > 100
Partie SQLITE :
Soit le script python suivant :
import sqlite3
conn = sqlite3.connect(‘Gavasoft.db’)
cur = conn.cursor()
nouveau={‘nom’ :’Martin’, ‘fonction’ : stagiaire’, ‘embauche’ : 2010}
Bases de données
27
Révision Informatique, Concours MP-PC-T 2020
12.Ecrire le/les instructions permettant d’ajouter ce nouveau employé dans la base de donnée
cur.execute ( ‘insert into emp values( :nom, :fonction, :embauche) ,nouveau )
13.Ecrire une fonction Employes(ville) qui prend en paramètre le lieu ville d’un département et qui retourne
la liste des employés de la ville donnée.
def getEmployes(ville) :
req = ‘select * from emp where numD = (select numD from dept where lieu
={}’.format(ville)
cur.execute(req)
employes = cur.fetchall()
return employes
14.Ecrire une fonction getVilles ( ) qui retourne la liste des villes de tous les départements.
def getVilles ( ) :
req = ‘select distinct lieu from dept’
cur.execute(req)
return cur.fetchall()
15.Ecrire les instructions nécessaires permettant de sauvegarder les renseignements des employés de chaque
ville dans des fichiers. Chaque fichier sera nommé par le nom de la ville par exemple ‘Creiteil.txt’et comporte
dans chaque ligne les données d’un employé séparées par un point-virgule
villes = getVilles ( )
for ville in villes :
f = open(ville+’txt’ , ‘w’)
Lemp = getEmployes(ville)
for emp in Lemp :
emp = [str(x) for x in emp ]
ligne =’ ;’.join( emp) +’\n’
f.write(ligne)
f.close()
Bases de données
28
Révision Informatique, Concours MP-PC-T 2020
4)SELECT Nom, Prenom FROM Disque D, Auteur A WHERE D.CodeA=A.CodeA INTERSECT SELECT
Nom, Prenom FROM Livre L, Auteur A WHERE D.CodeA=L.CodeA
7) SELECT Nom, Téléphone, COUNT(*) FROM Abonne A, Prêt P WHERE A.NumAbo=P.NimAbo GROUP
BY Nom, Téléphone
14) SELECT COUNT(*) FROM E_Disque WHERE DateAchat BETWEEN ’01-Jan-2006’ AND ’10-Dec-
2007’
16) SELECT Nom, Prénom, Rue, Ville, CodeP FROM Abonne A, Prêt P, Disque D WHERE
A.NumAbo=P.NumAbo AND P.CodeOuv=D.CodeOuv AND DatePret=’12-Jan-2006’
17) SELECT Titre FROM Abonne A, Prêt P, Disque D WHERE A.NumAbo=P.NumAbo AND
P.CodeOuv=D.CodeOuv AND NOM="Gava" AND Prénom="Frédéric" UNION SELECT Titre FROM
Abonne A, Prêt P, Livre L WHERE A.NumAbo=P.NumAbo AND P.CodeOuv=L.CodeOuv AND
NOM="Gava" AND Prénom="Frédéric"
18) SELECT CodeOuv FROM Prêt P, Abonne A WHERE P.NumAbo=A.NumAbo AND Prénom="Frédéric"
AND Nom="Gava" AND CodeOuv IN (SELECT CodeOuv FROM Livre WHERE Genre="Policier")
OR CodeOuv IN (SELECT CodeOuv FROM Disque WHERE Style="Jazz")
19) SELECT Identité FROM Auteur A, Livre L WHERE A.CodeOuv=L.CodeOuv AND Genre="Policier"
AND NOT ALL(SELECT Identité FROM Auteur A, Livre L WHERE A.CodeOuv=L.CodeOuv AND
Genre<>"Policier")
Bases de données
29
Révision Informatique, Concours MP-PC-T 2020
Ouvrages :
Toute l’informatique en CPGE scientifique, Etienne Cochard, Sophie Rainero, Marielle Roussange, Emanuelle
Sebert-Cuvillier
Informatique pour tous en classes préparatoires aux grandes écoles, Benjamin Wack& al., Edition Eyrolles,
Août 2013, ISBN: 978-2-212-13700-2.
Supports de Cours
Support de Cours de W.Meftah, Les bases de données relationnelles, pour 2ème année préparatoire MP-PC-T et
BG, IPEIS, Année universitaire 2019-2020.
Sites Web :
https://docs.python.org/3/library/sqlite3.html
https://python.doctor/page-cours-python-debutant-documentation
https://www.cours-gratuit.com/langage-sql/
Bases de données