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