Académique Documents
Professionnel Documents
Culture Documents
4 Listes - Série 1 9
5 Listes - Série 2 11
6 Tuples et ensembles 13
8 Chaînes de caractères 16
10 Fichiers 21
12 Dictionnaires 26
13 Circuits logiques 28
20 Réseaux 48
21 Algorithmes gloutons 51
23 Assembleur 56
24 Algorithmes kNN 60
26 Réseaux - Filius 65
Exercice 1.1 (Console 1) Observer et analyser les résultats obtenus dans la console.
>>> a = 3 >>> b = a /7
>>> type ( a ) >>> b
< class ' int ' > 0.42857142857142855
>>> alpha = float ( a ) >>> c = 14* b
>>> alpha >>> c
3.0 6.0
>>> type ( alpha ) >>> gamma = int ( c )
< class ' float ' > >>> gamma
6
>>> a , b = 2 , 5
>>> print ( " Somme = " , a + b )
Somme = 7
>>> print ( " Le p r o d u i t de " ,a , " par " ,b , " vaut : " , a * b )
Le p r o d u i t de 2 par 5 vaut : 10
>>> msg = " b o n j o u r "
>>> msg2 = ' tout le monde '
>>> msg + msg2
' b o n j o u r tout le monde '
Exercice 1.4 (Console 4) On a tapé les instructions suivantes dans la console. Compléter.
1 a, b = 5, 2 a b
2 a = a + 1 1
3 b = a + 1
4 b += 1 2
5 a, b = b, a 3
6 a = b
4
5
6
1) Sans taper les instructions, remplir le tableau ci-dessus avec les valeurs prises par a et b.
2) Par quoi aurait-on pu remplacer la ligne 4 pour avoir le même effet ?
3) Quelle est l’effet de l’instruction a, b = b, a ? Par quelles instructions aurait-on pu remplacer
cette instruction ?
Exercice 1.7 (Différence entre if et while) On considère les deux programmes suivants.
# Programme 1 # Programme 2
a = 7.5 a = 7.5
if a > 3 : while a > 3 :
a = a -1 a = a -1
Exercice 1.8 (Trier deux valeurs) Ecrire une fonction afficheValeur qui prenne en entrée
deux valeurs a et b et affiche la plus petite puis la plus grande.
Exercice 1.9 (Bonjour) Ecrire une fonction afficheBonjour qui prenne en entrée un entier
monChoix et affiche "Bonjour Monsieur" si la valeur entrée est 0, "Bonjour Madame" si la valeur
entrée est 1 et "Bonjour" si la valeur est autre.
Exercice 1.11 (Plein d’étoiles) Ecrire une fonction triangleEtoile qui prend comme paramètre
un nombre entier naturel n et qui affiche le résultat ci-contre quand on exécute TriangleEtoile(5) :
*
**
***
****
*****
Exercice 1.13 (Positionnement tortue) Taper le programme suivant et interpréter les lignes
de code en fonction de l’affichage.
def p o s I n i t () :
setup (900 ,600)
fd (100)
e x i t o n c l i c k ()
p o s I n i t ()
Exercice 2.1 (Multiples) Ecrire la fonction multipleOuPas qui affiche pour un nombre entier
positif nb, l’un des messages suivants :
• "Ce nombre est pair"
• "Ce nombre est impair, mais est multiple de 3"
• "Ce nombre n’est ni pair ni multiple de 3"
Exercice 2.2 (Des nombres) Observer ce que l’on obtient à la console si on exécute le code
suivant.
for d in range (10) :
for u in range (10) :
n = 10* d + u
print ( n )
Remplacer l’instruction print(n) par print(n, end='') puis par print(n, end='-'). Observer chaque
fois le résultat à la console.
Exercice 2.3 (Tables) Ecrire un programme qui affiche les tables de multiplications de 1 à 10.
Indication : utiliser une boucle imbriquée comme dans l’exercice précédent.
Exercice 2.4 (Seuil 1) On place un capital de 500 euros sur un compte rémunéré à 3% par
an. L’algorithme ci-dessous permet de calculer le nombre d’années au bout duquel le capital sera
doublé. Le programme traduisant cet algorithme comprend des erreurs. Corriger les erreurs.
Exercice 2.5 (Evolution d’un capital 1) Une somme de 2000 euros est déposée sur un compte
rémunéré au taux annuel de 2 %.
Exercice 2.6 (Evolution d’un capital 2) Une somme de 2000 euros est déposée sur un compte
rémunéré au taux annuel de 2 %.
1) Ecrire un script affichant le nombre d’années au bout duquel le compte atteindra 3000 euros.
2) Comment modifier ce script pour qu’il puisse fonctionner avec n’importe quelle somme initiale,
n’importe quel taux et n’importe quelle somme finale attendue ?
Exercice 2.7 (Factorielle) Ecrire une fonction qui, à partir d’un nombre de départ, calcule sa
factorielle.
Remarque : factorielle 8, notée 8 !, vaut 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8.
1) Tester
from random import r a n d i n t
print ( r a n d i n t (1 ,3) )
2) On lance un dé à 6 faces. Ecrire une fonction de5 qui renvoie True si la valeur du dé est 5, False
sinon.
Exercice 2.9 (Double 6) On lance deux dés équilibrés à six faces numérotées de 1 à 6. Ecrire
une fonction renvoyant le nombre de lancers nécessaires pour obtenir un double six.
Exercice 2.10 (Hasard 2) On choisit au hasard une carte dans un jeu classique de 32 cartes. Si
la carte est un as, on s’arrête ; sinon, on remet la carte dans le paquet et on recommence... Ecrire
un programme simulant cette expérience et renvoyant le nombre de tirages nécessaires pour obtenir
un as pour la première fois.
Exercice 2.11 (Supérieur à 10) Est-il possible de trouver un (ou des) entier(s) n tels que :
1 1 1 1
+ + + ... + > 10 ?
1 2 3 n
Ecrire un algorithme puis l’implémenter en Python.
Exercice 2.12 (Tracé) Taper le programme suivant et interpréter les lignes de code en fonction
de l’affichage.
Exercice 2.13 (Figures géométriques) On travaille dans une fenêtre graphique de taille
600×600.
Exercice 3.7 (Opérations 2) Effectuer les opérations suivantes en binaire et vérifier les résultats
en procédant aux conversions nécessaires.
1001 + 1011 1+1+1+1
Exercice 3.8 (Opérations 3) Effectuer les opérations suivantes en binaire et vérifier les résultats
en procédant aux conversions nécessaires.
1011 × 11 1100 × 101 100111 × 110
Exercice 3.11 (Loi mystère) Soient a et b deux booléens. On définit la loi Mystere telle que
a Mystere b = (a or b)and not(a and b)
1) Compléter la table de vérité de la loi Mystere :
b
0 1
a
0
1
Indication : il est utile de s’aider d’une table plus détaillée :
a b a or b a and b not (a and b) (a or b) and not(a and b)
0 0
0 1
1 0
1 1
>>> L =[1 , -2 ,3 ," rer " ] >>> list1 =2*[ 'a ']
>>> len ( L ) >>> list1 . append (3.0) # ajout d ' une valeur
4 >>> list1
>>> L [0] [ 'a ' , 'a ' , 3.0]
1 >>> range (0 ,10)
>>> L [2] range (0 , 10)
3 >>> list ( range (10) ) # d é f . par t r a n s t y p a g e
>>> L [ -1] [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
' rer ' >>> list ( range (2 ,8) )
>>> 'a ' in L [2 , 3 , 4 , 5 , 6 , 7]
False >>> list ( range (1 ,15 ,2) )
>>> type ([1 ,2 ,3]) [1 , 3 , 5 , 7 , 9 , 11 , 13]
< class ' list ' > >>> list ( range (5 , -1 , -1))
>>> [1 ,2 ,3]==[1 ,3 ,2] [5 , 4 , 3 , 2 , 1 , 0]
False >>> l I m p a i r s = [2* k +1 for k in range (5) ]
>>> [1 ,2 ,3]+[4 ,5] >>> l I m p a i r s
[1 , 2 , 3 , 4 , 5] [1 , 3 , 5 , 7 , 9]
Exercice 4.2 (Parcours) Exécuter les codes suivants et observer les résultats.
def a f f i c h e L i s t e E l ( L ) : def a f f i c h e L i s t e I n d ( L ) :
""" P a r c o u r s sur les é l é ments """ """ P a r c o u r s sur les i n d i c e s """
for elem in L : for k in range ( len ( L ) ) :
print ( elem ) print ( k , L [ k ])
>>> L = [ 'a ' ,1 ,2.5 ," b o n j o u r" ] >>> L = [ 'a ' ,1 ,2.5 ," b o n j o u r" ]
>>> a f f i c h e L i s t e E l ( L ) >>> a f f i c h e L i s t e I n d ( L )
Exercice 4.3 (De 1 à 6) Le but de cet exercice est de générer la liste L des entiers de 1 à 6 de 3
manières différentes :
1) par compréhension ;
2) grâce à une fonction creeListeEntiers1 qui prend comme paramètre un nombre entier naturel
n > 0. Cette fonction pourra utiliser l’opérateur + ;
3) grâce à une fonction creeListeEntiers2 qui prend comme paramètre un nombre entier naturel
n > 0. Cette fonction pourra utiliser la méthode append.
Exercice 4.4 (Les carrés maintenant) Mêmes consignes qu’à l’exercice précédent pour générer
la liste des carrés des nombres de 1 à 6.
Exercice 4.5 (Les jours de la semaine) Ecrire une fonction jourSemaine qui prenne en entrée
un entier i et retourne le i-ème jour de la semaine (si l’on fournit la valeur 2 en entrée à cette
fonction, elle devra donc retourner "Mardi").
Remarque : il est demandé de ne pas utiliser de structure conditionnelle.
Exercice 4.6 (Jeu de dés) On lance un dé. Si le numéro est 1, 5 ou 6, alors c’est gagné, sinon
c’est perdu. Ecrire un programme simulant ce jeu en utilisant une liste.
Exercice 5.1 (Listes par compréhension) Dans cet exercice, les listes sont des listes d’entiers.
1) Ecrire une fonction puissance(liste,k) qui élève chaque élément de liste à la puissance k. Par
exemple puissance([1,2,3,4,5],3) renvoie [1,8,27,64,125].
2) Ecrire une fonction addition(liste1,liste2) qui additionne terme à terme les éléments de deux
listes de même longueur. Par exemple addition([1,2,3],[5,6,7]) renvoie [6,8,10].
3) Ecrire une fonction nonZero(liste) qui renvoie la liste de tous les éléments non nuls. Par exemple
nonZero([7,0,2,3,0,4,9,0]) renvoie [7,2,3,4,9].
4) Ecrire une fonction pairs(liste) qui renvoie la liste de tous les éléments pairs. Par exemple
pairs([1,0,6,7,0,4,5,0]) renvoie [0,6,0,4,0].
Exercice 5.3 (Mélange) Ecrire une fonction mix mélangeant les éléments d’une liste. On pourra
la tester en lui demandant de mélanger la liste des 20 premiers entiers.
Exercice 6.1 (Console tuple) Observer les résultats obtenus dans la console.
Exercice 6.2 (Console set) Observer les résultats obtenus dans la console.
Exercice 6.4 (Croissant) Ecrire la fonction verifCroissant qui prend en paramètre un tuple et
renvoie True si le tuple est trié par ordre croisssant et False sinon.
Par exemple, sommeT((3,2,4)) doit renvoyer False.
Il est demandé d’utiliser un parcours par indices.
Exercice 6.6 (Tables de multiplication) Ecrire une fonction table(n) renvoyant un tuple
composé des 10 premiers multiples de n.
Exercice 6.7 (Liste triée sans doublon) On se donne une liste maListe d’entiers quelconques,
certains d’entre eux étant présents en plusieurs exemplaires. Ecrire, en une seule ligne, l’instruction
permettant de supprimer les doublons et de trier cette liste.
Exercice 6.8 (Plusieurs informations) Ecrire une fonction minMaxMoy qui reçoit une liste d’en-
tiers et qui renvoie le minimum, le maximum et la moyenne de cette liste.
Que renvoie minMaxMoy([10, 17, 14, 22, 12, 15]) ?
Exercice 6.9 (Distance) Ecrire une fonction distance qui, étant donnés deux points
(x1,y1) et (x2,y2) reçus en paramètres sous forme de tuples, calcule et renvoie la distance eucli-
dienne entre ces deux points.
Rappel : la distance entre deux points de coordonnées (x1 ; y1 ) et (x2 ; y2 ) est donnée par :
q
(x2 − x1 )2 + (y2 − y1 )2
Exercice 6.10 (Décodage) On se donne une liste qui encode une séquence t. Chaque élément
de cette liste est un tuple de deux éléments : le nombre de répétitions successives de l’élément x
dans t, et l’élément x lui-même. Les éléments successifs répétés forment la séquence t. Ecrire une
fonction decompresse, qui reçoit une telle liste en paramètre et renvoie la séquence t sous forme
d’une nouvelle liste.
Exemple :
>>> m a L i s t e = [(4 ,1) , (2 ,2) , (2 , ' test ') , (3 ,3) , (1 , ' b o n j o u r ') ]
>>> d e c o m p r e s s e( m a L i s t e)
[1 , 1 , 1 , 1 , 2 , 2 , ' test ' , ' test ' , 3 , 3 , 3 , ' b o n j o u r ']
Exercice 7.2 (Entiers relatifs) Soit le nombre binaire A codé sur 5 bits : A = (01110)2 .
1) Effectuer le complément à 2 de A.
2) Quelle est la valeur en base 10 de A ? Quelle est la valeur en base 10 du complément à deux de
A.
3) Effectuer la somme (en numération binaire) du nombre A et de son complément à deux.
4) Les nombres entiers relatifs sont maintenant codés sur 6 bits. Après avoir codé en binaire (−18)10
et (12)10 , effectuer leur somme et montrer que le résultat binaire vaut (−6)10 .
Exercice 7.4 (Sur 16 bits) Coder selon la convention du complément à 2 sur 16 bits le nombre
(−357)10 .
Exercice 8.3 (Huit petits canetons (G. Swinnen)) Dans un conte américain, huit petits
canetons s’appellent respectivement Jack, Kack, Lack, Mack, Nack, Oack, Pack et Qack.
Ecrire une fonction générant tous ces noms à partir des deux chaînes suivantes :
prefixes = "JKLMNOPQ" et suffixe = ’ack’
La fonction ne devrait être composée que de trois ou quatre lignes.
Exercice 8.4 (Table de multiplication) Ecrire une fonction Table(n) écrivant dans la console
10 lignes donnant la table du nombre n passé en argument :
1) avec un seul print mais sans utiliser la méthode format,
2) avec un seul print et la méthode format.
Exercice 8.5 (Ecriture en miroir) Ecrire une fonction miroir(maChaine) affichant la chaine
maChaine avec les caractères dans l’ordre inverse.
Par exemple, miroir("Coucou comment vas tu ?") renvoie "? ut sav tnemmoc uocuoC"
Exercice 8.9 (Niveau de sécurité d’un mot de passe) Définir une fonction
securite(chaine) permettant de vérifier le degré de sécurité d’un mot de passe selon les critères
suivants. Le mot de passe comporte :
La fonction affichera un message indiquant si le mot de passe est valide ou une raison de non
validité.
Exercice 8.10 (Suppression de caractères) Ecrire une fonction suppression(chaine) qui af-
fiche une chaîne de caractères passée en argument après en avoir supprimé les voyelles et les espaces.
Exercice 8.12 (Mot mystère) Définir une fonction motMystere(maChaine) qui affiche la chaîne
maChaine modifiée en remplaçant toutes les voyelles par le caractère _.
On veillera à gérer les caractères accentués.
Exercice 8.13 (Codage de César) Ecrire une fonction codage(maChaine, n) qui prend en ar-
gument une chaîne de caractères et décale ses lettres de n crans dans l’alphabet. Par exemple,
codage("bac",3) renvoie "edf". On utilisera pour cela les fonctions ord et chr qui permettent la
conversion des caractères en code ASCII. Ecrire également une fonction de décodage.
Exercice 9.1 (Ma première page HTML) Saisir dans un éditeur de texte (Notepad++ par
exemple) le texte suivant.
Choisir un répertoire qui sera utilisé dans tous les exercices et y sauvegarder le fichier en lui donnant
le nom index1.html, puis ouvrir le fichier avec un navigateur Internet.
On va ensuite un peu enrichir notre page Web.
Modifier le titre de l’onglet de navigation en NSI et ajouter :
• un titre Num é rique et Sciences informatiques entre des balises <h1 > .
• un premier bloc délimité par des balises < div > qui contient deux paragraphes délimités par les
balises <p > : dans le 1e paragraphe, on peut lire Voici quelques informations concernant
cette nouvelle sp é cialit é et dans le second : Image à ajouter .
• un 2e bloc qui contient le titre Chapitres de niveau <h3 > suivi d’une liste (non ordonnée) de 3
éléments : IHM Web , Repr é sentation des donn é es et Histoire de l ' informatique .
• un 3e bloc qui contient le titre Nombre d ' heures par semaine de niveau <h3 > suivi de la table
suivante dont il faut compléter la 3e ligne avec Terminale puis 2 puis 6 :
< table id = " t a b l e H e u r e s " >
<tr >
<th > Classe </ th > <th > Projet </ th > <th > Total </ th >
</ tr >
<tr >
<th > Premi è re </ th >
< td class = " m o n A n n e e" > 1 </ td >
< td class = " m o n A n n e e" > 4 </ td >
</ tr >
<tr >
...
</ tr >
</ table >
Exercice 9.2 (Ma première page avec CSS) Saisir dans l’éditeur de texte le texte suivant.
body { background - color : # FAF0E6 ; }
h1 { color : brown ; text - align : center ;}
ul { list - style - type : circle ; }
table , td , th , tr { border : 1 px solid RGB (165 , 42 , 42) ;}
th { font - style : italic ;}
td , th , tr { p a d d i n g : 8 px ;}
# t a b l e H e u r e s { background - color : # F5DEB3 ; }
. m o n A n n e e { color : red ;}
Observer le résultat dans le navigateur. Faire le lien entre chaque ligne du fichier css et les modi-
fications observées. Observer les différentes manières de définir les couleurs.
Exercice 9.3 (Une autre page) Il s’agit de créer une seconde page html (liée au même fichier
cinlinecss) avec comme titre pour l’onglet de navigation Num é ration . Cette page doit contenir :
• un titre Convertisseur entre des balises <h1 > .
• un premier bloc délimité par des balises < div > qui contient la phrase Voici un outil de
conversion des nombres d é cimaux , binaires et hexad é cimaux .
• un 2e bloc qui contient 3 lignes ; chaque ligne (délimité par des balises <p > ) est composé de 3
éléments :
– une étiquette délimitée par des balises < label >
– une zone de saisie : < input type = " text " >
– un bouton : < input type = " button " value = " Convertir " >
<p > < label for = " b10 " > D é cimal : </ label >
< input type = " text " class = " nb " id = " b10 " >
< input type = " button " value = " C o n v e r t i r " > </p >
<p > < label for = " b2 " > B i n a i r e : </ label >
...
< input type = " button " value = " C o n v e r t i r " > </p >
<p > < label for = " b16 " > Hexad é cimal : </ label >
< input type = " text " class = " nb " id = " b16 " >
< input type = " button " value = " C o n v e r t i r " > </p >
Après avoir complété la ligne relative à la base 2, sauvegarder le fichier en lui donnant le nom
convertisseur.html. Valider la page puis la visualiser dans le navigateur.
Ajouter dans le fichier css les lignes suivantes et observer l’effet obtenu.
label {
/* Pour ê tre s û rs que toutes les é t i q u e t t e s ont la m ê me taille et
sont c o r r e c t e m e n t align é es */
d i s p l a y: inline - block ;
width : 150 px ;
text - align : right ;
}
On peut valider ce fichier css à l’adresse http : // jigsaw . w3 . org / css - validator / .
Remarque : L’idée du convertisseur est adaptée de la page
http : // www . mathartung . xyz / isn / TP / TPhtml / tp4 . html .
Ouvrir index . html dans le navigateur. L’image prend beaucoup de place ! Pour remédier à cela,
ajouter la ligne suivante dans le fichier css :
Vérifier les deux pages html sur http : // validator . w3 . org / et le fichier css sur
http : // jigsaw . w3 . org / css - validator / .
La conversion en tant que telle des nombres d’une base à l’autre sera faite dans le chapitre
"JavaScript". To be continued ...
Consignes
• Dans votre dossier NSI, créer un dossier nommé Fichiers. Les fichiers textes et les scripts
Python des exercices suivants doivent être enregistrés dans ce dossier.
• Dans Notepad (ou Notepad++), enregistrer les fichiers textes avec l’encodage UTF-8.
2) Ecrire une fonction desMots permettant d’afficher le cinquième mot, puis les quatorzième, quin-
zième et seizième mots sur une même ligne et séparés par un espace, du fichier Test.txt. Utiliser
la méthode split sur la chaîne de caractères contenu.
3) La méthode read() peut également être utilisée avec un argument. Celui-ci indiquera combien
de caractères doivent être lus, à partir de la position déjà atteinte dans le fichier. Par exemple,
pour lire les six premiers caractères du fichier Test.txt, on tape :
f i c h i e r = open ( " Test . txt " ," r " , e n c o d i n g = " utf -8 " )
c o n t e n u = f i c h i e r. read (6)
print ( c o n t e n u)
f i c h i e r. close ()
S’il ne reste pas assez de caractères au fichier pour satisfaire la demande, la lecture s’arrête tout
simplement à la fin du fichier. De plus, si la fin du fichier est déjà atteinte, read() renvoie une
chaîne vide.
Ecrire une fonction desCaracteres permettant d’afficher les caractères quinze à vingt-six du
fichier Test.txt.
f i c h i e r= open ( " Test . txt " ," r " , e n c o d i n g = " utf -8 " )
print ( f i c h i e r. r e a d l i n e () )
print ( f i c h i e r. r e a d l i n e () )
f i c h i e r. close ()
tandis que pour afficher les deux lignes du fichier Test.txt dans une liste, on tape
f i c h i e r = open ( " Test . txt " ," r " , e n c o d i n g = " utf -8 " )
print ( f i c h i e r. r e a d l i n e s () )
f i c h i e r. close ()
1) Saisir les deux scripts précédents et exécutez-les. Observer les résultats obtenus.
2) Ecrire une fonction deuxiemeMot permettant d’afficher le deuxième mot de chacune des deux
lignes du fichier Test.txt.
2) Combien de lignes comporte ce fichier ? Ecrire une fonction nbLignes renvoyant le nombre de
lignes d’un fichier dont le nom est passé en paramètre. La tester avec le fichier
Proverbes.txt.
3) Ecrire une fonction proverbe attendant en entrée un entier n et renvoyant le proverbe situé à la
ligne numéro n. La fonction affichera un message d’erreur si le nombre n n’est pas valide.
4) Combien de mots comporte chacun des proverbes ? Ecrire une fonction motProverbe prenant
deux entiers n et m en paramètres et renvoyant le mot numéro m du proverbe à la ligne n. Si
les valeurs de n ou m ne remplissent pas les conditions voulues, on affichera un message d’erreur
dans la console.
Exercice 11.2 (Recherche min/max) Dans cet exercice, on se donne un tableau T de n nombres.
1) Ecrire un algorithme permettant de trouver la valeur minimale m de ce tableau ainsi que sa place
p dans ce tableau.
2) Combien de comparaisons effectue cet algorithme ? Quelle est sa complexité ?
3) Mêmes questions pour la valeur maximale M du tableau et sa place P dans ce tableau.
Exercice 11.4 (Tri par sélection à la main) En précisant les étapes, à l’aide d’un tri par
sélection, trier par ordre croissant le tableau suivant.
7 2 3 0 -2 2 -1 5
Exercice 11.5 (Tri par insertion à la main) En précisant les étapes, à l’aide d’un tri par
insertion, trier par ordre croissant le tableau suivant.
1 4 -2 0 4 5 2
Exercice 11.6 (Tri par sélection) On se donne un tableau T de n nombres. Une méthode pour
trier ce tableau par ordre croissant consiste à chercher le minimum, à le mettre en première position
et à recommencer ainsi sur le reste du tableau.
1) Ecrire un algorithme pour trier le tableau par ordre croissant par cette méthode. Quelle est sa
complexité ?
2) Comment modifier cet algorithme pour trier le tableau par ordre décroissant ? La complexité
est-elle modifiée ?
3) Justifier sa terminaison.
4) Décrire un invariant de boucle pour prouver la correction de cet algorithme.
Exercice 11.7 (Minimum) Ecrire une fonction Python chercheMin qui renvoie le minimum d’une
liste L (non vide) de nombres.
Exercice 11.9 (Implémentation tri par insertion) Proposer une implémentation en langage
python de cet algorithme.
Exercice 11.10 (Vitesse d’exécution) Le code python suivant permet de déterminer le temps
d’exécution des instructions entre les deux time.time().
import time , random
t = time . time ()
dt = time . time () -t
# a f f i c h e la duré e au centi è me pr è s
print ( " Le temps d ' ex é cution fut de {:.2 f } s " . format ( dt ) )
1) Proposer un code python qui permet de déterminer le temps d’exécution d’un tri par sélection
d’un tableau tab de grande taille (il est prudent de commencer avec 10000).
2) Faire de même pour un tri par insertion et comparer.
>>> dico = {}
>>> dico [ ' cup '] = ' tasse '
>>> dico [ ' cat '] = ' chat '
>>> dico [ ' cup ']
' tasse '
>>> dico
{ ' cat ': ' chat ' , ' cup ': ' tasse '}
>>> dico2 = { " melon " :4 , " poire " :9 , " citron " :2}
>>> dico2 [ " citron " ] = 5
>>> dico2
{ ' citron ': 5 , ' melon ': 4 , ' poire ': 9}
>>> len ( dico2 )
3
>>> del ( dico2 [ ' melon ' ])
>>> dico2
{ ' citron ': 5 , ' poire ': 9}
>>> ' poire ' in dico2
True
>>> dico3 = { x : x **2 for x in range (4) }
>>> dico3
{0: 0 , 1: 1 , 2: 4 , 3: 9}
>>> dico4 = { cle : val for cle , val
... in zip ([ 'a ' , 'b ' , 'c ' ] ,( ' alpha ' , ' beta ' , ' gamma ') ) }
>>> dico4
{ 'a ': ' alpha ' , 'b ': ' beta ' , 'c ': ' gamma '}
Exercice 12.3 (Nombre de jours du mois) On se donne les deux listes suivantes :
Jour = [31,28,31,30,31,30,31,31,30,31,30,31] et
Mois = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre',
'Octobre','Novembre','Décembre']
Définir un dictionnaire nbJMois associant à chaque mois le nombre de jours correspondant.
Exercice 12.5 (Magasin en ligne) On donne le tableau suivant indiquant le nom des produits
et le prix correspondant :
Exercice 12.6 (Analyse d’une chaîne) Ecrire une fonction analyse prenant en paramètre une
chaîne de caractère et générant un dictionnaire dont les clés sont chacun des caractères de la chaîne
et les valeurs le nombre de fois où ce caractère est présent dans la chaîne.
Exercice 13.2 (Porte OU EXCLUSIF) On rappelle que si A et B sont deux booléens, alors
le booléen S = A OU EXCLUSIF B vaut 1 si A et B ont des valeurs distinctes et 0 sinon.
1) Montrer, à l’aide de tables de vérité, la relation :
A OU EXCLUSIF B = (A ET NON(B)) OU (NON(A) ET B).
2) Représenter la porte correspondante à la fonction booléenne OU EXCLUSIF à l’aide des portes
élémentaires NON, OU et ET.
<p > < label for = " b10 " > D é cimal : </ label >
< input type = " text " class = " nb " id = " b10 " >
< input type = " button " value = " C o n v e r t i r" o n c l i c k= " c o n v N b D e c () ; " >
</p >
<p > < label for = " b2 " > B i n a i r e : </ label >
< input type = " text " class = " nb " id = " b2 " >
< input type = " button " value = " C o n v e r t i r" o n c l i c k= " c o n v N b B i n () ; " >
</p >
<p > < label for = " b16 " > Hexad é cimal : </ label >
< input type = " text " class = " nb " id = " b16 " >
< input type = " button " value = " C o n v e r t i r" o n c l i c k= " c o n v N b H e x a () ; " >
</p >
f u n c t i o n c o n v N b D e c ()
{
b i n a i r e = d o c u m e n t. g e t E l e m e n t B y I d ( " b2 " ) ;
h e x a d e c i m a l = d o c u m e n t. g e t E l e m e n t B y I d ( " b16 " ) ;
f u n c t i o n c o n v N b H e x a ()
{
d e c i m a l = d o c u m e n t. g e t E l e m e n t B y I d ( " b10 " ) ;
b i n a i r e = d o c u m e n t. g e t E l e m e n t B y I d ( " b2 " ) ;
Exercice 14.2 (Liste d’élèves) Reprendre la page index.html liée à la feuille de style
monStyle.css (du chapitre HTML).
Le but est d’ajouter un bouton qui lorsqu’on appuie dessus, rend visible un bloc délimité par des
balises <div> et qui contient la liste des élèves.
Pour ce faire, il faut :
• ajouter un bouton grâce à la syntaxe suivante :
<div > < button o n c l i c k= " a f f i c h e L i s t e () " > Voir la liste des é l è ves
</ button > </ div >
• ajouter un bloc délimité par des balises <div> dont l’identifiant est divListeEleves et qui
contient la liste ordonnée suivante :
1) Aurore Attention
2) Bob Bidule
3) Clara Catastrophe
4) David Dépêche
• dans le fichier css, déclarer ce bloc invisible en ajoutant la ligne suivante qu’il faut compléter :
... {display : none ;}
• écrire la fonction javascript qui rend le bloc visible et l’inclure dans l’entête du fichier index.
html (alternative à l’utilisation d’un fichier externe).
Pour terminer
• Tout en bas de la page, ajouter un lien interne Retour en haut de la page qui permet de
revenir au titre délimité par les balises <h1>.
• Dans le css, ajouter une ligne pour que le bouton ait une marge extérieure inférieure de 10px
et pour que son texte soit de taille 14.
Exercice 15.1 (Recherche sol) On souhaite déterminer si le mot « sol » est présent dans la liste
de mots suivante :
bal, zéro, trou, pile, tas, file, auto, frite, bol, cil, gel, vent, vrai, air.
Appliquer l’algorithme de dichotomie en complétant le tableau d’avancement fourni qui reprend les
notations du cours.Conclure.
Exercice 15.2 (Recherche 1020) Soit T un tableau avec les nombres de 1 à 1024 rangés par
ordre croissant.
1) Si on parcourt T de manière séquentielle, combien faut-il d’étapes pour déterminer si 1020 est
un élément de T ?
2) En déduire le nombre de comparaisons nécessaires.
3) Reprendre ces questions en utilisant l’algorithme de dichotomie et en complétant le tableau
d’avancement ci-dessous qui reprend les notations du cours.
On notera que, dans ce cas, T [m] = m.
TA = max − min + 1 : c’est la taille du tableau dans lequel on cherche val.
Exercice 15.3 (Les bonbons) Votre voisin vous propose de jouer au jeu « C bon les bonbons ? »
Il pense à un nombre entier compris entre 10 et 99. À vous de deviner ce nombre afin de gagner les
bonbons !
Chaque fois que vous proposez une valeur, votre voisin vous indique
• si votre proposition correspond au nombre à déterminer ;
• sinon, si votre proposition est strictement inférieure ou strictement supérieure au bon nombre.
Quelle est la meilleure stratégie à adopter pour gagner les bonbons ?
Déterminer le nombre maximal de tentatives intelligentes pour répondre au problème.
Exercice 15.5 (Commentaires) Pour chacun des codes Python ci-dessous, compléter les com-
mentaires.
• Les paramètres a et b sont des nombres entiers positifs.
• Le paramètre T est un tableau de nombres entiers triés par ordre croissant.
Exercice 15.6 (Comparaison) Ecrire le code Python d’une fonction booléenne qui indique si la
valeur médiane d’un tableau de n nombres entiers est strictement supérieure ou non à un nombre
donné.
La fonction se nomme medianeStrSup et prend comme paramètres un tableau trié T et un nombre
entier valeur.
Exercice 16.1 (Nombres réels 1) Donner la valeur décimale du nombre −1, 0100112 × 23 .
Exercice 16.2 (Nombres réels 2) La norme IEEE 754 est la norme la plus employée pour la
représentation des nombres à virgule flottante dans le domaine informatique. La première version
de cette norme date de 1985.
Le format dit "simple précision" et le format dit "double précision". Le format "simple précision"
utilise 32 bits pour écrire un nombre flottant alors que le format "double précision" utilise 64 bits.
La norme IEEE 754 utilise :
• 1 bit de signe (1 si le nombre est négatif et 0 si le nombre est positif)
• des bits consacrés à l’exposant (8 bits pour la simple précision et 11 bits pour la double
précision) - l’exposant est systématiquement décalé afin d’obtenir uniquement des valeurs
positives : il faut ajouter à l’exposant 127 en simple précision et 1023 en double précision.
• des bits consacrés à la mantisse (23 bits pour la simple précision et 52 bits pour la double
précision)
Coder le nombre 6,875 avec la norme IEEE 754 en simple précision.
Exercice 16.6 (Codage des caractères) En code ASCII, (41)16 correspond à 'A' et (33)16
correspond à '3'. Coder le message suivant :
B A C 2 1 3
41 33
Exercice 16.7 (Conversions 1) A l’aide d’une table ASCII, convertir en texte les informations
suivantes codées en ASCII (hexadécimal) : 4E 53 49 20 65 73 74 20 75 6E 65 20 22 65 78 63 65
6C 6C 65 6E 74 65 22 20 46 6F 72 6D 61 74 69 6F 6E 2E
Exercice 16.8 (Conversions 2) Coder en Unicode UTF-8, sous forme hexadécimale, le texte :
Année 2019.
Exercice 16.9 (Conversions 3) Trouver le texte représenté en ASCII binaire par la suite de
bits : 01000011001001110110010101110011011101000010000001100110011000010110001101101001
0110110001100101.
Exercice 16.12 (Cryptage) Lorsque l’on envoie un message sur Internet et qu’on ne veut pas
que ce message puisse être intercepté et compris par une personne autre que le destinataire, on doit
utiliser une méthode (ou un algorithme) de cryptage.
Le principe général est d’altérer le message selon une méthode connue de l’émetteur et du récep-
teur et d’envoyer sur le réseau le message ainsi modifié. Bien entendu, seul le récepteur doit être
en mesure de décrypter le message reçu pour retrouver le message initial, c’est-à-dire avant sa
transformation par l’opération de cryptage.
Certains algorithmes de cryptage reposent sur l’utilisation d’une clé qui est une séquence de bits
quelconque connue uniquement de l’émetteur et du destinataire du message. Le message crypté
envoyé sur le réseau est obtenu en transformant le message initial à l’aide de cette clé (selon une
méthode connue de l’émetteur et du récepteur) de même que le décryptage par le destinataire est
obtenu en transformant le message crypté à l’aide de cette clé.
Un algorithme de cryptage très simple consiste à crypter le message en utilisant une clé c de 8 bits
et en transformant chaque octet m du message par l’octet m XOR c. Le destinataire effectue la même
opération : il transforme chaque octet m' qu’il a reçu par l’octet m' XOR c pour retrouver l’octet
du message initial. Cette méthode peut naturellement être généralisée pour une longueur de clé
quelconque, et pas uniquement de 8 bits.
Dans cet exercice, on s’intéresse au cryptage d’un texte codé en ASCII (donc avec des caractères
codés sur 7 bits) à l’aide d’une clé de 7 bits.
1) On veut envoyer le mot yop. Donner, à l’aide de la table ASCII, la séquence binaire correspondant
à ce mot.
2) On utilise la clé 55. Quel sera alors le message envoyé après cryptage (en binaire et en texte) ?
3) Vérifier qu’après décryptage, le destinataire retrouve bien le message initial.
4) Prouver à l’aide d’une table de vérité que le destinataire peut toujours retrouver le message
initial à partir de la clé et du message crypté.
5) En pratique, une longueur de clé de 7 bits est insuffisante. On utilise des clés d’au moins 32 ou
64 bits. Pourquoi ?
6) Programmer en python les fonctions de cryptage et décryptage.
En Python, l’opérateur XOR est ^. Tester dans la console 1^0, qui renvoie 1 et 55^121, qui renvoie
78.
nom,prenom,nbVoix
Dupond,Emile,514
Dupont,Chloe,632
Dupons,Camille,421
Flavier,Jean,123
Remarque : Il serait possible de lire notre fichier sans utiliser le module csv. Si nous utilisons le
module csv, c’est qu’il permet de faciliter l’écriture de nos programmes.
import csv
with open ( ' E l e c t i o n. csv ') as m o n F i c h i e r :
table2 = list ( csv . D i c t R e a d e r ( m o n F i c h i e r) )
A la console, on obtient :
>>> table2
[{ ' nbVoix ': 514 , ' nom ': ' Dupond ' , ' prenom ': ' Emile '} ,
{ ' nbVoix ': 632 , ' nom ': ' Dupont ' , ' prenom ': ' Chloe '} ,
{ ' nbVoix ': 421 , ' nom ': ' Dupons ' , ' prenom ': ' C a m i l l e '} ,
{ ' nbVoix ': 123 , ' nom ': ' F l a v i e r ' , ' prenom ': ' Jean ' }]
Quel est l’intérêt d’utiliser une liste de dictionnaires plutôt qu’une liste de listes ?
1) Qu’obtient-on si on tape :
valEstPresente1(table1, 'Camille')
valEstPresente1(table1, 'Laura')
2) Ecrire une fonction valEstPresente2 dans le cas où le fichier a été lu sous forme de liste de
dictionnaires.
Exercice 17.6 (Recherche doublons) Ecrire une fonction rechercheDoublons qui retourne un
tuple constitué d’une part, de la liste des lignes différentes (sans doublon) et d’autre part, de la
liste des lignes qui sont répétées.
On testera la fonction avec table1 (sans doublon) et avec table3 (avec doublon), obtenue en répétant
une des lignes. Par exemple, table3 sera obtenue à partir du fichier ElectionD.csv contenant les
lignes suivantes :
nom,prenom,nbVoix
Dupond,Emile,514
Dupont,Chloe,632
Dupons,Camille,421
Dupont,Chloe,632
Flavier,Jean,123
More examples
# E x a m p l e 2 - Sort the list d e s c e n d i n g
>>> cars = [ ' Ford ' , ' BMW ' , ' Volvo ']
>>> cars . sort ( r e v e r s e= True )
>>> cars
[ ' Volvo ' , ' Ford ' , ' BMW ']
>>> cars = [ ' Ford ' , ' BMW ' , ' Volvo ']
>>> cars . sort ( key = myFunc )
>>> cars
[ ' BMW ' , ' Ford ' , ' Volvo ']
>>> cars = [{ ' car ': ' Ford ' , ' year ': 2005} ,\
... { ' car ': ' BMW ' , ' year ': 2019} ,\
... { ' car ': ' Volvo ' , ' year ': 2011}]
>>> cars . sort ( key = myFunc )
>>> cars
[{ ' car ': ' Ford ' , ' year ': 2005} ,
{ ' car ': ' Volvo ' , ' year ': 2011} ,
{ ' car ': ' BMW ' , ' year ': 2019}]
>>> cars = [ ' Ford ' , ' BMW ' , ' Volvo ']
>>> cars . sort ( r e v e r s e= True , key = myFunc )
>>> cars
[ ' Volvo ' , ' Ford ' , ' BMW ']
1) (Cas simple) Ecrire une fonction qui trie le tableau par ordre alphabétique décroissant par
rapport à la 1e colonne (nom) lorsque les données sont stockées sous forme de liste de listes.
2) (Cas général) Ecrire une fonction qui trie le tableau par nombre de voix croissant. Plus préci-
sément, on demande une fonction lorsque les données sont stockées sous forme de liste de listes
et une fonction pour une liste de dictionnaires.
nom,prenom,nbVoix
Prince,Georges,421
Casir,Abdel,854
Dupons,Camille,421
On veut créer une table avec les lignes issues de Election.csv et de Electionbis.csv sans doublon.
Exercice 17.9 (Fusion et bibliothèque pandas) Soit le fichier Age.csv dont le contenu est
donné ci-dessous.
nom,prenom,age
Dupond,Emile,29
Filant,Marc,34
Dupont,Chloe,54
Dupons,Camille,38
Pour les lignes de Election.csv et Age.csv qui ont le nom et le prénom en commun, on veut créer
un tableau qui contient les informations des deux fichiers (en n’indiquant qu’une seule fois le nom
et le prénom par ligne).
Pour faire cette fusion, le plus simple est d’utiliser la bibliothèque pandas qui n’est pas par défaut
dans Edupython.
La bibliothèque pandas est très utilisée pour tout ce qui touche au traitement des données.
Voici la procédure d’installation (sous Windows) : dans EduPython, sélectionner
menu Outils - Outils - installation d'un nouveau module.
Une fenêtre d’invite de commande (cmd) s’ouvre et il faut choisir le mode d’installation. Choisir
conda et indiquer le nom du module à importer (ici, pandas).
import pandas
table1 = pandas . r e a d _ c s v( " e l e c t i o n. csv " )
>>> table1
nom prenom nbVoix
0 Dupond Emile 514
1 Dupont Chloe 632
2 Dupons Camille 421
3 Flavier Jean 123
On remarque qu’une colonne a été ajoutée par rapport aux données : les nombres présents dans
cette colonne sont appelés des index. Chaque ligne du tableau a un index (première ligne : index
0, deuxième ligne index 1...).
Il est possible de récupérer certaines données du tableau, par exemple, certaines lignes, certaines
colonnes ou bien encore des valeurs uniques. Pour cela, il suffit d’utiliser l’instruction
loc[indexLigne,nomColonne] avec les index des lignes et les noms des colonnes.
Pour récupérer
• les données d’une colonne pour toutes les lignes, on remplace indexLigne par :
• les données de toutes les colonnes d’une ligne particulière, en remplaçant nomColonne par :
Il est possible de trier le tableau en fonction des valeurs d’un descripteur. Il suffit d’utiliser l’ins-
truction sort_values. Il est aussi possible de fusionner des tables ayant au moins une colonne en
commun grâce à l’instruction merge.
>>> s o u s T a b l e= table1 . loc [[0 ,1] ,[ ' nom ' , ' nbVoix ' ]]
>>> s o u s T a b l e
nom nbVoix
0 Dupond 514
1 Dupont 632
>>> r e s u l t a t C o n d = table1 . loc [ table1 [ " nbVoix " ] >300 ,[ " nom " ," prenom " ]]
>>> r e s u l t a t C o n d
nom prenom
0 Dupond Emile
1 Dupont Chloe
2 Dupons C a m i l l e
On rappelle que répertoire est synonyme de dossier (folder en anglais). Le répertoire courant
est celui dans lequel on se trouve.
Pour réutiliser une commande précédente, on peut utiliser la flèche vers le haut.
Exercice 18.1 (Commandes de base) Dans cet exercice, nous allons nous intéresser aux com-
mandes permettant de manipuler l’arborescence de fichiers du système.
• ls (list) permet de lister le contenu d’un répertoire (par défaut, le répertoire courant). On peut
lui passer en argument le chemin du répertoire à observer. Il existe de nombreuses options pour
modifier la présentation du résultat, parmi lesquelles :
⋄ -l qui affiche des informations plus détaillées (droits d’accès, taille, propriétaire),
⋄ -R qui parcourt les répertoires récursivement.
• cd (change directory) change le répertoire courant. Si la commande est lancée sans argument,
c’est le répertoire personnel de l’utilisateur ( home ) qui devient le répertoire courant. L’argument
est le nouveau répertoire dans lequel on veut se placer, qui peut être donné de manière absolue
ou relative. La notation .. désigne le répertoire parent d’un répertoire (on peut utiliser cette
notation de manière répétée, ainsi ../.. désigne le parent du parent).
• pwd (print working directory) affiche le répertoire courant.
• mkdir (make directory) sert à créer un répertoire dont le nom est donné en argument.
• touch permet de créer un fichier vide (le nom du fichier à créer est passé en argument).
• mv (move) permet de déplacer un fichier ou répertoire. Cette commande prend deux arguments :
le fichier source et sa destination. C’est également cette commande qui permet de renommer un
fichier (ou un répertoire) en le "déplaçant" vers un autre nom (par exemple
mv titi . txt toto . txt ).
En outre, mv * monDossier permet de déplacer tous les fichiers du répertoire courant vers le
répertoire monDossier .
• cp (copy) copie un fichier ou un répertoire d’un emplacement vers un autre. La syntaxe est
similaire à celle de la commande mv (source puis cible). L’option -R permet d’effectuer une copie
récursive dans le cas où la source est un répertoire.
• rm (remove) supprime le ou les fichiers ou répertoires passés en argument. Pour supprimer un
répertoire, il faut ajouter l’option -r qui indique que la suppression doit-être effectuée récursi-
vement.
• file donne des informations sur le contenu d’un fichier (format des données, encodage...).
Exercice 18.4 (Modification des droits) chmod permet de changer les permissions de lecture,
d’écriture et d’exécution d’un fichier ou d’un répertoire pour le propriétaire, son groupe et les
autres. Il existe 3 syntaxes différentes pour définir des droits, dans les 3 cas le résultat est le même.
On ne peut modifier les droits sur les fichiers et répertoires que si on est le propriétaire du fichier
ou si on dispose des droits root . On va étudier le fonctionnement en mode octal, chmod est suivi
de trois chiffres, chacun d’eux permettent de données des droits sur le propriétaire, le groupe et les
autres. Par défaut, le créateur d’un fichier ou d’un dossier devient automatiquement le propriétaire.
1) Utiliser la commande touch suivi d’un nom de fichier ( nsi500 par exemple) pour créer un
fichier vide.
2) Utiliser la commande ls avec l’option -l pour visualiser les droits du fichier nsi500 .
3) Utiliser la commande chmod 000 nsi500 pour modifier les droits du fichier puis ls -l .
4) Essayer d’effacer le fichier nsi500 .
5) Utiliser la commande chmod 541 nsi500 pour modifier les droits du fichier puis ls -l .
#!/bin/bash
nb="$1"
echo "Nombre=$nb"
grep "^a" fruits.txt > $nb.txt
Remarques
• Les caractères # ! sont un marqueur spécial qui désigne un type de fichier, ici un script shell
exécutable. Ils sont suivis du chemin vers le programme qui interprète les commandes de ce
script. Ensuite, cet interpréteur de commande exécute les commandes du script.
• Il ne faut pas mettre d’espace dans l’instruction nb="$1".
2) Rendre le fichier exécutable.
3) Exécuter le script en tapant : ./ fifi . sh 5
Qu’observe-t-on ?
Exercice 19.1 (Somme) En utilisant la fonction range pour générer les nombres 50, 52, 54, ...,
écrire un programme qui calcule la somme :
50 × 1 + 52 × 2 + 54 × 3 + 56 × 4 + 58 × 5 + ... + 100 × 26
Exercice 19.2 (2 chaînes et 1 liste) On donne les chaînes de caractères : mot1 = "efg" et
mot2= "a5". Ecrire une fonction permettant de créer la liste
['ea', 'e5', 'fa', 'f5', 'ga', 'g5'] à partir des chaînes mot1 et mot2.
Indication : on pourra utiliser deux boucles imbriquées.
Exercice 19.3 (Paires) Ecrire une fonction qui prend deux listes li1 et li2 en paramètres et
retourne la liste de toutes les paires (a,b) telles que a est un élément de li1 et b est un élément de
li2.
Par exemple, creerPaires(['a','b','c'], [1,2]) renverra
[('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)].
Exercice 19.4 (Compter les lettres) Ecrire une fonction compteLettres qui admet comme
argument une chaîne de caractères et qui renvoie un dictionnaire contenant le nombre d’occurrences
de chacun des caractères utilisés dans la chaîne.
Exercice 19.5 (Les lunes) Définir le dictionnaire lunes représenté ci-dessous. Ce dictionnaire
stocke le nombre de satellites de chaque planète.
clé ’Mercure’ ’Venus’ ’Terre’ ’Mars’ ’Jupiter’ ’Saturne’ ’Uranus’ ’Neptune’
valeur 0 0 1 2 63 61 27 11
Ecrire un programme permettant de :
• modifier le dictionnaire précédent pour corriger une erreur qui s’est glissée dans l’énoncé. La
planète Neptune comporte en fait 13 satellites.
• afficher le nombre de lunes de la Terre,
• afficher la liste des planètes,
• afficher le nombre total de lunes.
Exercice 19.6 (Echange clés/valeurs) Ecrire une fonction qui échange les clés et les valeurs
d’un dictionnaire (ce qui permettra par exemple de transformer un dictionnaire anglais/français en
un dictionnaire français/anglais). On suppose que le dictionnaire ne contient pas plusieurs valeurs
identiques.
Exercice 19.7 (Max clés) Ecrire une fonction maxDic qui prend en paramètre un dictionnaire
(dont les valeurs sont des nombres) et renvoie la clé correspondant à la plus grande valeur.
Par exemple, maxDic({'a': 3, 'b': 10, 'c': 0, 'd': 5}) renverra 'b'.
Exercice 19.8 (Tri clés) Ecrire une fonction triCles qui prend un dictionnaire (dont les valeurs
sont des nombres) et renvoie la liste des clés du dictionnaire par ordre de valeurs décroissantes dans
le dictionnaire.
Par exemple, triCles({'a': 3, 'b': 5, 'c': 0, 'd': 10}) renverra ['d','b','a','c'].
Exercice 19.9 (Liste mystère) Que contient la variable L après l’instruction suivante ?
L=[n**2 if n%2==0 else n**3 for n in range(11)]
Exercice 19.11 (Trouver un nombre) Ecrire un programme qui permet de trouver un nombre
mystère qui répond à toutes les conditions suivantes :
• Il est composé de 3 chiffres.
• Il est strictement inférieur à 300.
• Il est pair.
• Deux de ses chiffres sont identiques.
• La somme de ses chiffres est égale à 7.
Exercice 20.1 (Matériel) Attribuer les définitions suivantes à l’élément auquel elles corres-
pondent.
Exercice 20.4 (Bit alterné) On imagine deux systèmes, A et B, utilisant le protocole du bit
alterné. Le chronogramme ci-dessous représente le transport de trois unités de données entre les
deux.
Quelles seront la valeur du compteur associé à la troisième unité de données, et les valeurs des deux
variables chez l’émetteur et le récepteur ? 0, 1 ou 2 ?
Exercice 20.7 (Invite de commandes) Pour accéder à l’invite de commandes sous Windows :
faire un clic droit sur le menu D é marrer , choisir Ex é cuter puis taper cmd .
Remarque : à partir de Windows 10, l’invite de commande par défaut ( cmd . exe ) a été remplacée
par l’utilitaire Windows PowerShell.
Taper, dans l’invite de commande, la commande ipconfig / all .
1) Relever l’adresse MAC de la carte réseau Ethernet.
2) Relever l’adresse IP, le masque de sous-réseau de la carte réseau. Indiquer si le mode d’adressage
est en mode automatique ou manuel. Donner la durée de validité des paramètres IP. Donner
également l’adresse du serveur DHCP.
3) Déterminer l’adresse IP du réseau du lycée.
4) Relever l’adresse IP de la passerelle par défaut (default gateway) qui est le routeur par lequel
l’ordinateur est connecté à Internet.
5) Relever l’adresse IP du serveur DNS.
Pour tester la communication entre deux machines, il faut utiliser la commande ping . Par exemple,
la commande ping 172.1.1.99 permet de vérifier que votre PC communique avec le poste 172.1.1.99.
1) Tester la communication avec un autre PC de la salle.
2) Tester la communication avec le site www . google . fr . Relever l’adresse IP du serveur qui héberge
le site.
La commande tracert sous Windows (ou traceroute sous Linux), suivie d’une adresse IP, affiche
les routeurs chemin parcouru par les datagrammes de notre ordinateur jusqu’à celui dont l’adresse
IP est indiquée. Il est ainsi possible de dresser une cartographie des routeurs présents entre une
machine source et une machine destinataire. Elle est notamment utilisée pour détecter un éventuel
point défaillant dans le réseau.
1) Taper la commande tracert www . google . com . Indiquer les adresses IP de départ et d’arrivée.
Donner le nombre de routeurs traversés.
2) Aller sur https : // gsuite . tools / traceroute . Sur cette page, on peut lire : "To track and map
the full path of an IP packet - This tool is based on Linux open-source utilities traceroute."
Indiquer dans quel pays se situe le serveur hébergeant le site. Tester par exemple avec
www . google . fr , www . marmiton . fr et www . lyc - descartes - montigny . ac - versailles . fr .
nslookup (Name System Look Up) est un outil permettant d’interroger un serveur DNS.
1) Taper la commande nslookup . Donner l’adresse IP du serveur DNS du réseau du lycée.
2) Entrer ensuite www . google . fr . Donner l’adresse du serveur qui héberge le site web.
3) Même chose pour le site www . wikipedia . org . Taper quit pour sortir.
Clients A B C D E F
Jour de début de location 4 11 2 9 6 1
Jour de fin de location 7 15 5 12 10 14
1) On peut représenter les demandes de location de chaque client par un segment dont les extrémités
ont pour abscisses le jour de début et de fin de location. Ainsi, le client A serait représenté par :
Exercice 21.3 (Problème du sac à dos) Ali Baba est enfin parvenu à entrer dans la caverne
des 40 voleurs, mais il ne pourra pas emporter toutes leurs richesses : il n’est capable de porter que
M kilogrammes dans son sac à dos.
Devant lui se trouvent des trésors en quantité illimitée dont les valeurs (prix et masse unitaires)
sont données dans le tableau ci-dessous :
Objets A B C D
Masse en kg 15 10 6 2
Prix en euros 240 200 114 20
1) Ali est très pressé et décide de remplir son sac avec les objets dont le prix est le plus élevé...
jusqu’à ce qu’il ne puisse plus mettre d’objets dans son sac. Donner la composition du sac d’Ali
lorsqu’il applique sa méthode sur un sac de capacité M = 11 kg.
2) Etudier les compositions d’un sac de capacité M = 27 kg : la méthode d’Ali pour remplir son
sac est-elle celle qui lui permet d’emporter le plus d’argent ? Justifier.
3) Proposer une méthode gloutonne plus efficace que celle d’Ali. Appliquer votre méthode à un sac
de capacité M = 13 kg. Est-ce la solution optimale ? Justifier.
4) Les objets volés par Ali sont en fait des sacs remplis de poudres précieuses : Ali n’est pas obligé
de prendre la totalité de l’objet mais peut n’en prendre qu’une partie. La méthode gloutonne
proposée à la question 3 donne-t-elle alors la solution optimale ?
Exercice 22.3 (Des dictionnaires) L’instruction suivante crée un tableau réunissant quelques
informations sur les clients d’un magasin. Pour plus de lisibilité, chaque ligne est un dictionnaire.
clients = [
{ ' nom ': ' G i l b e r t ' , ' prenom ': ' Jean ' , ' age ': ' 54 ' , ' genre ': 'm '} ,
{ ' nom ': ' Dupont ' , ' prenom ': ' Pierre ' , ' age ': ' 34 ' , ' genre ': 'm '} ,
{ ' nom ': ' Sylla ' , ' prenom ': ' Anne ' , ' age ': ' 48 ' , ' genre ': 'f '}
]
1) Ecrire une fonction qui affiche tous les clients dont l’âge est inférieur à 50. Qu’obtient-on ?
2) Ecrire une fonction qui affiche tous les clients de genre 'm'. Qu’obtient-on ?
def t a b l e a u M y s t e r i e u x () :
monTab = [[0] * 9 for i in range (9) ]
for l in range (1 ,10):
for c in range (1 ,10):
monTab [l -1][ c -1] = l + c
return monTab
tab = t a b l e a u M y s t e r i e u x ()
print ( tab )
Exercice 22.5 (Tableau mystérieux - la suite) A partir du tableau tab obtenu dans l’exercice
précédent, qu’obtient-on après l’exécution du script suivant ?
Exercice 22.6 (Base de données) L’entreprise KiStokTout possède une base de données dans
laquelle elle enregistre les informations personnelles de ses clients :
nom, prénom, adresse, âge, taille (en cm), poids (en kg).
Elle initialise cette base de données par la ligne suivante :
r e g i s t r e = [1 ,{ ' nom ': ' HILUM ' , ' pr é nom ': ' Mohan ' , ' a d r e s s e ': ' 224 avenue \
des fleurs 75001 Paris ' , ' age ' :67 , ' taille ' :178 , " poids " :81}]
Exercice 22.7 (QCM) Pour chaque question, une seule réponse est correcte parmi les quatre
proposées.
1) Pour construire une table de 7 lignes et 7 valeurs remplie de 1, on utilise la syntaxe :
a) [1] * 7 for i in range(7) c) [[1] * 7 for i in range(7)]
b) for i in range(7)[1] * 7 d) [for i in range(7)[1] * 7]
a = ((1 , 2 , 3) , (4 , 5 , 6) , (7 , 8 , 9) ) [1]
b = a [2]
Il existe plusieurs langages assembleurs. Pour les exercices, on va travailler avec un simulateur
nommé AQA, développé par Peter L Higginson, et utiliser sa syntaxe. Les notations seront donc
un peu différentes de celles du cours et nous aurons accès à plusieurs registres (R0 à R12).
Sur la page http://peterhigginson.co.uk/AQA/info.html, on peut lire :
The AQA Instruction Set :
• LDR Rd, <memory ref> : Load the value stored in the memory location specified by
<memory ref> into register d.
• STR Rd, <memory ref> : Store the value that is in register d into the memory location spe-
cified by <memory ref>.
• ADD Rd, Rn, <operand2> : Add the value specified in <operand2> to the value in
register n and store the result in register d.
• SUB Rd, Rn, <operand2> : Subtract the value specified by <operand2> from the value in register
n and store the result in register d.
• MOV Rd, <operand2> : Copy the value specified by <operand2> into register d.
• CMP Rn, <operand2> : Compare the value stored in register n with the value specified by
<operand2>.
• B <label> : Always branch to the instruction at position <label> in the program.
• B<condition> <label> : Conditionally branch to the instruction at position <label> in the
program if the last comparison met the criteria specified by the <condition>.
Possible values for <condition> and their meaning are : EQ : Equal to, NE : Not equal to, GT :
Greater than, LT : Less than.
• HALT : Stop the execution of the program.
<operand2> can be #nnn or Rm to use either a constant or the contents of register Rm.
Exemples
• LDR R1,78 : Place la valeur stockée à l’adresse mémoire 78 dans le registre R1 (par souci de
simplification, nous continuons à utiliser des adresses mémoire codées en base 10).
• STR R3,125 : Place la valeur stockée dans le registre R3 en mémoire vive à l’adresse 125.
• ADD R1,R0,#128 : Additionne le nombre 128 (une valeur immédiate est identifiée grâce au
symbole #) et la valeur stockée dans le registre R0, place le résultat dans le registre R1.
• SUB R0,R1,R2 : Soustrait la valeur stockée dans le registre R2 de la valeur stockée dans le
registre R1, place le résultat dans le registre R0.
• MOV R0, R3 : Place la valeur stockée dans le registre R3 dans le registre R0.
• B 45 : Nous avons une structure de rupture de séquence, la prochaine instruction à exécuter
se situe en mémoire vive à l’adresse 45.
CMP R0 , # 23
• BEQ 78
Si la valeur stockée dans le registre R0 est égale à 23, la prochaine instruction à exécuter se
situe à l’adresse mémoire 78.
4) STR R0,15
5) B 100
1) Additionner la valeur stockée dans le registre R0 et la valeur stockée dans le registre R1, le résultat
est stocké dans le registre R5.
2) Placer la valeur stockée à l’adresse mémoire 878 dans le registre R0.
3) Si la valeur stockée dans le registre R0 est égale à 42 alors la prochaine instruction à exécuter se
situe à l’adresse mémoire 85.
Exercice 23.3 (Comparer) Les instructions assembleur B, BEQ, BNE, BGT et BLT n’utilisent pas
directement l’adresse mémoire de la prochaine instruction à exécuter, mais des "labels". Un label
correspond à une adresse en mémoire vive. L’utilisation d’un label évite donc d’avoir à manipuler
des adresses mémoires en binaire ou en hexadécimale.
Comparer le programme écrit en Python et le même programme écrit en assembleur :
x = 4 MOV R0 , # 4
y = 8 STR R0 ,30
if x == 10: MOV R0 , # 8
y = 9 STR R0 ,75
else : LDR R0 ,30
x = x +1 CMP R0 , # 10
z = 6 BNE else
MOV R0 , # 9
STR R0 ,75
B endif
else :
LDR R0 ,30
ADD R0 , R0 , # 1
STR R0 ,30
endif :
MOV R0 , # 6
STR R0 ,23
HALT
Exercice 23.4 (Premier essai) Le simulateur AQA, composé d’une RAM et d’un CPU, est basé
sur une architecture de von Neumann.
Adresse : http://www.peterhigginson.co.uk/AQA/.
• A droite, on trouve la mémoire vive ("main memory"). Chaque cellule de la mémoire possède
une adresse (de 000 à 199), ces adresses sont codées en base 10.
• Au centre, on trouve le CPU avec, du haut vers le bas :
– le bloc "registre" ("Registers") : nous avons 13 registres (R0 à R12) + 1 registre (PC)
qui contient l’adresse mémoire de l’instruction en cours d’exécution ;
– le bloc "unité de commande" ("Control Unit") qui contient l’instruction machine en cours
d’exécution (au format hexadécimal) ;
– le bloc "unité arithmétique et logique" ("Arithmetic and Logic Unit").
Nous ne nous intéresserons pas aux autres composants de la partie CPU.
• A gauche, on trouve la zone d’édition ("Assembly Language"), c’est dans cette zone que nous
allons saisir nos programmes en assembleur.
Dans la partie "éditeur" ("Assembly Language"), saisir les lignes de codes suivantes.
MOV R0 , # 42
STR R0 ,150
HALT
Une fois la saisie terminée, cliquez sur le bouton "submit". Vous devriez voir apparaitre des nombres
"étranges" dans les cellules mémoires d’adresses 000, 001 et 002 :
Exercice 23.5 (Modification) Modifier le programme précédent pour qu’à la fin de l’exécution,
on trouve le nombre 54 à l’adresse mémoire 50. On utilisera le registre R1 à la place du registre R0.
Tester vos modifications en exécutant la simulation.
Exercice 24.1 (Classification n°1) Dans la figure ci-dessous, on connaît la classe de 6 points
(cercles pleins bleus et croix rouges). On souhaite classer les points (4 ;3) et (1,5 ;2,8) en se basant
sur la classe du point le plus proche.
Exercice 24.2 (Classification n°2) On considère des points représentés par un cercle ou une
croix, représentés sur la figure ci-dessous.
Les coordonnées d’un point sont ses attributs, et sa représentation graphique (cercle ou croix) est
sa classe. Ainsi le point K a pour attributs (3 ;4) et pour classe croix.
• En appliquant l’algorithme 1-NN, attribuer une classe parmi cercle ou croix aux points suivants :
A(1 ;8), B(5 ;5), C(6 ;3), D(6 ;8) et E(9 ;6).
• Même chose avec l’algorithme 3-NN.
• Même chose avec l’algorithme 5-NN.
Exercice 24.3 (Classification n°3) Dans la figure, les points appartiennent à 2 classes appelées
A et B. L’ordre de sélection des points est indiqué par les indices situés à côté de chacun. Les points
1 à 4 sont déjà classés ; on applique donc l’algorithme en commençant avec le point 5.
1) Appliquer la méthode des kPPV avec k=3. Ecrire la classe résultante à côté de chaque point.
2) Ecrire la fonction distance qui prend en entrée deux points et renvoie la distance entre ces deux
points.
3) Faire tourner le programme avec les données de l’exercice 1.
4) Généraliser pour déterminer la couleur d’un point en se basant sur les k points les plus proches
(k impair). On suppose toujours qu’il y a deux couleurs possibles.
Faire tourner avec les données de l’exercice 2.
Exercice 25.1 (Somme alternée) Ecrire un programme qui réalise les étapes suivantes, en
utilisant les variables a de type liste d’entiers et res de type entier :
1) Créer une liste a qui contient les entiers de 1 à 10.
2) Soit n =len(a). Calculer la somme a[0] − a[1] + a[2] − a[3] + . . . a[n − 1] dans res.
Exercice 25.2 (Somme alternée n°2) Reprendre l’exercice précédent en lui ajoutant une liste
b pour enregistrer le calcul des termes intermédiaires, c’est-à-dire :
b[0] = a[0]
b[1] = a[0] − a[1]
b[2] = a[0] − a[1] + a[2]
..
.
b[n − 1] = a[0] − a[1] + a[2] + . . . a[n − 1]
Exercice 25.3 (Mettre de l’ordre) Dans chaque cas, tester la fonction avec la liste suivante :
['toto','bonjour','a','oui','non'].
1) Ecrire une fonction ordre1 qui prend en argument une liste de mots et modifie la liste en
ordonnant les mots en fonction du nombre de lettres de chaque mot. La fonction ne renvoie rien.
2) Ecrire une fonction ordre2 qui prend en argument une liste de mots et renvoie la liste des mots
ordonnée en fonction du nombre de lettres de chaque mot. La liste passée en paramètre ne doit
pas être modifiée.
Exercice 25.4 (Fusion de listes) Ecrire une fonction fusion qui prend deux listes en paramètres
et retourne une nouvelle liste obtenue en alternant les éléments des deux listes, par exemple merge
([1,3], [2,4]) renvoie [1,2,3,4].
Si une liste est plus longue que l’autre, ses éléments sont ajoutés à la fin du résultat. Par exemple
fusion([1,3], [2,4,5,6]) renvoie [1,2,3,4,5,6].
Exercice 25.5 (Divisibilité) Ecrire un programme qui calcule le plus petit entier divisible par
tous les nombres de 1 à 10.
Exercice 25.6 (Triangle de Pascal) Le triangle de Pascal est une présentation des coefficients
binomiaux sous forme de triangle.
Les premières lignes sont données par
1
11
12 1
13 31
14 641
15 10 10 5 1
...
La première ligne est 1. Pour les autres lignes, le j e élément (sauf le dernier) de la ligne i est la
somme des j e et (j − 1)e éléments de la ligne i − 1. Le dernier élément est 1.
Ecrire la fonction tp qui prend un entier n en paramètre et affiche les n premières lignes du triangle
de Pascal.
c h a i n e E t u d i a n t s = ''' 2 1 3 6 1 5 2 0 0 ; B E S N I E R; JEAN
2 1 3 5 6 5 4 8 8 ; DUPOND ; MARC
2 1 4 6 6 5 5 5 5 ; DURAND ; JULIE '''
Exercice 25.8 (Meilleure moyenne) Ecrire une fonction qui prend en entrée un dictionnaire
associant à un nom une liste de notes et qui retourne la liste des noms des personnes qui ont la
moyenne la plus élevée (s’il y a des ex-aequo, cette liste contiendra plusieurs éléments, sinon, elle
n’en contiendra qu’un) et la moyenne correspondante.
On pourra utiliser le dictionnaire suivant pour tester la fonction ainsi écrite :
notes = {"Anne": [1, 5, 12], "John": [15, 16, 19], "Paul": [5, 12], "Nicolas": []}
Exercice 25.9 (Atteindre une somme fixée) On cherche à atteindre le total de 100 dans une
liste de nombres. On considère une liste de n entiers compris entre 1 et 99 (inclus).
Par exemple, la liste de n = 20 entiers :
[16,2,85,27,9,45,98,73,12,26,46,25,26,49,18,99,10,86,7,42]
qui a été obtenue au hasard par la commande :
liste20 = [randint(1,99) for i in range(20)].
On cherche différentes manières de trouver des nombres de la liste dont la somme fait exactement
100.
1) Ecrire une fonction sommeDeuxConsecutifs100(liste) qui teste s’il existe deux éléments consé-
cutifs de la liste dont la somme vaut 100. La fonction renvoie True ou False (mais elle peut
aussi afficher les nombres et leur position, pour vérification). Pour l’exemple donné la fonction
renvoie False.
2) Ecrire une fonction sommeDeux100(liste) qui teste s’il existe deux éléments de la liste, situés à
des positions différentes, dont la somme vaut 100. Pour l’exemple donné la fonction renvoie True
et peut afficher les entiers 2 et 98 (aux rangs 1 et 6 de la liste).
3) Ecrire une fonction sommeSuite100(liste) qui teste s’il existe des éléments consécutifs de la liste
dont la somme vaut 100. Pour l’exemple donné, la fonction renvoie True et peut afficher 25, 26,
49 (aux rangs 11, 12 et 13).
Quel est le résultat de l’appel d(4) ? Puis de l’appel d(10) ? Que fait la fonction d ?
2) Un diviseur non-trivial d’un entier n est un diviseur de n différent de 1 et de n. Écrire une
fonction DNT, d’argument n, utilisant d(n) et renvoyant la liste des diviseurs non-triviaux de
l’entier n.
3) Écrire une fonction SommeCarresDNT, d’argument n, renvoyant la somme des carrés des diviseurs
non-triviaux de l’entier n.
4) Ecrire la suite des instructions permettant d’afficher tous les nombres entiers inférieurs à 1000
et égaux à la somme des carrés de leurs diviseurs non-triviaux. Que peut-on conjecturer ?
Les exercices sont adaptés d’un document de travail proposé par Jean-Philippe Toureau, lui-même
inspiré du guide réalisé par Daniel Garmann.
Filius dispose de 3 modes : design (marteau), simulation (flêche verte) et documentation (crayon).
Pour les clients, nous prendrons des Portables et pour les serveurs, nous prendrons des Ordinateurs.
Pour voir la configuration d’un poste, double-clic ou clic droit puis configure.
Tester la connexion entre les postes 0.10 et 1.10 avec la commande ping. Que se passe-t-il ?
Normalement, vous devez obtenir un message Destination inaccessible parce que le message a
besoin de quitter le réseau local et que nous n’avons pas encore configuré la passerelle entre les
différents postes.
4) Toutes les données issues d’un formulaire sont des chaînes de caractères mais PHP procède à des
transtypages automatiquement pour gérer les calculs ou autres. Toutefois, il se peut qu’il puisse
y avoir des problèmes si les données fournies ne peuvent pas être transtypées correctement.
a) Saisir dans le champ valeur la donnée 200a et une valeur numérique dans le champ taux.
Qu’observe-t-on ?
b) Saisir à présent une valeur numérique dans le champ valeur et la donnée 0,453 dans le
champ taux. Qu’observe-t-on ?
Indication : La fonction is_numeric détermine si une variable est un nombre ou une chaîne
numérique. Par exemple, si on souhaite tester si la variable val est bien un nombre, on
pourra utiliser le code suivant.
if (is_numeric($val)) {
...
}
else {
echo "erreur";
}
Exercice 27.2 (Conversion de grandeurs) Les codes CSS, JavaScript et PHP seront écrits
dans des fichiers externes.
1) Ecrire le code HTML de la page suivante :
Lorsque l’on clique sur l’un des boutons radios, la page est complétée par le formulaire choisi
qui est constitué d’un champ textuel requis et de deux listes déroulantes.
Par exemple, en cliquant sur le bouton radio aire, on obtient la page suivante :
2) Ecrire un script PHP permettant de gérer les différents formulaires de conversion. Il testera en
particulier la validité de la donnée saisie dans le champ textuel et renverra un message d’erreur
le cas échéant. Par exemple, dans le cas où la donnée saisie est correcte, il permettra d’afficher
la page
Exercice 27.3 (Gestion de fichier) On reprend le fichier Proverbes.txt qui contient onze
proverbes de sept mots.
Indication : On donne un extrait de code qui peut être utile pour l’exercice.
$P = $_GET['proverbe'];
$F = fopen('Proverbes.txt','r');
for($i=1;$i<=$P;$i++){
$ligne = trim(fgets($F));
}
fclose($F);
$mots = explode(' ',$ligne);