Informatique Pour Tous Interrogation n°3 Rapport de la correction I

publicité
Informatique Pour Tous
Interrogation n°3
Rapport de la correction
I-Syntaxe Python
I-1) Quelle est la commande Python qui permet d’ouvrir en lecture un fichier nommé MonFichier.txt
dans le répertoire courant du disque dur pour en utiliser ensuite le contenu ?
Aucune réponse correcte.
La fonction open() est quelquefois connue mais elle est alors mal utilisée.
Il manque toujours les guillemets autour de la chaîne de caractères « MonFichier.txt »
I-2) Soit la variable var = [(0,0,0,0),(1,0,0,0),(0,1,0,0),(0,0,1,0),(1,1,1,1)]
a) Quelle est la valeur de var[2]
C’est l’élément d’indice 2 de la liste ; c’est un tuple.
b) Quelle est la valeur de len(var)
C’est le nombre d’éléments de la liste.
c) Quelle est la valeur de len(var[1])
C’est le nombre d’éléments de l’élément d’indice 1 qui est un tuple.
d) Quelle est la valeur de [var[i][1] for i in range(2,4)]
C’est la liste des éléments d’indices 1 des tuples d’indices 2,3 soit [1, 0].
e) Quelle est la valeur de [var[1][i] for i in range(2,4)]
C’est la liste des éléments d’indices 2, 3 du tuple d’indices 1 soit [0, 0].
f) Quelle est la valeur de [var[i][i] for i in range(4)]
C’est la liste des éléments d’indices i des tuples d’indices 0, 1, 2 et 3 soit [0, 0, 0, 0].
II-Analyse de code
II-1) On rappelle qu’en Python l’opérateur % donne le reste de la division. Par exemple, 10%2 donne
0, 10%3 donne 1.
Qu’affiche à l’écran le script suivant :
def fonction(n, a):
terme = a
for k in range(n):
terme = (k*a*terme+a**2) % 256
return terme
n = 2
a = 10
print("resultat1 = ", fonction (n, a))
print("resultat2 = ", fonction (a, n))
print("resultat3 = ",(n, a))
Informatique Pour Tous
page 1/3
PCSI1 2016-2017
Les fonctions print afficheront la chaîne « resultatn = » suivie de la valeur correspondante.
Les deux paramètres de la fonction sont des entiers, peu importe leur nom dans l’appel de la fonction.
Le résultat 2 est faux dans la plupart des copies.
Pour résultat1, Il faut écrire le script
terme = 10
for k in range(2):
terme = (k*10*terme+10**2) % 256
Pour résultat2, Il faut écrire le script
terme = 2
for k in range(10):
terme = (k*2*terme+2**2) % 256
Il n’y a que 4 copies correctes.
II-2) Extrait de la documentation Python : « enumerate(thing), where thing is either an iterator or a
sequence, returns a iterator that will return the tuples (0, thing[0]), (1, thing[1]), (2,
thing[2]), and so forth.. »
Qu’affiche à l’écran le script suivant :
def fonction(t,p):
t1, t2 = [], t
for (i, x) in enumerate(t):
if x <= p :
t1.append(x)
else:
t2[i] = p
return t1, t2
t1 = [10, 1515, 2048, -10, 42]
t2 = [42, 73]
print(t1,t2)
print(t1,t2,fonction(t1 , 42))
Exemple de conflits potentiels entre trois vols
print(t1, t2) est facile à deviner : il suffit de recopier l’énoncé.
Par contre, la deuxième ligne est un gros piège. Il ne faut pas oublier que Python évalue les valeurs, en
commençant par la plus à droite, avant de les afficher (ou de les utiliser).
Il faut donc évaluer d’abord fonction(t1, 42). en constatant que la variable t2 locale de la fonction est égale au paramètre t donc ici à la liste globale t1. Celle ci sera donc modifiée dans la boucle et,
à la fin de la fonction, ne sera plus la même qu’avant l’appel de la fonction. Le résultat de la fonction est
un tuple de 2 listes.
III-Projet : Prévention des collisions aériennes (d’après Centrale 2016Informatique commune MP, PC, PSI, TSI )
III-1-a) Écrire en Python une fonction nb_conflits() sans paramètre qui renvoie le nombre de conflits
potentiels, c’est-à-dire le nombre d’arêtes de valuation non nulles du graphe décrit par la variable globale
conflit.
Informatique Pour Tous
page 2/3
PCSI1 2016-2017
Pas très compliqué. Il faut faire une double boucle sur les lignes, puis les éléments d’une ligne, en ne prenant
que les éléments de la diagonale pour ne pas compter 2 fois le même conflit. 8 copies à peu près correctes.
b) Exprimer la complexité de cette fonction en fonction de n.
Résultat classique pour 2 boucles imbriquées. Il FAUT justifier le résultat.
Écrire en Python une fonction nb_vol_par_niveau_relatif(regulation)
nb_vol_par_niveau_relatif(regulation) qui prend en paramètre une
régulation (liste de n entiers) et qui renvoie une liste de 3 entiers [a, b, c] dans laquelle a est le nombre
de vols à leurs niveaux RFL, b le nombre de vols au-dessus de leurs niveaux RFL et c le nombre de vols
au-dessous de leurs niveaux RFL.
Peu de copies s’essayent à cette question mais avec réussite (6 copies correctes sur 8).
a) Écrire en Python une fonction cout_regulation(regulation)
cout_regulation(regulation) qui prend en paramètre une liste
représentant une régulation et qui renvoie le coût de celle-ci.
Question mal comprise. Il faut commencer par créer la liste des vols avant de calculer le coût de chacun.
b) Évaluer la complexité de cette fonction en fonction de n.
Il y a encore deux boucles imbriquées.
c) Déduire de la question a) une fonction cout_RFL() qui renvoie le coût de la régulation pour laquelle chaque avion vole à son RFL.
pas traitée.
d) Combien existe-t-il de régulations possibles pour n vols ?
3 réponses correctes mais elles ne sont pas justifiées.
e) Est-il envisageable de calculer les coûts de toutes les régulations possibles pour trouver celle de
cout minimal ?
La réponse est souvent affirmée sans justification.
On suppose importées les fonctions suivantes, que l’on pourra utiliser :
exp(x) qui renvoie l’exponentielle de x ;
randint(0,n) qui renvoie un entier tiré au sort dans [0, n] ;
random() qui renvoie un réel tiré au sort dans [0, 1]. Ainsi, un événement qui ne se produit que si
random() <= p a une probabilité p de se produire.
Écrire en Python une fonction recuit(regulation)
recuit(regulation) qui modifie la liste regulation passée en paramètre
en appliquant l’algorithme du recuit simulé. On fera débuter l’algorithme avec la valeur T = 1000 et à
chaque étape la valeur de T sera diminuée de 1%. L’algorithme se terminera lorsque T < 1.
Pratiquement pas traitée. C’est évidemment une question difficile. Voir les commentaires dans le corrigé.
Conclusion :
Le sujet était un peu difficile car il demandait de se rappeler ce qui a été fait depuis le début de
l’année. La moitié des copies montre qu’il n’en reste presque rien . Pour ces étudiants, il faut sérieusement se poser la question d’adapter les méthodes d’apprentissage pour ne pas oublier le lendemain ce qui est appris la veille. C’est indispensable pour une deuxième année profitable.
Il faut bien se rendre compte que les questions de la partie III ne représentent qu’une infime partie
de l’épreuve posée effectivement au concours.
Pour terminer, il faut souligner que, comme dans les autres matières, une réponse non justifiée n’est
pas acceptée. Une réponse commençant par « OUI » ou « NON » non plus.
Informatique Pour Tous
page 3/3
PCSI1 2016-2017
Téléchargement