CCINP Informatique Commune TSI 2022Sujet et rapport du jury
- Chaînes de caractères et slicing
- Tuples et structures de données
- Récursivité et algorithmique (tri, complexité)
- Modules Python et lecture de documentation
- Bases de données SQL (requêtes, jointures)
Téléchargements
- Corrigé : pas encore disponible
Présentation du sujet
Difficulté moyenneReprésentation de données géolocalisées sur une carte numérique en Python (données exif, module folium, SQL)Afficher ou masquer la section
Présentation du sujet
Difficulté moyenneLe sujet fait développer un script Python qui place sur une carte numérique les noms de fichiers photos à partir de leurs données exif, notamment leurs coordonnées GPS. Il combine manipulation de chaînes de caractères et de tuples, utilisation du module folium, algorithmique (parcours de fichiers, tri, récursivité) et interrogation d'une base de données SQL.
- 1Partie I : Géolocalisation de photosManipuler des chaînes de caractères : comparaison, extraction de l'extension d'un fichier.
- 2Partie II : Lecture de données exifConvertir des coordonnées GPS et lire des métadonnées exif d'une image.
- 3Partie III : Module FoliumUtiliser le module folium pour placer des marqueurs de photos géolocalisées sur une carte numérique.
- 4Partie IV : Ajout d'une ligne entre chaque markerTracer une ligne polygonale reliant les marqueurs placés sur la carte.
- 5Partie V : Recherche de photos dans un dossierParcourir des fichiers et répertoires avec le module os, notamment de façon récursive.
- 6Partie VI : Une fonction mystère et son applicationÉtudier un algorithme de tri et sa complexité.
- 7Partie VII : Interrogation de bases de données SQLÉcrire des requêtes SQL avec jointures et les exploiter dans du code Python.
Difficulté moyenne. Le rapport indique que la difficulté résidait surtout dans l'appropriation de la documentation fournie, avec des parties bien traitées (SQL, algorithme de tri) et d'autres nettement moins réussies (partie V sur les fichiers et répertoires).
L'épreuve en chiffres
Moyenne 10,24 / 20 · écart-type 4,54 · 1 238 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 10,24/ 20
- Écart-type
- 4,54
- Présents
- 1 238
- Coefficient
- 4
- Durée
- 3 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 11 mai 2022. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ce qu'a observé le jury
6 erreurs relevéesComparaison de chaînes de caractères mal comprise · Slicing méconnu · Confusion entre print et returnAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet, qui s'appuie sur les programmes de première et deuxième années, résidait surtout dans la capacité à s'approprier une documentation. Le bilan est contrasté : de bonnes copies montrent une bonne maîtrise du langage Python, de l'algorithmique et du SQL, tandis que trop de candidats ne connaissent pas leur cours ou peinent à lire une documentation pourtant rédigée en français.
Les erreurs les plus sanctionnées
- 1Comparaison de chaînes de caractères mal compriseQ1
Trop peu de candidats arrivent au bon résultat sur la comparaison de chaînes de caractères, une majorité ne comprenant pas l'ordre lexicographique utilisé.
« la comparaison entre les différentes chaînes de caractères n’est pas comprise par une majorité »
- 2Slicing méconnuQ3
Le slicing n'est pas connu par beaucoup de candidats, qui utilisent une boucle pour tenter de résoudre une question pourtant simple.
- 3Confusion entre print et return
Le return n'est pas compris par une quantité trop importante de candidats, nombreux considérant qu'un print a le même rôle qu'un return.
- 4Parcours de fichiers et répertoires mal maîtriséQ18, Q19, Q20
Les notions de répertoire et de fichier semblent être source de confusion, et la question sur la récursivité et son test d'arrêt est très rarement traitée.
- 5Jointures SQL fragilesQ23 à Q26
On note beaucoup d'erreurs de syntaxe (when au lieu de where) et l'écriture d'une jointure est trop souvent problématique, la mise en application des requêtes en Python restant compliquée.
- 6Milieu de deux points non maîtriséQ13
La moitié des candidats ne savent pas comment déterminer le milieu de deux points en connaissant leurs coordonnées.
Ce qui a été bien réussi
- Les questions Q2 et Q4, sur l'extraction de l'extension d'un fichier, sont en général bien traitées.
- La question Q14 est généralement bien traitée quand elle est abordée.
- La partie SQL (Q23 à Q26) a permis à beaucoup de candidats de récolter facilement des points.
- Les compréhensions de listes sont rarement utilisées mais, quand elles le sont, elles sont parfaitement maîtrisées.
- Beaucoup de bonnes copies montrent que le cours (complexité, SQL) et le langage Python sont bien connus.
Conseils du jury
- Lire attentivement la documentation fournie sur les modules et fonctions avant de commencer à coder.
- Respecter le prototype des fonctions données, notamment le type des données à passer et à retourner.
- Utiliser assert pour le débogage plutôt que print, et réserver return à la valeur renvoyée par la fonction.
- Respecter l'ordre des questions, quitte à laisser des blancs, et soigner la présentation de la copie.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ÉPREUVE SPÉCIFIQUE - FILIÈRE TSI
INFORMATIQUE
Durée : 3 heures
RAPPEL DES CONSIGNES
- Utiliser uniquement un stylo noir ou bleu foncé non effaçable pour la rédaction de votre composition ; d'autres couleurs, excepté le vert, peuvent être utilisées, mais exclusivement pour les schémas et la mise en évidence des résultats.
- Ne pas utiliser de correcteur.
- Écrire le mot FIN à la fin de votre composition.
Les calculatrices sont interdites.
Chaque Partie peut être traitée de manière indépendante.
Les fonctions Python créées dans une question (même non traitée) pourront être utilisées.
Représentation de données géolocalisées sur une carte numérique
Présentation du thème du sujet
- la date où elle a été prise;
- les coordonnées GPS de l'endroit où elle a été prise.
Partie I - Géolocalisation de photos
x='2020:06:12 21:12:40'
y='2020:06:12 21:32:40'
print (x>y)
Exemple: mot1='chat.jpg', mot2='chien.jpeg', mot3='fichier.ipynb'
Les chaînes de caractères qui commencent par ' . ' sont exclues.
Exemple:'.ipynb', '.jpg' sont exclues.
Q2. Écrire une fonction nommée placeDuPoint qui prend en entrée une chaîne de caractères et qui retourne l'indice du point dans cette chaîne caractères.
Exemple: dans 'devoir.ipynb' le point a pour indice 6.
Q3. Écrire une fonction nommée coupeExtension qui prend en entrée une chaîne de caractères et qui retourne la chaîne de caractères précédent le caractère ' . ' . Exemple: la fonction appliquée à 'devoir.ipynb' retourne 'devoir'.
Partie II - Lecture de données exif
On rappelle l'utilisation de la fonction openImage :
my_image=openImage("photo.jpg")
Q5. Écrire une fonction convertTodecimale qui prend en entrée un tuple (degré, minutes, secondes) et qui retourne le flottant correspondant.
Q6. Écrire une fonction imageToGpsPoint qui prend en entrée une variable my_image et qui retourne une variable de type Point.
Partie III - Module Folium
Présentation du module folium
Les données que nous allons manipuler sont des photos ayant des données exif, plus particulièrement des coordonnées GPS, puis nous allons mettre en place le script qui permet de placer leurs noms sur une carte numérique. On précise que l'on peut ajouter le script pour les visualiser, mais cela nécessite du code Html, ce qui n'est pas abordé dans ce sujet.
Chaque nom de photo sera positionné sur cette carte grâce à ses coordonnées GPS. Un marqueur (nommé marker dans le module folium) permet de repérer cette photo positionnée sur la carte et une option popup permet de nommer ce marqueur. La carte peut être centrée sur des coordonnées particulières et peut être plus ou moins "zoomée".
- marker pour tout marqueur (ou symbole) placé sur la carte numérique à certaines coordonnées GPS;
- popup : option qui permet de donner un nom au marker par le biais d'une chaîne de caractères.
import folium #importation du module
location=(35.9279, -114.9721) #location est de type Point
#ce tuple représente le couple (latitude, longitude)
#Pour créer une carte vide centrée sur location:
carteTest=folium.Map(location,zoom_start=20) # l'option de zoom est ici à 20 arbitrairement
#Pour ajouter un marker à la carte créée ici nommée carteTest
#Ce marker est placé aux coordonnées location:
folium.Marker(location, popup='Las Vegas').add_to(carteTest)
#popup donne un nom au marker, ici 'Las Vegas', sur la carte
#Pour créer et sauvegarder la carte au format html
carteTest.save('MaCarte.html') #Le nom de sauvegarde est ici Macarte.html
On rappelle que chaque carte doit être centrée sur un point dont les coordonnées GPS sont connues.
centre=(46.87, 4.00261)
c=folium.Map(location=centre,zoom_start=20)
folium.Marker((46.877, 4.00261),popup="LosAngeles1").add_to(c)
folium.Marker((46.87, 4.003),popup="LosAngeles2").add_to(c)
folium.Marker((46.88, 4.003),popup="LosAngeles3").add_to(c)
c.save('maCarte.html') # sauvegarde de la carte
#le nom doit avoir l'extension .html pour obtenir une page web lisible
- chaque popup aura pour nom le nom ajouté;
- la fonction retournera la carte créée.
listePhotos=['Venitian.jpeg','Bellagio.jpeg','Palazzo.png']
III. 1 - Coordonnées GPS
On donne deux Point appelés inf et sup et on suppose que le segment formé par ces deux Point est la diagonale d'un rectangle non aplati où le coin inférieur gauche est inf et le coin supérieur droit est sup.
On ne souhaite positionner que les noms des photos situées dans ce rectangle.
Dans cette sous-partie, nous parlerons d'une liste de chaînes de caractères qui représentent des noms de photos (type 'photo01.jpg') et ayant des données exif.
- Vrai si point1 et point2 forment un rectangle non aplati, dont point1 sera le coin inférieur gauche et point2 le coin supérieur droit;
- Faux sinon.
On précise que le bord du rectangle est exclu.
III. 2 - Ajout de markers à une carte numérique
On dispose d'une liste de noms de photos, les markers seront des noms de photos.
Parmi ces photos on souhaite sélectionner uniquement celles dont les coordonnées GPS sont incluses strictement dans le rectangle délimité par inf et sup, et positionner leur nom sur une carte numérique.
On rappelle que pour sauvegarder une carte (de nom 'nomDeLaCarte'), il suffit d'utiliser le code :
carte.save('nomDeLaCarte'+'.html')
Le code Python pour l'affichage dans une page web sera alors :
webbrowser.open('nomDeLaCarte.html')
- une liste de photos au format chaîne de caractères (exemple : 'Bellagio.jpeg'), nommée listePhotos;
- inf et sup de type Point;
- titre qui sera le nom de la carte sous forme de chaîne de caractères (sans extension);
Cette fonction retourne False si le nombre d'éléments ajoutés à la carte est nul, sinon elle sauvegarde la carte et la retourne.
Partie IV - Ajout d'une ligne entre chaque marker
Chaque marker sera relié à un autre marker par une ligne dessinée sur la carte.
Chaque ligne dessinée est faite suivant l'ordre d'apparition des noms dans la liste.
Pour faire une ligne qui relie un marker à un autre marker dans l'ordre d'une liste, on procède comme ci-dessous.
Attention, dans l'exemple, les éléments de la liste sont des tuples de coordonnées GPS.
p1=[39.900908, -73.040335]
p2=[40.768571, -73.861603]
p3=[41.011522, -73.960004]
centre=[40.70000, -73.70000]
coordinates=[p1,p2,p3]
m=folium.Map(location=centre,zoom=20)
aline=folium.PolyLine(locations=coordinates,weight=2,color='blue')
# Ajout d'une ligne polygonale p1-p2-p3 de couleur bleue largeur 2
aline.add_to(m)
- une liste de noms de photos au format chaîne de caractères (exemple : 'Bellagio.jpeg'), nommée listePhotos;
- inf et sup de type Point;
- titre qui sera une chaîne de caractères (sans extension) représentant le nom de la carte;
Cette fonction crée une carte dont le nom est titre, et y positionne uniquement le nom des photos si elles sont dans le rectangle délimité par inf et sup, et relie chaque élément consécutif ajouté à la carte par une ligne rouge de largeur 1.
La carte sera centrée sur le milieu du segment inf - sup.
Cette fonction retourne False si le nombre d'éléments ajoutés à la carte est nul, sinon elle sauvegarde la carte et la retourne.
On donne la liste ordonnée des points de ce rectangle à utiliser dans cette question :
coordinates=[inf,inf2,sup,sup2,inf]
Partie V - Recherche de photos dans un dossier
Le module os permet de gérer ces dossiers et nous allons utiliser en particulier la fonction os. listdir qui prend en paramètres une chaîne de caractères (le nom d'un dossier) et qui retourne la liste de noms de fichiers avec leur extension ou de dossiers.
Par exemple : l'appel de la fonction os.listdir ('Photos') retourne la liste des noms des fichiers et des sous-dossiers du dossier appelé ici Photos.
import os
liste=os.listdir('Photos') # os.listdir ne peut prendre en entrée qu'un repertoire
print(liste)
>>>['Photos2019','Photos2018','photo1.jpg','photo2.jpg','photo3.jpg']
liste2=os.listdir('dossier\dossier2')
print(liste2)
>>>['dossier 3 bis','dossier 3 ter','dossier3','photo2_1.png','photo2_2.jpg']
On rappelle que le nom d'un fichier contient une seule et unique fois le caractère ' . ' et que le nom d'un dossier ne comporte pas ce caractère. Dans les Q17, Q18 et Q19, les chaînes de caractères utilisées ne peuvent être que des noms de dossiers ou des noms de fichiers.
donnees=['photo.jpeg','dir1','dir2','photo2.jpeg',...,'photo1211.png','dir4110']
#'dir1','dir2',...,'dir4110' sont des dossiers
Q19. Que contient liste après l'exécution du code Python ci-dessous :
# mot est une variable qui contient une chaîne de caractères
# qui est le nom d'un dossier ou d'une photo
monDir='rep' # le dossier initial
if '.' not in mot:
monDir=monDir+'\'+mot
liste=os.listedir(monDir)
Partie VI - Une fonction mystère et son application
def mysteryMachine(liste):
x=1
while(x<len(liste)):
nom=liste [x]
i=x
while(openImage(nom).datetime<openImage(liste[i-1]).datetime): # Question 2
liste[i]=liste[i-1]
i=i-1
if(i==0): # Question 3
break
liste[i]=nom
x+=1
return liste
2. Que fait la boucle while numérotée # Question 2.
3. Justifiez le test numéroté # Question 3.
4. Quel algorithme de tri est en en jeu dans cette fonction?
5. Quelle est la complexité de cet algorithme?
6. Que fait cette fonction?
nom=input("Nom dossier?")
liste=listerFichiers(nom)
liste=mysteryMachine(liste)
titre=jpgTohtml(liste[0])
carte=listeTomap(liste,inf,sup,titre)
coordinates=[inf,inf2,sup,sup2,inf]
aline=folium.PolyLine(locations=coordinates,weight=1,color='blue')
aline.add_to(carte)
carte.save(titre)
Partie VII - Interrogation de Bases de données SQL
Les tables utiles pour répondre aux questions sont en annexe 3. On remarquera que dans la table Photos, les latitudes et longitudes sont des entiers : une division par 10000 permet d'avoir la latitude et la longitude réelle.
On notera que dans la table Photos, Date correspond à la date de création (année/mois/jour) de photos présentes dans le dossier (colonne nommée Dossier). On précise qu'à un nom de photo correspond une unique photo et que chaque dossier ne contient que des photos.
def requete_to_liste(sql):
return liste
Rappels sur Python
Rappels sur les listes
#On suppose que maListe est une liste
len(maListe) # donne la longueur de maListe
maListe.append(objet) # ajoute l'objet à maListe
#il sera le dernier élément une fois ajouté
#soit autreListe une liste
maListe.append(autreListe)#ajoute tous les éléments de autreListe à maliste
#autreListe est non modifiée
Rappels sur les tuples
monTuple=(donnee1,donnee2)
monTuple[0]# permet d'accéder à donnee1
monTuple[1]# permet d'accéder à donnee2
#on peut aussi accéder aux données en faisant
val1,val2=monTuple
print(val1)
>>>donnee1
print(val2)
>>>donnee2
#Pour parcourir un tuple :
for x in monTuple:
print(x)
>>>donnee1
>>>donnee2
Exemple:
def retourneTuple(x,y):
return (x+y,x-y)
som,diff=retourneTuple(10,3)
print(som)
>>>13
print(diff)
>>>7
Rappels sur les chaînes de caractères
mot="test"
for lettre in mot:
print(lettre)
#Résultat console :
T
e
s
t
print(mot [:3])
>>>Bon
print(mot [3:])
>>>jour
print(len (mot))
>>>7
ANNEXE 2 Présentation des données exif
Module exif
Voici deux exemples d'informations accessibles :
. Date de la prise de vue.
. Coordonnées GPS du lieu de la prise de vue.
Les données exif sont accessibles dans un script Python en important le module exif, puis en accédant à Image dans ce module. À l'issue du script suivant, la variable my_image permet d'accéder aux données exif:
from exif import Image
with open("photo.jpg", 'rb') as imageFile:
my_image= Image(imageFile)
def openImage(nom): #nom est une chaîne de caractères qui représente ici une photo
with open(nom, 'rb') as imageFile:
return Image(imageFile)
imageFile.close()
#Exemple d'appel de cette fonction :
my_image=openImage("photo.jpg")
La liste des données exif qui nous intéressent est:
my_image.datetime # une date au format chaîne de caractères
my_image.gps_longitude # un tuple de trois nombres
my_image.gps_longitude_ref # une chaîne de caractères 'E' ou 'W'
my_image.gps_latitude # un tuple de trois nombres
my_image.gps_latitude_ref # une chaîne de caractères 'N' ou 'S'
Coordonnées GPS - Règles de conversion
On donne la règle de conversion suivante :
1 degré = 1
1 minute =
1 seconde = 1/3600
L'orientation pour la latitude est '
Les valeurs décimales sont signées: négative si on est '
my_image.gps_latitude_ref # donne 'N' ou 'S'
my_image.gps_longitude_ref # donne 'E' ou 'W'
my_image.gps_latitude # donne par exemple (36,10,11.78)
my_image.gps_longitude # donne par exemple (115,8,23.38)
my_image.gps_latitude_ref # donne par exemple 'N'
my_image.gps_longitude_ref # donne par exemple 'W'
Date de prise de vue
#année:mois:jour heure:minute:seconde avec un seul espace entre jour et heure
'1967:06:17 11:15:00'
'2020:12:24 23:59:59'
var_date=my_image.datetime
#var_date sera une chaîne de caractères qui contient les informations de date.
ANNEXE 3
Tables SQL
| Nom | Date | Latitude | Longitude | Id |
| Photo10 |
|
35937 | -1149686 | 1 |
| Photo11 |
|
35937 | -1149685 | 2 |
| Photo24 |
|
35937 | -1149686 | 3 |
| Photo15 |
|
35938 | -1149686 | 4 |
| Photo33 |
|
35939 | -1149688 | 5 |
|
|
|
|
|
|
| Id | Dossier | NomPhoto |
| 1 | C :
|
Photo10 |
| 2 | C :\Images\LasVegas\Palazzo | Photo11 |
| 3 | C :
|
Photo24 |
|
|
|
|
| 10 | C :
|
Photo40 |
| 11 | C : \Images\LasVegas\Palazzo | Photo30 |
| 12 | C :
|
Photo15 |
|
|
|
|
| Table | Champ | Type |
| Photos | Nom | Chaîne de caractères |
| Photos | Date | Chaîne de caractères |
| Photos | Latitude | Entier |
| Photos | Longitude | Entier |
| Photos | Id | Entier |
| Dir | Id | Entier |
| Dir | NomPhoto | Chaîne de caractères |
| Dir | Dossier | Chaîne de caractères |
FIN
Questions fréquentes
4 questionsSur quels chapitres porte le sujet CCINP informatique commune TSI 2022 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte le sujet CCINP informatique commune TSI 2022 ?
Il porte sur les chaînes de caractères et le slicing, les tuples, la récursivité et les algorithmes de tri, l'utilisation de modules Python (folium, exif) et les requêtes SQL avec jointures.
Quelles erreurs le jury a-t-il le plus relevées sur ce sujet ?
Une comparaison de chaînes de caractères mal comprise, le slicing méconnu, une confusion fréquente entre print et return, et des jointures SQL mal maîtrisées.
Ce sujet CCINP informatique TSI 2022 est-il difficile ?
Le rapport situe la difficulté surtout dans l'appropriation de la documentation fournie plutôt que dans le niveau des notions, avec des résultats contrastés selon les parties.
Faut-il bien connaître le SQL pour ce sujet CCINP TSI 2022 ?
Oui, la dernière partie porte sur l'interrogation d'une base de données SQL, qui a permis à beaucoup de candidats de récolter des points malgré des erreurs de syntaxe fréquentes.
Pas de description pour le moment
