0% ont trouvé ce document utile (0 vote)
1K vues63 pages

Exercices de Programmation Python

Transféré par

Hassan Boulkacem
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
1K vues63 pages

Exercices de Programmation Python

Transféré par

Hassan Boulkacem
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Algorithmique et programmation Langage python

Série 1
Exercices
Exercice 1
Ecrire un programme qui permet de saisir un nombre puis déterminer s’il appartient à un intervalle
donné, sachant que les extrémités de l’intervalle sont fixées par l’utilisateur.

• Corrigé

Exercice 2
Ecrire un programme qui demande deux nombres à l’utilisateur et l’informe ensuite si leur produit
est négatif ou positif. Attention toutefois : on ne doit pas calculer le produit des deux nombres.

• Corrigé

Exercice 3
Ecrire un programme qui permet de calculer le montant des heures supplémentaires d’un employé,
sachant le prix unitaire d’une heure selon le barème suivant :
▪ Les 39 premières heures sans supplément,
▪ De la 40ième à la 44ième heure sont majorées de 50%,
▪ De la 45ième à la 49ième heure sont majorées de 75%,
▪ De la 50ième heure ou plus, sont majorées de 100%.

CPGE_MPSI 1
/PCSI
Algorithmique et programmation Langage python

• Corrigé

Exercice 4
Ecrivez un programme qui lira au clavier l’heure et les minutes, et il affichera l’heure qu’il sera une
minute plus tard. Par exemple, si l'utilisateur tape 21 puis 32, l'algorithme doit répondre : "Dans une
minute, il sera 21 heure(s) 33". NB : on suppose que l'utilisateur entre une heure valide. Pas besoin
donc de la vérifier.

• Corrigé

CPGE_MPSI 2
/PCSI
Algorithmique et programmation Langage python

Exercice 5
Écrire un programme qui à partir d’une note affiche la mention correspondant ?

• Corrigé

Exercice 6
Ecrire un programme qui demande un nombre de départ, et qui ensuite affiche les dix nombres
suivants. Par exemple, si l'utilisateur entre le nombre 17, le programme affichera les nombres de
18 à 27.

• Corrigé

Exercice 7
Le pgcd de deux nombres par soustractions successives.
• pgcd (a, b) = pgcd (a − b, a) si a > b
• pgcd (a, b) = pgcd (a, b − a) si b > a
□ pgcd (a, b) = a si a = b
On suppose que les opérandes sont des entiers positifs, écrire un programme qui permet de calculer
le PGCD de deux nombres a et b.

CPGE_MPSI 3
/PCSI
Algorithmique et programmation Langage python

• Corrigé

Exercice 8
Écrire un programme qui saisie N entiers et affiche leur somme et leur moyenne ?

• Corrigé

Exercice 9
Ecrire un programme qui détermine si un entier N est parfait ou non. Un entier est dit parfait s'il est
égal à la somme de ses diviseurs. Exemple 6 = 3 + 2 +1

• Corrigé

CPGE_MPSI 4
/PCSI
Algorithmique et programmation Langage python

Exercice 10
Ecrire un programme qui permet de calculer le produit de deux entiers en utilisant des additions
successives.

• Corrigé

Exercice 11
Ecrire un programme qui permet de saisir un entier N et d'afficher s'il est premier ou non. Un nombre
est dit premier s'il est divisible uniquement par 1 et par lui-même.

• Corrigé

Exercice 12
Ecrire programme permettant de lire un nombre entier N puis calcule son factoriel.
N !=1*2*3*….*(n-1)*N
0 !=1
a) Utilisez While,
b) Utilisez For.

CPGE_MPSI 5
/PCSI
Algorithmique et programmation Langage python

• Corrigé

Exercice 13
Calculer la moyenne de notes fournies au clavier avec un dialogue de ce type :
note 1 : 12
note 2 : 15.25
note 3 : 13.5
note 4 : 8.75
note 5 : -1
moyenne de ces 4 notes : 12.37
Le nombre de notes n’est pas connu a priori et l’utilisateur peut en fournir autant qu’il le désire. Pour
signaler qu’il a terminé, on convient qu’il fournira une note fictive négative.

• Corrigé

6
CPGE_MPSI/PCSI
Algorithmique et programmation Langage python

Série 2
Exercices
Exercices 1
Ecrire un programme qui demande à l’utilisateur un nombre compris entre 1 et 3 jusqu’à ce que la
réponse convienne.

• Corrigé

Exercice 2
Ecrire un programme qui demande un nombre compris entre 10 et 20, jusqu’à ce que la réponse
convienne. En cas de réponse supérieure à 20, on fera apparaître un message : « Plus petit ! », et
inversement, « Plus grand ! » si le nombre est inférieur à 10.

• Corrigé

7
Algorithmique et programmation Langage python

Exercice 3
Ecrire un programme qui permet de saisir une série de nombres entiers positifs et qui après saisie,
affiche les valeurs du plus petit et du plus grand nombre saisi ainsi que la somme et la moyenne
des nombres.

• Corrigé

Exercice 4
Écrire un programme qui permet de calculer S1, S2, S3, S4, S5 et S6 tel que:
1. S1 = 1 + ½ + 1/3 + ¼ +……..1/N
2. S2 = 1 + ½ + ¼ + 1/6 +……..1/N
3. S3 = 1 + 1/3 + 1/5 +……..1/N
4. S4 = 1 - ½ + ¼ - 1/6……..1/N
5. S5 = 1 + x+x²……..xN
6. S6 = 1 + x+x²/2…….. xN /N
Le nombre N est fixé par l’utilisateur
Algorithmique et programmation Langage python

• Corrigé
N=int(input(‘Saisir N ‘))
S1, S2, S3, S4, S5, S6=1,1,1,1,1,1
for i in range(2,N+1) :
S1+=1/i
print(‘la somme S1 est ’,S1)

for i in range(2,N+1,2) :
S2+=1/i
print(‘la somme S1 est ’,S2)

for i in range(3,N+1,2) :
S3+=1/i
print(‘la somme S1 est ’,S3)

signe=-1
for i in range(2,N+1,2) :
S1+=signe*(1/i)
signe*=(-1)
print(‘la somme S4 est ’,S4)

x=int(input(‘saisir x ‘))
for i in range(1,N+1) :
S5+=x**i
print(‘la somme S5 est ’,S5)

for i in range(1,N+1) :
S6+=(x**i)/i
print(‘la somme S6 est ’,S6)

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercice 5
Ecrire un programme qui détermine le 20ième terme d'une suite définie par
: S0 = 2, S1 = 3 et Sn = Sn-2 + (-1)n * Sn-1
• Corrigé

Exercice 6
Ecrire un programme qui détermine le Nième terme d'une suite définie par
: S0 = 2, S1 = 3, S2 = -2 et Sn = Sn-3 + (-1)n * Sn-1
• Corrigé

Exercice 7
Ecrire un programme qui à partir d’une date divisée en ses composantes (J, M, A) et affiche la date
du lendemain.
Tenir compte du cas où la date saisie est la date du dernier jour du mois ou celle du dernier jour de
l’année.
Remarque : prendre 28 comme nombre de jours du mois de février.

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

• Corrigé
A=int(input(“saisir une année : “))
M=int(input(“saisir le mois : “))
J=int(input(“saisir le jour : “))
if M>12 or J>31 :
print(“la date est invalide“)
else :
if M==12 :
if j<31 :
J+=1
else :
J=0
M=1
A+=1
elif M==2 :
if J>28 :
print(“jour invalide“)
elif J==28 :
J=0
M+=1
else :
J+=1
else :
if M==1 or M==3 or M==5 or M== 7 or M==8 or M==10:
if J==31 :
J=0
M+=1
else :
J+=1
else :
if J==30 :
J=0
M+=1
else :
J+=1

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Pour calculer les moyens de ses étudiants, un professeur calcule deux moyennes : la moyenne
arithmétique et la moyenne de la mauvaise et la meilleure des notes de trois notes. Il choisira par
la suite la meilleure des deux moyennes calculées. Ecrire un programme qui saisit les trois notes
d’un étudiant et affiche la moyenne finale accordée.
▪ Exemple :
Si les trois notes d’un étudiant sont : 12, 8, 14 alors :
Moyenne arithmétique=(12+8+14)/3=34/3=11,34
Moyenne de la mauvaise et de la meilleure : (14+8)/2=22/2=11
Le professeur choisira la première moyenne.
• Corrigé

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Ecrivez un programme qui lit trois valeurs entières (A, B et C) au clavier. Triez les valeurs A, B et C
par échanges successifs de manière à obtenir : val(A) val(B) val(C) et affichez les trois valeurs.

• Corrigé

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Les fonctions et
récursivité

Exercice 1
On se propose de calculer une valeur approchée de la constante K de Catalan en utilisant la formule
suivante :

Ecrire une fonction val_app(epsilon) qui permet de retourner une valeur approchée de la constante
K en utilisant la formule ci-dessus et en s’arrêtant dès que la valeur absolue de la différence entre
deux somme successives devienne inférieure ou égale à une erreur epsilon donnée en paramètre.

• Corrigé

Exercice 2
Soit la formule suivante qui permet de déterminer une valeur approchée de Cos(x) :

Ecrire une fonction Calcul_Cos(x) qui permet de :


▪ Saisir un réel x appartenant à l’intervalle [-1, 1],
▪ Calculer et afficher une valeur approchée de Cos(x) en utilisant la formule donnée ci-dessus. Le calcul
s’arrête lorsque la différence entre deux termes consécutifs devient inférieure à 10-4.

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercice 3
Soit la suite U définie par :
-U0 est un entier positif pris au hasard (avec 3<U0<40
-Un=Un-1/2 si Un-1 est pair, sinon Un=3*Un-1+1 (n>0)
cette suite aboutit au cycle redondant formé par les trois termes 4,2,1 à partir d’un certain rang.
▪ Exemple :
Pour U0=3
U1=10 U2=5 U3=16 U4=8 U5=4 U6=2 U7=1 U8=4 U9=2 U10=1,
Donc la suite U entre dans le cycle redondant 4,2,1 à partir du 6ème terme(rang=6)
Ecrire une fonction Python permettant de déterminer le rang à partir duquel la suite U aboutit au
cycle redondant 4, 2 et 1

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercice 4
Ecrivez un programme Python permettant de calculer la limite à  près de la suite définie par la
relation de récurrence :
U0 =2 et Un+1= Un +2/Un , n0.
On arrête d’itérer quand l’intervalle entre 2 termes consécutifs devient strictement inférieur à .

• Corrigé

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercice 5
Ecrivez un programme Python permettant de calculer la nième terme de la suite définie par :
□ F0=1, F1=2
• Fn= 4Fn-1 + 3Fn-2 (n 2 )
• Corrigé

Exercice 6
La suite de Fibonacci est définie comme suit :
1 𝑠𝑠𝑠𝑠 𝑈 < 2
𝑈𝑈𝑈𝑈
𝑈𝑈9:! + 𝑈𝑈9:+ 𝑠𝑠𝑠𝑠𝑈𝑈𝑠𝑠𝑈𝑈
Ecrire une fonction récursive calculant Fib(n)

• Corrigé
def Fib(n) :
if n<2 :
return 1
else :
return Fib(n-1)+ Fib(n-2)

Exercice 7
Soit la suite définie par :
1 𝑠𝑠𝑠𝑠 𝑈𝑈 <
𝑈𝑈𝑈𝑈
2 3𝑈𝑈9:! + 𝑈𝑈9:+
𝑠𝑠𝑠𝑠𝑈𝑈𝑠𝑠𝑈𝑈
Ecrire une fonction récursive permettant de calculer le nième terme de la suite.

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

• Corrigé

Exercice 8
Soient u et v les deux suites définies par :

Ecrire deux fonctions CalculerU (a,b,n) et CalculerV(a,b,n) pour calculer respectivement les deux
termes Un et Vn des deux suites.

• Corrigé

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercice 9
Considérons la méthode suivante pour calculer Xn :

n/2 représente la division entière de n par 2.


Ecrire une fonction récursive pour calculer Xn

• Corrigé

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Les chaines de caractères (Série


4)

Exercice 1 :
Un entier est dit distinct s’il est composé de chiffres distincts (différents).
Ecrire un programme python qui permet de saisir un entier n (n>0), puis de vérifier et d’afficher si
cet entier est distinct ou non.
Exemple :
N=1273 est dit distinct car il est formé par les chiffres 1, 2, 7 et 3 qui sont tous distincts, donc, le
programme affichera : cet entier est distinct
N=1565 est dit non distinct car il est formé par les chiffres 1, 5, 6, 5 qui ne sont pas tous distincts
(le chiffre 5 se répète deux fois, donc le programme affichera : cet entier est non distinct

• Corrigé

Exercice 2 :
Ecrire un programme python qui permet d’afficher tous les entiers positifs de trois chiffres de la
forme cdu tel que, pour chaque entier, la somme de ses chiffres (c+d+u) est un diviseur du produit
de ses chiffres (c*d*u)
Exemple :
L’entier 514 vérifie cette propriété, en effet, (5+1+4) =10 est un diviseur de (5*1*4) =20

• Corrigé

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercice 3 :
En arithmétique, un auto-nombre est un entier naturel N qui ne peut pas s’écrire sous la forme d’un
nombre M ajouté à la somme des chiffres de M.
▪ Exemple :
▪ Pour N=21, n’est pas un auto nombre, puisqu’il peut être généré à partir de la somme d’un nombre M égal à 15
et les chiffres qui le constituent (1 et 5) c’est-à-dire 21=15+1+5.
▪ Pour N=20, est un auto-nombre puisqu’il ne peut pas être généré à partir de la somme d’un nombre M et les
chiffres qui le constituent.
Ecrire un programme permettant de vérifier si un entier naturel N strictement positif est un auto-
nombre.

• Corrigé

Exercice 4 :
Ecrire un programme Python qui permet de déterminer si un entier N de quatre chiffres vérifie la
relation suivante :
N=somme des puissance Kème de ses chiffres, avec 1<=K<=5
▪ Exemple :
Pour voir si le nombre n=1634 vérifie ou non cette propriété on commence par calculer la somme
des chiffres à la puissance 1, puis à la puissance 2, puis à la puissance 3,… :
▪ 11+61+31+41=14 est différent de 1634 alors on continue avec les chiffres à la puissance 2
▪ 12+62+32+42=62 est différent de 1634 alors on continue avec les chiffres à la puissance 3
▪ 23+63+33+43=308 est différent de 1634 alors on continue avec les chiffres à la puissance 4
▪ 14+64+34+44=1634 est égal à 1634 alors on arrête le traitement et on affiche : n=1634 et K=4
Pour le nombre n=2114, voyons s’il vérifie ou pas la propriété :

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

▪ 21+11+11+41=8 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 22+12+12+42=22 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 23+13+13+43=74 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 24+14+14+44=274 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 25+15+15+45=1058 est différent de 2114 alors on arrête le traitement et on affiche le message : n=2114 ne vérifie
pas la propriété

• Corrigé

Exercice 5 :
Un nombre premier N est dit circulaire s’il vérifie la propriété suivante : chacune des rotations de
ses chiffres d’un élément vers la droite, forme à son tour un nombre premier.
▪ Exemple :
Si N=719 est un nombre premier circulaire car 719, 971 et 197 sont des nombres premiers avec :
▪ 971 est le nombre obtenu après une rotation des chiffres de 719 d’un élément vers la droite.
▪ 197 est le nombre obtenu après une rotation des chiffres de 971 d’un élément vers la droite
Si N=23, N n’est pas un nombre premier circulaire car il est premier mais 32 ne l’est pas.
Si N=6102, N n’est pas un nombre premier circulaire car il n’est pas premier.
Ecrire un programme Python permettant de chercher tous les nombre premiers circulaire se trouvant
dans un intervalle [p,q] fournis par l’utilisateur.

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

def premier(n):
if n==2 :
return True
etat=True
for i in range(2, int(sqrt(n))+2):
if n%i==0:
etat=False
break
return etat
def circulaire(p,q):
for i in range(p,q+1):
if premier(i)==True:
etat=True
ch=str(i)
k=0
while k<len(ch) and etat==True:
ch=ch[-1]+ch[:len(ch)-1]
if premier(int(ch))==False:
etat=False
break
k+=1
if etat==True:
print('nombre : ',i)

Exercice 6 :
On définit le poids d’une chaine comme étant la somme des produits de la position de chaque
voyelle dans cette chaine par son rang dans l’alphabet français.
Si la chaine ne contient pas de voyelles alors son poids est égal à zéro.
N.B : les voyelles sont A, E, I, O, U, Y et leurs rangs respectifs sont :1, 5, 9, 15, 21, 25
▪ Exemple :
La chaine ‘BONNE’ contient 2 voyelles ‘O’ et ‘E’, sont poids est égal à 2*15+5*5=55
La chaine ‘CHANCE’ contient 2 voyelles ‘A’ et ‘E’, son poids est égal à : 3*1+6*5=33
▪ Travail à faire :
Ecrire un programme Python qui permet de lire une chaine non vide, composée seulement par des
lettres alphabétiques majuscules puis calcule et affiche le poids de cette chaine.

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercice 7
On se propose d’écrire un programme Python permettant de déterminer et d’afficher un code à partir
d’un entier N strictement positif et supérieur à 100, selon le principe suivant :
▪ Calculer la somme S des chiffres qui composent le nombre N
▪ Recommencer le calcul de la somme des chiffres de la somme obtenue S tant que celle-ci n’est pas comprise
entre 1 et 9.
Le code sera le nombre formé par N auquel on place à sa gauche la dernière somme obtenue.
▪ Exemple :
Pour N=9867, le programme affichera : le code est 39867
En effet :
Pour N=9867 :
▪ La 1ère somme S vaut 30 (car 9+8+6+7=30)
▪ La 2ème somme S vaut 3 (car 3+0=3)
▪ Etant donné que la derniers somme S, qui vaut 3, est comprise entre 1 et 9, le code sera 39867

• Corrigé

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercices corrigés (Série


5)
Algorithmes de
Exercice 1 :
cryptage
On veut crypter une chaine de caractères données CH dont la taille ne dépasse pas 50 caractères
en une chaine résultat Res de la manière suivante : parcourir la chaine CH de gauche à droite en
comptant le nombre d’occurrences successives de chaque caractère de la chaine CH, puis de
ranger la chaine Res, ce nombre suivi du caractère e question.
Ecrire un programme Python permettant de saisir la chaine CH qui doit être non vide et formée
uniquement par des lettres alphabétiques, puis de former et d’afficher la chaine Res selon le
principe décrit précédemment.
▪ Exemple :
Si CH=’aaaFyBssssssssssssazz’ alors la chaine Res qui sera affichée est ‘3a1F1y1B12s1a2z’

• Corrigé

Exercice 2 :
On se propose d’écrire un programme qui permet de saisir et de crypter un mot M non vide,
composé uniquement par des lettres majuscules et d’afficher le mot crypté MC.
La méthode de cryptage est la suivante :
▪ Pour chaque lettre, déterminer son nombre d’occurrence (apparition) n dans le mot M.
▪ Déterminer K qui est égal à 2*n si n est impair et sera égal à (n DIV 2) si n est pair.
▪ Remplacer chaque lettre par Kième lettre qui la suit dans l’intervalle de l’alphabet [‘A’…’Z’].
▪ Pour les dernières lettres, on rend dès le début, par exemple si K=3, on remplacera ‘A’ par ‘D’,’B’ par ‘E’, ‘C’
par ‘E’… ‘Y’ par ‘B’ et ‘Z’ par ‘C’.

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

▪ Exemple :
Pour le mot ‘HAPPY’
‘H’ ‘A’ ‘P’ ‘P’ ‘Y’
Nombre d’occurrence 1 1 2 2 1
La valeur de K 1*2=2 1*2=2 2 DIV 2=1 2 DIV 2=1 1*2+2
La lettre de
‘J’ ‘C’ ‘Q’ ‘Q’ ‘A’
remplacement
Le mot crypté sera :’JCQQA’
▪ Travail à faire :
Ecrire un programme Python qui permet de saisir un mot non vide et composé uniquement par des
lettres majuscules, puis d’afficher le mot crypté selon le principe décrit ci-dessus.

• Corrigé

Exercice 3 :
Un des plus anciens systèmes de cryptographie (aisément déchiffrable) consiste à décaler les
lettres d’un message pour le rendre illisible. Ainsi, les A deviennent des B, les B des C, etc.
Et les Z deviennent des A
Ü Exemple :
Si CH=’ABCCZABEY’ alors la chaine Res crypté qui sera affichée est ‘BCDDABCEZ’
Travail à faire :

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Ecrivez un programme qui demande une chaine CH à l’utilisateur et qui la code dans une chaine
Res selon ce principe.

• Corrigé

Exercice 4- le chiffre de César :


Une amélioration (relative) du principe utilisé dans l’exercice 2 consiste à opérer avec un décalage
non de 1, mais d’un nombre quelconque de lettres. Ainsi, par exemple, si l’on choisit un décalage
de 3, les A deviennent des E, les B des E, etc.
Et les Z deviennent C
Réalisez un programme python sur le même principe que le précédent, mais qui demande en plus
quel est le décalage à utiliser.

• Corrigé

Exercice 5 :
Une technique ultérieure de cryptographie consista à opérer non avec un décalage systématique,
mais par une substitution aléatoire. Pour cela, on utilise un alphabet-clé, dans lequel les lettres se
succèdent de manière désordonnée, par exemple :
HYLUJPVREAKBNDOFSQZCWMGITX
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

C’est cette clé qui va servir ensuite à coder le message. Selon notre exemple, les A deviendront
des H, les B des Y, les C des L, etc.
Ü Exemple :
Si CH=’ABCDEFZ’ alors la chaine Res crypté qui sera affichée est ‘HYLUJPX’
Travail à faire :
Ecrire un programme Python qui effectue ce cryptage (l’alphabet-clé sera saisi par l’utilisateur, et
on suppose qu'il effectue une saisie correcte) sur une chaine de caractères CH et stocker le résultat
dans Res.

• Corrigé

Exercice 6 - le chiffre de Vigenère :


Un système de cryptographie beaucoup plus difficile à briser que les précédents fut inventé au XVIe
siècle par le français Vigenère. Il consistait en une combinaison de différents chiffres de César.
On peut en effet écrire 25 alphabets décalés par rapport à l’alphabet normal :
▪ L’alphabet qui commence par B et finit par …YZA
▪ L’alphabet qui commence par C et finit par …ZAB
▪ etc.
Le codage va s’effectuer sur le principe du chiffre de César : on remplace la lettre d’origine par la
lettre occupant la même place dans l’alphabet décalé.
Mais à la différence du chiffre de César, un même message va utiliser non un, mais plusieurs
alphabets décalés. Pour savoir quels alphabets doivent être utilisés, et dans quel ordre, on utilise
une clé.
Si cette clé est "VIGENERE" et le message "Il faut coder cette phrase", on procèdera comme suit :
La première lettre du message, I, est la 9e lettre de l’alphabet normal. Elle doit être codée en utilisant
l’alphabet commençant par la première lettre de la clé, V. Dans cet alphabet, la 9e lettre est le D. I
devient donc D.
La deuxième lettre du message, L, est la 12e lettre de l’alphabet normal. Elle doit être codée en
utilisant l’alphabet commençant par la deuxième lettre de la clé, I. Dans cet alphabet, la 12e lettre
est le S. L devient donc S, etc.
Quand on arrive à la dernière lettre de la clé, on recommence à la première.
Ecrire un programme python qui effectue un cryptage de Vigenère, en demandant bien sûr au départ
la clé à l’utilisateur.

• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python

Exercices Corrigés Python (série 6)


Exercice 1
Un administrateur d’un site web veut assurer un maximum de sécurité pour les utilisateurs du site. Pour ceci
il décide de réaliser une application qui évalue la force des mots de passe des différents utilisateurs du site,
sachant qu’un mot de passe est une chaine de caractères qui ne comporte pas d’espaces et de lettres accentuées.
La force d’un mot de passe varie, selon la valeur d’un score calculé, de ‘Très faible’ jusqu’à ‘Très fort’ :
▪ Si le score <20, la force du mot de passe est ‘Très faible’
▪ Sinon si le score<40, la force d’un mot de passe est ‘Faible’
▪ Sinon si le score <80, la force du mot de passe est ‘Fort’
▪ Sinon la force du mot de passe est ‘Très fort’
Le score se calcule en additionnant des bonus et en retranchant des pénalités.
Les bonus attribués sont :
▪ Nombre total de caractères * 4
▪ (Nombre total de caractères – nombre de lettres majuscules) * 2
▪ (Nombre total de caractères – nombre de lettres minuscules) * 3
▪ Nombre de caractères non alphabétiques * 5
Les pénalités imposées sont :
▪ La longueur de la plus longue séquence de lettres minuscules * 2
▪ La longueur de la plus longue séquence de lettres majuscules * 3
Exemple :
Pour le mot de passe ‘P@cSI_promo2017’, le score se calcule comme suit :
La somme de bous = 15*4 + (15-3) *2 + (15-6) *3+6*5=141
▪ Le nombre total de caractères = 15
▪ Le nombre de lettres majuscules = 3
▪ Le nombre de lettres minuscules=6
▪ Le nombre de caractères non alphabétiques =6
La somme des pénalités = 5*2+2*2=14
▪ La longueur de la plus longue séquence de lettres minuscules(‘promo’) =5
▪ La longueur de la plus longue séquence de lettres majuscules(‘SI’) =2
Le score final = 141-14=127 ; puisque 127>80 alors le mot de passe est considéré comme ‘Très fort’
Travail demandé :
1. Ecrire une fonction NbCMin(pass) qui retourne le nombre de caractères minuscules.
2. Ecrire une fonction NbCMaj(pass) qui retourne le nombre de caractères majuscules.
3. Ecrire une fonction NbCAlphapass) qui retourne le nombre de caractères non alphabétiques.
4. Ecrire une fonction LongMaj(pass) retourne la longueur de la plus longue séquence de lettres
majuscules.
5. Ecrire une fonction LongMin(pass) retourne la longueur de la plus longue séquence de lettres
minuscules.
6. Ecrire une fonction Score(pass) qui affiche le score d’un mot de passe
Correction :

CPGE_MPSI/PCSI Python Page 27 sur 63


Algorithmique et programmation Langage python

def NbcMin(passe):
nb=0
for i in passe:
if 'a'<=i<='z':
nb+=1
return nb

def NbcMaj(passe):
nb=0
for i in passe:
if 'A'<=i<='Z':
nb+=1
return nb
def NbcAlpha(passe):
return len(passe)-NbcMaj(passe)-NbcMin(passe)

def longMaj(passe):
d=0
s=0
i=0
while i< len(passe):
if 'A'<passe[i]<'Z':
s+=1
else:
if s > d:
d=s
s=0
i+=1
return d

def longMin(passe):
d=0
s=0
i=0
while i< len(passe):
if 'a'<passe[i]<'z':

CPGE_MPSI/PCSI Python Page 28 sur 63


Algorithmique et programmation Langage python

Exercice 2 :
Louis Braille, est l’inventeur du système d’écriture tactile à points saillants, à l’usage des personnes aveugles
ou fortement malvoyantes.
En braille standard :
▪ Un caractère est représenté par six points numérotés de 1 à 6 et disposés comme le montre la Figure
1
▪ Un point peut être saillant (en relief) ou non, comme le montre la Figure 2.
▪ Le nombre et la disposition des points en relief définissent un caractère.

Figure 1 Figure 2

CPGE_MPSI/PCSI Python Page 29 sur 63


Algorithmique et programmation Langage python

Dans la suite, on s’intéressera à la représentation des 26 lettre majuscules de l’alphabet français. Le tableau
suivant donne cette représentation.

N.B chaque point noir représente un point saillant.


Etant donné un fichier d’enregistrements intitulé ‘Codes_braille.txt’, ou chaque enregistrement est composé
de deux champs :
▪ Un champ lettre contenant une lettre majuscule de l’alphabet français
▪ Un champ codage contenant une chaine de 6 caractères représentant l’équivalent en braille de la lettre.
En utilisant le fichier ‘Code_brailles.txt’, o se propose de convertir le fichier texte intitulé ‘[Link]’
contenant une représentation braille d’un texte en son équivalent en alphabet français puis d’afficher le résultat
obtenu.
▪ Sachant que :
▪ Chaque ligne du fichier ‘[Link]’ contient la représentation d’un seul mot.
▪ La représentation d’un mot est une concaténation de blocs de six caractères.
▪ Chaque bloc de six caractères représente une lettre du mot.
▪ Un caractère peut être un astérisque (‘*’) représentant un point saillant, ou un trait d’union (‘-‘)
représentant un point non saillant.
▪ Les caractères ‘*’ et ‘-‘ sont disposés selon l’ordre des numéros des points qu’ils représentent. Par
exemple, la lettre ‘H’ sera représentée par block de six caractères suivant :
* * - - * -
1 2 3 4 5 6
Exemple :
Etant donné le contenu du fichier ‘Codes_braville.txt’ donc une partie est représentée comme suit :
A *-----
B **----
C *--*--
D *--**-

Si le contenu du fichier ‘[Link]’ est le suivant :

**----*-*-*-*-***--*-**-*-*-*-*-*--****-*-

CPGE_MPSI/PCSI Python Page 30 sur 63


Algorithmique et programmation Langage python

****---***---*-*--
Le programme affichera la chaine : ‘BONJOUR PSI’
En effet :
-‘BONJOUR’ est l’équivalent en alphabet français de la première ligne du fichier ‘[Link]’.
B O N J O U R

**---- *-*-*- *-***- -*-**- *-*-*- *-*--* ***-*-


-‘PSI’ est l’équivalent en alphabet français de la deuxième ligne du fichier ‘[Link]’
Ecrire un programme Python permettant de résoudre ce problème. Vous pouvez utiliser plusieurs fonctions
Correction :
def dictionnaire(fichier) :
fichier=open(fichier)
dic={}
for i in code:
c=[Link]()
l=[Link](' ')
cle=l[1]
dic[cle]=l[0]
[Link]()
return dic

def coder(fichier) :
dic=dictionnaire('codes_Braille.txt')
f=open(fichier)
s=""
for j in f:
c=[Link]()
nb=len(j)//6
po=0
for k in range(nb):
cle=c[po:po+6]
s+=dic[cle]
po+=6
s+=' '
return s
print(coder('[Link]'))

CPGE_MPSI/PCSI Python Page 31 sur 63


Algorithmique et programmation Langage python

Exercices Corrigés Python (série 7)


Exercice 1 :
Une molécule est un regroupement d’au moins deux atomes qui sont unis par des liens chimiques et elle est
représentée par une formule chimique. Exemple : H2O.
Une formule chimique est une succession de symboles d’atomes, suivi chacun par un entier représentant le
nombre d’apparitions(nbr) de l’atome dans la molécule.
Chaque atome est symbolisé par la première lettre de son nom en majuscule, suivie éventuellement d’une
deuxième lettre en minuscule pour distinguer des atomes ayant des initiales identiques. Ainsi, le Fluor(F) se
distingue de Fer(Fe), du Fermium(Fm) et du Francium(Fr).
Le calcul de la masse molaire moléculaire d’une molécule, notée M(Molécule), sera comme suit :
Pour chaque atome de la molécule, calculer le produit (nbr * A(atome)) ou A(atome) est un réel représentant
la masse atomique de l’atome ;
Calculer la somme des produits obtenus.
Exemple :
Pour la molécule dichromate de potassium (K2Cr2O7) qui est constituée de 2 atomes de potassium(K), 2
atomes de chrome(Cr) et 7 atomes d’oxygène(O), sa masse molaire moléculaire M(K2Cr2O7) est égale à
2*A(K)+2*A(Cr)+7*A(O).
Puisque A(K)=39,1 g/mol, A(Cr)=52 g/mol et A(O)=16 g/mol, alors M(K2Cr2O7)=2*39,1+2*52+7*16=294,2
g/mol
Travail demandé
En disposant d’un fichier texte ‘Molé[Link]’ dont chaque ligne contient le nom d’une molécule suivi de sa
formule chimique, séparés par le caractère astérisque ‘*’ .
Ecrire une fonction remplireAtome() qui permet de remplir le fichier ‘[Link]’ par les données relatives
à N atomes (N<=50), ou chacun est représenté par son symbole et sa masse atomique,
Ecrire un fonction masseAtome() qui permet de stocker dans un fichier ‘[Link]’ le nom et la masse
molaire moléculaire de chaque molécule figurant dans le fichier ‘[Link]’.
Correction :

CPGE_MPSI/PCSI Python Page 32 sur 63


Algorithmique et programmation Langage python

c=[Link]()
l=[Link](' ')
cle=l[0]
dic[cle]=l[1]
[Link]()
return dic

def massAtome():
dic= dictionnaire('[Link]')
source=open('[Link]')
dest=open('[Link]','a')
for ligne in source:
c=[Link]()
l=[Link]('*')
atome=''
nb=''
estnombre=False
masse=0
for lettre in l[1]:
if 'A'<=lettre<='Z' or 'a'<=lettre<='z':
if estnombre==True:
masse+=int(dic[atome])*int(nb)
atome=''
nb=''
estnombre=False
atome+=lettre
else:
estnombre=True
nb+=lettre
masse+=int(dic[atome])*int(nb)
[Link](l[1]+':'+str(masse)+'\n')

massAtome()

CPGE_MPSI/PCSI Python Page 33 sur 63


Algorithmique et programmation Langage python

Exercice 2 :
Dans un contexte arithmétique, on définit les nombres premiers factoriels et les nombres premiers primoriels
comme indiqué ci-après.
Un nombre PF est dit premier factoriel s’il vérifie les deux propriétés suivantes :
▪ PF est un nombre premier
▪ Et PF s’écrit sous la forme d’un factoriel incrémenté ou décrémenté de 1 (PF=F! + 1 ou PF=F! - 1),
sachant que le factoriel de F noté F ! est égal à F*(F-1) *…*1
Exemple :
▪ 7 est un nombre premier factoriel car 7 est premier et il s’écrit sous la forme 3! + 1.
▪ 719 est un nombre premier factoriel car 719 est premier et il s’écrit sous la forme 6! - 1.
Un nombre PP est dit premier primoriel s’il vérifie les deux propriétés suivantes :
▪ PP est un nombre premier
▪ PP s’écrit sous la forme d’une primorielle incrémentée ou décrémentée de 1 (PP=P#+1 ou PP=P#-1),
sachant que la primorielle de P notée P# est égale au produit des nombres premiers inférieurs ou égaux
à P.
Exemple
▪ 211 est un nombre premier primoriel car 211 est premier et il s’écrit sous la forme 7# + 1
En effet, 7#+1=2*3*5*7 + 1 =210 + 1=211
▪ 30029 est un nombre premier primoriel car 30029 est premier et il s’écrit sous la forme 13# - 1
En effet, 13# - 1 = 2*3*5*7*11*13-1=30030 – 1 =30029
Travail demandé :
1. Ecrire une fonction premier_fact(n) qui permet de vérifier est ce que n est un nombre premier factoriel
ou non
2. Ecrire une fonction premier_primoriel(n) qui permet de vérifier est ce que n est un nombre premier
primoriel ou non
Correction :

CPGE_MPSI/PCSI Python Page 34 sur 63


Algorithmique et programmation Langage python

f=f*ordre
ordre+=1
if f+1==n or f-1==n:
etat=True
return etat

def premier_primoriel(n):
etat=False
if premier(n)==True:
p=3
s=0
while s<n:
s=1
for i in range(2,p+1):
if premier(i)==True:
s=s*i
p+=1
if s+1==n or s-1==n:
etat=True
break

return etat

n=719
print(premier_fact(n))

CPGE_MPSI/PCSI Python Page 35 sur 63


Algorithmique et programmation Langage python

Exercices Corrigés Python (série 8)


Exercice 1 :
Etant donné un fichier texte nommé ‘F_IPV4.txt’ contenant dans chaque ligne une adresse IPV4. On se
propose de vérifier la validité des adresses IPV4 stockés dans ce fichier, de déterminer la classe à laquelle
appartient chacune des adresses valides, de les faire migrer vers le système IPV6 et de stocker dans un fichier
d’enregistrements nommé ‘F_IPV6.txt’ chaque adresse IPV4 valide ainsi que la classe à laquelle elle
appartient et son équivalent en IPV6.
Pour ce faire, on dispose des informations suivantes :
1. Une adresse IPV4 valide est codée sur quatre octets (32 bits) et représentée sous la forme W.X.Y.Z
avec W, X, Y et Z sont quatre entiers naturels appartenant chacun à l’intervalle [0,255] et séparés par
le caractère ‘.’
NB. Pour vérifier la validité d’une adresse IPV4, le candidat est appelé uniquement à vérifie si W, X,
Y et Z sont dans l’intervalle [0,255].
2. Chaque adresse IPV4 valide appartient à une classe :
o Classe A, si la valeur du premier bit à gauche de la représentation en binaire de W est 0.
o Classe B, si la valeur des deux premiers bits à gauche de la représentation en binaire de W est 10.
o Classe C, si la valeur des trois premiers bits à gauche de la représentation en binaire de W est 110.
o Classe D, si la valeur des quatre premiers bits à gauche de la représentation en binaire de W est
1110
o Classe E, si la valeur des quatre premiers bits à gauche de la représentation en binaire de W est
1111
3. Une adresse IPV6 est codée sur 16 octets (128 bits). Pour faire migrer une adresse IPV4 valide vers le
système IPV6, on va s’intéresser uniquement au bloc de 32 bits dans l’adresse IPV6 qui représente la
conversion en hexadécimal de l’adresse IPV4.
Pour ce faire, on convertit chacun des nombres W, X, Y et Z en hexadécimal, puis, les concaténer en
insérant le caractère ‘ :’ au milieu du résultat obtenu.
Exemple
L’adresse [Link] est valide et elle appartient à la classe B car la valeur des deux premiers bits à gauche
de la représentation en binaire de 155 qui est 10011011 est 10.
• L’équivalent du nombre décimal 155 en hexadécimal est 9B
• L’équivalent du nombre décimal 105 en hexadécimal est 69
• L’équivalent du nombre décimal 50 en hexadécimal est 32
• L’équivalent du nombre décimal 69 en hexadécimal est 45
Donc, le bloc de 32 bits dans l’adresse IPV6 qui représente la conversion en hexadécimal de l’adresse IPV4
est 9B69 :3245
Travail demandé
1. Ecrire une fonction valide(ip) qui permet de vérifier la validité d’une adresse IPV4 (True or False)
2. Ecrire une fonction classe(ip) qui retourne la classe d’une adresse ip
3. Ecrire une fonction adresseip6(ip) qui permet de convertir une adresse ip en V4 vers une adresse IPV6
4. Ecrire la fonction Genere() qui permet de générer le fichier ‘F_IPV6.txt’
Remarque :
▪ La fonction bin(nb) permet de convertir en binaire un nombre nb (bin(155) à 0b10011011)
▪ La fonction hex(nb) permet de convertir un nombre décimal en hexadécimal (hex(155) à 0x9b)

CPGE_MPSI/PCSI Python Page 36 sur 63


Algorithmique et programmation Langage python

Correction :
def valide(ip):
ad=[Link]('.')
if len(ad)==4:
if 0<int(ad[0])<255 and 0<int(ad[1])<255 and 0<int(ad[2])<255 and 0<int(ad[3])<255:
return True
else: return False
else: return False

def binaire(nb):
val=['0','0','0','0','0','0','0','0']
binn=bin(int(nb))
i=len(val)-len(binn[2:])
for lettre in binn[2:]:
val[i]=lettre
i+=1
return ''.join(val)

def classe(ip):
if valide(ip):
ad=[Link]('.')
binn=binaire(ad[0])
if binn[0]=='0':
return 'A'
elif binn[:2]=='10':
return 'B'
elif binn[:3]=='110':
return 'C'
elif binn[:4]=='1110':
return 'D'
else:
return 'E'
else: return False

CPGE_MPSI/PCSI Python Page 37 sur 63


Algorithmique et programmation Langage python

def adresseip6(ip):
if valide(ip):
ad=[Link]('.')
adresse=hex(int(ad[0]))[2:]+hex(int(ad[1]))[2:]+':'+hex(int(ad[2]))[2:]+hex(int(ad[3]))[2:]+'\n'
return adresse
else: return ''

def Genere():
source=open('F_IPV4.txt')
dest=open('F_IPV6.txt','a')
for ligne in source:
if valide([Link]()):
chaine=[Link]()+' : '+classe([Link]())+' : '+adresseip6([Link]())
[Link](chaine)
[Link]()
[Link]

CPGE_MPSI/PCSI Python Page 38 sur 63


Algorithmique et programmation Langage python

Exercice 2 :
On se propose de crypter un message, formé uniquement par des lettres majuscules et des espaces, en utilisant
la méthode de chiffrement de Polybe qui consiste à :
▪ Ranger, dans une matrice carrée de dimension 5x5, les lettres d’un mot-clé donné suivies des lettres
restantes de l’alphabet dans l’ordre, à l’exception de la lettre ‘W’.
Le mot-clé est une chaine de caractères formée uniquement de L lettres majuscules, sans doublons et
ne contenant pas la lettre ‘W’ (avec 3<=L<=10).
▪ Remplacer chaque lettre du message à crypter par les coordonnées de sa position dans la matrice (le
numéro de la ligne suivi du numéro de la colonnes), sachant que :
➢ Le caractère espace ne subit aucun cryptage ;
➢ La lettre ‘W’ sera remplacée par les coordonnées de la lettre ‘V’
Exemple
Pour le mot-clé ‘MYSTER, on construit la matrice suivante :
1 2 3 4 5
1 M Y S T E
2 R A B C D
3 F G H I J
4 K L N O P
5 Q U V X Z

Le cryptage du message ‘CHERCHER POLYBE DANS WIKIPEDIA’ sera :


‘2433152124331521_454442122315_25224313_533441344515253422’ ou le mot ‘WIKIPEDIA’ est crypté
comme suit : ‘533441344515253422’ car ‘W’ remplacé par ‘53’ (les coordonnées de la lettre ‘V’), 4I4 est
remplacé par ‘34’, ‘K’ est remplacé par ‘41’, ‘P’ est remplacé par ‘45’, ‘E’ est remplacé par ‘15’, ‘D’ est
remplacé par ‘25’ et ‘A’ est remplacé par ‘22’.
Travail demandé
1. Ecrire une fonction Python Crypter_Polybe(message, motcle), qui permet de crypter un message
donnéselon le mot-clé en respectant les contraintes cités ci-dessus selon la méthode de chiffrement de
Polybe.
2. Ecrire une fonction Decrypter_Polybe(message, motcle), qui permet de décrypter le message
donnéselon le mot-clé selon le chiffrement de Polybe.

CPGE_MPSI/PCSI Python Page 39 sur 63


Algorithmique et programmation Langage python

Correction :
def matrice(motcle):
alpha='ABCDEFGHIJKLMNOPQRSTUVXYZ'
Mat=[[0]*5 for _ in range(5)]
Mat[0][0]=motcle[0]
i=0
j=1
for pos in range(1,len(motcle)):
if j==5:
i+=1
j=0
if motcle[pos] not in motcle[:pos]:
Mat[i][j]=motcle[pos]
j+=1
for pos in range(len(alpha)):
if j==5:
i+=1
j=0
if alpha[pos] not in motcle:
Mat[i][j]=alpha[pos]
j+=1
return Mat
def Crypter_Polybe(msg, motcle):
Mat=matrice(motcle)
res=''
for pos in range(len(msg)):
if msg[pos]==' ':
res+='_'
elif msg[pos]=='W':
res+='00'
else:
i=0
j=0
while Mat[i][j]!=msg[pos]:
j+=1
if j==5:
j=0
i+=1
res+=str(i+1)+str(j+1)
return res

CPGE_MPSI/PCSI Python Page 40 sur 63


Algorithmique et programmation Langage python

def Decrypter_Polybe(msg, motcle):


Mat=matrice(motcle)
res=''
k=0
while k<len(msg)-1:
s=msg[k]
if msg[k]=='_':
res+=' '
k+=1
elif msg[k]=='0':
res+='W'
k+=2
else:
i=int(msg[k])-1
j=int(msg[k+1])-1
res+=Mat[i][j]
k+=2
return res

CPGE_MPSI/PCSI Python Page 41 sur 63


Algorithmique et programmation Langage python

Exercices Corrigés (série 9)

Exercice 1
Un nombre heureux est un nombre entier qui, lorsqu’on ajoute les carrés de chacun de ses chiffres, puis les
carrés des chiffres de ce résultat et ainsi de suite jusqu'à l’obtention d’un nombre à un seul chiffre égal à 1
(un).
Exemple :
N=7 est heureux, puisque :
72=49
42+92=97
92+72=130
12+32+02=10
12+02=1
On est arrivé à un nombre d’un seul chiffre qui est égal à 1, donc N=7 est heureux
Travail demandé :
Ecrire une fonction heureux(nb) qui permet de déterminer si un nombre entier nb est heureux ou non.
ð Correction

CPGE_MPSI/PCSI Python Page 42 sur 63


Algorithmique et programmation Langage python

Exercice 2
La suite de robinson est définie par :
o U0=0
o Un se construit en concaténant le nombre d’apparition de chacun des chiffres constituant le terme
Un-1 suivi du chiffre lui-même, selon l’ordre décroissant des chiffres, pour tout n>0.
Exemple :
Pour n=5, U5=13123110
En effet :
o U0=0
o U1=10 car il y a une apparition (1) du chiffre 0 dans U0
o U2=1110 car il y’a une apparition (1) du chiffre 1 et une apparition (1) du chiffre 0 dans U1
o U3=3110 car il y’a une apparition (3) du chiffre 1 et une apparition (1) du chiffre 0 dans U2
o U4=132110 car il y’a une apparition (1) du chiffre 3, deux apparition du chiffre 1 et une apparition (1)
du chiffre 0 dans U3
o U5=13123110 car il y’a une apparition (1) du chiffre 3, une apparition du chiffre 2, trois apparitions
du chiffre 1 et une apparition (1) du chiffre 0 dans U3
Travail à faire :
Ecrire une fonction robinson(n) qui permet de calculer le Nième terme de la suite de robinson
ð Correction

CPGE_MPSI/PCSI Python Page 43 sur 63


Algorithmique et programmation Langage python

Exercice 3
Un entier est dit distinct s’il est composé de chiffres distincts (différents).
Ecrire un programme python qui permet de saisir un entier n (n>0), puis de vérifier et d’afficher si cet entier
est distinct ou non.
Exemple :
N=1273 est dit distinct car il est formé par les chiffres 1, 2, 7 et 3 qui sont tous distincts, donc, le programme
affichera : cet entier est distinct
N=1565 est dit non distinct car il est formé par les chiffres 1, 5, 6, 5 qui ne sont pas tous distincts (le chiffre 5
se répète deux fois, donc le programme affichera : cet entier est non distinct
ð Correction

CPGE_MPSI/PCSI Python Page 44 sur 63


Algorithmique et programmation Langage python

Exercices Corrigés (série 10)

Exercice 1
Soit un fichier typé intitulé [Link] qui comporte les enregistrements relatifs aux candidats d’un
concours. Chaque enregistrement est composé de : NCIN, NOM, PRENOM, AGE, DECISION : (type
contenant les identificateurs suivants : admis, refusé, ajourné), et séparé par point virgule (;).
Travail demandé :
1. Définir la fonction saisir() qui permet de remplir les données relatives aux candidats dans le fichier
[Link], 1. L’arrêt de la saisie se fait en répondant à la question ("Saisir un nouveau candidat, (O
/ N) ? ")
2. Définir la fonction admis() qui permet créer le fichier [Link] comportant les données relatives aux
candidat admis
3. Afin de sélectionner en priorité les candidats admis et âgés moins de 30 ans, créer la fonction attente()
qui produira à partir du fichier [Link], un nouveau fichier intitulé [Link] comportant les données
relatives aux candidats admis et âgés plus que 30 ans. Une ligne du fichier [Link] comprend le
NCIN, le NOM et PRENOM d’un candidat séparé par point virgule (;).
4. Définir la fonction statistiques(dec) qui permet de retourner le pourcentage des candidats pour la
décision dec (admis, refusé et ajourné). Exemple : Le pourcentage des candidats admis = (Nombre
des candidats admis / Nombre des candidats) *100
5. Définir la fonction supprimer() qui supprimera du fichier [Link] les candidat âgés plus que 30
N.B : On suppose que les fichiers seront mis à la racine du lecteur C.
ð Correction
def saisir():
new='O' # O -> oui ; N -> non
fichier=open('[Link]','a')
decision={'a':'admis(e)','r':'refusé(e)','aj':'ajourné(e)'}
while new=='O':
cin=input('Saisir le Numéro CIN : ')
nom=input('Saisir le Nom : ')
prenom=input('Saisir le prenom : ')
age=input("saisir l'age ")
dec=input('saisir la décision a (admis(e)) ; r (refusé(e) ) ; aj (ajourné(e)) : ')
ligne=cin+';'+nom+';'+prenom+';'+age+';'+decision[dec]+'\n'
[Link](ligne)

new=input('Saisir un nouveau candidat, (O / N) ?')


[Link]()

CPGE_MPSI/PCSI Python Page 45 sur 63


Algorithmique et programmation Langage python

def admis():
fichier=open('[Link]')
dest=open('[Link]','a')

for ligne in fichier:


L=[Link](';')
if L[4].strip()=='admis(e)':
[Link](ligne)
[Link]()
[Link]()

def attente():
fichier=open('[Link]')
dest=open('[Link]','a')

for ligne in fichier:


L=[Link](';')
if int(L[3])>=30:
enreg=L[0]+';'+L[1]+';'+L[2]+'\n'
[Link](enreg)
[Link]()
[Link]()

def statistiques(dec):
fichier=open('[Link]')
L=[Link]()

[Link]()

L1=[] # candidats admis


L2=[] # candidats refusés
L3=[] # candidats refusés

for ligne in L:
L=[Link](';')

CPGE_MPSI/PCSI Python Page 46 sur 63


Algorithmique et programmation Langage python

if L[4].strip()=='admis(e)':
[Link](ligne)
elif L[4].strip()=='refusé(e)':
[Link](ligne)
else:
[Link](ligne)

if dec=='admis':
return (len(L1)/len(L))*100
elif dec=='refusé':
return (len(L2)/len(L))*100
else:
return (len(L3)/len(L))*100

def supprimer():
fichier=open('[Link]')

candidat=[] # contient les candidats restants


for ligne in fichier:
L=[Link](';')
if int(L[3])<30:
[Link](ligne)
[Link]()

#réecrire la nouvelle liste


fichier=open('[Link]','w')
[Link](candidat)
[Link]()

CPGE_MPSI/PCSI Python Page 47 sur 63


Algorithmique et programmation Langage python

Exercice 2
Après la réussite au baccalauréat, les meilleurs bacheliers sont orientés vers les classes préparatoires aux
grandes écoles. En effet, la priorité est à celui qui a le score (nombre de points) le plus élevé. Ce score est
appelé formule globale.
Les élèves admissibles seront classés par ordre décroissant selon la formule globale, Puis, une fois classés,
ces bacheliers seront divisés en 4 groupes de la façon suivante :
Nb
Groupe description Réparation
d’étudiants
40% (SMA) ; 30% (SMB) ; 20% (PC) ; 10%
Principale Liste principale 30
(SVT)

50% (SMA) ; 25% (SMB) ; 20% (PC) ; 5%


Tranche 1 Liste d’attente N°1 40
(SVT)

40% (SMA) ; 30% (SMB) ; 20% (PC) ; 10%


Tranche 2 Liste d’attente N°2 60
(SVT)

Tranche 3 Liste d’attente N°3 50 55% (SMA) ; 25% (SMB) ; 20% (PC) ;

Dans le répertoire C:/bachelier, on dispose d’un fichier nommé ‘[Link]’ contenant la liste des bacheliers
admissibles de la section Physique et sciences industrielles. Dans ce fichier, chaque bachelier est défini par :
▪ Num_insc : le numéro d’inscription
▪ NP : le nom et prénom
▪ FILIERE : le nom de la filière (SMA, SMB, PC ou SVT)
▪ MG : moyenne générale.
▪ FS (formule spécifique) : un réel déjà calculé à partir des notes obtenues dans les diverses matières.
▪ i : un réel=1 si l’élève est redoublant en BAC et 1.10 sinon
les informations sont séparées par point virgule( ;)
On souhaite réaliser les fonctions suivantes :
1. formule_gen() qui permet de créer un autre fichier ‘PSI_FG.txt’, à partir du fichier ‘[Link]’, et y
stocker, pour les mêmes bacheliers, les informations suivantes : Num_insc, NP, FILIERE et FG.
Sachant que la formule globale (FG) de chaque élève est calculée par l’équation :
FG=((5*MG+FS)*i)
2. classer() qui permet de classer les bacheliers du fichiers ‘PSI_FG.txt’ par ordre décroissant selon la
formule globale(FG).
N.B : pour faire cette tache, on doit transmettre les informations dans un tableau, les trier puis les
transmettre ordonnées dans le fichier, implémenter un algorithme de tri que vous voulez pour trier le
tableau
3. generer() qui permet d’extraire, dans le même répertoire, 4 autres fichiers (‘PSI_princ.txt’,
‘PSI_t1.txt’, ‘PSI_g2.txt’, ‘PSI_g3.txt’) contenant respectivement les bacheliers appartenant au
groupe liste principale, tranche 1, tranche2 et tranche3.
4. afficher(Num_insc) qui permet d’afficher, pour un candidat donné, en fonction de son numéro
d’inscription (donnée fournie en argument), le groupe auquel il appartient

CPGE_MPSI/PCSI Python Page 48 sur 63


Algorithmique et programmation Langage python

ð Correction
def formule_gen():
source=open('[Link]')
dest=open('PSI_FG.txt','a')
for ligne in source:
s=[Link]()
tab=[Link](':')
fg=((5*float(tab[3])+float(tab[4]))*float(tab[5]))
etd=str(tab[0])+':'+str(tab[1])+':'+str(tab[2])+':'+str(fg)+'\n'
[Link](etd)
[Link]()
[Link]()

def classer():
source=open('PSI_FG.txt')
L=[Link]()
for i in range(len(L)-1):
m=i
for j in range(i+1,len(L)):
t1=L[j].strip().split(':')
t2=L[m].strip().split(':')
if float(t1[3])>float(t2[3]):
m=j
L[i],L[m]=L[m],L[i]
[Link]()
source=open('PSI_FG.txt','w')
[Link](L)
[Link]()

def generer():

CPGE_MPSI/PCSI Python Page 49 sur 63


Algorithmique et programmation Langage python

l1=[]#SMA
l2=[]#SMB
l3=[]#PC
l4=[]#SVT
#classer()
#classer dans 3 listes les etudiants selon la filière

source=open('PSI_FG.txt')
for ligne in source:
t=[Link](':')
if t[2]=='SMA':
[Link](ligne)
elif t[2]=='SMB':
[Link](ligne)
elif t[2]=='PC':
[Link](ligne)
else:
[Link](ligne)
[Link]()

# construire la liste principale

nb1=12 # nombre des etudiants SMA


nb2=9 # nombre des etudiants SMB
nb3=6 # nombre des etudiants PC
nb4=3. # nombre des etudiants SVT

isma=0 # indice de début pour SMA


ismb=0 # indice de début pour SMB
ipc=0. # indice de début pour PC
isvt=0. # indice de début pour SVT

princ=open('PSI_princ.txt','a')
for i in range(nb1):
if i<len(l1):
[Link](l1[i])

CPGE_MPSI/PCSI Python Page 50 sur 63


Algorithmique et programmation Langage python

for i in range(nb2):
if i<len(l2):
[Link](l2[i])

for i in range(nb3):
if i<len(l3):
[Link](l3[i])

for i in range(nb4):
if i<len(l4):
[Link](l4[i])
[Link]()
# construire la tranche 1

isma=nb1
ismb=nb2
ipc=nb3
isvt=nb4
nb1+=20
nb2+=10
nb3+=8
nb4+=2

princ=open('PSI_t1.txt','a')
for i in range(isma,nb1):
if i<len(l1):
[Link](l1[i])

for i in range(ismb,nb2):
if i<len(l2):
[Link](l2[i])

for i in range(ipc,nb3):
if i<len(l3):
[Link](l3[i])

CPGE_MPSI/PCSI Python Page 51 sur 63


Algorithmique et programmation Langage python

for i in range(isvt,nb4):
if i<len(l4):
[Link](l4[i])
[Link]()
# construire la tranche 2

isma=nb1
ismb=nb2
ipc=nb3
isvt=nb4
nb1+=24
nb2+=18
nb3+=12
nb4+=6

princ=open('PSI_t2.txt','a')
for i in range(isma,nb1):
if i<len(l1):
[Link](l1[i])

for i in range(ismb,nb2):
if i<len(l2):
[Link](l2[i])

for i in range(ipc,nb3):
if i<len(l3):
[Link](l3[i])

for i in range(isvt,nb4):
if i<len(l4):
[Link](l4[i])
[Link]()
# construire la tranche 3

isma=nb1

CPGE_MPSI/PCSI Python Page 52 sur 63


Algorithmique et programmation Langage python

ismb=nb2
ipc=nb3
nb1+=27
nb2+=12
nb3+=11

princ=open('PSI_t3.txt','a')
for i in range(isma,nb1):
if i<len(l1):
[Link](l1[i])

for i in range(ismb,nb2):
if i<len(l2):
[Link](l2[i])

for i in range(ipc,nb3):
if i<len(l3):
[Link](l3[i])

for i in range(isvt,nb4):
if i<len(l4):
[Link](l4[i])
[Link]()

def afficher(Num_insc):

CPGE_MPSI/PCSI Python Page 53 sur 63


Algorithmique et programmation Langage python

princ=open('PSI_princ.txt')
L1=[Link]()

tr1=open('PSI_t1.txt')
L2=[Link]()

tr2=open('PSI_t2.txt')
L3=[Link]()

tr3=open('PSI_t3.txt')
L4=[Link]()

etat=False
tranche=''

# chercher dans la liste principale


for ligne in L1:
if str(Num_insc)==ligne[:len(str(Num_insc))]:
etat=True
tranche='Liste principale'
break
# si l'etudiant n'appartient pas à liste principale rechercher dans la tranche 1
if etat==False:
for ligne in L2:
if str(Num_insc)==ligne[:len(str(Num_insc))]:
etat=True
tranche='Tranche 1'
break

# si l'etudiant n'appartient pas à tranche 1 rechercher dans la tranche 2


if etat==False:
for ligne in L3:
if str(Num_insc)==ligne[:len(str(Num_insc))]:
etat=True
tranche='Tranche 2'
break

CPGE_MPSI/PCSI Python Page 54 sur 63


Algorithmique et programmation

CPGE_MPSI/PCSI Python
Algorithmique et programmation Langage python

Exercice 1

On donne une valeur K et un tableau T de N valeurs entières(N<50) tel que la valeur K ne figure pas
dans le tableau T (T[i]!=K ;i=1..N)

Ecrire une fonction deplacer(T,K)qui permet de déplacer les éléments du tableau T de manière à
regrouper en tête de celui-ci toutes les valeurs inférieures à K et en queue les valeurs supérieures à K
(sans utiliser un autre tableau).

Exemple :

Avec K=20 le tableau T devient :

Avec K=2 le tableau T devient :

Exercice 1
1 def deplacer (T , K ):
2 i =0
3 d = len ( T ) -1
4 while i < d :
5 if T [ i ] < k :
6 i +=1
7 else :
8 if T [ d ] < k :
9 T [ i ] , T [ d ]= T [ d ] , T [ i ]
10 else :
11 d -=1

Exercice 2
Soit une matrice A(n,m) de valeurs entières (n<50,m<100)

Ecrire une fonction trier(A) qui permet de faire un tri décroissant sur toutes les colonnes de la matrice A

Exemple :

CPGE_MPSI/PCSI
Algorithmique et programmation Langage python

Exercice 2
1 def Trier ( A ):
2 nl = len ( A ) # nombre de lignes
3 nc = len ( A [0]) # nombre de colonnes
4 for k in range ( nc ):
5 # tri par s e l e c t i o n
6 for i in range ( nl -1):
7 m=i
8 for j in range ( i +1 , nl ):
9 if A [ j ][ k ] > A [ m ][ k ]:
10 m=j
11 A [ i ][ k ] , A [ m ][ k ]= A [ m ][ k ] , A [ i ][ k ]
12 # fin tri par s e l e c t i o n

Exercice 3

Soit une matrice A de n ligne et m colonnes(n<100, m<50). Et soit le tableau T définie par rapport à la
matrice A comme suit : L’ième élémént de T représente le nombre d’éléments de la ligne i de A qui n’existe
pas dans la ligne i+1 (la ligne suivante si elle existe).

Ecrire une fonction build(A) qui construit et affiche le tableau T.

Exercice 3
1 def build ( A ):
2 nl = len ( A ) # nombre de lignes
3 nc = len ( A [0]) # nombre de colonnes
4 T =[ 0]*( nl -1)
5 for i in range ( nl -1):
6 nb =0
7 for j in range ( nc ):
8 print ( A [ i +1])
9 if A [ i ][ j ] not in A [ i +1]:
10 nb +=1
T [ i ]= nb
return T

CPGE_MPSI/PCSI
Algorithmique et programmation Langage python

Exercice 4

En mathématiques, une matrice stochastique (aussi appelée matrice de Markov) est une matrice carrée dont
chaque élément est un réel compris entre 0 et 1 et dont la somme des éléments de chaque ligne vaut 1. Cela
correspond, en probabilité, à la matrice de transition d'une chaîne de Markov finie.

Une matrice est dite bistochastique (ou doublement stochastique) si la somme des éléments de chaque ligne et
de chaque colonne vaut 1.

Voici un exemple de matrice stochastique P (dans cet exemple, la somme des éléments de chaque ligne est
égale à 1 ; on remarque que la somme des éléments de chaque colonne est quelconque):

Par exemple :

Si G est une matrice stochastique, alors on appelle vecteur stable pour G un vecteur h tel que :

Et

1. Ecrire une fonction eststochastique(P) qui permet de vérifier est ce que la matrice P est
stochastique ou non

2. Ecrire une fonction estbistochastique(P) qui permet de vérifier est ce que la matrice P
est bistochastique ou non

3. Ecrire une fonction vecteurstable(G, h) qui permet de vérifier est ce que h est un vecteur
stable de G ou non

CPGE_MPSI/PCSI
Algorithmique et programmation Langage python

Exercice 4
1 def e s t s t o c h a s t i q u e ( P ):
2 nl = len ( P ) # nombre de lignes
3 nc = len ( P [0]) # nombre de colonnes
4
5 etat = True # on suppose que la matrice est s t o c h a s t i q u e
6 for i in range ( nl ):
7 s =0
8 for j in range ( nc ):
9 s += P [ i ][ j ]
10 if s >1:
11 etat = False
12 break
13 return etat
14
15 def e s t b i s t o c h a s t i q u e ( P ):
16 nl = len ( P ) # nombre de lignes
17 nc = len ( P [0]) # nombre de colonnes
18
19 etat = True # on suppose que la matrice est b i s t o c h a s t i q u e
20 if ( e s t s t o c h a s t i q u e ( P )):
21 for j in range ( nc ):
22 s =0
23 for i in range ( nl ):
24 s += P [ i ][ j ]
25 if s >1:
26 etat = False
27 break
28 return etat
29
30 def v e c t e u r s t a b l e (G , h ):
31 nl = len ( G ) # nombre de lignes
32 nc = len ( G [0]) # nombre de colonnes
33 etat = True
34 if ( e s t s t o c h a s t i q u e ( G )):
35 for j in range ( nc ):
36 s =0
37 for i in range ( nl ):
38 s += h [ i ]* G [ i ][ j ]
39 if s != h [ j ]:
40 etat = False
41 break
42 else : 42
43 etat = False
44 return etat

CPGE_MPSI/PCSI

Vous aimerez peut-être aussi