Académique Documents
Professionnel Documents
Culture Documents
Sujet 5 heures
Examen 15 septembre 2023
Les documents ne sont pas autorisés. La note prendra en compte la clarté des explications. Il est
conseillé d’effectuer les exercices dans l’ordre.
1
toutes les 5 minutes. Ce sont des capteurs polyvalents placés sur les ouvertures d’une
maison (fenêtres/portes) qui permettent de détecter l’ouverture ou non mais aussi le
mouvement et la température. Les différentes colonnes disponibles dans ce fichier sont :
— Identifiant_capteur (entier) : identifiant unique du capteur.
— Piece (texte) : pièce dans laquelle se trouve le capteur.
— Num mesure (entier) : numéro de la mesure de la journée pour le capteur (1 à minuit
et s’incrémente à chaque mesure jusqu’à la fin de la journée).
— Ouverture (booléen) : vaut True si la porte/fenêtre est ouverte et False sinon.
— Presence (booléen) : vaut True si le capteur détecte un mouvement et False sinon.
— Temperature (flottant) : indique la température mesurée à 0.1◦ C près.
Le fichier csv est pour l’instant ouvert par les élèves dans un tableur comme Calc/Excel.
Donner 3 questions que vous pourriez poser aux élèves pour les faire tra-
vailler, sur ordinateur, sur le traitement de données structurées, le but étant
ici de leur faire découvrir les traitements possibles.
Vous expliquerez à chaque fois brièvement l’intérêt de la question pour l’acquisition de
compétence des élèves. Chaque question devra faire travailler les élèves sur une opération
différente.
Vous souhaitez maintenant les faire travailler sur le traitement du fichier à l’aide de
Python en utilisant la bibliothèque pandas. Vous trouverez en annexe une description des
fonctions utiles de pandas (cf Annexe B).
Pour une exploitation du fichier " Donnees capteurs 22 09 21.csv " avec la bibliothèque
pandas, on s’est assuré que les nombres réels sont désormais écrits avec des points et non
des virgules.
Le but de votre exercice est que les élèves puissent répondre de manière automatisée
grâce à Python aux questions suivantes (pour le jour considéré) :
— Donner la température minimale de la cuisine quand le capteur 3 indique la présence
de quelqu’un.
— Afficher toutes les températures de la maison triées de manière croissante.
(d) Écrire, tel qu’un élève pourrait le faire, le programme permettant de répondre à ces
questions à l’aide de la bibliothèque pandas.
(e) Décrire la structure d’une activité de 1h30 sur machine permettant à vos élèves, qui n’ont
jamais utilisé pandas, d’être capables de répondre à ces questions. On ne demande pas
ici de rédiger complètement le document qui serait fourni aux élèves mais d’indiquer
clairement l’organisation de l’activité en précisant notamment les questions posées aux
élèves.
3. Traitement de données sous forme de tables. Vous travaillez sur le traitement de données en
tables avec vos élèves de première. Pour travailler sur les données en tables, vous avez choisi de
travailler avec des tableaux de p-uplets. Avec les élèves, les p-uplets seront codés, en Python,
à l’aide de dictionnaires. Dans cet objectif, vous préparez un cours sur les dictionnaires.
(a) Présenter, tel que vous le feriez avec vos élèves, la différence entre le type dictionnaire et
le type liste.
(b) Expliquer brièvement comment les dictionnaires sont implémentés en Python.
(c) Citer un exemple d’utilisation de dictionnaire pour illustrer votre cours sur les diction-
naires. Vous justifierez votre choix en expliquant notamment pourquoi l’exemple est per-
2
tinent pour ce cours de première. Qu’est-ce qui pourrait être un mauvais exemple d’un
point de vue pédagogique et pourquoi ?
4. Vous décidez de travailler avec vos élèves à partir de deux fichiers csv présentés en annexe pour
démarrer le traitement des données en tables (Annexe C). Pour que les élèves comprennent
bien les mécanismes en jeu, vous n’utilisez pas ici la bibliothèque Python pandas. Vous vous
êtes inspirés de la situation sanitaire actuelle pour créer deux fichiers (qui ne sont bien-sûr
que des fichiers exemples) : l’un correspondant à la liste des personnes testées positives à
la Covid19 et l’autre à la liste des personnes ayant mangé au restaurant. Ces fichiers sont
supposés être stockés par l’assurance maladie, le second servant à contacter les personnes
contacts à risques. Le premier fichier nommé "positifs.csv" (cf Annexe C.1) contient les
informations suivantes :
— le numéro de sécurité social du contaminé (descripteur : num SS ; type : entier),
— son âge (descripteur : age ; type : entier),
— le jour du test positif (descripteur : jour test ; type : entier),
— le mois du test positif (descripteur : mois test ; type : entier),
— son sexe (descripteur : sexe ; type : caractère),
— s’il a été vacciné ou non (descripteur : vaccine ; type : booléen). Le deuxième fichier
nommé "restaurants.csv" (cf Annexe C.2) contient les informations suivantes :
— l’identifiant de l’enregistrement (descripteur : id enregistrement ; type : entier),
— l’identifiant du restaurant (descripteur : id restaurant ; type : entier),
— le jour du repas (descripteur : jour repas ; type : entier),
— le mois du repas (descripteur : mois repas ; type : entier),
— la tranche horaire du repas (descripteur : tranche horaire ; type : entier),
— le numéro de la table (descripteur : num table ; type : entier),
— le numéro de sécurité social du client (descripteur : num SS ; type : entier).
Pour cet exercice, on ne considèrera que 2 tranches horaires (la 1 de 12h à 14h et la 2 de 19h
à 21h) et on considérera qu’une même personne ne peut pas être testée deux fois positive à
la Covid19.
(a) Ecrire le programme Python commenté qui permettrait à vos élèves de récupérer sous
forme de liste de dictionnaires, nommée positifs, les informations contenues dans le fichier
" positifs.csv ". Chaque élément de la liste est un dictionnaire comprenant les valeurs
d’une ligne de la table et dont les clés sont les descripteurs de la table. On utilisera pour
cela notamment la fonction readlines.
(b) Quels sont pour vous les points importants à aborder avec vos élèves et/ou ceux qui
risquent de leur poser problème lorsque vous abordez pour la première fois le programme
de la question précédente avec vos élèves ?
(c) Vous souhaitez faire travailler vos élèves sur la recherche, dans une table, des lignes vé-
rifiant des critères exprimés en logique propositionnelle en utilisant les fichiers décrits
ci-dessus. On supposera, pour la suite de l’exercice, que les élèves ont implémenté le
programme Python retournant une liste de dictionnaires restaurants contenant les infor-
mations contenues dans le fichier "restaurants.csv". Vous rédigez maintenant une partie
de cet exercice.
i. Proposer 3 questions de difficulté croissante (dont au moins une nécessitant la fusion
des tables) où les élèves doivent rédiger des programmes en Python. On suppose ici
que les listes de dictionnaires positifs et restaurants sont déjà construites.
3
ii. Proposer pour chaque question une correction. Décrire brièvement les points sur les-
quels vous serez vigilant lors de la correction de ces questions.
□
Correction exercice 0
4
faciale, sont deux dispositifs présentant ces risques, et ont déjà été utilisés dans certains
pays à des fins de répression politique.
— La sécurité des données. En effet, la mutualisation des données, les informations per-
sonnelles pouvant en être tirées ainsi que l’exploitation commerciale en découlant, en
font une cible privilégiée pour des individus ou organismes malintentionnés (tentatives
d’arnaques, démarchages agressifs).
2. Utilisation des fichiers csv
(a) Descripteur : caractéristique propre à un objet permettant de le décrire au sein d’une
collection
(b) Proposition d’activité débranchée : les élèves choisissent un objet/une personne (un ca-
marade, une célébrité, un film, un livre,. . . ) et les autres élèves doivent être capables
de retrouver l’objet/personne grâce à la description faite par leurs camarades. Au fur
et à mesure on complique les choses en empêchant l’utilisation de certains descripteurs
(le nom pour les personnes par exemple). On fait alors émerger le terme de descrip-
teurs d’une donnée. On peut alors les sensibiliser aux différents types de données (texte,
nombre,. . . ) et les faire réfléchir aux descripteurs qui permettent à coup sûr d’identifier
la personne/l’objet. On peut ensuite remettre en application sur un autre exemple.
Il faut que les questions fassent travailler sur la recherche, le filtre, le tri ou le calcul.
Quelques exemples :
— N’afficher que les données des capteurs de la cuisine. (filtre)
— Afficher les données en les triant par l’identifiant de capteur. (tri)
— N’afficher que les données du capteur n4 dans l’ordre décroissant des mesures (de la
fin de journée au début de la journée). (filtre + tri)
— Calculer la température moyenne de la cuisine entre 8h et 20h. (calcul-moyenne)
— Y a-t-il eu quelqu’un dans le garage lors de cette journée ? (recherche)
— Calculer la température maximale/minimale d’une pièce (calcul-max/min)
— Déterminer pendant combien de temps une porte (identifiée par son capteur) est restée
ouverte sur la journée. (filtre + calcul-nombre de fois)
(c) Code [
import pandas
donnees=pandas.read csv(”Donnes capteurs 22 09 21.csv”,sep=’; ’)
print(donnees.loc[(donnees[’Piece’]==’Cuisine’) & (donnees[’Presence’]==True)
,’ Temperature ’ ].min())
print(donnees.loc[’Temperature’].sort values( ascending=True))
]
5
3. Traitement de données sous forme de tables
(a) Les dictionnaires et les listes permettent de rassembler des éléments. Les éléments d’une
liste sont ordonnés selon un numéro qu’on appelle l’indice de l’élément. On accède à
un élément en utilisant cet indice. Dans un dictionnaire en Python, les éléments sont
identifiés par une clé. On peut faire l’analogie avec un dictionnaire de français ou‘ on
accède à une définition avec un mot. Contrairement aux listes qui sont délimitées par des
crochets, on utilise des accolades pour les dictionnaires.
(b) En Python, les dictionnaires sont implémentés sous forme de tables de hachage. Chaque
entrée du tableau est en fait une combinaison de trois valeurs : <valeur-hachage, clé, va-
leur>. Lors de l’ajout d’une entrée à la table, le hachage de la clé donne un emplacement.
Si cet emplacement est vide, l’entrée est ajoutée à l’emplacement. Si ce n’est pas le cas
(et qu’il s’agit bien d’une nouvelle clé à insérer), il recherche un emplacement vide. De-
puis Python 3.7 (officiellement 3.6 officieusement) les dictionnaires sont désormais classés
selon l’ordre d’insertion..
(c) Quelques exemples :
— Un "annuaire" contenant des noms et des numéros de téléphone.
— Un dictionnaire français-anglais.
L’exemple est pertinent s’il est parlant pour les élèves, simple (on est au début du cours)
et montre bien l’intérêt du dictionnaire par rapport aux listes. Il doit aussi permettre
d’illustrer qu’ici l’ordre des couples clé-valeur n’a pas d’importance (données pas ordon-
nées). Un mauvais exemple peut être un exemple qui associe à un ensemble d’entiers
consécutifs, un texte (ou un nombre). Par exemple un relevé météo de températures re-
levées quotidiennement sur une année sera directement exploitable en étant placé dans
une liste de 365 éléments. L’utilisation d’un dictionnaire dans ce cas n’est pas nécessaire.
(d) Code possible :
[
f=open(’positifs.csv’,’r’)
Ltexte=f.readlines()
f.close()
champs=Ltexte [0].strip().split (”;”)
positifs =[]
for ligne in Ltexte [1:]:
enregistrement={}
donnees=ligne.strip().split(”;”)
for i in range(0,4):
enregistrement[champs[i]]=int(donnees[i])
enregistrement[champs[4]]=donnees [4]
enregistrement[champs[5]]=eval(donnees[5])
positifs.append(enregistrement)
]
4. Solution
— Les sensibiliser à la fonction readlines et au fait que sa valeur de retour est une liste dont
chaque élément est un texte.
— Les sensibiliser à la fonction split qui ne s’utilise que sur un texte (et non pas sur une
liste) mais qui renvoie une liste.
6
— Attention aux types manipulés. On part toujours d’un texte mais suivant les données, il
faut changer de type pour pouvoir travailler dessus ensuite.
— Le comptage démarre à la valeur 0. Des élèves de 1ère peuvent ne pas être familiarisés à
cet usage.
— Faire attention aux en-têtes qui sont utilisés pour avoir les clés mais qui ne doivent pas
être traités dans la boucle for.
5. (a) Voici un exemple de 3 questions :
i. Donner la liste des numéros de sécurité sociale des personnes testées positives et qui
sont vaccinées.
ii. Donner la liste des numéros de sécurité sociale des personnes ayant mangé le 30/06
ou le 01/07 .
iii. Donner la liste des identifiants des restaurants où une personne positive a mangé (la
liste pourra contenir plusieurs fois le même identifiant).
(b) Code :
— 1. Lpositifs =[]
for pos in positifs :
if pos[’vaccine’]==True:
Lpositifs.append(pos[’num SS’])
print(Lpositifs)
— 2. Lnum=[]
for enr in restaurants :
if (enr[ ’jour repas ’]==30 and enr[ ’mois repas ’]==6) or (enr[’jour
repas ’]==1 and enr[’mois repas’]==7):
Lnum.append(enr[ ’num SS’])
print (Lnum)
— 3. Ici on crée un liste de dictionnaires qui contient la fusion et on travaille dessus. Ce
n’est pas obligatoire. fusion =[]
for p in positifs :
for enr in restaurants :
if enr[’numSS’]==p[’numSS’]:
dict={}
for cle in p.keys():
dict[cle]=p[cle]
for cle in enr.keys():
dict[cle]=enr[cle]
fusion .append(dict)
for elt in
print(elt[’id restaurant’])
]
Une syntaxe spécifique Python peut aussi être proposée dans ces 3 questions.
— 1. Lpositifs=[pos[’num SS’] for pos in positifs if pos[’vaccine’]]
— 2. Lnum=[enr [’numSS’] for enr in restaurants
if (enr[’jour repas’] == 30 and enr[’mois repas’] == 6)
or (enr[’jour repas’] == 1 and enr[’mois repas’] == 7)]
7
— 3. Lfusion = [enr[ ’id restaurant ’] for enr in restaurants if enr[ ’num
SS’] in [pos[’numSS’] for pos in positifs]]
(a) xn = x ∗ xn−1
(b) xn = xndiv2 ∗ xndiv2 ∗ xnmod2
(c) Même définition que (1b) mais en utilisant une variable intermédiaire pour stocker xndiv2 .
2. Soit la suite (un )n≥0 est définie par les égalités suivantes :
(a) Écrivez une fonction récursive traduisant naïvement cette définition mathématique.
(b) Évaluer le nombre d’appels récursifs de votre fonction.
un+2 un+1
(c) En utilisant léxponentiation rapide et le fait que =M
un+1 un
pour une matrice M bien choisie, écrivez une fonction calculant un , réalisant O(log2 (n))
opérations arithmétiques, dans le pire des cas.
Correction exercice 0
8
Algorithm 2 Un second algo : puis1(x, n)
2. if n ≤ 1 then
if n = 0 then
retourner (1)
else
retourner (x)
end if
else
retrourner (puis1(x, ndiv2) ∗ puis1(x, ndiv2) ∗ puis1(x, n mod 2))
end if
(An/2 )2 si n pair
n
A =
(An/2 )2 ∗ A sinon
il effectuer θ(log2 n) multiplications de matrices 2 × 2. Complexité de la multiplication de
matrices 2 × 2 : θ(1). En conclusion, on calcule fn en θ(log2 n)
Exercice 3 Réseaux
9
(c) Quelle est l’adresse du sous-réseau ?
(d) Quelle est l’adresse de diffusion (broadcast) de ce sous-réseau ?
(e) L’adresse IP 200.100.10.35 appartient-elle à ce sous-réseau ?
Correction exercice 0
1. Un réseau informatique représente plusieurs ordinateurs connectés entre eux à l’aide d’un
système de communication.
2. Adressas IP
(a) Adresse IP : Nombre unique identifiant un périphérique dans un réseau informatique.
(b) Adresse MAC : Est une adresse de couche 2 comportant 6 octets et contrôlée par l’IEEE.
(c) Routeur : Est un équipement réseau qui transmet les paquets d’un réseau à un autre en
fonction des adresses IP.
(d) Commutateur : Est un équipement réseau qui filtre, transfère et inonde des trames en
fonction de l’adresse de destination de chaque trame.
(e) Carte réseau : Est un équipement informatique conçu pour permettre à des ordinateurs
de communiquer sur un réseau informatique.
3. Adressage IP
(a) L’équivalent binaire de l’adresse IP : 11001000.01100100.00001010.00111100
(b) Cette adresse IP est une adresse de classe C. (Plage d’adresse de classe C : 192.0.0.0 −
− − 223.255.255.255)
(c) L’adresse du sous-réseau est : 11001000.01100100.00001010.00111100(200.100.10.60) AND
11111111.11111111.11111111.11100000(255.255.255.224)
11001000.01100100.00001010.00100000(200.100.10.32)
Donc, L’adresse du sous-réseau est : 200.100.10.32
(d) L’adresse de diffusion (broadcast) de ce sous-réseau est : 11001000.01100100.00001010.00111111
(200.100.10.63)
(e) 11001000.01100100.00001010.00100011(200.100.10.35) AND 11111111.11111111.11111111.11100000(255.
11001000.01100100.00001010.00100000(200.100.10.32) Donc, L’adresse IP 200.100.10.35
appartient au sous-réseau 200.100.10.32/27.
Exercice 4
Soit la base de données relationnelle des vols quotidiens d’une compagnie aérienne qui contient
les tables Avion, Pilote et Vol.
— Table Avion (NA : numéro avion de type entier (clé primaire),
— Nom : nom avion de type texte (12),
10
— Capacite : capacité avion de type entier,
— Localite : ville de localité de l’avion de type texte (10) )
— Table Pilote (NP : numéro pilote de type entier,
— Nom : nom du pilote de type texte (25),
— Adresse : adresse du pilote de type texte (40) )
— Table Vol (NV : numéro de vol de type texte (6),
— NP : numéro de pilote de type entier,
— NA : numéro avion de type entier,
— VD : ville de départ de type texte (10),
— VA : ville d’arrivée de type texte (10),
— HD : heure de départ de type entier,
— HA : heure d’arrivée de type entier)
1. Insérer les avions suivants dans la table Avion : (100, AIRBU S, 300, RABAT ), (101, B737, 250, CASA),
(101, B737, 220, RABAT )
2. Afficher tous les avions
3. Afficher tous les avions par ordre croissant sur le nom
4. Afficher les noms et les capacités des avions
5. Afficher les localités des avions sans redondance
6. Afficher les avions dans la localité et Rabat ou Casa
7. Modifier la capacité de l’avion numéro 101, la nouvelle capacité et 220
8. Supprimer les avions dans la capacité et inférieure à 200
9. Afficher la capacité maximale, minimale, moyenne des avions
10. Afficher les données des avions dont la capacité et la plus basse
11. Afficher les données des avions dont la capacité et supérieure à la capacité moyenne.
12. Afficher le nom et l’adresse des pilotes assurant les vols IT100 et IT104
13. Afficher les numéros des pilotes qui sont en service
14. Afficher les numéros des pilotes qui ne sont pas en service
15. Afficher les noms des pilotes qui conduisent un AIRBUS
Correction exercice 0
1. Insérer les avions suivants dans la table Avion : (100, AIRBU S, 300, RABAT ), (101, B737, 250, CASA), (101,
— Insert into avion values (100, ’AIRBUS’, 300, ’RABAT’) ;
— Insert into avion values (101,’B737’,250,’CASA’) ;
— Insert into avion values (101, ’B737’,220,’RABAT’) ;
2. Afficher tous les avions
— select * from avion ;
3. Afficher tous les avions par ordre croissant sur le nom
11
— select * from avion order by Nom asc ;
4. Afficher les noms et les capacités des avions
— select nom, Capacite from avion ;
5. Afficher les localités des avions sans redondance
— select distinct Localite from avion ;
6. Afficher les avions dans la localité et Rabat ou Casa
— select * from avion where Localite=’Rabat’ or Localite=’Casa’ ;
7. Modifier la capacité de l’avion numéro 101, la nouvelle capacité et 220
— Update avion set Capacite=220 where NA=101 ;
8. Supprimer les avions dans la capacité et inférieure à 200
— Delete from avion where Capacite <200 ;
9. Afficher la capacité maximale, minimale, moyenne des avions
— Select Max(Capacite), Min(Capacite), Avg(Capacite) from avion ;
10. Afficher les données des avions dont la capacité et la plus basse
— Select * from avion where Capacite=min(Capacite) ;
11. Afficher les données des avions dont la capacité et supérieure à la capacité moyenne.
— Select * from avion where Capacite>=avg(Capacite) ;
12. Afficher le nom et l’adresse des pilotes assurant les vols IT100 et IT104
— Select Nom, Adresse from Pilote, Vol where Pilote.NP= Vol.NP and NV=’IT100’ and
NV=’IT104’ ; 2012/2013
13. Afficher les numéros des pilotes qui sont en service
— Select NP from Vol ;
14. Afficher les numéros des pilotes qui ne sont pas en service.
— Select NP from Pilote where NP not in (select NP from Vol) ;
15. Afficher les noms des pilotes qui conduisent un AIRBUS
— Select Pilote.NOM from Pilote, Vol, Avion where Pilote.NP= Vol.NP and Avion.NA=Vol.NA
and Avion.NOM=’AIRBUS’ ; 2012/2013
Exercice 5
(a) Etant données les mots u = aa et v = bab, écrire les mots uv, (uv)2 et u3 v.
(b) Enoncés tous les mots de longueur deux définis sur A.
(c) Soient les ensembles
— E1 = {u.v|u ∈ A+ , v ∈ A+ }
— E2 = {u.v|u ∈ A+ , v ∈ A∗ }
— E3 = {u.v|u ∈ A∗ , v ∈ A+ }
Donner la signification des ensembles Ei .
12
2. Définition : Préfixe, suffixe, et facteur : Soient deux mots u et v définis sur un alphabet
A.
— u est un préfixe de v si et seulement si ∃w ∈ A∗ tel que uw = v ;
— u est un suffixe de v si et seulement si ∃w ∈ A∗ tel que wu = v ;
— u est un facteur de v si et seulement si ∃w1 ∈ A∗ , ∃w2 ∈ A∗ tels que w1 uw2 = v.
Montrer que les relations “être-préfixe-de”, “être-suffixe-de” et “être-facteur-de” sont des rela-
tions d’ordre partiel sur A∗ , cést-à-dire quélles sont transitives, antisymétriques et réflexives.
3. Sur l’alphabet A = {0, 1}, on considère les langages L1 = {01n |n ∈ IN} et L2 = {0n 1|n ∈ IN}.
Définir les langages L1 L2 , L1 ∩ L2 et L21 .
4. On considère la grammaire G = (T, N, S, R) où
T = {0, 1}
N = {S}
R = {S → 0S|1S|0}
Déterminer L(G).
5. Construire une grammaire pour la langage L = {02n 1n |n ≥ 0}.
Correction exercice 0
1. Mots :
(a) uv = aabab, (uv)2 = aababaabab et u3 v = aaaaaabab.
(b) Mots de longueur deux = {aa, ab, ba, bb}.
(c) E1 = {u ∈ A∗ ||u| ≥ 2} = ensemble des mots d’au moins deux symboles. E2 = A+ et
E3 = A+ .
2. pour "être-préfixe-de" :
— Transitivité : soient trois mots u, v et w définis sur A tels que u est un préfixe de v et v
est un préfixe de w. Montrons que u est un préfixe de w :
— u est un préfixe de v → ∃u′ ∈ A∗ tel que uu′ = v.
— v est un préfixe de w → ∃v ′ ∈ A∗ tel que vv ′ = w.
Par conséquent, w = uu′ v ′ et donc u est un préfixe de w.
— Antisymétrie : soient deux mots u et v définis sur A tels que u est un préfixe de v et v
est un préfixe de u. Montrons que u est égal à v :
— u est un préfixe de v → ∃u′ ∈ A∗ tel que uu′ = v
— v est un préfixe de v → ∃u′ ∈ A∗ tel que vv ′ = u. Par conséquent, uu′ v ′ = u et donc
u′ = ϵ et v ′ = ϵ et u = v.
— Réflexivité : pour tout mot u défini sur A, on a u est un préfixe de u car u = u.ϵ et
ϵ ∈ A∗ .
3. L1 L2 = {01n 0m 1|n ∈ IN, m ∈ IN} ; L1 ∩ L2 = {01} et L21 = {01n 01m | ∈ IN, m ∈ IN}
13
1 2 3 4
5 6 7 8 9
2 4 3
10 11 12
5 6 7 13 14
T = {0, 1}
N = {S}
R = {S → 00S1|ϵ}
Exercice 6
Soit G = (S, A) un graphe orienté sans circuit. On rappelle que dans une liste topologique L,
∀(x, y) ∈ A, x est placé avant y dans la liste. Soit s un sommet fixé de S tel que ∀x ∈ S, il existe
un chemin de s à x dans G. On considère l’algorithme LT OP suivant dans lequel :
— F et P sont respectivement, une file et une pile initialement vides ;
— un sommet est dit visité s’il appartient à F
14
□
Correction exercice 0
Table 1 – Description
F P
LT OP (G, 1) () ()
Enf iler(F, 1) (1) ()
LT OP (G, 2) (1) ()
Enf iler(F, 2) (1, 2) ()
LT OP (G, 4) (1, 2) ()
Enf iler(F, 4) (1, 2, 4) ()
LT OP (G, 6) (1, 2, 4) ()
Enf iler(F, 6) (1, 2, 4, 6) ()
LT OP (G, 3) (1, 2, 4, 6) ()
Enf iler(F, 3) (1, 2, 4, 6, 3) ()
LT OP (G, 7) (1, 2, 4, 6, 3) ()
Enf iler(F, 7) (1, 2, 4, 6, 3, 7) ()
EM P ILER(P, 7) (1, 2, 4, 6, 3, 7) (7)
EM P ILER(P, 3) (1, 2, 4, 6, 3, 7) (3, 7)
EM P ILER(P, 6) (1, 2, 4, 6, 3, 7) (6, 3, 7)
EM P ILER(P, 4) (1, 2, 4, 6, 3, 7) (4, 6, 3, 7)
LT OP (G, 5) (1, 2, 4, 6, 3, 7) (4, 6, 3, 7)
Enf iler(F, 5) (1, 2, 4, 6, 3, 7, 5) (4, 6, 3, 7)
EM P ILER(P, 5) (1, 2, 4, 6, 3, 7, 5) (5, 4, 6, 3, 7)
EM P ILER(P, 2) (1, 2, 4, 6, 3, 7, 5) (2, 5, 4, 6, 3, 7)
EM P ILER(P, 1) (1, 2, 4, 6, 3, 7, 5) (1, 2, 5, 4, 6, 3, 7)
15
Exercice 7
Soit G = (S, A) un graphe orienté donné par la figure 2.
1. Montrer que si G est sans circuit, tout chemin de G est élémentaire et est de longueur
inférieure ou égale à n − 1.
2. Montrer que si G est sans circuit, il existe un sommet sans prédécesseur.
3. Montrer que si G est sans circuit, alors il existe un plus long chemin. Montrer que ce chemin
relie un sommet sans prédécesseur à un sommet sans successeur. Quén est-il si G possède un
circuit ?
4. Donner toutes les composantes fortement connexes du graphe de la figure 2, ainsi que le
graphe réduit associé. Le graphe réduit est le graphe constitué par les composantes connexes.
5. Montrer que le graphe réduit associé à un graphe G quelconque ne possède pas de circuit.
6. Montrer que si G est fortement connexe et n > 1, il contient un circuit.
7. Montrer que si G est fortement connexe, chaque sommet est de degré au moins égal à 2.
□
Correction exercice 0
1. Montrons que tout chemin c est élémentaire et de longueur inférieure ou égale à n − 1. Soit
c = (s0 , s1 , . . . , sp−1 , sp ) un chemin de G de longueur p. S’il existe i et j (i ̸= j, on supposera
i < j) tels que si = sj , alors (si , si+1 , . . . , sj−1 , sj ) est un circuit, ceci contredit l’hypothèse.
Tout chemin de G ne peut donc passer deux fois par le même sommet. Or pour némprunter
que des sommets différents, un chemin de G ne peut contenir plus de n sommets. IL est donc
longueur inférieure ou égale à n − 1.
2. Nous faisons une démonstration par l’absurde. Posons l’hypothèse suivante : G est sans circuit
et chaque sommet a (au moins) un prédécesseur. Choisissons un sommet quelconque de G,
soit s0 , s0 a un prédécesseur s1 . G est sans circuit donc le chemin (s1 , s0 ) est élémentaire
et de ce fait s1 ̸= s0 . Le sommet s1 admet un prédécesseur s2 et le chemin (s2 , s1 , s0 ) est
élémentaire et s2 ̸= s1 et s2 ̸= s0 . En continuant cette construction nous obtenons un chemin
élémentaire (sn , . . . , s1 , s0 ) tel que sn ̸= sn−1 , . . . , sn ̸= s1 , sqn ̸= s0 ce qui est absurde car le
nombre de sommets de G est n.
3. Si G est sans circuit, tout chemin de G est élémentaire et donc de longueur inférieure ou
égale à n − 1. Lénsemble des chemins de G est donc un ensemble fini. On peut alors ordonner
les éléments de cet ensemble par leur longueur. Parmi tous les chemins de G il en existe donc
au moins un dont la longueur est supérieure ou égale à celle de tous les autres chemins.
Soit c = (s0 , . . . , sp ) un chemin élémentaire de longueur maximum p. Si on suppose que
s0 a un prédécesseur s, alors le chemin (s, s0 , . . . , sp ) est un chemin élémentaire de longueur
p + 1, ce qui contredit l’hypothèse que p est la longueur maximum. Donc s0 n’a pas de
prédécesseur. On montre de la même façon que sp n’a pas de successeur.
Si G possède un circuit, il est évident que G ne possède pas de plus long chemin, puisquén
empruntant autant de fois que nécessaire le circuit, on peut trouver un chemin aussi long
qu’on le souhaite.
16
4. Le graphe de la figure 3 comporte 8 composantes fortement connexes représentées sur la
figure 2. Le graphe réduit est donné par la figure 4.
C4
1 2 3 4
5 6 7 8 9
C2
C3
C1
10 11 12
C5 C6 C7
13 14
C8
17
1 2 3 4
5 6 7
A B C D E F
1 identifiant_capteur piece Num_mesure Ouverture Presence Temperature
2 1 Salon 1 False False 18, 7
3 3 Cuisine 1 False False 18, 8
4 2 Chambre 1 1 True False 17, 5
5 5 Salle de bain 1 False False 19, 1
6 6 Chambre 2 1 False True 16, 6
7 4 Entree 1 False False 17, 4
8 1 Salon 2 False False 18, 7
9 3 Cuisine 2 False False 18, 8
10 2 Chambre 1 2 True False 17, 5
Table 2 – Donnees_capteurs avec ouverture en format Calc/Excel (les colonnes (resp. les lignes)
sont numérotées par A, B . . . (resp. 1, 2, . . .).
18
— df.loc(index ligne,index colonne) retourne, sous forme d’un objet de type dataframe,
certaines lignes et colonnes du dataframe df. L’index des colonnes est le nom des colonnes
dans le fichier csv, et l’index des lignes est l’index créé lors de l’initialisation du dataframe à
la lecture du fichier.
Par exemple, print(df.loc[0,’Temperature’]) affichera la température de la 1ère ligne
du fichier.
Il est également possible d’effectuer des tests sur le contenu d’un dataframe.
Par exemple, print(df[’Piece’]==’Salon’) affichera, sous forme de booléens, pour
chaque ligne du fichier, si la pièce mentionnée est un salon. Ces deux techniques peuvent être
conjointement utilisées pour filtrer des lignes à partir de tests.
Par exemple, print(df.loc[df[’Piece’]==’Salon’, :]) affichera toutes les lignes qui
concernent le salon.
Il est possible de combiner plusieurs facteurs de filtrage en utilisant un ”et” (&) ou un
”ou”(|).
Par exemple, print(df.loc[(df[’Piece’]==’Salon’)|(df[’Piece’]==’Cuisine’),’Presence’])
affichera la colonne présence pour les lignes correspondant au salon ou à la cuisine.
— Il est possible de retourner le maximum (méthode max), le minimum (méthode min) et la
moyenne (méthode mean) d’une donnée d’une dataframe.
Par exemple, print(df.loc[ :,’Temperature’].mean()) affichera la température moyenne
mesurée sur l’ensemble des lignes du fichier.
— Pour retourner le contenu trié d’un dataframe, on utilise la méthode dataframe.sort va-
lues(column,ascending=...). column est une chaîne indiquant la colonne utilisée pour
le tri. Si ascending vaut True (valeur par défaut), le tri est croissant, s’il vaut False, il est
décroissant.
Par exemple, df.sort values(by=[”Piece”], ascending=False) affiche les lignes du
fichier triées par Piece dans l’ordre alphabétique inversé (en commençant par Z).
Annexe C
C.1 Extrait du fichier positifs.csv
num_SS; age;jour_test;mois_test;sexe;vaccine
1630580265006;58;2;7;H;True
2750846580156;46;2;7;F;False
1950412410023;26;3;7;H;False
2570235820132;64;3;7;F;False
19
4;796;1;7;8;1951012410056
5;796;1;7;1;8;1951232564031
20