Vous êtes sur la page 1sur 20

MEEF NSI 20 septembre 2023

Examen Capes informatique Durée: 5h

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.

Exercice 1 Gestion des données


Vous souhaitez aborder la notion de données et l’importance que les données ont pris dans notre
société avec vos élèves de SNT en seconde.
1. Introduction à la problématique des données
(a) Citer un exemple que vous pourriez utiliser devant les élèves pour illustrer l’importance
de l’exploitation des données dans leur vie quotidienne. Vous justifierez brièvement votre
choix.
(b) Expliquer, en quelques lignes et comme vous l’expliqueriez à vos élèves, pourquoi le sto-
ckage de données sur le "cloud" (donc dans les datacenters) a bien un impact négatif sur
l’environnement. Vous donnerez deux impacts différents sur l’environnement.
(c) Donner deux conseils concrets que vous pourriez donner à vos élèves pour limiter facile-
ment l’impact de leurs données sur l’environnement.
(d) Expliquer en quoi disposer de données massives (appelées aussi Big Data) peut être un
avantage dans certains enjeux de société. Illustrer votre réponse avec un exemple que
vous pourriez proposer à vos élèves.
(e) Citer un danger (autre que l’impact sur l’environnement) qui est apparu ou peut ap-
paraître avec les données massives. Vous expliquerez, comme vous l’expliqueriez a‘ vos
élèves, ce danger en quelques lignes.
2. Utilisation des fichiers csv. Vous voulez maintenant traiter la notion de données structurées
toujours avec vos élèves de seconde.

(a) Définir la notion de descripteur d’objet.


(b) Proposer une activité débranchée que vous pourriez réaliser en classe pour leur faire
comprendre la notion de descripteur d’objet. Cette activité devra durer entre 30 min et
1h. On attend une description détaillée du déroulement de l’activité et de ses attendus.
(c) Vous abordez ensuite le traitement de ces données structurées. Voici l’extrait du pro-
gramme de seconde SNT sur ce point :
Contenus Capacités attendus
Traitement de données structurées Réaliser des opérations de recherche, filtre
tri ou calcul sur une ou plusieurs tables
Pour cela, vous décidez de les faire travailler sur le fichier csv suivant :" Donnees
capteurs 22 09 21.csv " (cf Annexe A). Ce fichier contient toutes les mesures réalisées par
les capteurs d’une maison domotisée le 22/09/2021. Chaque capteur envoie ses mesures

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

1. Introduction à la problématique des données


(a) Voici des exemples possibles :
— Récupération de leurs données d’écoute/visionnage pour leur proposer du contenu
ciblé (musique/vidéo/réseaux sociaux) (l’intérêt consiste à montrer que se baser sur
les données a des avantages ; ici avoir du contenu qui nous intéresse ; mais aussi des
inconvénients les informations proposées sont basées sur ce que l’on a précédemment
consulté, ce qui peut induire des biais de confirmation, et donc d’apporter un propos
nuancé).
— Données en temps réel : circulation routière en temps réel (exemple qui devrait parler
aux élèves car leurs parents utilisent des gps même si eux ne conduisent pas encore).
L’important est que les exemples parlent vraiment aux élèves.
(b) Les datacenters qui stockent les données du Cloud fonctionnent bien sûr avec de l’élec-
tricité, mais doivent aussi, pour pouvoir fonctionner correctement, être refroidis, ce qui
a un coût énergétique non négligeable. De plus, les machines sur lesquelles les données
sont stockées doivent être fabriquées et pour cela on utilise notamment des métaux rares
(dont l’extraction est très polluante). Il faut aussi transférer les informations depuis le
datacenter vers les appareils et vice-versa ce qui a aussi un coût énergétique (et nécessite
aussi une infrastructure de communication).
(c) Il y a bien sûr beaucoup de possibilités et il s’agit en général de réduire la quantité de
données (stockées et/ou téléchargées). Voici quelques exemples :
— Supprimer les mails qui ne sont plus utiles dans leur boîte
— Supprimer les fichiers inutiles dans leur Cloud
— Ne pas envoyer une vidéo quand un simple SMS suffit, ou favoriser les formats de
compression récents ou des définitions inférieurs (éviter le HD ou UltraHD)
— Passer par un câble Ethernet pour télécharger plutôt que le Wi-Fi
— Sauvegarder en local les fichiers/vidéos dont on aura besoin souvent plutôt que de les
retélécharger à chaque fois
(d) Voici quelques exemples possibles. En intelligence artificielle, on peut être amené à mani-
puler des grands volumes de données (jeu d’entraînement et de test) pour la construction
de méthodes de prédiction. C’est à l’origine de progrès dans de nombreux domaines scien-
tifiques comme, par exemple, la santé, les prévisions météo. Disposer de données massives
permet aussi l’optimisation dans des domaines très variés (boutique e-commerce, horaires
de trains). À New-York, le Big Data permet par exemple de prévoir les incendies. C’est
une science qui se développe et beaucoup d’usages ne sont pas encore connus.
(e) Voici quelques dangers possibles :
— Le risque de surveillance de masse et l’atteinte à la vie privée. L’analyse du trafic
Internet ou encore la géolocalisation en temps réel via des systèmes de reconnaissance

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))
]

(d) Voici une description succincte d’une organisation possible de l’activité :


— Leur faire construire progressivement des éléments de réponses aux questions (pas
exemple, afficher les données puis sélectionner une colonne, mettre un critère, en
mettre plusieurs, . . .).
— Les faire travailler sur la sélection sur critère, puis sur le tri des valeurs (d’abord
simplement sur les colonnes puis sur une sélection de données).
Les élèves pourrait d’abord travailler sur des exemples fournis, puis être amenés à
écrire eux-mêmes les programmes.

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]]

Fin correction exercice 0

Exercice 2 Algorithmes récursifs

1. Calculer xn , pour des valeurs entières et positives de n, de plusieurs possibilité en utilisant


les définitions récursives suivantes (qu’il faudra compléter) et évaluer l’ordre de grandeur de
la complexité de chacune des méthodes :

(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 :

u0 = 1, u1 = 42 et pour n ≥ 0, un+2 = un+1 − 2un .

(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

Algorithm 1 Un premier algo : puis(x, n)


1. if n = 0 then
retourner 1
else
retourner (x ∗ puis(x, n − 1))
end if

En se basant sur l’exercice précédent : θ(n).


En se basant sur l’exercice précédent : θ(n).
En se basant sur l’exercice précédent : θ(log2 n).
 
1 −2
4. M =
1 0
Pour calculer An nous avons besoin de calculer :

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

Algorithm 3 Un troisième algo : puis2(x, n)


3. if n ≤ 1 then
if n = 0 then
retourner (1)
else
retourner (x)
end if
else
aux := puis2(x, ndiv2) ; retrourner (aux ∗ aux ∗ puis(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)

Fin correction exercice 0

Exercice 3 Réseaux

1. Qu’est-ce qu’un réseau informatique ?


2. Définissez les termes suivants :
(a) Adresse IP.
(b) Adresse MAC.
(c) Routeur.
(d) Commutateur.
(e) Carte réseau.
3. Un ordinateur P1 dont les paramètres réseau sont les suivants : Adresse IP : 200.100.10.60
Masque du sous-réseau : 255.255.255.224
(a) Codez l’adresse IP en binaire.
(b) Quelle est la classe du réseau ?

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.

Fin correction exercice 0

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

Fin correction exercice 0

Exercice 5

1. Soit l’alphabet A = {a, b}.

(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

Figure 1 – Graphe orienté Figure 2 – Un graphe orienté

4. L(G) = {u0|u ∈ {0, 1}∗ }.


5. On définit la grammaire G = (T, N, S, R) où

T = {0, 1}
N = {S}
R = {S → 00S1|ϵ}

Fin correction exercice 0

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

Algorithm 4 LT OP (G : graphe; s : sommet)


Enf iler(F, s)
while s possède un successeur y non visité do
LT OP (G, y)
end while
EM P ILER(P, s)

1. Appliquer la procédure LT OP en partant du sommet s = 1 de léxemple de la figure 1. On


précisera l’état de F et P à chaque étape.
2. A quoi correspond F lors de la terminaison de LT OP ?
3. Démontrer que, lors de la terminaison de LT OP , P définit une liste topologique des sommets
de G.

14

Correction exercice 0

1. On décrit l’tat de F et P à chaque étape dasn le tableau 1

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)

2. La file F correspond à un parcours en profondeur à partir du sommet s du graphe G à la


terminaison de LT OP (G, s).
3. Par définition, un sommet x est visité s’il se trouve dans file F . Lors de l’appel LT OP (G, s)
le sommet x est enfilé dans F , puis une série d’appels à LT OP (G, y) (où y est un successeur
de x non visité) est effectuée ; Ainsi, tout sommet x est visité avant tous ses successeurs. De
même, puisque x est empilé après les appels LT OP (G, y), la pile P contient le sommet x au
sommet de la pile à la fin de l’appel LT OP (G, x). Comme ses successeurs ont été placés dans
P par la série d’appels à LT OP (G, y), il ne peut exister de successeur y de x placé après x
dans P : la pile définit donc bien une liste topologique des sommets de G.

Fin correction exercice 0

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

Figure 3 – Composantes fortement connexes du graphe de la figure 2

5. Supposons, pour simplifier la démonstration, qu’il existe un circuit de longueur 2 dans le


graphe réduit, et que ce circuit relie les deux composantes connexes Cp et Cq . Cela signifie
qu’il existe un arc(sp1 , sq1 ) dans G ou sp1 ∈ Cp et sq1 ∈ Cq . De la même façon, il existe un
arc (sq2 , sp2 ) dans G ou sq2 ∈ Cq et sp2 ∈ Cp . IL existe donc un chemin de sq1 à sq2 et un
chemin de sp2 à sp1 . Il existe donc un circuit passant par les sommets sq2 , sq1 , sp2 et sp1 . Ceci
est en contradiction avec la définition d’un graphe réduit. Une démonstration similaire peut
être faite dans le cas d’un circuit de longueur quelconque.
6. Supposons que n > 1, G fortement connexe et sans circuit. Soient x et y deux sommets
distincts dee G. Soient c un chemin de x à y et d un chemin de y à x. Si d n’émprunte
aucun sommet de c autre que les sommets x et y alors C.d est un circuit passant par x et
y. Contradiction. Sinon, soit z le premier sommet de d appartenant à c (z ̸= x, z ̸= y). Le
sous-chemin de d de y à z est un circuit. Contradiction.
7. Supposons que G est un graphe fortement connexe. Soit x un sommet de G. Si dG (x) = 0
alors x est isolé. Contradiction. Si dG (x) = 1, le sommet x possède un voisin unique y. Ainsi,
x est soit une entrée et il n’existe pas de chemin de y à x, soit une sortie et il n’existe pas de
chemin de x à y. Ceci contredit le fait que G est un graphe fortement connexe. Le sommet
x est donc de degré au moins égal à 2.

Fin correction exercice 0

17
1 2 3 4

5 6 7

Figure 4 – Graphe réduit associé au graphe de la figure 2

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, . . .).

Annexe A : Extrait du fichier Donnees capteurs 22 09 21.csv (ouvert


dans un tableur)
Le séparateur du fichier .csv est ” ;”. Les informations sont données par le tableau 2.

Annexe B : Description de fonctions utiles de la bibliothèque pandas


— pandas.read csv(nom,sep=...) prend en argument une chaîne contenant l’adresse du fi-
chier csv à lire et un chaîne contenant le séparateur du fichier csv, et retourne une instance
de type dataframe, initialisée avec l’ensemble des données présentes dans le fichier. Lors de la
création du dataframe, un index est associé à chacune des lignes du fichier (en commençant
à partir de 0).
Par la suite, pour illustrer l’utilisation de certaines fonctions, on suppose que la variable ”df” pointe
vers le dataframe obtenu à partir du fichier "Donnees capteurs 22 09 21.csv".

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

C.2 Extrait du fichier restaurants.csv


id_enregistrement;id_restaurant;jour_repas;mois_repas;tranche_horaire;num_table;num_SS
1;324;30;6;2;5;1850659240032
2;324;30;6;2;5;2860372541115
3;796;1;7;1;8;1950412410023

19
4;796;1;7;8;1951012410056
5;796;1;7;1;8;1951232564031

20

Vous aimerez peut-être aussi