Académique Documents
Professionnel Documents
Culture Documents
Introduction
Les compétences en NSI
Thème A
Types de base
Chapitre 1
Premiers pas en Python
Chapitre 2
Représentation des nombres
Chapitre 3
Représentation d'un texte en machine
Thème B
Types construits
Chapitre 4
Les types de données construits
Thème F
Langage et programmation (1)
Chapitre 5
Les fonctions
Chapitre 6
Séquences conditionnelles et boucles
Thème G
Algorithmique
Chapitre 7
Recherche d'une valeur dans une liste
Chapitre 8
Les méthodes de tri de listes
Chapitre 9
Algorithme des k plus proches voisins
Chapitre 10
Algorithmes gloutons
Thème C
Traitement de donnéesen tables
Chapitre 11
Traitement de données en tables
Thème E
Architectures matérielles et systèmes d'exploitation
Chapitre 12
Architectures matérielles et systèmes d'exploitation
Thème D
Interactions entre l'homme et la machine sur le Web
Chapitre 13
Interactions entre l'homme et la machine sur le Web
Chapitre 14
Questionnaire à choix multiples type EC
1 Les compétences
A Analyser et modéliser un problème en termes de flux et de
traitement d'informations
Conseils du professeur
Ne pas hésiter à prendre un papier brouillon et à y mettre quelques idées avant de
résoudre un problème sur ordinateur. Ceci vous fera gagner du temps par la suite.
Remarque
Pour un Picea initialement de 1 m de haut, la solution est 3,5 m et sera développée
dans le chapitre sur les boucles for.
Conseils du professeur
Nous avons dit qu'il existe bien souvent plusieurs algorithmes qui mènent à la même
solution. Il en va de même pour leur programmation : il existe bien souvent plusieurs
façons de programmer un même algorithme. Aussi, lorsque vous écrirez des
programmes, il faudra bien garder en tête qu'il n'existe pas toujours de solution
unique à un même problème.
Conseils du professeur
Cette démarche d'abstraction vous sera bien utile en cours de physique-chimie où
vous devrez bien souvent tâcher de parvenir à une expression littérale plutôt que
d'effectuer votre raisonnement sur des valeurs numériques.
G Compétences transversales
Au cours de ce livre, diverses activités sont proposées, celles-ci
vous permettront de :
● faire preuve d'autonomie, d'initiative et de créativité́ ;
● présenter un problème ou sa solution, développer une
argumentation dans le cadre d'un débat ;
● coopérer au sein d'une équipe dans le cadre d'un projet ;
● rechercher de l'information, partager des ressources ;
● faire un usage responsable et critique de l'informatique.
2 L'environnement Pyzo
Puis taper sur la touche Enter du clavier. Dans ce cas, le shell renvoie
un nombre entier (aussi appelé integer, nous reviendrons là-dessus
plus loin dans ce chapitre) :
2
Remarque
Les numéros 1. à 3. sont ici générés automatiquement par l'éditeur Pyzo dans la colonne de
gauche (il ne faut pas les saisir à la main vous-même) et correspondent au numéro de
chaque ligne.
Vocabulaire à connaître
Dans ce programme, on effectue une affectation des variables a et b (cela signifie que l'on
stocke l'entier 1 dans la variable a, et 2 dans la variable b). On demande ensuite un
affichage du résultat grâce à la fonction print(). Le mot print est un mot réservé à Pyzo,
il s'affiche en bleu.
La phrase de commentaire "Le calcul de a+b donne" est appelée une chaîne de
caractères, elle s'affiche en bleu clair.
Une fois le fichier Calcul.py enregistré, on peut vérifier qu'il figure bien
dans le répertoire …/Info par exemple :
Une bonne pratique en programmation est de commenter ses
programmes. Le programme Calcul.py agrémenté de commentaires
donne par exemple :
1. ###Mon premier programme
2. #Affectations
3. a = 1
4. b = 2
5.
6. #Calcul et affichage du résultat
7. print("Le calcul de a+b donne", a+b)
Remarque
Un commentaire est donc ajouté grâce à un ou plusieurs #. Aussi, tout ce qui suit un # sur
une même ligne, n'est pas exécuté par Pyzo et s'affiche en vert dans l'éditeur.
Les integers
On se place dans le shell (pour plus de simplicité) et on tape par
exemple :
>>> type(3)
Remarque
On obtient le même résultat avec :
>>> type(-3)
exp(x) exp(x)
ln(x) ln(x)
sin(x) sin(x)
cos(x) cos(x)
π pi
√x sqrt(x)
Remarque
Le résultat du calcul donne en réalité 0 sur votre calculatrice. Ceci nous permet de
faire remarquer que la manipulation de nombres flottants entraîne une erreur numérique (ici
l'ordre de grandeur de l'erreur est ). Il faudra en tenir compte par la suite. Par
exemple, si on compare le résultat du calcul de à 0 avec :
Pyzo indique que le résultat de cette comparaison semble faux et que , ce qui n'a
pas de sens d'un point de vue mathématique.
Remarque
L'affectation d'une variable peut être effectuée dans le shell ou dans l'éditeur.
Vocabulaire à connaître
On parle de déclaration de variable lorsque celle-ci apparaît pour la première fois dans un
programme et qu'une valeur lui est affectée.
Ou encore :
>>> c = 1.2e-3
Remarque
La virgule se note . en Python.
Conseil
Pour le nom d'une variable on peut utiliser des lettres, des _ mais pas des -, des (),
des *, ni des '. On peut aussi utiliser des nombres dès lors qu'ils suivent une lettre ou
un _.
1. a' = 1 #interdit
2. a_prim = 1 #OK
3. a-1 = 1 #interdit
4. a_-1 = 1 #interdit
5. a_moins1 = 1 #OK
Remarque
La syntaxe *= est propre à Python. L'équivalent existe pour une somme, une division, une
soustraction etc. Exemples :
>>> a += 2 #on ajoute 2 à a
Un booléen est une variable qui peut prendre deux états : soit l'état
vrai (True) qui correspond à 1, soit l'état faux (False) qui correspond à
0. L'intérêt des booléens en informatique est qu'ils permettent de
tester si une expression logique est vraie ou fausse.
Pour s'exercer sur quelques tests, on affecte tout d'abord les valeurs
ci-dessous à trois variables a, b, c dans le shell :
>>> a,b,c = 4,2,1
On se doute alors que : le test a<b sera faux, le test b>c sera vrai. Dans
un script Python, lorsque l'on essaie de déterminer si une expression
logique est vraie ou fausse, le shell renvoie un booléen : le booléen
True si l'expression est vraie et le booléen False si l'expression est
fausse. Il suffit de taper les lignes suivantes dans le shell pour le
vérifier :
>>> a<b
>>> b>c
Vocabulaire à connaître
Chaque test (en colonne de gauche) correspond à une expression booléenne.
Les mots and, or et not sont appelés des opérateurs booléens.
a b a and b
0 0 0
0 1 0
1 0 0
1 1 1
a b a or b
0 0 0
0 1 1
1 0 1
1 1 1
a b a xor b
0 0 0
0 1 1
1 0 1
1 1 0
Exercices
Compétence attendue
Exercice 1.1
► Concevoir, traduire
Exercice 1.2
► Concevoir, traduire, décomposer
Compétence attendue
Exercice 1.3
► Concevoir, traduire
Exercice 1.4
► Développer
1 1 1 1 1 1 1 1 1
1 1 0 0 1 0 0 1 1
1 1 1 0 0 0 1 1 1
1 1 1 1 1 1 1 1 1
Compétence attendue
Exercice 1.5
► Développer
1 or 1 or 1 or 0 and 1 or
1 and 1 0 and 0 1 or 1 1 or 1
1 1 1 0 1
0 xor 0 xor
1 1 0 0 0 1 1
1 1
1 1 1 0 0 0 1 1 1
1 xor
1 1 1 1 1 1 1 1
1
1 1 1 1 1 1 1 1 1
Compétence attendue
0 0 1
1 1 10
Exercice EC 1.1
1 min ● 3 points
Choisir parmi les quatre expressions suivantes celle(s) qui donneront
True :
Réponses :
a) True and (True and True)
b) True and (True and False)
c) True and (False and True)
d) True or (True and False)
Exercice EC 1.2
1 min ● 3 points
On impose :
1. a = 1
2. b = 4
Réponses :
a) a>2 and b>a
b) a>2 and b<a
c) a<2 and b>a
d) a<2 or b<a
Corrigé des exercices
Exercice 1.1
Exercice 1.2
Erreurs à éviter
Ne pas oublier les . pour la virgule d'un flottant.
Exercice 1.3
Dans l'éditeur, il faut importer les fonctions cos et sin ainsi que le
nombre π de la bibliothèque math. On se rappelle la conversion
d'unité radian à degré avec :
1 radian = degré
1. ###Ex 1.3
2. from math import pi, cos, sin
3. deg = 90 # deg est un entier
4. rad = deg*pi/180 #rad sera un réel
5. # python utilise automatiquement le type approprié pour rad qui
est un réel (float)
6. print("La conversion de cet angle en radians donne :", rad)
7. print("cos(",rad,") = ",cos(rad))
8. print("sin(",rad,") = ",sin(rad))
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 0 0 1 0 0 1 1
1 1 0 0 1 0 0 1 1
1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1
1 1 0 1 1 1 0 1 1
1 1 1 0 0 0 1 1 1
1 1 1 1 1 1 1 1 1
Exercice 1.5
Exercice 1.5
On obtient :
● 111 puis
● 11000
● 1100
Erreurs à éviter
Ne pas oublier la retenue pour les deux dernières additions.
Corrigé des exercices de type EC -
QCM
Exercice EC 1.1
Exercice EC 1.2
Les bases
Base 10 :
La notation des nombres en base 10 est celle que l'on utilise tous les
jours en calcul. C'est en effet la plus simple à manipuler :
signifie «135 en base 10 » et se traduit par :
Base 2 :
La notation des nombres en base 2 est très importante car elle permet
de comprendre comment sont codés les nombres dans un ordinateur.
signifie « 1011 en base 2 » et se traduit par :
Base 16 :
La notation des nombres en base 16 est également utilisée en
informatique notamment pour représenter des niveaux de canaux de
couleur.
signifie « 111 en base 16 » et se traduit par :
► Méthode
On divise par 2 le nombre donné, on note le quotient et le reste qui
est 0 ou 1. Puis on divise par 2 le quotient, on note le reste (0 ou 1),
etc. On s'arrête une fois que le quotient devient 0.
Exemple : écriture en base 2 du nombre 135.
➟ On divise 135 par 2, on obtient 67, il reste 1.
➟ On divise 67 par 2, on obtient 33, il reste 1.
➟…
➟ On divise 1 par 2, on obtient 0, il reste 1. On s'arrête car le
quotient est devenu 0.
► Méthode
On déroule ensuite les restes (entourés d'une bulle dans la figure
précédente) de droite à gauche. Les restes sont : 1, puis 0, puis 0,
puis 0, 0, 1, 1, 1.
Résultat : (135)10 en base 2 se note (10000111)2. (135)10 peut
alors se retrouver avec le calcul suivant :
► Méthode
On utilise l'écriture en binaire vue en début de ce chapitre. Si le
nombre de bits obtenu est inférieur à n, on rajoute des 0 pour
parvenir à n bits. S'il n'y a pas assez de bits disponibles, on dit que
la capacité d'écriture est insuffisante (on parle d'overflow).
Exemple : écriture en binaire du nombre (135)10 sur n bits.
On a trouvé son écriture en binaire : (10000111)2.
Lorsque c'est possible, on ajoute des 0 pour aller jusqu'à n bits :
Entier Sur 4 bits Sur 8 bits Sur 16 bits Sur 32 bits
+ 1 1 0 0 1 0 0
= 1 1 1 0 1 0 1 1
× 0 0 0 1 1
+ 0 1 1 0
= 1 0 0 1 0
Erreur à éviter
Ne pas oublier la retenue lorsque l'on effectue la somme en binaire de 1 + 1.
► Méthode
➟ On inverse les bits de l'écriture binaire de sa valeur absolue, on
fait ce qu'on appelle le complément à un ;
➟ On ajoute 1 (donc (00000001)2 sur 8 bits) au résultat.
Exemple : Représentation binaire de (–8)10 sur 8 bits.
➟ On écrit en binaire (+8)10 : cela donne (0000 1000)2. On inverse
les 1 et les 0 : (1111 0111)2 ;
➟ On ajoute 1 au résultat en tenant compte des retenues (c'est-à-
dire que 1 + 1 donne 10) :
(11110111)2 + (00000001)2 = (11111000)2.
Codage en base 16
Base hexadécimale 0 1 2 3 4 5 6 7
Base binaire 0000 0001 0010 0011 0100 0101 0110 0111
Base décimale 8 9 10 11 12 13 14 15
Base hexadécimale 8 9 A B C D E F
Base binaire 1000 1001 1010 1011 1100 1101 1110 1111
Il devient vite compliqué d'utiliser cette méthode pour les très petits ou
très grands nombres comme le nombre d'Avogadro par exemple : Na
= 6,022.1023 mol–1.
On utilise pour cela la notation scientifique d'un nombre décimal x qui
consiste à préciser son signe s (+ ou –), à déterminer un nombre
décimal m (appelé mantisse de x) et un entier relatif n (appelé
exposant de x), soit :
x = s m.10n
Exemple :
Vocabulaire à connaître
Cette écriture est appelée virgule flottante. En effet, la virgule peut flotter de gauche à
droite : on peut la placer là où on le souhaite.
Concept logique
Les valeurs extrêmes (0 et 2N − 1) de l'exposant sont réservées pour zéro et les infinis (en
Python NaN = Not a Number).
m
● Le nombre codé vaut en base 10 :
x = −1,5625.2−57 ≈ 1,0842.10−17
C'est une représentation approximative.
Erreurs à éviter
Ne pas oublier le bit implicite.
Exemple :
● Le premier 0 représente s = 0, le signe sera (−1)0 donc +
● 01111100 : n = 26 + 25 + 24 + 23 + 22 = 124 ; E = 124 − 127 = −3
● 0100 0000 0000 0000 0000 000 :
Dépassement de capacité
Les nombres à virgule flottante sont définis sur un nombre fini de bits,
il y a donc forcément un nombre maximal représentable dans ce
format.
Notamment, en 64 bits, on ne peut pas utiliser un exposant supérieur
à 1023 (211 − 1) sinon on obtient à nouveau un dépassement de
capacité (overflow).
Arrondis et conséquence
On note également que rares sont les nombres décimaux
représentables exactement en virgule flottante.
Vocabulaire à connaître
La représentation des nombres réels, donc des flottants, est dite souvent approximative.
Exemple :
>>> 0.1 + 0.2 - 0.3 == 0.0
Le shell renvoie False, ce qui n'a pas de sens ! Il faut plutôt effectuer
un test du type │a − b│< ε où ε est une valeur proche de zéro à
définir :
1. x = 0.1 + 0.2 - 0.3
2. y = 0.0
3. eps = 1E-5 #définition de la précision à 0.00001 près
4. print(abs(x - y)< eps) #test adapté aux flottants
Compétence attendue
Exercice 2.1
► Traduire, décomposer
Exercice 2.2
► Traduire, décomposer
Compétence attendue
➡ Utiliser le complément à 2.
Exercice 2.3
► Traduire, décomposer
Compétence attendue
Exercice 2.4
► Analyser
b) (1101)2 × (111)2
c) (1111)2 + (10)2
Compétence attendue
Exercice 2.5
► Analyser, mobiliser
Compétence attendue
Exercice 2.6
► Analyser, traduire
Exercice EC 2.1
5 min ● 18 points
Convertir en base décimale les nombres binaires suivants :
a) (1110)2
□ 3 □ 14 □ 7 □ 9
b) (00101100)2
□ 22 □ 33 □ 44 □ 7
Convertir en binaire les nombres décimaux suivants :
c) (135)10
Réponses :
a) 12
b) 15
c) 332
d) 116
Exercice EC 2.3
1 min ● 3 points
Quelle méthode utiliser pour effectuer le codage binaire d'un
entier négatif ?
Réponses :
a) Le codage hexadécimal
b) Le codage flottant
c) La méthode du complément à deux
d) La méthode IEE-754
Exercice EC 2.4
1 min ● 3 points
On s'intéresse à l'égalité d'un calcul par rapport à zéro. On tape
d'abord :
1. from math import sin, pi
2. a = sin(2*pi)
3. eps=1E-5
Exercice EC 2.5
1 min ● 3 points
Un entier n est codé grâce à la méthode du complément à deux et
donne :
(0000 0010)2. Quelle est la représentation binaire de -n ?
Réponses :
a) (0000 0110)2
b) (0000 1110)2
c) (1111 1101)2
d) (1111 1110)2
Exercice EC 2.6
1 min ● 3 points
Comment s'écrit en base 16 (en hexadécimal) le nombre dont
l'écriture binaire est (0101 0101)2 ?
Réponses :
a) 55
b) 155
c) 77
d) 88
Exercice EC 2.7
1 min ● 3 points
Comment s'écrit en base 2 (en binaire) le nombre dont l'écriture en
base hexadécimale est (D21)2 ?
Réponses :
a) (1111 0100 1001)2
Exercice 2.1
Exercice 2.2
Exercice 2.3
Exercice 2.4
Exercice 2.5
a)
b)
● Le signe sera +
● 01111101 : n = 26 + 25 + 24 + 23 + 22 + 20 = 125
E = 125 − 127 = −2
● 0101010 10101010 10101011 : est la mantisse m et vaut :
m= = 1,33301…
Conseils
Il faut remarquer que le codage est approximatif.
c)
● Le signe sera +
● 01111101 : n = 26 + 25 + 24 + 23 + 22 + 20 = 125
E = 125 − 127 = −2
● 0000000 00000000 00000000 :
Exercice 2.6
1. from math import sin, pi
2. a = sin(2*pi)
3. eps=1E-5
4.
5. print(abs(a-0)==0) #mauvais test
6. print(abs(a-0)<eps) #test correct
Corrigé des exercices de type EC -
QCM
Exercice EC 1.1
a) 14
b) 44
c) (10000111)2
d) (100101100)2
e) (11000111)2
f) (11111111)2
Exercice EC 2.2
Exercice EC 2.3
a) Le codage hexadécimal
b) Le codage flottant
c) La méthode du complément à deux
d) La méthode IEE-754
Exercice EC 2.4
a) print(abs(a-0)==0)
b) print(abs(a-0) != 0)
c) print(abs(a-0)<eps)
d) print(abs(a-0)>eps)
Exercice EC 2.5
a) (0000 0110)2
b) (0000 1110)2
c) (1100 1101)2
d) (1111 1110)2
Il suffit d'inverser les 1 et les 0 puis d'ajouter 1 (attention (1)2 + (1)2 =
(10)2).
Exercice EC 2.6
a) 55
b) 155
c) 77
d) 88
Exercice EC 2.7
1 Le code ASCII
Un peu d'histoire
La table ASCII
La norme ASCII définit 128 codes (numérotés de 0 à 127 et codés en
binaire) et utilise 7 bits. Ceci comprend 95 caractères imprimables :
les chiffres de 0 à 9, les lettres minuscules et capitales de A à Z, et
des symboles mathématiques et de ponctuation. Chaque caractère
d'un texte en ASCII est souvent stocké dans un octet dont le 8-
ième bit est 0.
● Les codes 0 à 31 et le 127 sont des caractères de contrôle. Ils
permettent de faire des actions telles que :
– o retour à la ligne ;
– o bip sonore.
● Les codes 65 à 90 représentent les majuscules.
● Les codes 97 à 122 représentent les minuscules (il suffit de modifier
le 6-ième bit pour passer de majuscule à minuscule).
Exemple : on veut trouver l'écriture binaire en norme ASCII du mot
« Info ».
En lisant par correspondance dans la table on parvient à I → 73 ce
qui donne en binaire : 01001001
Puis n → 110 soit 01101110
Puis f → 102 soit 01100110
Puis o → 111 soit 01101111
Au final le mot « Info » s'écrit sur 4 octets :
01001001 01101110 01100110 01101111
Exemple : on veut trouver l'écriture binaire grâce à la norme ASCII
du mot « défi ».
Cette fois, c'est impossible car la lettre « é » ne figure pas dans la
table ASCII.
Limitations
ASCII est suffisant pour représenter les textes en anglais, mais il ne
permet pas de représenter les accents ou les lettres spécifiques de
l'espagnol, du français etc. comme « é, è, ç » etc. D'où la nécessité de
trouver une norme plus internationale.
2 La norme ISO-8859-1
Nécessité
3 La norme Unicode
Conseil
Les incompatibilités de normes sont donc à l'origine des problèmes que l'on rencontre
parfois avec les caractères accentués. Lorsque l'on écrit un email, il est plus sûr de
n'utiliser que des caractères non accentués (un « e » remplace un « é » par exemple).
En effet, un destinataire qui n'utilise pas la même norme que vous verra sinon des
caractères é ou ? à la place des « é » …
Exercices
Compétence attendue
Exercice 3.1
► Décomposer, développer
Compétence attendue
Exercice 3.3
► Mobiliser
Exercice EC 3.1
1 min ● 3 points
Le code ASCII permet de représenter en binaire les caractères
alphanumériques. Sur combien de bits sont-ils codés ?
Réponses :
a) 7
b) 4
c) 9
d) 2
Exercice EC 3.2
1 min ● 3 points
Le code ASCII de la lettre A est 0x41, celui de la lettre B est 0x42, celui
de la lettre C est 0x43, etc. Quel est le code ASCII, en hexadécimal, de
la lettre F ?
Réponses :
a) 1x45
b) 0x48
c) 2x45
d) 0x46
Exercice EC 3.3
1 min ● 3 points
Parmi les choix suivants, lequel n'est pas celui d'un d'encodage de
caractères ?
Réponses :
a) Unicode
b) UTF-8
c) ASCII
d) Comic SANS MS
Exercice EC 3.4
1 min ● 3 points
Parmi les caractères ci-dessous, lequel ne fait pas partie du code
ASCII ?
Réponses :
a) ù
b) space
c) )
d) @
Exercice EC 3.5
1 min ● 3 points
Donner un inconvénient correct de la norme ASCII :
Réponses :
a) L'encodage est trop long
b) Elle n'est pas adaptée à toutes les langues
c) Elle ne permet pas d'écrire en majuscules
d) Elle ne permet pas d'écrire de ponctuation
Corrigé des exercices
Exercice 3.1
Exercice 3.2
a) hello
b) informatique
c) binaire
Exercice 3.3
Exercice EC 3.1
a) 7
b) 4
c) 9
d) 2
Exercice EC 3.2
a) 1x45
b) 0x48
c) 2x45
d) 0x46
Exercice EC 3.3
a) Unicode
b) UTF-8
c) ASCII
d) Comic SANS MS
Exercice EC 3.4
a) ù
b) space
c) )
d) @
Exercice EC 3.5
1 Les p-uplets
Créer un p-uplet
Notion d'indexation
On tape cette fois dans le shell :
>>> a[0]
10
On peut donc accéder au contenu de la variable a en utilisant des
indices (aussi appelés index). Ces indices notés i démarrent à 0. Donc
l'indice associé à l'entier 10 est i = 0, celui associé à 20 est i = 1 etc. :
a=
Erreurs à éviter
On peut parfois par inadvertance utiliser une « , » à la place d'un « . » lors de la saisie d'un
flottant. Dans ce cas Python identifiera la saisie à un type tuple et non à un flottant.
Exemple : soit la variable b = –1,2 dont on souhaite prendre la valeur absolue, on tape
dans l'éditeur :
1. b = -1,2 #Erreur, il fallait saisir b = -1.2
2. print(abs(b))
Le shell renvoie un message d'erreur car on ne peut pas prendre la valeur absolue d'un
tuple :
Traceback (most recent call last):
File "<tmp 1>", line 2, in <module> print(abs(b))
TypeError: bad operand type for abs(): 'tuple'
2 Les listes
Vocabulaire à connaître
On dit que les listes sont des types de données modifiables, ou mutables.
Conseils
Ne pas oublier que les indices positifs ou index démarrent à 0.
On utilise range(n) qui renvoie une liste démarrant à 0 et qui finit à n-1.
Donc attention n est exclu ! Ainsi la variable i prend tour à tour les
valeurs 0, 1, … , n-1.
Remarque
La syntaxe complète est range(debut,fin,pas) : cela crée une liste allant de debut à
fin-1 avec l'incrémentation pas. Si la valeur debut n'est pas mentionnée, elle vaut 0 par
défaut. Si le pas n'est pas fourni, il vaut 1 par défaut.
Exemple :
1. n = 5
2. L = [i for i in range(n)] #i va de 0 à 5 exclu par pas de 1
3. print(L)
Exemple :
1. L = [i for i in range(1,10,2)]
2. print(L)
Soit dans le shell : [4] puis [4,5], [4,5,6]. On peut donc partir d'une liste
vide que l'on construit au fur et à mesure avec append( ) ou effectuer
une concaténation simple avec un +.
Exemple :
>>> x = 5
>>> x in liste1 #on cherche 5 dans la liste1
True
Remarque
La recherche d'un élément avec in implique que le programme va parcourir un à un les
éléments de la liste.
Sachant qu'une opération sur un ordinateur prend en moyenne environ 10−9 s, si la liste
contient 106 éléments, le programme mettra 10−3 s. Si la liste contient 1012 éléments, le
programme mettra 103 s etc. Donc le temps de recherche est proportionnel à la longueur de
la liste. On dit que le coût en temps est linéaire.
Créer un dictionnaire
Tout comme les listes, les dictionnaires sont des objets structurés
pouvant contenir d'autres objets. Les dictionnaires sont délimités par
des { }, là où les listes l'étaient par des [ ].
Dans un dictionnaire les informations ne sont pas stockées dans un
ordre précis. Aussi, pour accéder aux objets contenus dans le
dictionnaire, on utilise plutôt des clés que des indices.
On peut, comme on l'a fait pour les listes, créer un dictionnaire vide
(avec { }) et le remplir au fur et à mesure. On crée par exemple ci-
dessous un répertoire de numéros de téléphone en tapant dans le
shell :
>>> repertoire = {}
>>> repertoire["nom"] = "Alex"
>>> repertoire["numero de tel"] = "06 67 65 13 21"
>>> repertoire
{'nom': 'Alex', 'numero de tel': '06 67 65 13 21'}
Remarque
On aurait pu aussi créer le dictionnaire en une seule fois plutôt que de le remplir au fur et à
mesure :
>>> repertoire = {'nom': 'Alex', 'numero de tel': '06 67 65 13 21'}
Vocabulaire à connaître
Les clés et leurs valeurs sont ici des chaînes de caractères. Ils sont déclarés entre
guillemets ou entre apostrophes : 'nom' ou "nom".
Les guillemets sont plus pratiques lorsque la chaîne contient des apostrophes : 'numero
d'aide' n'est pas une chaîne valide. "numero d'aide" et "numero de tel" sont des
chaînes correctes.
Remarque
On peut aussi avoir des clés et valeurs sous forme d'entier (assez classique) ou sous un
autre type de donnée.
Ou encore :
>>> 'adresse' in repertoire.keys() #parcours des clés
False
Remarque
Tout comme pour les listes, la recherche d'un élément avec in implique que le programme
doive parcourir un à un les éléments du dictionnaire (dans ce cas repertoire ne contient que
deux éléments ce qui est peu : on peut le vérifier avec len(repertoire)). Mais dans la pratique
on peut manipuler des dictionnaires très longs, auquel cas la durée de parcours peut vite
augmenter.
À nouveau le temps de recherche est proportionnel à la longueur du dictionnaire : le coût en
temps est linéaire.
Exercices
Compétence attendue
Exercice 4.1
► Décomposer
Compétence attendue
Exercice 4.2
► Décomposer, développer
Remarque
Pour constituer Y et Z, vous pouvez vous servir de la liste X.
Compétence attendue
Exercice 4.3
► Analyser
1. #Script 2
2. a = [2,1,0.5]
3. a = [3] + a
4. a[1] = 2
5. del a[2]
Exercice 4.4
► Analyser
Compétence attendue
Exercice 4.5
► Modéliser
Exercice EC 4.1
1 min ● 3 points
On tape les lignes suivantes :
1. L = [2, 6, 8, 4]
2. L[1] = L[1] + 4
3. print(L[1])
Exercice EC 4.2
1 min ● 3 points
On tape les lignes suivantes :
1. L = [2, 6, 8, 4]
2. L[1] = L[1] + 4
3. print(L)
Que s'affiche-t-il dans le shell ?
Réponses :
a) [2, 6, 8, 4]
b) [4, 6, 8, 4]
c) [2, 10, 8, 4]
d) [6, 6, 8, 4]
Exercice EC 4.3
1 min ● 3 points
On a construit une liste annee2021 contenant des villes et la
température moyenne en juin. On tape les lignes suivantes :
1. annee2021 = [('Paris',22), ('Houston',25), ('Moscou',16)]
2. m = annee2021[0][1]
3. for i in range(len(annee2021)):
4. if annee2021[i][1] > m:
5. m = annee2021[i][1]
6. print(m)
Exercice EC 4.4
1 min ● 3 points
Quel est le contenu de la variable diff à la fin de l'exécution du script
suivant ?
1. entiers = (10,6,1,12,15)
2. diff = entiers[2] - entiers[3]
Réponses :
a) 11
b) -11
c) 5
d) -5
Exercice EC 4.5
1 min ● 3 points
On remplit le dictionnaire bonbon :
1. bonbon = {'forme': 'rond', 'masse': 0.01,'couleur' :'rouge'}
2. print(bonbon.keys())
Exercice EC 4.6
1 min ● 3 points
On définit la liste d'entiers liste = [30,20,40,50]. Quelle est le contenu
de la variable liste[1] ?
Réponses :
a) 30
b) 20
c) 40
d) 50
Exercice EC 4.7
1 min ● 3 points
On considère la liste de listes suivante :
noel = [ ['J', 'O', 'J'], ['E', 'U', 'X'], ['N', 'O', 'E','L'] ]
Exercice EC 4.8
1 min ● 3 points
On considère la liste de listes suivante :
noel = [ ['J', 'O', 'J'], ['E', 'U', 'X'], ['N', 'O', 'E','L'] ]
Exercice EC 4.9
1 min ● 3 points
On considère la liste de listes suivante : serie = [['T', 'H', 'I','R',
'T', 'E', 'E', 'N'], ['R', 'E', 'A', 'S', 'O', 'N', 'S']]
Comment obtenir la liste : serie = ['T', 'H', 'I','R', 'T', 'E', 'E', 'N',
'R', 'E', 'A', 'S', 'O', 'N', 'S'] ?
Réponses :
a) serie = serie[0] + serie[1]
b) serie = serie[0] , serie[1]
c) serie = [serie[0] + serie[1]]
d) serie = [[serie[0] + serie[1]]]
Corrigé des exercices
Exercice 4.1
Exercice 4.2
1. X = [i/10 for i in range(1,21)] # i va de 1 à 21 exclu (donc 20)
2. print("X",X)
3.
4. #Méthode 1
5. Y = [(i/10)**3 for i in range(1,21)]
6. print("Y",Y)
7. #Méthode 2 avec X
8. Y = [i**3 for i in X] # i parcourt les éléments de X
9. print("Y",Y)
10.
11. Z = [1/i for i in X] # i parcourt les éléments de X
12. print("Z",Z)
Exercice 4.3
Exercice 4.4
Voire même :
1. V = []
2. a = 3
3. V.append(a)
4. V.append(a*2)
5. V.append(a*4)
6. V.append(a*12)
7. print(V)
Exercice 4.5
Exercice EC 4.1
a) 7
b) 10
c) 9
d) 6
Exercice EC 4.2
a) [2, 6, 8, 4]
b) [4, 6, 8, 4]
c) [2, 10, 8, 4]
d) [6, 6, 8, 4]
Exercice EC 4.3
a) 22
b) ('Paris',22)
c) ('Houston',25)
d) 25
Exercice EC 4.4
a) 11
b) –11
c) 5
d) –5
Exercice EC 4.5
Exercice EC 4.6
a) 30
b) 20
c) 40
d) 50
Exercice EC 4.7
a) noel[0][2]='Y'
b) noel[1][2]='Y'
c) noel[2][2]='Y'
d) noel[0]='Y'
Exercice EC 4.8
a) noel[0][1] et noel[0][2]
b) noel[0][1] et noel[2][1]
c) noel[0][-2] et noel[2][1]
d) noel[0][1] et noel[1][2]
Exercice EC 4.9
Un peu d'histoire
Avec ce chapitre on démarre l'écriture d'algorithmes. Le mot
« algorithme » vient du nom d'un mathématicien arabe du VIIIe siècle
après J.-C., Al-Khwarizmi. Ce mathématicien écrivit en langue arabe
le plus ancien traité d'algèbre «Al-Jabr» sur la résolution des
équations. Il y proposait les solutions en décrivant l'enchaînement
d'étapes à suivre pour résoudre les équations.
John McCarthy est l'auteur du langage Lisp (sorti en 1958), qui est à
l'origine des langages de programmation fonctionnels.
La programmation fonctionnelle est un mode de programmation qui
passe par l'évaluation de fonctions mathématiques.
Cette fonction très simple renvoie l'année 2021. Pour l'appeler il suffit
de taper annee() dans le shell.
1. def puissances2() : #pas d'argument d'entrée
2. return (2**1, 2**2, 2**3, 2**4) #4 arguments de sortie
Remarque
Lors du choix du nom de la fonction, ne pas prendre celui d'une variable déjà existante sous
peine d'obtenir des résultats aberrants. Le nom de fonction suivant n'est pas judicieux :
1. def calcul(x) :
2. """ calcul est aussi une variable : mauvais choix """
3. calcul = x + 1
4. return calcul
Celui-ci non plus :
5. calcul = 2
6. def calcul(x) :
7. """ calcul est déjà une variable ! """
8. res = x + 1
9. return res
Vocabulaire à connaître
Une fonction qui n'a pas d'argument de sortie est appelée procédure.
Variable locale
Une variable locale est une variable créée au sein d'une fonction, elle
ne sera pas accessible dans le programme principal.
1. def ajoute_1(x) :
2. resultat = x + 1 #resultat est une variable locale
3. return resultat
Ici, resultat, est une variable locale à la fonction. Celle-ci n'existe qu'au
sein de la fonction ajoute_1 et n'est pas visible dans le programme
principal. L'appel suivant : print(resultat) renvoie un message
d'erreur (variable resultat non définie) :
NameError: name 'resultat' is not defined
Variable globale
Une variable globale est une variable créée dans le programme
principal (c'est-à-dire à la racine du fichier .py créé), elle sera
accessible partout : dans les fonctions et dans le programme principal.
1. y = 2 #on déclare la variable globale y
2. def fct(x) :
3. return y+x #on se sert de y dans fct
Dans les deux cas, le résultat renvoyé par la fonction est affiché dans
le shell : 3
Attention : l'argument d'entrée fourni à la fonction doit posséder un
type compatible avec les commandes exécutées par la fonction.
Dans les lignes de code précédentes, le nombre 2 puis la variable
globale y sont des arguments d'entrée de la fonction ajoute_1. Tous
deux sont de type int qui est compatible avec la commande x+1
exécutée par la fonction ajoute_1.
En revanche, l'exemple suivant comporte une erreur de type
d'argument d'entrée :
1. print(ajoute_1([1,2,3])) #[1,2,3] n'est pas un nombre
D'où l'erreur : TypeError: can only concatenate list (not "int") to list
4 Les assertions
Des assertions peuvent être utilisées pour garantir des préconditions
ou des post conditions sur les arguments de la fonction.
Exemple :
1. def racine(x) :
2. """Calcule la racine d'un nombre, renvoie le résultat
3. x : un nombre positif ou nul (entier, flottant)
4. resultat : un flottant
5. """
6. assert x>=0
7. resultat = sqrt(x)
8. return resultat
5 Jeux de tests
Une fois une fonction créée, il faut impérativement vérifier sa validité.
C'est-à-dire qu'elle effectue bien ce pour quoi elle a été conçue.
Pour assurer cette validation, on mettre en œuvre un jeu de tests sous
la forme d'une suite d'appels de la fonction définie. Ces tests doivent
envisager suffisamment de cas afin que le concepteur ait confiance
dans la validité de sa fonction. L'écriture du jeu de test se compose
d'une suite d'assertions.
Exemple :
1. def ajoute_1(x) :
2. return x + 1
3.
4. #Jeu de tests
5. assert ajoute_1(2) == 3
6. assert ajoute_1(-2) == -1
L'exécution de ces lignes ne renvoie rien car les tests effectués sont
vrais. En revanche si on écrit un test qui est faux (comme
assert ajoute_1(2) == -2), on obtient :
assert ajoute_1(-2) == 2
AssertionError
Compétence attendue
Exercice 5.1
► Analyser
Compétence attendue
Exercice 5.2
► Analyser
a) Écrire une fonction nommée suivant qui prend pour argument un
entier n et renvoie le suivant : n + 1. La fonction doit vérifier que n
est bien un entier. Tester la fonction dans la console.
b) Écrire une fonction nommée suivantbis qui prend pour argument un
entier n et renvoie les deux suivants : n + 1 et n + 2 sous la forme
d'une liste. La fonction doit vérifier que n est bien un entier. Tester
cette fonction dans la console. Accéder au premier élément de la
liste.
Exercice 5.3
► Traduire
Écrire une fonction surface permettant de calculer la surface d'un
rectangle. Elle admettra comme argument d'entrée deux variables l et
L (deux entiers ou flottants positifs ou nuls) correspondant aux deux
côtés du rectangle. La fonction doit vérifier que les arguments d'entrée
sont bien positifs ou nuls. Cette fonction doit renvoyer le résultat.
Compétence attendue
Exercice 5.4
► Traduire
Compétence attendue
Exercice 5.5
► Traduire, décomposer
Écrire une fonction qui admet comme argument une variable deg (qui
contient une valeur en degrés) et qui réalise les opérations suivantes :
● Convertir l'angle deg en radians et stocker cette grandeur dans une
variable rad.
● Calculer le sinus et le cosinus de rad, renvoyer le résultat de ces
deux calculs.
Appeler la fonction pour un angle dont la valeur est 90 degrés.
Compétence attendue
Exercice 5.6
► Traduire, décomposer
● RTerre = 6 371 km
● G = 6,67 × 10−11 USI
● mTerre = 6,0 × 1024 kg
Écrire une fonction dans l'éditeur qui permet d'évaluer la constante g à
une altitude h quelconque. Les constantes seront définies dans le
programme principal (en dehors de la fonction). Appeler la fonction et
afficher le résultat pour h = 1 mètre de manière conviviale (c'est-à-dire
avec un peu de texte puis le résultat suivi de son unité SI).
Compétence attendue
Exercice 5.7
► Traduire, développer
Compétence attendue
Exercice 5.8
► Développer
Et en langage C :
int G(int a, int b)
{
int res = 0 ;
res = a+b -a*b ;
return res; // On retourne le résultat du calcul
}
Exercice-bilan 5.1
45 min ● 10 points
À présent il est temps de laisser libre cours à votre imagination. Dans
le cadre d'un projet, on vous demande de mettre au point une
fonction.
La méthode de résolution de problème appliquée à l'informatique sera
utilisée :
1) Définir
● Quel problème tâche-t-on de résoudre ?
● Quelles sont les contraintes ?
● À quoi ressemble un succès ? Quel est votre objectif ?
2) Préparer
● Rechercher les solutions possibles.
● Élaborer un plan.
3) Essayer
● Mettre en œuvre votre plan.
4) Réfléchir
● Comparer le résultat à l'objectif.
● Quelles sont les améliorations possibles ?
Source : code.org
Il vous faut pour cela définir un problème, ce à quoi sert votre fonction.
Puis préparer une solution et pour cela trouver les arguments d'entrée
et de sortie de la fonction. Ensuite il vous faudra la tester dans
différentes situations. On vous demande ensuite de réfléchir au
résultat obtenu.
Attention, prenez bien soin de spécifier la fonction afin qu'un autre
utilisateur puisse s'en servir facilement.
En fin de séance, les différentes fonctions pourront être présentées à
la classe.
Exercice-bilan 5.2
5 min ● 5 points
Soit un vecteur de trois coordonnées représenté par une liste de trois
entiers.
➡ Écrire une fonction admet pour argument cette liste et qui renvoie
la norme du vecteur.
Exercice-bilan 5.3
10 min ● 5 points
Soit un vecteur de trois coordonnées représenté par une liste de trois
entiers.
➡ Écrire une fonction admet pour argument deux listes représentant
les coordonnées de deux vecteurs et qui renvoie le résultat du
produit scalaire de ces deux vecteurs.
Exercices de type EC - QCM
Exercice EC 5.1
1 min ● 3 points
On tape les lignes suivantes :
1. def F(n ):
2. n = n**2
3. return n+1
4.
5. print(F(3))
Exercice EC 5.2
1 min ● 3 points
On tape les lignes suivantes :
1. def F(x,y):
2. return x/y
3.
4. print(F(2,0))
Exercice EC 5.3
1 min ● 3 points
On tape les lignes suivantes :
1. def F(n):
2. n = n**2
3. return n+1
4.
5. print(F(2))
Exercice EC 5.4
1 min ● 3 points
On tape les lignes suivantes :
1. def F(x,y):
2. calcul = x+y
3. return calcul
4.
5. x = 1
6. y = 2
7. print(calcul)
Exercice 5.1
Seul le programme e) est correct. Pour les autres il manque soit les
« : », soit l'indentation, soit l'assertion, soit le return.
Exercice 5.2
1. def suivant(n):
2. """renvoie le résultat du calcul n+1
3. n : un entier
4. """
5. return n+1
6.
7. print(suivant(2))
8.
9. def suivant_bis(n):
10. """renvoie n+1 et n+2 sous forme de liste
11. n : un entier
12. """
13. return [n+1,n+2]
14.
15. L = suivant_bis(2)
16. print("1er terme",L[0])
Exercice 5.3
1. def surface(l,L):
2. """renvoie le résultat du calcul l*L
3. l,L : des nombres postifs ou nuls
4. """
5. assert l>=0 and L>=0
6. return l*L
7.
8. print(surface(3,2))
Exercice 5.4
1. from math import pi
2.
3. def perimetre(r):
4. """renvoie le résultat du calcul du perimetre
5. r : un nombre postif ou nul
6. """
7. assert r>=0
8. return 2*pi*r
9.
10. print(perimetre(-1)) #affiche une assertion Error
11. print(perimetre(1)) #affiche 6.283185307179586
Exercice 5.5
1. from math import pi, sin, cos #pour pi, sin( ), cos( )
2.
3. def sincos(deg):
4. """renvoie le résultat des calculs du sin et cos
5. deg : un nombre
6. """
7. rad = deg*pi/180
8. sinus = sin(rad)
9. cosinus = cos(rad)
10. return sinus, cosinus
11.
12. angle = 90
13. si,co = sincos(angle) #affectation de deux variables
14. print("Le cosinus de l'angle vaut :",co)
15. print("Le sinus de l'angle vaut :",si)
Exercice 5.6
1. R_Terre = 6371E3 #en m
2. G = 6.67E-11 #USI
3. m_Terre = 6.0E24 #kg
4.
5. def calcul_g(h):
6. """renvoie le résultat du calcul de g
7. h : un nombre
8. """
9. g = G*m_Terre/(R_Terre+h)**2
10. return g
11.
12. print("La valeur de g pour h = 1 m est :",calcul_g(1),"m/s^2")
Exercice 5.7
1. def G(a,b):
2. """renvoie le résultat du calcul de a+b-a*b
3. a,b : des entiers
4. """
5. assert type(a)==int and type(b)==int
6. return a+b-a*b
7. #Jeu de tests :
8. assert G(1,1) == 1
9. assert G(-1,1) == 1
10. assert G(1,-2) == 1
Exercice 5.8
Exercice-bilan 5.2
1. from math import sqrt
2. def norme(v):
3. """renvoie le résultat du calcul de la norme du vecteur v
4. v : une liste
5. """
6. x = v[0]
7. y = v[1]
8. z = v[2]
9. return sqrt(x**2+y**2+z**2)
Exercice-bilan 5.3
1. def prod_scalaire(u,v):
2. """renvoie le résultat du calcul du produit scalaire u.v
3. u,v : des listes
4. """
5. x1 = u[0]
6. y1 = u[1]
7. z1 = u[2]
8. x2 = v[0]
9. y2 = v[1]
10. z2 = v[2]
11. return x1*x2+y1*y2+z1*z2
Ou bien plus court :
1. def prod_scalaire(u,v):
2. """renvoie le résultat du calcul du produit scalaire u.v
3. u,v : des listes
4. """
5. return u[0]*v[0]+u[1]*v[1]+u[2]*v[2]
Corrigé des exercices de type EC -
QCM
Exercice EC 5.1
a) 7
b) 10
c) 9
d) 6
Exercice EC 5.2
a) 2
b) rien cela ne fonctionne pas
c) ZeroDivisionError: division by zero
d) 1
Exercice EC 5.3
a) 7
b) 10
c) 9
d) 5
Exercice EC 5.4
a) 3
Un peu d'histoire
Certains de ces tests peuvent être appliqués aux listes. Par exemple,
si on définit :
1. li = [1,3,5]
2. liste = [1,3,5]
3. liste2 = [[1,3,5], [1,4,6]]
si test alors
instruction1
fin si
Conseils
Ne pas oublier les « : » à la suite du test ni l'indentation suite aux « : »
si test alors
instruction1
sinon alors
instruction2
fin si
Ce qui donne en Python :
1. if test :
2. instruction1
3. else :
4. instruction2
Remarque
Le if signifie si, le else signifie sinon.
Conseils
Il ne faut pas placer de test à la suite du else. Ne pas oublier les « : » à la suite du
else.
si test1 alors
instruction1
sinon si test2 alors
instruction2
sinon alors
instruction3
fin si
Et en Python, cela se traduit par :
1. if test1 :
2. instruction1
3. elif test2 :
4. instruction2
5. else :
6. instruction3
Remarque
Le elif signifie donc sinon si.
Remarque
Il est possible d'avoir une instruction conditionnelle au sein d'une autre instruction
conditionnelle.
1. if test1 :
2. if test2 :
3. instruction1
4. else :
5. instruction2
Dans ce cas la variable i prend une à une les valeurs des éléments
de la liste.
Remarque
À remarquer les « : » et l'indentation essentielle suite aux « : ».
Remarque
De la même manière, l'itérable peut être de type chaîne de caractères ou un dictionnaire.
1. for i in chaîne : #l'itérable est chaîne
2. instruction
3. for i in dictionnaire : #l'itérable est dictionnaire
4. instruction
Remarque
La recherche d'un élément avec for i in liste: implique que le programme va parcourir
un à un les éléments de la liste. Ceci revient à utiliser if i in liste: déjà vu dans le
chapitre précédent.
On a dit à cette occasion que comme une opération sur un ordinateur prend en moyenne
environ 10–9 s, si la liste contient 106 éléments, le programme mettra 10–3 s. Si la liste
contient 1012 éléments, le programme mettra 103 s, etc. Donc le temps de calcul est
proportionnel à la longueur de la liste. On dit que le coût en temps de la fonction chercher
est linéaire.
Les variables debut, fin et pas sont des entiers. debut est optionnel et
vaut 0 s'il est omis. De même, pas est optionnel et vaut 1 s'il est omis.
Ce qui donne en Python :
1. for i in range(debut,fin,pas) : #l'itérable est range( )
2. instruction
Coût en temps
Si une fonction (comme somme définie ci-dessous) comporte une boucle
for qui effectue n opérations unitaires, son coût en temps est aussi
linéaire. On dit aussi que sa complexité temporelle est linéaire.
1. def somme(n):
2. """Renvoie la somme des n premiers entiers
3. som : un entier"""
4. som=0
5. for i in range(n): #effectue n itérations
6. som = som+1
7. return som
Remarque
À remarquer les « : » et l'indentation essentielle suite aux « : ».
Remarque
Contrairement aux boucles for, les boucles while ne s'incrémentent pas toutes seules. Il
faut initialiser le ou les paramètres en dehors de la boucle et le ou les incrémenter dans la
boucle.
1. i = 0
2. while i<5 :
3. print("Ne s'arrête jamais…")
4. i=i-1 #i sera toujours < 5 car négatif
On obtient :
u vaut : 0
u vaut : 1
u vaut : 3
u vaut : 7
Coût en temps
Les fonctions ou scripts impliquant une seule boucle while qui effectue
de l'ordre de n itérations ont aussi un coût en temps linéaire : donc une
complexité temporelle linéaire. C'est le cas du programme suivant :
1. n = 1000000 #nb affichage
2. compteur = 0 #compteur initialisé à 0
3. while compteur<n : #condition compteur<n
4. print("Bonjour")
5. compteur=compteur+1 #compteur incrémenté
Compétence attendue
Exercice 6.1
► Concevoir
Exercice 6.2
► Concevoir, traduire
Exercice 6.3
► Analyser, traduire
Exercice 6.4
► Traduire
Compétence attendue
Exercice 6.5
► Traduire
Écrire une fonction qui cherche un élément x (un entier) dans une liste
d'entiers. La fonction doit renvoyer le booléen True si x se trouve dans
la liste, False sinon.
Pour cette fonction, indiquer la complexité temporelle si la liste
contient n entiers.
Exercice 6.6
► Traduire
Écrire une fonction qui compte le nombre d'éléments dans une liste,
ce sans faire appel à len( ).
Pour cette fonction, indiquer la complexité temporelle si la liste
contient n entiers.
Exercice 6.7
► Traduire
1) Écrire une fonction minimum qui prend en argument une liste d'entiers
et qui renvoie la plus petite valeur contenue dans la liste. Tester
cette fonction sur une liste d'entiers.
2) Modifier cette fonction (en une fonction que l'on appellera min2) pour
qu'elle renvoie l'indice de la première occurrence de la plus petite
valeur.
3) Modifier à nouveau cette fonction (en une fonction que l'on
appellera min3) pour qu'elle renvoie la liste des indices de la plus
petite valeur.
Indiquer la complexité temporelle de chaque fonction dans le cas
d'une liste de n entiers.
Compétence attendue
Exercice 6.8
► Développer
Et en langage C :
decimal x = 1 ;
if (x>0)
printf("x est positif") ;
else
printf("x est négatif ou nul") ;
Exercice 6.9
► Développer
Et en langage C :
int i ;
for (i =0 ; i <5 ; i++)
{
printf(("%d vaut :",i)
}
Compétence attendue
Exercice 6.11
► Analyser, décomposer
Exercice-bilan 6.1
45 min ● 15 points
On considère une liste d'individus dont certains sont amis dans un
réseau social.
Julie 1
Tom 2
Sam 3
Portillon 4
Charlie 5
Aussi le réseau d'amitié peut être représenté par une liste de listes
notée Facebk. Chaque sous liste appelée paire possède deux valeurs i,
j qui sont au format entier. Cette paire [i, j] représente un lien
d'amitié. Chaque lien d'amitié est représenté de manière unique dans
la liste Facebk. Le réseau d'amitié correspondant aux tableaux ci-
dessus donne donc :
Facebk = [[1,2],[1,4],[2,3],[3,5],[4,5]]
● Écrire une fonction lien(paire,i,j) où paire est une liste à deux
éléments et i et j sont deux entiers, et qui renvoie True si les deux
éléments contenus dans paire sont i et j dans un ordre quelconque ;
et renvoie False sinon.
● Écrire une fonction amis(Facebk,i,j) qui renvoie True s'il existe un lien
d'amitié entre les individus i et j dans le réseau Facebk; et renvoie
False sinon.
● Écrire une procédure ajout_amis(Facebk,i,j) qui modifie le réseau
Facebk pour y ajouter un lien d'amitié entre les individus i et j si ce
lien n'y figure pas déjà.
● Écrire une fonction liste_amis(Facebk,i) qui renvoie la liste des amis
de i dans le réseau Facebk.
Exercice-bilan 6.2
15 min ● 5 points
● Écrire une fonction vdif qui prend en paramètre deux listes de
nombres de même longueur et qui renvoie une nouvelle liste
constituée de la différence terme à terme de ces deux listes (la
première moins la deuxième) :
vdif([1,2,3],[4,5,6]) → [-3,-3,-3]
● Écrire une fonction vsom qui, cette fois, effectue la somme terme à
terme des éléments des deux listes. Cette fonction prend en
paramètre deux listes de nombres et doit renvoyer une nouvelle liste
contenant les sommes des termes des deux listes :
vsom([1,2,3],[4,5,6]) → [5,7,9]
Exercice EC 6.1
1 min ● 3 points
On tape les lignes suivantes :
1. x,y,z = 1,5,3
2. def F(x,y,z):
3. if y<x :
4. x,y = y,x
5. if z<y :
6. y,z = z,y
7. return x,y,z
8. print(F(x,y,z))
Exercice EC 6.2
1 min ● 3 points
On tape les lignes suivantes :
1. x = 1
2. if x > 0 :
3. print("x est positif")
4. else :
5. print("x est négatif ou nul")
Exercice EC 6.3
1 min ● 3 points
On tape les lignes suivantes :
1. L = []
2. for i in range(5) :
3. … #on ajoute i à la fin de la liste
Exercice EC 6.4
1 min ● 3 points
La fonction suivante doit renvoyer le maximum dans une liste
d'entiers :
1. def maximum(liste):
2. maxi = liste[0]
3. for … :
4. if i>maxi:
5. maxi = i
6. return maxi
Quelle instruction peut remplacer les pointillés afin que maximum renvoie
bien le maximum de la liste liste ?
Réponses :
a) i in range(liste) :
b) i in range(len(liste)) :
c) i in liste :
d) i in range(liste)
Corrigé des exercices
Exercice 6.1
1. def nombre(x):
2. """Renvoie True si x est un réel ou un entier, False sinon"""
3. if type(x)==int or type(x)==float :
4. return True
5. else:
6. return False
7.
8. print(nombre(-2.2))
9. print(nombre(4))
10. print(nombre("Bonjour"))
Exercice 6.2
1. def est_pair(a):
2. """ Renvoie True si a est pair, False sinon"""
3. if a%2==0 :
4. print ("a est pair")
5. return True
6. else:
7. print ("a est impair")
8. return False
On teste :
9. x = 4
10. print(est_pair(x)) #On obtient True
Exercice 6.3
1. def test_pH(pH):
2. """ teste la caractère acide, basique ou neutre d'une solution
3. Effectue un affichage, ne renvoie rien
4. Teste si pH est un entier ou un flottant"""
5. assert type(pH)==int or type(pH)==float
6. if pH<7:
7. print("solution acide")
8. elif pH>7:
9. print("solution basique")
10. else :
11. print("solution neutre")
On teste :
12. test_pH(1) #affiche acide
13. test_pH(8) #affiche basique
14. test_pH(7) #affiche neutre
Exercice 6.4
1. from math import sqrt
2. def racine(x):
3. """Renvoie la valeur de la racine carrée d'un nombre x si x>=0
4. affiche un message d'erreur si x<0, renvoie False"""
5. if x>=0 :
6. return sqrt(x)
7. else:
8. print ("Racine impossible")
9. return False
10.
11. print(racine(-2)) #message d'erreur, renvoie False
12. print(racine(4)) #renvoie 2.0
Exercice 6.5
On peut utiliser une boucle for qui parcourt les éléments de la liste.
1. def chercher(liste,x):
2. """ Renvoie True si x est dans liste, False sinon
3. x : un entier"""
4. for i in liste: #i parcourt les éléments de la liste
5. if i==x: #i comparé à x
6. return True
7. return False #toute la boucle a été effectuée sans trouver x
On teste :
8. liste = [0,1,2,3,4,5,6,7,8,9]
9. print (7,"est dans la liste :", chercher(liste,7)) #True
On teste :
16. print (7,"est dans la liste :", chercher(liste,7)) #True
Exercice 6.6
On teste :
7. liste = [0,1,2,3,4,5,6,7,8,9]
8. print(comptage(liste)) #affiche 10
Cette fonction implique une seule boucle for de l'ordre de n itérations
(avec n la dimension de la liste parcourue) et possède un coût en
temps linéaire (donc une complexité linéaire).
Exercice 6.7
Ces trois fonctions impliquent chacune une seule boucle for de l'ordre
de n itérations (avec n la dimension de la liste parcourue) et possèdent
chacune un coût en temps linéaire.
Exercice 6.8
Exercice 6.9
Exercice 6.10
Dans le shell :
0 1 1 2 3 5 8 13 21 34
Exercice 6.11
Exercice-bilan 6.1
1. #Lien
2. def lien(paire,i,j):
3. """ Renvoie True si i et j sont dans paire, False sinon
4. paire : une liste de deux éléments
5. i,j : des entiers"""
6. return paire == [i,j] or paire == [j,i]
7.
8. #amis
9. def amis(Facebk,i,j):
10. """ Renvoie True si i et j sont amis dans Facebk, False sinon
11. Facebk : une liste de listes de deux éléments
12. i,j : des entiers
13. paire : une liste"""
14. for paire in Facebk:
15. test = lien(paire,i,j)
16. if test == True:
17. return test
18. return False
19.
20. Facebk = [[1,2],[1,4],[2,3],[3,5],[4,5]]
21. print(amis(Facebk,1,2)) #True car Julie et Tom sont amis
22. print(amis(Facebk,3,4)) #True car Sam et Portillon ne sont pas
amis
23.
24. #ajout_amis
25. def ajout_amis(Facebk,i,j):
26. """Modifie la liste Facebk si [i,j] n'y figure pas déjà
27. Facebk : une liste de listes de deux éléments
28. i,j : des entiers"""
29. if amis(Facebk,i,j)==False :
30. Facebk.append([i,j])
31.
32. Facebk = [[1,2],[1,4],[2,3],[3,5],[4,5]]
33. print(Facebk) #pour vérifier le contenu de Facebk
34. ajout_amis(Facebk,3,4)
35. print(Facebk) #[[1,2],[1,4],[2,3],[3,5],[4,5],[3,4]] : Sam et
Portillon sont bien amis à présent
36.
37. #liste_amis
38. def liste_amis(Facebk,i):
39. """Etablit la liste des amis de i dans le réseau Facebk
40. Facebk : une liste de listes de deux éléments
41. amis, paire : des listes
42. i,j : des entiers"""
43. liste=[]
44. for paire in Facebk:
45. if i in paire:
46. liste.append(paire) #On stocke les paires qui incluent i
47. amis=[]
48. for couple in liste:
49. for j in couple:
50. if j!=i:
51. amis.append(j) #On stocke les amis de i
52. return amis
53.
54. print(liste_amis(Facebk,2)) #Tom est bien ami avec Julie et Sam
Exercice-bilan 6.2
1. #Différence
2. def vdif(liste1, liste2) :
3. """Effectue la différence de deux listes terme à terme
4. liste1, liste 2 et liste 3 des listes """
5. n = len(liste1) #nombre éléments de liste1
6. liste3 = [] #liste3 vide
7. for i in range(n) : #i parcourt les indices de liste1
8. liste3.append(liste1[i]-liste2[i])
9. #ajoute en fin de liste3
10. return liste3
11.
12. liste1 = [1,2,3]
13. liste2 = [4,5,6]
14. print(vdif(liste1, liste2)) # [-3,-3,-3]
15.
16. #Somme
17. def vsom(liste1, liste2) :
18. """Effectue la somme de deux listes terme à terme
19. liste1, liste 2 et liste 3 des listes """
20. n = len(liste1) #nombre d'éléments de liste1
21. liste3 = [] #liste3 vide
22. for i in range(n) : #i parcourt les indices de liste1
23. liste3.append(liste1[i]+liste2[i])
24. #ajout en fin de liste3
25. return liste3
26.
27. print(vsom(liste1, liste2)) # [5,7,9]
Ces deux fonctions impliquent chacune une seule boucle for de l'ordre
de n itérations (avec n la dimension de la liste parcourue). En effet le
range(n) crée n valeurs. Les fonctions possèdent chacune un coût en
temps linéaire.
Corrigé des exercices de type EC -
QCM
Exercice EC 6.1
a) (1,5,3)
b) un tuple
c) (1,3,5)
d) (1,3,3)
Exercice EC 6.2
Exercice EC 6.3
a) L.append(i)
b) L+(i)
c) L = L+[i]
d) L = [0,1,2,3,4]
Exercice EC 6.4
a) i in range(liste) :
b) i in range(len(liste)) :
c) i in liste :
d) i in range(liste)
Thème G
Algorithmique
Chapitre 7
Recherche d'une valeur dans une
liste
Cours
La façon la plus simple de chercher une valeur dans une liste est de
parcourir un à un les éléments de la liste (de manière séquentielle) et
de comparer ces éléments à la valeur recherchée. Ceci a déjà été
effectué au chapitre précédent avec la fonction chercher de l'exercice
6.5 :
1. def chercher(liste,x):
2. """ Renvoie True si x est dans liste, False sinon
3. x : un entier
4. liste : une liste"""
5. for i in liste: #i parcourt les éléments de la liste
6. if i==x: #i comparé à x
7. return True
8. return False #toute la boucle a été effectuée sans trouver x
On teste :
9. liste = [0,1,2,3,4,5,6,7,8,9]
10. print (7,"est dans la liste :", chercher(liste,7)) #True
Complexité en temps
La fonction chercher impliquant une seule boucle for de l'ordre de n
itérations (avec n la dimension de la liste parcourue) ou bien faisant
appel à « x in liste » possède un coût en temps linéaire (donc une
complexité linéaire). Aussi le temps de calcul de cette fonction est
proportionnel à la longueur de la liste.
Il y a plus efficace, il s'agit de la recherche dichotomique. Cependant
la liste doit au préalable être triée.
Un peu d'histoire
debut ← 0
fin ← n-1
m ← int((debut+fin)/2)
tant que debut <= fin
si v = liste[m] alors
renvoyer m
sinon si liste[m] >v alors
fin ← m
sinon
debut ← m+1
fin si
m ← int((debut+fin)/2)
fin tant que
Remarque
debut, fin sont des indices. m est l'indice du milieu de la liste, on doit le transformer au
format entier avec int.
Soit en Python :
1. def dichotomie(liste,v):
2. """ Recherche l'entier v dans une liste triée
3. Renvoie la position de v s'il est dans liste, False sinon
4. liste : une liste triée
5. v : un entier"""
6. debut = 0 #indice de debut initialisé à 0
7. fin = len(liste)-1
8. #indice de fin initialisé à l'indice maximum de liste
9. m = int((debut+fin)/2) #renvoie la partie entière
10. while debut <= fin : #s'arrête dès que debut > fin
11. if liste[m] == v : #si v est trouvé
12. return m #on renvoie son indice
13. elif liste[m] > v :
14. fin = m-1 #on cherche dans la liste inférieure
15. else :
16. debut = m+1 #on cherche dans la liste supérieure
17. m = int((debut+fin)/2) #m actualisé
18. return False #on n'a pas trouvé v
19.
20. liste = [1,3,6,9]
21. print(dichotomie(liste,9)) #affiche 3
Coût en temps
On veut comparer l'ordre de grandeur des temps d'exécution Tn
rencontrés pour des algorithmes de recherche d'un entier
(quelconque) dans une liste triée. On détermine expérimentalement le
temps de calcul Tn pour des listes de longueurs n différentes : n = 102
et n = 105. Les calculs tournent sur un ordinateur pour lequel une
opération possède un temps unitaire de 10−9 s.
Type de recherche Tn si n = 102 Tn si n = 105
Compétence attendue
Exercice 7.1
► Analyser, traduire
Exercice 7.2
► Traduire, développer
Julie 1
Tom 2
Sam 3
Portillon 4
Charlie 5
Exercice EC 7.1
1 min ● 3 points
Citer un (ou plusieurs) inconvénient(s) à la recherche d'un entier dans
une liste par la méthode de dichotomie ?
Réponses :
a) La liste ne doit pas être trop longue (maximum 10000 termes).
b) La liste doit être triée.
c) La liste ne peut pas contenir des entiers négatifs.
d) La liste sera modifiée en fin de recherche.
Exercice EC 7.2
1 min ● 3 points
Quelle est le coût en temps de la fonction suivante ?
1. def chercher(liste,x):
2. if x in liste:
3. return True
4. return False
Réponses :
a) Il s'agit d'un coût logarithmique.
b) Il s'agit d'un coût linéaire
c) Il s'agit d'un coût quadratique.
d) Il s'agit d'un coût semi-logarithmique.
Exercice EC 7.3
1 min ● 3 points
Quelle est le coût en temps de la fonction suivante ?
1. def dichotomie(liste,v):
2. debut = 0
3. fin = len(liste)-1
4. m = int((debut+fin)/2)
5. while debut <= fin :
6. if liste[m] == v :
7. return m
8. elif liste[m] > v :
9. fin = m-1
10. else :
11. debut = m+1
12. m = int((debut+fin)/2)
13. return False
Réponses :
a) Il s'agit d'un coût logarithmique.
b) Il s'agit d'un coût linéaire
c) Il s'agit d'un coût quadratique.
d) Il s'agit d'un coût semi-logarithmique.
Exercice EC 7.4
1 min ● 3 points
On cherche l'entier 8 dans une liste L de n = 20000 termes triée :
L = [1, 4, 9, 8, 10, 12, 13, 15, 16, …, 100, …, 199999, 200000]
Il n'y a pas de doublons dans cette liste. Quelle sera la fonction la plus
rapide ?
1. def chercher(liste,v):
2. if v in liste:
3. return True
4. return False
5.
6. def dichotomie(liste,v):
7. debut = 0
8. fin = len(liste)-1
9. m = int((debut+fin)/2)
10. while debut <= fin :
11. if liste[m] == v :
12. return m
13. elif liste[m] > v :
14. fin = m-1
15. else :
16. debut = m+1
17. m = int((debut+fin)/2)
18. return False
Réponses :
a) La fonction chercher.
b) La fonction dichotomie.
c) Aucune des deux : le temps de calcul sera à peu près le même.
d) La fonction dichotomie qui fait appel à chercher.
Corrigé des exercices
Exercice 7.1
Conseils
Se souvenir des fonctions du cours.
On obtient :
La durée du calcul pour dichotomie est : 2.6941299438476562e-05 s
La durée du calcul pour chercher est : 0.013746976852416992 s
Conseils
Se souvenir qu'on accède au premier élément d'une liste avec liste[0], le second
avec liste[1].
Corrigé des exercices de type EC -
QCM
Exercice EC 7.1
Exercice EC 7.2
Exercice EC 7.3
Exercice EC 7.4
a) La fonction chercher.
b) La fonction dichotomie.
c) Aucune des deux : le temps de calcul sera à peu près le même.
d) La fonction dichotomie qui fait appel à chercher.
1 Nécessité de trier
Les méthodes de tri sont essentielles dans la
manipulation de données. En effet, une fois
des données stockées (comme des livres
rangés dans une bibliothèque, des mots
rangés dans un dictionnaire, des copies de
baccalauréat stockées dans un centre
d'examen), on souhaite y accéder et ce travail
est facilité lorsque les données sont triées.
Un peu d'histoire
Depuis les débuts de l'informatique, les algorithmes de tri ont fait
l'objet de nombreuses recherches.
Betty Holberton (née Snyder), qui a travaillé sur ENIAC et UNIVAC
(les premiers ordinateurs), compte parmi les auteurs des premiers
algorithmes de tri (vers 1951). De nouveaux algorithmes sont toujours
en cours d'invention, comme le Timsort assez récent
car datant de 2002.
Le tri par insertion et le tri par sélection sont simples à écrire mais
assez peu performants d'un point de vue complexité temporelle. Il est
possible de les écrire en place et donc d'avoir une assez bonne
complexité spatiale.
Remarque
Si la liste t est une liste de listes comme [[a1,b1],[a2,b2]]. Le tri s'applique par défaut aux
premiers éléments de chaque sous-liste : a1 et a2 ici.
2 Tri par insertion
Principe
Il s'agit du principe du tri d'un jeu de cartes (on range une carte
piochée dans son jeu déjà̀ classé). Pour l'appliquer, on parcourt les
éléments d'une liste et on insère successivement chaque élément
dans la liste déjà triée.
Cet algorithme est assez lent, en revanche le tri par insertion est
relativement efficace lorsqu'il s'agit de trier de courtes listes. Il est
assez simple à écrire. Il s'agit d'un tri en place.
Exemple : On veut trier les éléments 9, 3, 1 (un as), 6 représentés
par la liste [9,3,1,6]
n ← nombre d'éléments de t
pour i allant de 1 à n-1
tant que i > 0 et t[i] < t[i-1]
permuter t[i] et t[i-1]
i ← i - 1
fin tant que
fin pour
Indice de lecture : i = 1
boucle for : t[1] analysé sur la boucle for : l'élément est jaune.
boucle while : en gris t[0] comparé à t[1]. Donc permutation entre le
« 3 » et le « 9 ».
Indice de lecture : i = 2
Indice de lecture : i = 3
Complexité temporelle
On s'intéresse au nombre de comparaisons effectuées.
● Dans le meilleur des cas : la liste est déjà triée par ordre croissant.
La boucle for effectue n – 1 itérations : on effectue n – 1
comparaisons. Soit de l'ordre de n opérations. On dit que le coût en
temps est linéaire.
● Dans le pire des cas : la liste est triée par ordre décroissant. La
boucle for effectue toujours n – 1 itérations (soit de l'ordre de n
opérations). i varie de 1 à n − 1. À chaque pas, la boucle while
effectue i comparaisons. Le nombre de comparaisons au total est :
1 + 2 + … + (n − 2) + (n − 1) : soit de l'ordre de n opérations
La boucle while étant imbriquée dans la boucle for, on effectue au
maximum de l'ordre de n × n opérations. On dit que le coût en
temps est quadratique.
Validité du tri
On choisit comme invariant de boucle H : « la liste L[0:i+1] est triée
par ordre croissant à l'issue de l'itération i ».
Initialisation
Avant d'entrer dans la boucle, i = 0, la liste est constituée du terme au
rang 0 : [L[0]]. Ce qui est identique à L[0:0+1]. Cette liste constituée
d'un seul terme est forcément triée. Donc l'hypothèse H est vraie.
Conservation
On se place à la
fin de l'itération i. la liste
L[0:i+1] = [L[0], L[1], …,L[i]] est supposée triée dans l'ordre croissant
si H est vraie. On effectue un nouveau tour de boucle donc on se
place à l'itération i + 1. La boucle effectue le tri au rang i + 1 :
1. while i+1>0 and t[i+1] < t[i]: #au rang i+1 au lieu de i, teste si
t[i+1] mal placé
2. t[i],t[i+1]=t[i+1],t[i] #permute t[i+1] et t[i]
3. …
Alors la liste L[0:i+2] = [L[0], L[1], …, L[i], L[i+1]] devient triée dans
l'ordre croissant. L'hypothèse H reste vraie.
Terminaison
En sortie de boucle, i a pris sa dernière valeur i = n − 1, et la boucle
permet d'effectuer le tri au rang n − 1 :
1. while n-1>0 and t[n-1] < t[n-2]: #au rang n-1 au lieu de i, teste
si t[n-1] mal placé
2. t[n-2], t[n-1] = t[n-1], t[n-2] #permute t[n-1] et t[n-2]
3. …
Principe
On parcourt les éléments d'une liste et on cherche le minimum, on le
permute avec le premier élément de la liste. Puis on parcourt le reste
des éléments de la liste et on cherche le nouveau minimum, on le
permute avec le nouveau premier élément de la liste, etc.
Exemple : On veut trier les éléments 9, 3, 1 (un as), 6 représentés
par la liste [9,3,1,6] donc le jeu de cartes suivant :
Pour cela, on cherche le minimum (le « 1 » donc l'as). On le
permute avec le « 9 ».
Pseudo-code
Le principe est le suivant : on utilise deux fonctions afin de trier une
liste t de n éléments. La fonction minimum détermine l'indice du
minimum d'une liste t[j,n-1] donc comprise entre les indices j et n-1.
Soit le pseudo-code de la fonction minimum(t,j) :
indice ← j
mini ← t[j]
n ← nombre d'éléments de t
pour i allant de j+1 à n-1
si t[i] < mini
indice ← i
mini ← t[i]
fin si
fin pour
renvoyer indice
n ← nombre d'éléments de t
pour i allant de 0 à n-2
i_min ← minimum(t,j)
si i différent de j alors
permuter t[i] et t[j]
fin si
fin pour
Remarque
Il n'y a pas de return car cette fonction ne renvoie rien. Elle modifie t en place.
Pour vérifier l'impact sur la liste t, il faut bien un print(t), car tout
comme pour le tri par insertion, la fonction en elle-même ne renvoie
rien. L'affichage donne : [1, 3, 6, 9]
Ainsi la liste t a été modifiée et triée.
Complexité temporelle
On s'intéresse au nombre de comparaisons effectuées.
La liste est triée par ordre décroissant. La boucle for de tri_selection
effectue n − 1 itérations (soit de l'ordre de n opérations). À chaque
itération, la fonction minimum est appelée. Elle même effectue n − (j + 1)
itérations. Soit de l'ordre de n opérations.
On a globalement de l'ordre de n × n opérations. On dit que la
complexité est quadratique.
Validité du tri
En choisissant l'invariant de boucle H : « la liste L[0:i+1] est triée par
ordre croissant à l'issue de l'itération i », on peut montrer de la même
manière que pour le tri par insertion que cet algorithme est valide.
4 Ordre de grandeur des temps d'exécution
On peut illustrer l'ordre de grandeur des temps d'exécution Tn
rencontrés pour des algorithmes de tri vus dans ce chapitre et celui du
tri fusion non développé dans ce livre. Pour cela, il suffit de déterminer
expérimentalement le temps de calcul Tn pour des listes de longueurs
n différentes : on reprend ici n = 102 et n = 105 comme dans le
chapitre précédent. Les calculs tournent sur un ordinateur pour lequel
une opération possède un temps unitaire de 10−9 s.
Insertion 10−5 s 10 s
Sélection 10−5 s 10 s
On se rend compte que les tris par sélection et par insertion sont donc
simples mais assez lents en termes d'exécution en particulier pour
des listes longues.
Exercices
Compétence attendue
➡ Savoir mettre en œuvre une méthode de tri : tri par insertion ou tri sélection.
Exercice 8.1
► Analyser, concevoir
Exercice 8.2
► Analyser, concevoir
Exercice 8.3
► Analyser, traduire
On souhaite cette fois trier la liste de listes Pers selon le numéro (donc
situé en deuxième position dans les sous-listes) :
Pers = [['Sam',3], ['Julie',1], ['Tom',2], ['Portillon',4],
['Charlie',5]]
Mais cette fois, seul un élément est mal trié. Il s'agit de la liste
['Sam',3] qui correspond à l'élément de Pers d'indice i=0, soit l'élément
Pers[0]. Proposer une fonction mettant en œuvre un algorithme de tri
conçu par vous-même permettant de trier la liste Pers. On ne replacera
que l'élément mal placé, sans trier toute la liste.
Pour cela, on pourra utiliser les lignes (dans l'ordre de votre choix) :
1. del Pers[0] #afin de supprimer l'élément mal placé et
2. Pers.insert(i, mal_placee) #afin d'insérer la liste mal_placee (à
déterminer) à l'indice i (à déterminer).
Exercices de type EC - QCM
Exercice EC 8.1
1 min ● 3 points
On dispose de la fonction suivante :
1. def mystere(t):
2. n = len(t)
3. for i in range(1,n):
4. while i>0 and t[i] < t[i-1]:
5. t[i-1],t[i] = t[i],t[i-1]
6. i = i - 1
Exercice EC 8.2
1 min ● 3 points
On dispose de la fonction suivante :
1. def qui_suisje(t):
2. n = len(t)
3. for j in range(n-1):
4. indice = minimum(t, j)
5. if indice != j:
6. t[indice], t[j] = t[j], t[indice]
De quel type d'algorithme s'agit-il ?
Réponses :
a) Il s'agit d'un tri à bulles
b) Il s'agit d'un algorithme de dichotomie
c) Il s'agit d'un tri par insertion
d) Il s'agit d'un tri par sélection
Exercice EC 8.3
1 min ● 3 points
On dispose de la fonction de tri suivante :
1. def tri(t):
2. n = len(t)
3. for i in range(1,n):
4. while i>0 and t[i] < t[i-1]:
5. t[i-1],t[i] = t[i],t[i-1]
6. i = i - 1
Exercice 8.1
Exercice 8.2
Erreurs à éviter
Il ne faut pas permuter t[i][1] mais bien t[i], la sous-liste complète.
Exercice 8.3
Exercice EC 8.1
Exercice EC 8.2
Exercice EC 8.3
1 Un peu d'histoire
Dans un rapport de la faculté de médecine aéronautique de la US Air
Force publié en 1951, Fix et Hodges introduisirent une méthode pour
la classification des motifs, connue depuis sous la règle des k plus
proches voisins (Fix & Hodges, 1951).
2 Principe
L'algorithme des k plus proches voisins s'écrit en abrégé k-NN ou
KNN, de l'anglais k-nearest neighbors. k est un nombre entier positif
généralement petit.
Il s'agit d'un des algorithmes de machine learning ou « apprentissage
machine » qui est essentiel dans le milieu de l'intelligence artificielle.
Le principe peut être résumé par « Dis-moi qui sont tes amis, et je te
dirai qui tu es ». Ou bien encore « Celui qui marche avec des hommes
sages sera sage, mais le compagnon d'imbéciles souffrira »
(proverbe).
Ce genre d'algorithme permet par exemple de prédire le
comportement d'une personne en s'intéressant à son milieu. Il peut
être utilisé par des géants de la vente comme Amazon, Netflix, iTunes
afin de prévoir si vous seriez ou non intéressé par un produit (ou un
film, une musique). En effet, en disposant de vos données (âge,
derniers achats etc.) et en les comparant à celle d'un client qui a
acheté un produit, un algorithme peut tâcher de prédire si vous seriez
intéressé ou non par le produit.
Les utilisations de k-NN sont encore plus larges que celles décrites ci-
dessus. De manière générale, cet algorithme peut être utilisé selon
deux objectifs :
● Pour effectuer une régression : on calcule la moyenne des valeurs
des k plus proches voisins d'un élément et on attribue cette
moyenne à l'élément étudié.
● Pour effectuer une classification : on cherche le résultat majoritaire
des classes d'appartenance des k plus proches voisins d'un
élément. On attribue la classe de l'élément suivant le résultat
obtenu. Si k = 1, alors l'élément est assigné à la classe de son
proche voisin.
3 Algorithme et fonctions
Dans le cadre du programme de NSI, on s'intéressera uniquement à
prédire la classe d'un nouvel élément (dont la position est connue)
faisant partie d'un ensemble de points dont les coordonnées et la
classe sont connues.
Aussi pour cet élément il faudra :
● Évaluer la distance qui sépare le nouvel élément de chacun des
autres points de l'ensemble. Chaque point de l'ensemble est
caractérisé par son indice noté i.
● Stocker ces valeurs de distance d dans une liste du type : [[d,i],[…],
[…], …]. Avec d la distance qui sépare le nouvel élément du point
d'indice i.
● Trier la liste selon les valeurs des distances d.
● Choisir les k premiers points de la liste triée (donc les k plus proches
voisins)
● Assigner une classe au nouvel élément en fonction de la majorité
des classes représentées parmi les k plus proches voisins.
On mettra en œuvre trois fonctions :
● Une fonction distance pour le calcul de la distance entre deux points
de coordonnées connues.
● Une fonction Kvoisins qui détermine les k plus proches voisins d'un
nouvel élément.
● Une fonction predire_classe qui détermine le résultat majoritaire des
classes d'appartenance des k plus proches voisins et assigne la
classe du nouvel élément à cette classe majoritaire.
Principe
Suivant que l'on raisonne sur une, deux, trois dimensions, le calcul de
la distance entre deux points est plus ou moins simple.
Remarque
Pour simplifier les choses, on s'attachera dans ce livre à écrire un algorithme pour un
espace à une seule dimension.
Principe
La liste des classes des éléments (le rond vert exclus) est :
Classes = ['T','C','C','T','T','C','C']#classes de l'espace 1D, 'C'
pour carré, 'T' pour triangle
Donc par exemple, l'élément de coordonnée 3.7 (et d'indice 3 car c'est
le quatrième et les indices en Python démarrent à 0) est un triangle.
L'élément de coordonnée 2.0 (et d'indice 2) est un carré. L'élément de
coordonnée 1.0 (et d'indice 1) est un carré. Ces trois éléments sont
les trois plus proches voisins du rond vert.
Il reste à présent à écrire une fonction Kvoisins qui prend en arguments
d'entrée une liste L de coordonnées des éléments (des flottants), un
entier k, et x la position d'un nouvel élément x et qui renvoie la liste des
indices dans L des k plus proches voisins de x. x ne fait pas partie de
la liste L.
Soit en pseudo-code :
n ← nombre d'éléments de L
listeDistanceIndice ← liste vide
pour i allant de 0 à n-1
d ← distance entre x et L[i]
ajouter [d,L[i]] en fin de listeDistanceIndice
fin pour
Trier listeDistanceIndice selon d
Voisins ← liste vide
pour i allant de 0 à k-1
ajouter listeDistanceIndice[i][1] à la fin de Voisins
fin pour
renvoyer Voisins
Fonction Kvoisins
Ce qui donne en Python :
1. def Kvoisins(L,k,x):
2. """renvoie la liste des indices des k plus proches voisins de x
3. x : la position de x, un flottant
4. L : une liste de positions (des flottants) correspondant aux
coordonnées des divers voisins de x
5. k : un entier
6. listeDistanceIndice : [[d,i],[],.] une liste des distances d des
éléments/x et leur indice i dans L
7. Voisins : une liste des indices des k + proches voisins"""
8. listeDistanceIndice = []
9. for i in range(len(L)):#on crée une liste [[d,i],[],.]
10. d = distance(x,L[i])
11. listeDistanceIndice.append([d,i])
12. listeDistanceIndice.sort()#on trie selon la distance (le
1er élément de chaque sous-liste [d,i]
13. Voisins = []#on crée une liste des indices des voisins
14. for i in range(k):#on crée une liste de k voisins
15. Voisins.append(listeDistanceIndice[i][1])#on ajoute l'indice à la
liste Voisins
16. return Voisins
17.
18. L = [0.5,1.0,2.0,3.7,5.1,6.0,7.0]#espace 1D sans le rond vert
19. Classes = ['T','C','C','T','T','C','C']#classes de l'espace 1D,
'C' pour carré, 'T' pour triangle
20. x = 3.0 #élément à classer
21. k = 3 #3 voisins
22. print("liste d'indices",Kvoisins(L,k,x)) #on veut la liste des
indices des voisins
23. print("liste des voisins",[L[i] for i in Kvoisins(L,k,x)])#on
veut la liste des positions des voisins
Ce qui donne bien dans le shell la liste des indices et les coordonnées
des trois plus proches voisins de x :
liste d'indices [3, 2, 1]
liste des voisins [3.7, 2.0, 1.0]
6 Attribution de classe
Principe
Fonction classe
Il reste donc à écrire une fonction predire_classe qui détermine le
résultat majoritaire des classes d'appartenance des k plus proches
voisins et assigne la classe du nouvel élément à cette classe
majoritaire. Cette fonction admet en arguments d'entrée une liste L de
coordonnées des éléments (des flottants), une liste Classes des
classes des éléments (une liste de chaînes de caractères), un entier k,
et x la position d'un nouvel élément x.
Remarque
On s'intéresse au cas simplifié où il n'existe que deux classes d'appartenance possibles :
'C' et 'T'.
Soit en pseudo-code :
Voisins ← Kvoisins(L,k,x)
Classespossibles ← ['C', 'T']
decompte ← [0, 0]
pour v allant du debut à la fin de Voisins
si Classes[v] est un carré
ajouter 1 au 1er élément de decompte
sinon
ajouter 1 au 2-ième élément de decompte
fin si
fin pour
indice ← indice du maximum de decompte
renvoyer Classespossibles[indice]
Ce qui donne bien 'C' pour « carré » dans le shell, ce qui avait été
anticipé précédemment.
Exercices
Compétence attendue
Exercice 9.1
► Concevoir, mobiliser
Pour la répartition ci-dessus, la classe des points 1 à 4 est connue :
elle est de type triangle ou carré.
➡ Sans coder, appliquer la méthode k-NN avec k = 3 successivement
aux points 5 à 8 afin de donner leur classe.
Exercice 9.2
► Concevoir, mobiliser
Compétence attendue
Exercice 9.3
► Traduire, développer
La fonction Kvoisins élaborée dans la partie cours de ce chapitre peut
être réécrite sans faire appel à une méthode de tri :
1. def Kvoisins(L,k,x):
2. listeDistances = []
3. for i in range(len(L)):
4. listeDistances.append(distance(x,L[i]))
5. Voisins = []
6. for i in range(k) :
7. d = distance(L[0],x)
8. for j in range(len(L)):
9. if listeDistances[j] != 0 and listeDistances[j] < d and j not in
Voisins:
10. d = listeDistances[j]
11. indice = j
12. Voisins.append(indice)
13. return Voisins
Compétence attendue
Exercice 9.4
► Traduire, développer
Soit un espace à deux dimensions. Chaque point est repéré par ses
coordonnées [x,y]. On rappelle que la distance qui sépare deux points
de coordonnées c1 = [x1,y1] et c2 = [x2,y2] peut être calculée comme
suit :
Exercice-bilan 9.1
30 min ● 10 points
Écrire une fonction lePlusProcheVoisin qui prend en argument d'entrée
une liste L de données (chaque donnée correspond à une
coordonnée) et x la coordonnée d'un l'élément x et qui renvoie l'indice
dans L du plus proche voisin de x (situé à une distance non nulle).
On pourra faire appel pour cela à une fonction distance qui pour deux
points de coordonnées x1 et x2, renvoie la distance que sépare ces
deux points.
Par exemple pour L = [10.0,6.0,1.0,7.0] et x = 5.0, alors
lePlusProcheVoisin(L,x) doit renvoyer 1 qui est l'indice de la coordonnée
x = 6.0 dans la liste L.
Aide
On pourra s'appuyer sur le principe des fonctions maximum et minimum élaborées au
chapitre 6.
Exercice-bilan 9.2
30 min ● 10 points
Pour la répartition ci-dessus, la classe des points 0 à 7 est connue :
elle est de type triangle 'T', carré 'C' ou rond 'R'.
● À partir de l'image ci-dessus, sans coder, appliquer un k-NN avec
k = 3 au point 8 afin de déterminer la nouvelle classe de ce point
(parmi triangle 'T', carré 'C' ou rond 'R').
On va à présent coder la méthode k-NN afin de résoudre le problème.
● Écrire une liste L des coordonnées des points 0 à 7. On peut
considérer que la coordonnée du point 0 vaut 0.0, celle du point 1
vaut 1.0.
● Écrire une liste Classes correspondant aux classes des points 0 à 7.
● On souhaite écrire un programme permettant de mettre en œuvre la
méthode k-NN avec k = 3 au point 8 de coordonnée x=3.0. Le but est
d'attribuer sa classe. On pourra faire appel aux fonctions Kvoisins()
et distance de ce chapitre ainsi qu'à la fonction suivante de prédiction
de classe (valable pour trois classes possibles) :
1. def predire_classe(L,Classes,k,x):
2. """renvoie la classe du nouvel élément x
3. x : la position de x, un flottant
4. L : une liste de positions (des flottants) correspondant aux
divers éléments voisins de x
5. Classes : la liste des classes, 'C' pour carré, 'T' pour triangle,
'R' pour rond
6. k : un entier
7. Voisins : une liste des indices des plus proches voisins
8. Classespossibles : la liste des classes possibles
9. """
10. Voisins = Kvoisins(L,k,x)#liste des indices des k plus proches
voisins
11. Classespossibles = ['C','T','R'] #liste classes possibles
12. decompte = [0,0,0]#decompte des classes
13. for v in Voisins : #on parcourt les indices des k plus proches
voisins
14. for i in range(len(Classespossibles)):#on parcourt les indices
des classes possibles
15. if Classes[v] == Classespossibles[i]:
16. decompte[i] += 1
17. plusGrandDecompte = decompte[0]
18. indice = 0
19. for i in range(1,len(Classespossibles)):
20. if decompte[i] > plusGrandDecompte:
21. plusGrandDecompte = decompte[i]
22. indice = i
23. return Classespossibles[indice]
Exercice-bilan 9.3
30 min ● 10 points
Un vaisseau spatial est positionné
proche du soleil, sa coordonnée est
fixée à x = 0. On suppose les planètes
du système solaire alignées sur un
même axe Ox et repérables par leur
coordonnée x. On dispose d'une liste :
planetes = du type
[['Mercure',0.39],['Terre',1.0],['Venus',0.72]]
['nom',coordonnée]. Chaque coordonnée x est en unité astronomique
UA.
Le vaisseau va parcourir les trois planètes une à une en choisissant à
chaque fois la planète la plus proche de lui-même. Construire la liste
représentant la trajectoire du vaisseau : on veut obtenir une liste de
noms.
Aide
On pourra se servir de l'instruction planete.pop(i) qui permet de supprimer l'élément
d'indice i de la liste planete.
Il est possible de reprendre la fonction lePlusProcheVoisin en l'adaptant au
problème étudié.
Exercices de type EC - QCM
Exercice EC 9.1
1 min ● 3 points
Exercice EC 9.2
1 min ● 3 points
L'algorithme des k plus proches voisins est un algorithme de :
Réponses :
a) tri
b) recherche d'une valeur dans une liste
c) classification
d) calcul de maximum très efficace
Corrigé des exercices
Exercice 9.1
Exercice 9.2
Exercice 9.3
On teste :
1. L = [0.5,1.0,2.0,3.7,5.1,6.0,7.0]
2. x = 3.0 #élément à classer
3. k = 3 #3 voisins
4. print("liste d'indices",Kvoisins(L,k,x)) #on veut la liste des
indices des voisins
5. print("liste des voisins",[L[i] for i in Kvoisins(L,k,x)])#on veut
la liste des coordonnées des voisins
Et on obtient :
liste d'indices [3, 2, 1]
liste des voisins [3.7, 2.0, 1.0]
Exercice 9.4
On écrit le programme :
1. from math import sqrt
2.
3. def distance_2D(c1,c2):
4. """renvoie la distance séparant deux points
5. c1, c2 : deux listes de coordonnées du type [x,y]"""
6. [x1,y1] = c1
7. [x2,y2] = c2
8. return sqrt((x1-x2)**2+(y1-y2)**2)
On le teste :
1. c1 = [1.0,1.0]
2. c2 = [0.0,0.0]
3. print(distance_2D(c1,c2))
Exercice-bilan 9.1
● Les trois plus proches voisins du point 8 sont : 5 (classe rond 'R'), 2
(classe carré 'C') et 7 (classe rond 'R'). La classe majoritaire est
rond. Ainsi 8 sera de classe rond : 'R'.
● La liste L donne L = [0,1,3.6,4.3,2.0,2.7,1.2,3.9]
Erreur à éviter
Attention à respecter l'ordre des points !
Exercice-bilan 9.3
Exercice EC 9.1
a) 'T'
b) 'C'
c) 'R'
d) impossible de conclure : il y a autant de ‘T’ que de ‘R’
Les trois plus proches voisins du point 8 sont : 5 (classe rond 'R'), 2
(classe carré 'C') et 7 (classe rond 'R'). La classe majoritaire est rond.
Ainsi 8 sera de classe rond : 'R'.
Exercice EC 9.2
a) tri
b) recherche d’une valeur dans une liste
c) classification
d) calcul de maximum très efficace
Chapitre 10
Algorithmes gloutons
Cours
Principe
Un des grands classiques est le problème du rendu de monnaie où
l'on souhaite rendre une somme en utilisant le moins de pièces (ou de
billets) possibles. Le principe de l'algorithme consiste à répéter le
choix de la pièce de plus grande valeur qui ne dépasse pas la
somme restante.
Remarque
On dit qu'il s'agit d'un algorithme glouton car il choisit la pièce la plus grosse à chaque étape
sans réfléchir à la suite.
Pseudo-code
En pseudocode, on peut écrire :
Fonction rendu_monnaie
La fonction rendu_monnaie suivante permet pour un montant appelé somme
que l'on doit rendre et une liste de pièces disponibles pieces, de
renvoyer la liste des pièces à rendre (la liste choisies).
Remarque
On suppose que l'on dispose d'un nombre de pièces illimité. Dans cette liste choisies, un 1
en indice i indique que la pièce d'indice i est retenue, un 2 que la pièce d'indice i est
retenue deux fois, etc. et un 0 qu'elle n'est pas retenue.
1. def rendu_monnaie(somme,pieces):
2. """Fournit la solution au problème du rendu de monnaie
3. somme : la somme à rendre, un entier
4. pieces : les types de pièces possibles, une liste d'entiers
classée dans le sens décroissant
5. choisies : une liste indiquant le nombre de pièces choisies pour
chacune des pièces
6. """
7. n = len(pieces)
8. choisies = [0]*n #liste de compteurs des pièces choisies
9. for i in range(n):#pour i allant de 0 à n-1
10. while somme >= pieces[i] :
11. somme = somme-pieces[i]#mise à jour de la somme à rendre
12. choisies[i] = choisies[i] + 1 #on augmente de 1 le compteur de la
pièce choisie
13. return choisies
Le shell affiche :
Les pièces choisies sont :
[1, 1, 1, 0, 0, 0, 0, 0, 0]
Il faut donc une pièce de 500 (billet de 5 euros), une pièce de 200
(2 euros) et une pièce de 100 (1 euro).
Cette fois on souhaite rendre 7 euros (700 centimes) :
18. somme = 700
19. print("Les pièces choisies sont :")
20. print(rendu_monnaie(somme,pieces))
Le shell affiche :
Les pièces choisies sont :
[1, 1, 0, 0, 0, 0, 0, 0, 0]
Il faut donc une pièce de 500 (billet de 5 euros), et une pièce de 200
(2 euros).
Cette fois on souhaite rendre 6 euros à partir des pièces fictives
4 euros, 3 euros, 1 euro :
1. pieces = [4,3,1]
2. somme = 6
3. print("Les pièces choisies sont :")
4. print(rendu_monnaie(somme,pieces))
Le shell affiche :
Les pièces choisies sont :
[1, 0, 2]
Il faut donc une pièce de 4 euros, et deux d'un euro. Alors qu'en effet
deux pièces de 3 euros seraient un rendu plus optimal car moins de
pièces seraient rendues.
Remarque
Il existe d'autres méthodes de programmation plus complexes du rendu de monnaie
(comme la programmation dynamique) mais elles ne seront pas développées dans cet
ouvrage car hors programme de NSI.
Principe
Un peu d'histoire
Pseudo-code
On dispose d'une liste de valeur des objets et de leur poids du type :
objets = [[valeur,poids],[…,…],…]
Fonction remplir_sac
On trie d'abord la liste objets selon les valeurs décroissantes puis on
remplit le sac. Ce qui donne en Python :
1. def remplir_sac(objets,poids_max):
2. """Fournit la solution au problème du sac à dos
3. poids_max : un flottant à ne pas excéder
4. objets : une liste de listes du type [valeur,poids] triée par
ordre décroissant de valeurs
5. objets_choisis : une liste de 1 ou de 0 indiquant si tel ou tel
objet est retenu
6. """
7. P = 0 #on initialise P
8. n = len(objets) #nombre d'objets
9. objets_choisis = [0]*n #on initialise la liste
10. for i in range(n):
11. if P + objets[i][1] <= poids_max :
12. objets_choisis[i] = 1 #objet choisi
13. P = P + objets[i][1] #le poids du sac est augmenté
14. return objets_choisis
Ce qui donne dans le shell la liste triée tout d'abord et les objets
choisis :
[[5, 0.5], [3, 4], [2, 1], [1, 0.2]]
Remarque
Dans la liste objets_choisis, un 1 en indice i indique que l'objet d'indice i est retenu, un
0 qu'il n'est pas retenu.
Aussi, on retient : les jumelles (de valeur 5), le chat (de valeur 3), le
livre (valeur 1). Cette solution est celle à laquelle nous sommes déjà
parvenus en déroulant l'algorithme.
Exercices
Compétence attendue
Exercice 10.1
► Traduire, analyser
Exercice 10.2
► Traduire, analyser
Exercice-bilan 10.1
15 min ● 10 points
On souhaite remplir un camion de déménagement de 5 m3, pour cela
on dispose d'une liste de meubles et de leur volume en mètres cubes :
meubles = [['armoire',3],['fauteuil',1.1],['lave vaisselle',1.0],
['lit',0.9],['machine',0.2]]
Exercice-bilan 10.2
15 min ● 10 points
On considère qu'un après-midi actif dure 6 h, on souhaite effectuer un
maximum de choses dans cet après-midi. Ces choses sont classées
par ordre croissant de durée dans la liste suivante :
durees = [1,2,3,4,5]
Exercice EC 10.1
1 min ● 3 points
L'algorithme glouton est un algorithme de :
Réponses :
a) tri
b) recherche d'une valeur dans une liste
c) résolution de problème
d) calcul de maximum très efficace
Exercice EC 10.2
1 min ● 3 points
On souhaite rendre 8 euros (800 centimes) dans le cadre du système
européen de monnaie. On dispose de différentes pièces stockées
dans la liste pieces :
1. pieces = [500,200,100,50,20,10,5,2,1]
2. somme = 800
Exercice EC 10.3
1 min ● 3 points
On souhaite rendre 7 euros (700 centimes) dans le cadre du système
européen de monnaie. On dispose de différentes pièces stockées
dans la liste pieces :
1. pieces = [500,200,100,50,20,10,5,2,1]
2. somme = 700
Exercice 10.1
Exercice 10.2
Exercice-bilan 10.1
Puis on applique à la liste qui est déjà triée par ordre décroissant de
volume :
15. meubles = [['armoire',3],['fauteuil',1.1],['lave vaisselle',1.0],
['lit',0.9],['machine',0.2]]
16. V_max = 5.0
17. print("Les meubles choisis sont :")
18. print(remplir_camion(meubles,V_max))
Exercice-bilan 10.2
Contrairement à l'algorithme glouton classique, on privilégie cette fois
les durées les plus courtes (et non les plus longues) : en effet on veut
effectuer un maximum de choses. Aussi il est bien que la liste durees
soit classée par ordre croissant et non décroissant.
La fonction donne :
1. def journee(durees):
2. """Renvoie le nombre de choses faisables
3. durees : une liste de durées triée par ordre croissant
4. T : un entier, le temps écoulé
5. nb_choses : un entier correspondant au nombre de choses effectuées
6. """
7. n = len(durees) #nombre de choses à faire
8. nb_choses = 0 #on initialise le nombre de choses effectuées
9. T = 0 #on initialise le temps écoulé
10. for i in range(n):
11. if T + durees[i] <= Tmax :
12. nb_choses +=1 #on ajoute une chose faire
13. T = T + durees[i] #le temps écoulé est augmenté
14. return nb_choses
On la teste :
1. durees = [1,2,3,4,5]
2. Tmax = 6
3. print("On peut faire le nombre de choses suivantes :")
4. print(journee(durees))
Exercice EC 10.1
a) tri
b) recherche d’une valeur dans une liste
c) résolution de problème
d) calcul de maximum très efficace
Exercice EC 10.2
Exercice EC 10.3
Un peu d'histoire
Remarque
La liste de listes ci-dessus est aussi appelée table.
2 Rappel sur l'indexation de tables
Dans le chapitre 4, on a vu la notion d'indexation de liste et celle des
listes de listes. On peut noter i les indices (ou index) des listes et j les
sous-indices. Les indices démarrent à 0 en Python. On peut aussi
utiliser des indices (index) négatifs qui démarrent à −1 à partir de la fin
d'une liste.
Par exemple si on définit liste ci-dessous :
Remarque
Donc si on veut appeler l'élément de la liste d'indice i et de sous-indice j, on doit taper :
liste[i][j]
Vocabulaire à connaître
La variable fichier est appelée un descripteur de fichier.
Remarques
La méthode chdir permet de changer de répertoire de lecture.
Ne pas oublier de refermer le fichier sous peine de détériorer son contenu ou causer des
erreurs.
Remarque
Chaque ligne de cette table album est appelée un enregistrement. Par exemple le premier
enregistrement de la table s'affiche grâce à l'instruction print(album[0]) et donne :
['1', 'I Need a Dollar', '4:04', 'Aloe Blacc', 'Good Things', 'R&B/Soul',
'Fichier audio MPEG']
Pour afficher le deuxième (indice 1) et le troisième (indice 2) éléments
de la première ligne (donc l'enregistrement d'indice 0) de la liste
album, il suffit de taper :
1. print(album[0][1])
2. print(album[0][2])
Remarque
Toutes les données stockées dans un fichier .txt ou .csv sont bien au format chaîne de
caractères. Si on souhaite effectuer des calculs par la suite, il faut veiller à convertir les
données au format integer ou float (si elles s'y prêtent bien sûr : c'est-à-dire si elles
correspondent à l'origine à un nombre).
Ce qui donne :
L'enregistrement cherché est : ['2', 'Green Lights', '2:56', 'Aloe
Blacc', 'Good Things', 'R&B/Soul', 'Fichier audio AAC achete']
Ce qui donne :
L'enregistrement cherché est : ['1', 'I Need a Dollar', '4:04', 'Aloe
Blacc', 'Good Things', 'R&B/Soul', 'Fichier audio MPEG']
Remarque
Si la liste t est une liste de listes comme [[a1,b1],[a2,b2]]. Le tri s'applique par défaut
aux premiers éléments de chaque sous-liste : a1 et a2 ici.
Ce fichier texte lu, on peut former une table regroupant les données :
mesures = [['1.378', '1.772'], ['1.379', '1.785'], ['1.395', '1.835'],
['1.396', '1.842'], ['1.378', '1.780'], ['1.369', '1.782'], ['1.378',
'1.811'], ['1.368', '1.784'], ['1.361', '1.779'], ['1.369', '1.792']]
Remarque
Toutes les données issues du fichier .txt sont au format chaîne de caractères.
Une fois les données triées selon les valeurs de tension, cela donne :
[['1.361', '1.779'], ['1.368', '1.784'], ['1.369', '1.782'], ['1.369',
'1.792'], ['1.378', '1.772'], ['1.378', '1.780'], ['1.378', '1.811'],
['1.379', '1.785'], ['1.395', '1.835'], ['1.396', '1.842']]
Remarque
Le tri s'effectue sans problème lorsqu'on l'applique à des nombres mais aussi à des chaînes
de caractères.
Soit :
1. U = [[9, '1.361'], [8, '1.368'], [6, '1.369'], [10, '1.369'], [1,
'1.378'], [5, '1.378'], [7, '1.378'], [2, '1.379'], [3, '1.395'],
[4, '1.396']]
2.
3. I = [[1, '1.772'], [9, '1.779'], [5, '1.780'], [6, '1.782'], [8,
'1.784'], [2, '1.785'], [10, '1.792'], [7, '1.811'], [3, '1.835'],
[4, '1.842']]
Remarque
C'est l'identifiant, attribut commun aux deux tables qui permet de les fusionner de manière
intelligente.
Vocabulaire à connaître
On appelle domaine de valeurs, l'ensemble des valeurs que peut prendre un attribut.
Par exemple :
Identifiant = { 1 ; 2 ; 3 ; …} ;
mesureU = { '1.378', '1.379', '1.395' ; …} ;
mesureI = { '1.772', '1.779', '1.780'; …} ;
Soit :
[[1, '1.378', '1.772'], [2, '1.379', '1.785'], [3, '1.395', '1.835'],
[4, '1.396', '1.842'], [5, '1.378', '1.780'], [6, '1.369', '1.782'],
[7, '1.378', '1.811'], [8, '1.368', '1.784'], [9, '1.361', '1.779'],
[10, '1.369', '1.792']]
Exercices
Compétence attendue
Exercice 11.1
► Traduire
Compétence attendue
➡ Rechercher les lignes d'une table vérifiant des critères exprimés en logique
propositionnelle.
Exercice 11.2
► Traduire
Julie 1
Tom 2
Sam 3
Portillon 4
Charlie 5
1 2
2 3
3 5
4 5
Compétence attendue
➡ Rechercher les lignes d'une table vérifiant des critères exprimés en logique
propositionnelle.
➡ Trier une table suivant une colonne.
➡ Construire une nouvelle table en combinant les données de deux tables.
Exercice 11.3
► Décomposer, traduire
Cette table peut être représentée par une liste de listes palu :
palu = [['Bresil','BR',2009,309316,85],
['Bresil','BR',2010,334667,76],['Kenya','KE',2010,898531,26017],
['Mali','ML',2011,307035,2128]]
Cette table peut être représentée par une liste de listes demographies :
demographies = [['BR',2009,193020000],
['BR',2010,194946000],['KE',2010,40909000],['ML',2011,33987000]]
1) Grâce à un script Python, extraire (sans doublon) le nom des pays
référencés dans la table palu et les classer par ordre alphabétique.
2) Écrire un script Python qui partir des deux tables palu et demographies,
permet de créer la nouvelle table :
repartition = [['nom', annee, cas, pop],.]
C'est-à-dire :
repartition = [['Bresil',2009,309316,193020000], ['Bresil',2010,334667,
194946000],['Kenya',2010,898531,40909000],['Mali',2011,307035, 33987000]]
Attention, il faut fusionner en partie les tables palu et demographies
pour les lignes dont le pays et l'année sont identiques bien sûr.
Source : concours Mines-Ponts 2016
Exercices-bilan
Exercice-bilan 11.1
30 min ● 10 points
Exercice-bilan 11.2
15 min ● 10 points
On dispose de la table de mesures suivante :
[[1.378, 1.772], [1.379, 1.785], [1.395, 1.835], [1.396, 1.842],
[1.378, 1.78], [1.369, 1.782], [1.378, 1.811], [1.368, 1.784], [1.361,
1.779], [1.369, 1.792]]
Exercice-bilan 11.3
10 min ● 5 points
On dispose de la table de mesures suivante :
[[1.378, 1.772], [1.379, 1.785], [1.395, 1.835], [1.396, 1.842],
[1.378, 1.78], [1.369, 1.782], [1.378, 1.811], [1.368, 1.784], [1.361,
1.779], [1.369, 1.792]]
Exercice EC 11.1
1 min ● 3 points
Qu'est-ce que le format csv d'un fichier ?
Réponses :
a) un format d'image RGB
b) Il signifie « coma separated values » : cela signifie que les données
stockées dans le fichier sont séparées par des virgules
c) un format de « lecture simple » d'un fichier (read only)
d) un format de fichier créé sous Word
Exercice EC 11.2
1 min ● 3 points
On donne un extrait de fichier :
“1”,”I Need a Dollar”,”4:04”,”Aloe Blacc”,”Good
Things”,”R&B/Soul”,”Fichier audio”,”MPEG”
De quel format s'agit-il ?
Réponses :
a) le format .png
b) le format .txt
c) le format .xls
d) le format .csv
Exercice EC 11.3
1 min ● 3 points
On dispose de la liste suivante : individus = [['Julie',1],
['Tom',2],['Sam',3],['Portillon',4],['Charlie',5]]
Exercice EC 11.4
1 min ● 3 points
Soit la liste qui attribue un numéro à chaque personne :
individus = [['Julie',1],
['Tom',2],['Sam',3],['Portillon',4],['Charlie',5]]
Exercice EC 11.5
1 min ● 3 points
Soit la liste qui attribue un numéro à chaque personne :
individus = [['Julie',1],
['Tom',2],['Sam',3],['Portillon',4],['Charlie',5]]
individu = ['Nicolas',6]
Exercice 11.1
Exercice 11.2
On définit les tables puis on cherche le nom dont l'identifiant vaut 5 :
1. individus = [['Julie',1],['Tom',2],['Sam',3],['Portillon',4],
['Charlie',5]]
2. liens = [[1,2],[2,3],[3,5],[4,5]]
3.
4. for i in individus :
5. if i[1]== 5 :
6. print(i[0])
Exercice 11.3
Exercice-bilan 11.1
Exercice-bilan 11.2
On obtient :
Le maximum des tensions est : 1.396 V
La tension moyenne est : 1.3771 V
Exercice-bilan 11.3
Exercice EC 11.1
Exercice EC 11.2
a) le format .png
b) le format .txt
c) le format .xls
d) le format .csv
Exercice EC 11.3
a) individus[2][1]=1
b) individus[1][1]=1
c) individus[1][1]==1
d) Sam = 1
Exercice EC 11.5
Un peu d'histoire
Principe
Le schéma d'architecture de von Neumann est séparé en quatre
éléments :
● L'unité arithmétique et logique : elle effectue les opérations de
base.
● L'unité de commande : elle est en charge du séquençage ou
découpage des opérations.
● La mémoire : elle contient les données, les programmes et indique
à l'unité de commande quelles opérations effectuer.
● Les entrées et sorties : assurent la communication avec l'extérieur.
2 L'ordinateur
Le protocole TCP/IP
L'ensemble des données transférées sur Internet est transféré grâce à
un protocole de communication universalisé : il s'agit du protocole
TCP/IP (ce qui signifie en anglais Transmission Control
Protocol / Internet Protocol). Pour rappel, ce sont des règles que les
machines suivent afin d'effectuer des tâches.
IP : Internet Protocol
Le protocole IP permet d'identifier et de nommer de façon uniforme
tous les éléments (téléphones, ordinateurs portables, tablettes et
objets connectés) qui sont reliés à Internet. Le protocole IP permet
l'élaboration et le transport des datagrammes IP (aussi appelés
paquets de données).
TCP : Transmission Control Protocol
Le protocole TCP est responsable de la mise en place de la
connexion et du contrôle de la transmission. Il s'agit d'un protocole de
remise fiable. Ce protocole s'assure que le destinataire a bien reçu les
données. En effet, lors du routage, un paquet peut ne pas arriver pour
cause de panne de ligne ou de routeur. Le protocole TCP assure alors
la fiabilité du transport des paquets.
Le protocole TCP fonctionne en trois phases :
● L'établissement de la connexion ;
● Les transferts de données ;
● La fin de la connexion.
Certains mécanismes sont mis en œuvre afin d'assurer la robustesse
et la fiabilité du transfert de données. En particulier, les numéros de
séquence sont utilisés afin d'ordonner les segments TCP reçus et de
détecter les données perdues, les sommes de contrôle (ou
checksum en anglais) permettent par exemple la détection d'erreurs,
et d'autres mécanismes permettent la détection des segments perdus
ou retardés.
En revanche, il n'y a pas de garantie temporelle d'arrivée des paquets
ce qui peut nuire à la qualité du streaming du son, de la vidéo : ceci
explique les soucis occasionnels de visionnage d'une vidéo en
streaming…
Le réseau
Le routeur
Chaque réseau est donc connecté à un ou plusieurs
autres réseaux. Au sein de ces réseaux, les
routeurs sont chargés du trafic.
Le routeur s'occupe du routage des paquets de
données de leurs émetteurs vers leurs destinataires.
Ce dernier est conçu afin de transférer des paquets vers un autre
routeur selon sa carte locale (ou table de routage, il s'agit d'un
schéma des meilleures routes vers les autres réseaux) et la
destination prévue, au mieux, selon un ensemble de règles (le
protocole TCP/IP dont nous avons parlé dans les paragraphes
précédents). Un routeur doit être connecté à au moins deux réseaux
informatiques afin de transférer des paquets d'information.
Pour plus de confort, on utilise à présent des routeurs wifi dans nos
maisons et nos lieux de travail, dans les restaurants etc… : ceci
permet d'avoir accès à Internet sur son téléphone, sa tablette, son
ordinateur portable.
Exemple d'une installation à domicile
5 Systèmes d'exploitation
Parmi les logos ci-dessous, quels sont ceux que vous connaissez ?
La commande cd
Elle signifie « change directory » et permet de changer de répertoire,
ce afin de se promener dans l'arborescence des répertoires.
Exemples :
● cd
permet de revenir au répertoire /home/utilisateur (identique à cd ~)
● cd –
permet de revenir au répertoire précédent
● cd ..
permet de remonter au répertoire parent
● cd /
permet de remonter à la racine de l'ensemble du système de
fichiers
● cd /Users/eleve/Desktop
se place dans le répertoire /Users/eleve/Desktop
La commande pwd
Elle signifie « print working directory » et permet d'afficher le chemin
absolu du répertoire courant (où on se situe).
La commande clear
Elle signifie « nettoyer » et permet de nettoyer le terminal, ce afin d'y
voir plus clair.
Exemples :
● chmod u+rw fichier
Ajoute ( + ) l'autorisation de lecture ( r ) et écriture ( w ) du
fichier fichier à l'utilisateur ( u )
● chmod -R u+rw dossier
Ajoute ( + ) l'autorisation de lecture ( r ) et écriture ( w ) du
répertoire dossier à l'utilisateur ( u )
● chmod ugo+x fichier
Ajoute ( + ) l'autorisation d'exécution ( x ) (c'est-à-dire ouverture) du
fichier fichier à tous (utilisateur ( u ), groupe ( g ) autres ( o )).
● chmod go-wx fichier
Supprime ( – ) l'autorisation d'écriture ( w ) et l'exécution ( x ) de
fichier au groupe ( g ) et aux autres ( o ).
La commande ps
Elle signifie « processes snapshot » et permet d'afficher les processus
en cours.
Exemples :
● ps -u
Affiche tous les processus de l'utilisateur u
● ps -A
Affiche tous les processus en cours : attention la liste est longue
dans ce cas !
Compétence attendue
Exercice 12.1
► Analyser, mobiliser
Compétence attendue
Vous avez vu en seconde que retenir l'adresse IP d'un site web, d'un
ordinateur n'était pas une chose évidente pour un humain. Pour cela,
il est utile de connaître son adresse symbolique ou nom d'hôte.
Il existe deux méthodes simples qui consistent à utiliser soit :
● une fenêtre de commande sur votre ordinateur dans laquelle on
tapera la commande nslookup suivie de l'adresse IP que l'on
souhaite traduire en nom d'hôte ou inversement le nom d'hôte à
traduire en adresse IP ;
● un site internet de résolution de noms d'hôte tel que
http://reverseip.domaintools.com ou bien encore https://www.ip-
tracker.org/lookup/reverse-ip.php
Exercice 12.3
► Mobiliser, développer
Cet exercice est une activité débranchée qui s'effectue à plusieurs.
On a vu précédemment que dans un réseau les ordinateurs
s'identifient non pas grâce à des noms mais à des adresses IP. Ceci
leur permet d'échanger des paquets de données. Retenir ces
adresses IP ne pose pas de souci pour un ordinateur mais pour un
humain c'est plus compliqué, c'est pourquoi vous devez disposer
d'une feuille sur laquelle vous allez inscrire une adresse au format
111. 1. 28. XX en remplaçant XX par les entiers de votre choix.
➡ Instructions :
● Vous avez en votre possession un petit papier qui correspond à
votre adresse IP, prenez une autre feuille sur laquelle vous allez
pouvoir noter celles de vos camarades.
● Aussi, votre mission est de passer voir vos camarades un à un
et de noter leur adresse IP. Vous avez 5 min !
Exercice 12.4
► Mobiliser
Exercice 12.5
► Décomposer
Compétence attendue
Exercice 12.6
► Décomposer
Cet exercice est une activité connectée qui s'effectue à plusieurs.
L'objectif est d'utiliser le simulateur du
site code.org (organisation à but non
lucratif qui a pour objectif la promotion
de l'informatique dans les écoles, les
inscriptions et l'utilisation du site sont
gratuites) afin d'illustrer comment les
messages sont transférés par paquets
via Internet et ce grâce aux
adresses IP.
1) Pour utiliser le simulateur d'Internet,
votre enseignant devra se créer un
compte sur code.org. Puis chaque
élève de la classe doit aussi se créer
un compte afin de se connecter à la
session de la classe (dont l'identifiant lui sera communiqué par le
professeur).
2) Puis pour accéder au simulateur d'internet, vous devez vous rendre
sur le lien : https://studio.code.org/s/netsim afin d'obtenir l'affichage :
3) Puis se rendre sur 10. Simulateur d'Internet en libre accès.
4) Cliquer sur le 1.
Il vous suffit alors vous et vos camarades connectés, de rejoindre un
routeur. Vous pouvez ensuite échanger des messages entre vous via
ce routeur, ce en sélectionnant l'adresse IP de votre camarade
destinataire. Les messages envoyés sont au format ASCII mais aussi
illustrés en binaire.
Dans l'exemple ci-dessous :
● L'élève 15 d'adresse IP 1.3 et l'élève 24 d'adresse IP 1.2 sont
connectés au routeur 1.
● L'élève 15 d'adresse IP 1.3 a envoyé le message ASCII 'Bonjour !' à
l'élève 24 d'adresse IP 1.2.
Il existe des possibilités multiples, notamment d'ajouter un DNS afin
de ne pas utiliser les adresses IP mais plutôt les noms des élèves
pour communiquer.
Compétence attendue
Exercice 12.7
► Analyser, développer
Effectuer une recherche afin de répondre aux questions :
1) Actuellement quel est le système d'exploitation le plus utilisé sur
ordinateur ? Et sur téléphone portable ?
2) Qu'est-ce qui les distingue ?
3) Quelles sont les différences entre les systèmes d'exploitation libres
et propriétaires ?
4) Citer un système d'exploitation libre.
Exercices de type EC - QCM
Exercice EC 12.1
1 min ● 3 points
Dans un terminal Unix, on tape :
ls -a
Que s'affiche-t-il ?
Réponses :
a) l'adresse IP
b) le nom de domaines
c) la liste des adresses IP
d) la liste des fichiers et dossiers dans le répertoire courant
Exercice EC 12.2
1 min ● 3 points
Dans un terminal Unix, on tape :
cd ..
Que se passe-t-il ?
Réponses :
a) on peut lire un CD
b) on retourne au répertoire précédent
c) on passe au répertoire parent (de niveau supérieur)
d) donne la classe du dossier
Exercice EC 12.3
1 min ● 3 points
Que signifie RAM ?
Réponses :
a) Read Access Memory
b) Random Access Memory
c) Read All Memory
d) Random Read memory
Exercice EC 12.4
1 min ● 3 points
Parmi les choix suivants, lequel n'est pas un système d'exploitation ?
Réponses :
a) Windows
b) Linux
c) Microsoft
d) MacOS
Exercice EC 12.5
1 min ● 3 points
Que permet de faire la commande Unix :
chmod u+rw fichier
Réponses :
a) supprime l'accès au fichier fichier à l'utilisateur
b) donne les droits de lecture et écriture du fichier fichier à l'utilisateur
c) supprime les droits de lecture et écriture du fichier fichier à
l'utilisateur
d) donne les droits de lecture et exécution du fichier fichier à
l'utilisateur
Exercice EC 12.6
1 min ● 3 points
Quel élément n'appartient pas à l'architecture de Von Neumann ?
Réponses :
a) les entrées et sorties
b) l'unité arithmétique et logique
c) la mémoire centrale
d) l'unité d'affichage
Exercice EC 12.7
1 min ● 3 points
À quoi sert la commande Unix suivante ?
traceroute 195.154.29.58
Réponses :
a) à tracer la route d'un paquet jusqu'à la destination d'adresse IP
195.154.29.58
b) à modifier l'adresse IP 195.154.29.58
c) à tracer la route de l'adresse IP 195.154.29.58
d) à retrouver le nom de domaine correspondant à l'adresse IP
195.154.29.58
Corrigé des exercices
Exercice 12.1
Exercice 12.2
Exercice 12.4
Exercice EC 12.1
a) À l'adresse IP
b) le nom de domaines
c) la liste des adresses IP
d) la liste des fichiers et dossiers dans le répertoire courant
Exercice EC 12.2
a) on peut lire un CD
b) on retourne au répertoire précédent
c) on passe au répertoire parent (de niveau supérieur)
d) donne la classe du dossier
Exercice EC 12.3
a) Windows
b) Linux
c) Microsoft
d) MacOS
Exercice EC 12.5
Exercice EC 12.6
Exercice EC 12.7
Événements
On insistera sur les clics dans ce chapitre car ce sont les plus visuels.
2 Interaction client-serveur
Objectif
Architecture client-serveur
Comme cela a déjà été abordé en classe de seconde, on sait que le
Web est basé sur une architecture client/serveur. Ceci peut être
résumé par le schéma ci-dessous où un client (généralement un
navigateur Web) envoie une requête à un serveur (le plus souvent un
serveur Web) en utilisant le protocole
HTTP. Le serveur répond à la requête
en utilisant le même protocole.
La méthode GET
Il s'agit de la méthode la plus fréquente pour demander une
ressource. Une requête GET est sans effet sur la ressource.
Exemple :
1. <form action="http://mon_site.com" method="get">
2. <div>
3. <label for="rep1">Question 1 ?</label>
4. <input name="rep1" id="rep1" value="A">
5. </div>
6. <div>
7. <label for="rep2">Question 2 ?</label>
8. <input name="rep2" value="B">
9. </div>
10. <div>
11. <button>Envoyer</button>
12. </div>
13. </form>
La méthode POST
Cette méthode doit être utilisée lorsqu'une requête doit modifier la
ressource.
Si un formulaire est envoyé avec cette méthode, les données sont
ajoutées au corps de la requête HTTP. On reprend l'exemple
précédent que l'on modifie avec la méthode POST.
Exemple :
1. <form action="http://mon_site.com" method="post">
2. <div>
3. <label for="rep1">Question 1 ?</label>
4. <input name="rep1" id="rep1" value="A">
5. </div>
6. <div>
7. <label for="rep2">Question 2 ?</label>
8. <input name="rep2" value="B">
9. </div>
10. <div>
11. <button>Envoyer</button>
12. </div>
13. </form>
Exercice 13.1
► Traduire
Exercice 13.2
► Analyser
► Code 2
13. <!DOCTYPE html>
14. <html>
15. <body>
16.
17. <h2>Modifier du texte HTML</h2>
18.
19. <p id="demo">JavaScript peut changer le contenu HTML.</p>
20.
21. <button type="button"
onclick='document.getElementById("demo").innerHTML = "Et hop, cela
a changé !"'>Cliquez ici !</button>
22.
23. </body>
24. </html>
Compétence attendue
Exercice 13.3
► Mobiliser, traduire
➡ Écrire une portion de code qui au clic d'un bouton modifie du texte
HTML. On pourra afficher « Avant », avant le clic et « Après »
ensuite.
Exercice 13.4
► Mobiliser, traduire
➡ Écrire une portion de code qui au clic d'un bouton efface du texte
HTML. On pourra afficher « Avant », avant le clic et rien ensuite.
Exercices de type EC - QCM
Exercice EC 13.1
1 min ● 3 points
Choisir la balise HTML permettant à l'utilisateur de saisir du texte dans
un formulaire en respectant la norme HTML :
Réponses :
a) <'saisir votre texte'>
b) <form>
c) <input type = « texte »/>
d) <input txt/>
Exercice EC 13.2
1 min ● 3 points
Que permet d'obtenir la méthode GET du protocole HTTP ?
Réponses :
a) une ressource
b) envoyer une adresse IP
c) envoyer un fichier
d) un nom de domaine
Exercice EC 13.3
1 min ● 3 points
Que fait la commande suivante ?
<button onmouseover ="alert('Bonjour')">Cliquez SVP.</button>
Réponses :
a) de créer un bouton qui affiche 'Bonjour' lorsque l'on passe la souris
dessus.
b) de créer un bouton qui affiche 'Bonjour' lorsque l'on clique dessus.
c) de créer une action qui affiche 'Bonjour'.
d) de créer un formulaire qui démarre par 'Bonjour'.
Exercice EC 13.4
1 min ● 3 points
Que fait la commande suivante ?
<button onclick ="alert('Bonjour')">Cliquez SVP.</button>
Réponses :
a) de créer un bouton qui affiche 'Bonjour' lorsque l'on passe la souris
dessus.
b) de créer un bouton qui affiche 'Bonjour' lorsque l'on clique dessus.
c) de créer une action qui affiche 'Bonjour'.
d) de créer un formulaire qui démarre par 'Bonjour'.
Exercice EC 13.5
1 min ● 3 points
Dans le langage HTML, quel est le type des instructions <body>
et </body> ?
Réponses :
a) Ce sont des balises.
b) Ce sont des formes.
c) Ce sont des bannières.
d) Ce sont des actions.
Corrigé des exercices
Exercice 13.1
<button onclick ="alert('Bonjour')">Cliquez SVP.</button>
<button onmouseover ="alert('Bonjour')">Cliquez SVP.</button>
<button onmouseout ="alert('Bonjour')">Cliquez SVP.</button>
Exercice 13.2
► Code 1
<button type="button"
onclick="document.getElementById('demo').style.display=
'none'">Cliquez ici !</button>
► Code 2
<button type="button"
onclick='document.getElementById("demo").innerHTML = "Et hop, cela a
changé !"'>Cliquez ici !</button>
Exercice 13.3
Par exemple :
1. <!DOCTYPE html>
2. <html>
3. <body>
4.
5.
6. <p id="demo">Avant </p>
7.
8. <button type="button"
onclick='document.getElementById("demo").innerHTML =
"Après !"'>Cliquez ici !</button>
9.
10.
11. </body>
12. </html>
Exercice 13.4
Exercice EC 13.1
Exercice EC 13.2
a) une ressource
b) envoyer une adresse IP
c) envoyer un fichier
d) un nom de domaine
Exercice EC 13.3
Exercice EC 13.5
Exercice EC 14.1
2h
Pour chacune des questions, il n'y a qu'une seule bonne réponse. Le
candidat gagne 3 points pour la réponse correcte, perd 1 point pour
une réponse fausse, et obtient un résultat nul pour absence de
réponse ou une réponse multiple. Sur chacune des sept parties, si le
total des points obtenu par le candidat est négatif, son résultat est
évalué à 0.
Réponses :
a) True
b) False
c) x==0
d) un message d'erreur
Réponses :
a) Un message d'erreur
b) [[1.378, 1.772], [1.378, 1.772], [1.395, 1.835]]
c) [1.378, 1.772]
d) [[1.378, 1.785], [1.379, 1.772], [1.395, 1.835]]
2) Soit la liste :
GoodThings = [[1,'I Need a Dollar','4:04','Aloe Blacc','Good
Things','R&B/Soul','Fichier audio MPEG'],
[1,'I Need a Dollar','4:04','Aloe Blacc','Good Things','R&B/Soul','Fichier
audio AAC achete']]
De quel type de liste s'agit t'il ?
Réponses :
a) Une liste de chaînes de caractères
b) Une liste de dictionnaires
c) Une liste de listes
d) Une liste de données binaires
3) Soit une liste qui contient deux enregistrements audios :
GoodThings = [[1,'I Need a Dollar','4:04','Aloe Blacc','Good
Things','R&B/Soul','Fichier audio MPEG'],
[1,'I Need a Dollar','4:04','Aloe Blacc','Good Things','R&B/Soul','Fichier
audio AAC achete']]
Comment afficher le type de fichier audio de chacun des deux
enregistrements ?
Réponses :
a) print(GoodThings[0], GoodThings[1])
b) print(GoodThings[6], GoodThings[6])
c) print(GoodThings[6])
d) print(GoodThings[0][6], GoodThings[1][6])
Réponses :
a) Cela crée un bouton qui permet de faire afficher la date lorsque
l'utilisateur clique sur le bouton.
b) Cela crée une fenêtre qui permet de faire afficher la date.
c) Cela crée une démonstration.
d) Cela permet de récupérer la date.
Réponses :
a) a = 13 et b = 13
b) a = 4 et b = 4
c) a = 4 et b = 13
d) a = 13 et b = 4.
3) Après avoir exécuté les lignes suivantes, quelles valeurs
contiennent les variables a et b ?
a = 13
b = 4
def somme(a,b) :
a = a+b
b = 2*a
return a
Réponses :
a) a = 13 et b = 4
b) a = 17 et b = 4
c) a = 17 et b = 26
d) a = 13 et b = 26.
4) Après avoir exécuté les lignes suivantes, quelles valeurs
contiennent les variables a et b ?
a = 13
b = 4
for i in range(b):
a = a+b
Réponses :
a) a = 13 et b = 4.
b) a = 29 et b = 4.
c) a = 17 et b = 26.
d) a = 29 et b = 26.
► Thème G : Algorithmique
1) Dans la fonction de la question précédente :
Réponses :
a) a est une variable globale.
b) a et b sont des variables globales.
c) L'instruction rem(L) modifiera une liste L auparavant définie et non
vide.
d) L'instruction rem(L) ne modifiera pas une liste L auparavant définie
et non vide.
2) On considère une liste L remplie de 1 et de taille n, où n est un entier
naturel non nul donné. On applique l'algorithme de tri par insertion
(par ordre croissant) sur la liste L. Combien de comparaisons entre
éléments de la liste L seront effectuées dans le pire des cas ? On
donnera un ordre de grandeur.
Réponses :
a) de l'ordre de n.
b) de l'ordre de n2.
c) de l'ordre de n3.
d) de l'ordre de 10.
3) La fonction suivante correspond à un algorithme :
1. def inconnue(t):
2. n = len(t)
3. for i in range(1,n):
4. while i>0 and t[i] < t[i-1]:
5. t[i-1],t[i] = t[i],t[i-1]
6. i = i - 1
Réponses :
a) de tri à bulles.
b) de tri par insertion.
c) de tri par sélection.
d) de tri fusion.
4) La fonction précédente renvoie :
Réponses :
a) une liste triée.
b) une liste non triée.
c) elle ne renvoie rien.
d) une boucle infinie.
5) Pour le schéma ci-dessous, on applique l'algorithme des k plus
proches voisins au rond vert. On choisit k = 3 et on cherche la
nouvelle classe du rond vert :
Réponses :
a) la classe rond.
b) la classe losange.
c) la classe carré.
d) la classe triangle.
6) La fonction suivante permet de :
1. def mystere(liste,x):
2. if x in liste:
3. return True
4. return False
Réponses :
a) trier une liste selon un critère x.
b) trouver le maximum x dans une liste.
c) chercher un élément x dans une liste de manière séquentielle.
d) chercher un élément x dans une liste de manière dichotomique.
Corrigé des exercices de type EC -
QCM
Exercice EC 14.1
Qu'obtient-on si on tape :
T = sorted(mesures)
print(T)
Réponses :
a) Un message d'erreur
b) [[1.378, 1.772], [1.378, 1.772], [1.395, 1.835]]
c) [1.378, 1.772]
d) [[1.378, 1.785], [1.379, 1.772], [1.395, 1.835]]
2) Soit la liste :
GoodThings = [[1,'I Need a Dollar','4:04','Aloe Blacc','Good
Things','R&B/Soul','Fichier audio MPEG'],
[1,'I Need a Dollar','4:04','Aloe Blacc','Good Things','R&B/Soul','Fichier
audio AAC achete]]
De quel type de liste s'agit t'il ?
Réponses :
a) Une liste de chaînes de caractères.
b) Une liste de dictionnaires.
c) Une liste de listes.
d) Une liste de données binaires.
3) Soit une liste qui contient deux enregistrements audios :
GoodThings = [[1,'I Need a Dollar','4:04','Aloe Blacc','Good
Things','R&B/Soul','Fichier audio MPEG'],
[1,'I Need a Dollar','4:04','Aloe Blacc','Good Things','R&B/Soul','Fichier
audio AAC achete']]
Comment afficher le type de fichier audio des chacun des deux
enregistrements ?
Réponses :
a) print(GoodThings[0], GoodThings[1])
b) print(GoodThings[6], GoodThings[6])
c) print(GoodThings[6])
d) print(GoodThings[0][6], GoodThings[1][6])
Réponses :
a) Cela crée un bouton qui permet de faire afficher la date
lorsque l'utilisateur clique sur le bouton.
b) Cela crée une fenêtre qui permet de faire afficher la date.
c) Cela crée une démonstration.
d) Cela permet de récupérer la date.
Réponses :
a) a = 13 et b = 13.
b) a = 4 et b = 4.
c) a = 4 et b = 13.
d) a = 13 et b = 4.
3) Après avoir exécuté les lignes suivantes, quelles valeurs
contiennent les variables a et b ?
a = 13
b = 4
def somme(a,b) :
a = a+b
b = 2*a
return a
Réponses :
a) a = 13 et b = 4.
b) a = 17 et b = 4.
c) a = 17 et b = 26.
d) a = 13 et b = 26.
4) Après avoir exécuté les lignes suivantes, quelles valeurs
contiennent les variables a et b ?
a = 13
b = 4
for i in range(b):
a = a+b
Réponses :
a) a = 13 et b = 4.
b) a = 29 et b = 4.
c) a = 17 et b = 26.
d) a = 29 et b = 26.
5) Qu'affiche le programme suivant ?
x = 1
if x = True :
for i in range(5):
n = n + 4
else :
for i in range(4):
n = n + 4
Réponses :
a) 10.
b) 20.
c) rien.
d) 11.
6) Soit la fonction :
def rem(L):
n = len(L)
a = L[-1]
L = L[0:n-1]
n = len(L)
for i in range(n):
b = L[-1]
L = L[0:n-1]
L.append(a)
a = b
On définit L = [1,2,3,4,5,6].
Réponses :
a) L'instruction rem(L) renvoie [1,2,3,4,5].
b) L'instruction rem(L) renvoie [2,3,4,5,6].
c) L'instruction rem(L) ne renvoie rien.
d) L'instruction rem(L) provoque un message d'erreur.
► Thème G : Algorithmique
1) Dans la fonction de la question précédente :
Réponses :
a) a est une variable globale.
b) a et b sont des variables globales.
c) L'instruction rem(L) modifiera une liste L auparavant définie et non
vide.
d) L'instruction rem(L) ne modifiera pas une liste L auparavant
définie et non vide.
2) On considère une liste L remplie de 1 et de taille n, où n est un entier
naturel non nul donné. On applique l'algorithme de tri par insertion
(par ordre croissant) sur la liste L. Combien de comparaisons entre
éléments de la liste L seront effectuées dans le pire des cas ? On
donnera un ordre de grandeur.
Réponses :
a) de l'ordre de n.
b) de l'ordre de n2.
c) de l'ordre de n3.
d) de l'ordre de 10.
3) La fonction suivante correspond à un algorithme :
1. def inconnue(t):
2. n = len(t)
3. for i in range(1,n):
4. while i>0 and t[i] < t[i-1]:
5. t[i-1],t[i] = t[i],t[i-1]
6. i = i - 1
Réponses :
a) de tri à bulles.
b) de tri par insertion.
c) de tri par sélection.
d) de tri fusion.
4) La fonction précédente renvoie :
Réponses :
a) une liste triée.
b) une liste non triée.
c) elle ne renvoie rien.
d) une boucle infinie.
5) Pour le schéma ci-dessous, on applique l'algorithme des k plus
proches voisins au rond vert. On choisit k = 3 et on cherche la
nouvelle classe du rond vert :
Réponses :
a) la classe rond.
b) la classe losange.
c) la classe carré.
d) la classe triangle.
6) La fonction suivante permet de :
1. def mystere(liste,x):
2. if x in liste:
3. return True
4. return False
Réponses :
a) trier une liste selon un critère x.
b) trouver le maximum x dans une liste.
c) chercher un élément x dans une liste de manière
séquentielle.
d) chercher un élément x dans une liste de manière dichotomique.
Table des matières
Avant-propos
Introduction
Les compétences en NSI
1 Les compétences
2 Récapitulatif des exercices illustrant les compétences
Thème A
Types de base
Chapitre 1
Premiers pas en Python
Cours
1 Un peu d'histoire de Python
2 L'environnement Pyzo
Les différentes fenêtres de Pyzo
Premiers calculs dans le shell
Premiers programmes dans l'éditeur
3 Quelques types de base : les integers et les flottants
Les integers
Les flottants
4 La bibliothèque math et ses fonctions
5 Les variables en Python
Affectation d'une ou plusieurs variables
Mots réservés et caractères à éviter
Modification du contenu d'une variable
Permutation de deux variables
6 Un autre type de base : les booléens
Valeurs booléennes : True et False
Table de l'expression booléenne : a and b
Table de l'expression booléenne : a or b
Table de l'expression booléenne : a xor b
Exercices
Exercices de type EC - QCM
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Chapitre 2
Représentation des nombres
Cours
1 Écriture d'un entier positif dans une base b ≥ 2
Les bases
Passage d'un nombre de la base 10 à la base 2 (écriture binaire)
2 Représentation binaire d'un entier relatif
Un peu d'histoire des nombres
Notion de bit de signe
Écriture d'un entier positif en binaire sur n bits
Somme et produit de deux nombres binaires
Écriture d'un entier négatif en binaire sur n bits (méthode du complément à deux)
3 Représentation en base hexadécimale
Codage en base 16
Conversion d'un octet en base hexadécimale
4 Représentation approximative des nombres réels
Écriture à virgule flottante
Nombres à virgule flottante : les flottants
Dépassement de capacité
Arrondis et conséquence
Exercices
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Chapitre 3
Représentation d'un texte en machine
Cours
1 Le code ASCII
Un peu d'histoire
La table ASCII
Limitations
2 La norme ISO-8859-1
Nécessité
Limitations
3 La norme Unicode
Nécessité d'une norme internationale
Convertisseur de texte en Unicode
Les erreurs d'encodage : incompatibilité de normes
Exercices
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Thème B
Types construits
Chapitre 4
Les types de données construits
Cours
1 Les p-uplets
Créer un p-uplet
Notion d'indexation
2 Les listes
Créer une liste
Lire et modifier les éléments d'une liste grâce à leurs index
Construire une liste par compréhension
Opérations sur les listes
Ajout d'un élément en fin de liste
Recherche d'un élément dans une liste avec in
Quelques commandes à retenir
3 Les dictionnaires
Créer un dictionnaire
Accéder aux valeurs d'un dictionnaire
Parcourir les clés ou les valeurs d'un dictionnaire
Exercices
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Thème F
Langage et programmation
Chapitre 5
Les fonctions
Cours
1 Créer une fonction
Un peu d'histoire
Forme générale d'une fonction
Spécification d'une fonction
Les arguments d'une fonction
2 Notion de variable locale, variable globale
Variable locale
Variable globale
3 Appeler une fonction
Appeler une fonction et effectuer un affichage
Appeler une fonction et effectuer un stockage du/des résultat(s)
Extraire un seul argument de sortie
4 Les assertions
5 Jeux de tests
6 Points importants à propos des fonctions
Ne pas oublier les « : »
Ne pas oublier l'indentation
Ne pas appeler une variable locale dans le programme principal
Un print n'équivaut pas à un return
Un return permet une sortie de fonction
Respecter l'ordre et le type des arguments d'entrée
Exercices
Exercices-bilan
Corrigé des exercices
Corrigé des exercices-bilan
Corrigé des exercices de type EC - QCM
Chapitre 6
Séquences conditionnelles et boucles
Cours
1 Les instructions conditionnelles
Un peu d'histoire
Rappel sur les tests logiques
Instruction conditionnelle simple
Instruction conditionnelle avec alternative
Instruction conditionnelle imbriquée
Implémentation d'une instruction conditionnelle au sein d'une fonction
2 Les boucles for
Notion de boucle inconditionnelle
Les boucles for : itérable de type liste
Les boucles for : itérable de type range( )
Coût en temps
Les boucles for : construction d'une liste en compréhension
3 Les boucles while
Notion de boucle conditionnelle
Non terminaison d'une boucle while
Application aux suites
Remplacement d'une boucle for par une boucle while
Coût en temps
Exercices
Exercices-bilan
Corrigé des exercices
Corrigé des exercices-bilan
Corrigé des exercices de type EC - QCM
Thème G
Algorithmique
Chapitre 7
Recherche d'une valeur dans une liste
Cours
1 Recherche séquentielle dans une liste
Parcours séquentiel d'une liste
Complexité en temps
2 Recherche dichotomique dans une liste triée
Un peu d'histoire
Le principe du diviser pour régner
Principe de la recherche dichotomique
Coût en temps
Terminaison de la boucle while
Exercices
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Chapitre 8
Les méthodes de tri de listes
Cours
1 Nécessité de trier
Un peu d'histoire
Des algorithmes de tri variés
Algorithmes de tri disponibles en Python
2 Tri par insertion
Principe
Pseudo-code
Tri par insertion en Python
Le tri étape par étape
Complexité temporelle
Notion d'invariant de boucle
Validité du tri
3 Tri par sélection
Principe
Pseudo-code
Tri par sélection en Python
Complexité temporelle
Validité du tri
4 Ordre de grandeur des temps d'exécution
Exercices
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Chapitre 9
Algorithme des k plus proches voisins
Cours
1 Un peu d'histoire
2 Principe
3 Algorithme et fonctions
Thème E
Architectures matérielles et systèmes d'exploitation
Chapitre 12
Architectures matérielles et systèmes d'exploitation
Cours
1 Modèle d'architecture séquentielle (von Neumann)
Un peu d'histoire
Principe
2 L'ordinateur
L'ordinateur avant et maintenant
De quoi est constitué un ordinateur ?
Les composants de l'ordinateur
3 Transmission de données dans un réseau
Les paquets de données
Le protocole TCP/IP
4 Architecture d'un réseau
Le réseau
Le routeur
5 Systèmes d'exploitation
Une multitude de systèmes d'exploitation possibles
Fonctions du système d'exploitation
Interface Homme-Machine (IHM)
6 Quelques commandes Unix
Notion de chemin d'accès
Les commandes de base
Les commandes de gestion de fichiers
Les commandes du système
Les commandes du réseau
Exercices
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Thème D
Interactions entre l'homme et la machine sur le Web
Chapitre 13
Interactions entre l'homme et la machine sur le Web
Cours
1 Interaction avec l'utilisateur dans une page Web
Événements
Les types d'événements les plus communs
Les clics : créer un affichage au clic
Les clics : modifier du contenu HTML au clic
Les clics : cacher du contenu HTML au clic
2 Interaction client-serveur
Objectif
Architecture client-serveur
Formulaire HTML et HTTP
3 Formulaire d'une page Web
Définition de la méthode d'envoi des données
La méthode GET
La méthode POST
Exercices
Corrigé des exercices
Corrigé des exercices de type EC - QCM
Chapitre 14
Questionnaire à choix multiples type EC
Exercices de type EC - QCM
Corrigé des exercices de type EC - QCM