.. _interrorapide20minutes201409rst: ================================================================ 1A.e - Correction de l’interrogation écrite du 26 septembre 2014 ================================================================ .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/exams/interro_rapide_20_minutes_2014_09.ipynb|*` chaîne de caractères, tri, fonction .. code:: ipython3 from jyquickhelper import add_notebook_menu add_notebook_menu() .. contents:: :local: Enoncé 1 ~~~~~~~~ Q1 ^^ Ecrire une fonction qui retourne 1 si :math:`n` est un multiple de 2014. .. code:: ipython3 def mul2014(n): return 1 if n % 2014 == 0 else 0 print(mul2014(2014), mul2014(2015)) .. parsed-literal:: 1 0 Pour cette question, quelques élèves ont vérifié que ``n`` était plus petit que 2014 d’abord. Ce n’est pas vraiment la peine. Q2 ^^ Calculer le minimum des cosinus des entiers de 1 à 10. .. code:: ipython3 import math min ( math.cos(i) for i in range(1,11) ) .. parsed-literal:: -0.9899924966004454 ``range(0,10)`` va de 0 à 10 exclu. .. code:: ipython3 list(range(0,10)) .. parsed-literal:: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Q3 ^^ Ecire une fonction qui vérifie qu’une chaîne de caractères est symétrique (ex: ``kayak``). .. code:: ipython3 def symetrie(s): i=0 j=len(s)-1 while i < j : if s[i] != s[j] : return False i += 1 j -= 1 return True print(symetrie("kayak"), symetrie("kakaks")) .. parsed-literal:: True False Sur cette question, on fait régulièrement deux erreurs lorsqu’on commence à programmer : - Le dernier indice est ``len(s)-1`` et non ``len(s)``. Le premier indice est 0. - Il ne sert à rien que ``i`` aille de 0 à ``len(s)-1``, aller de 0 à ``len(s)//2`` suffit. Enoncé 2 ~~~~~~~~ Q1 ^^ Ecrire une fonction qui retourne 1 si une chaîne de caractères contient un A, 0 sinon. .. code:: ipython3 def contient_A(s): return 1 if "A" in s else 0 print(contient_A("e")) .. parsed-literal:: 0 Utiliser une boucle n’était pas nécessaire, un simple test suffit. Q2 ^^ Calculer :math:`\sum_{i=1}^{10} \frac{x^{2i}}{\sin i}`. .. code:: ipython3 import math x = 0.3 sum ( x**(2*i) / math.sin(i) for i in range(1,11) ) .. parsed-literal:: 0.12093467645909634 Q3 ^^ Ecrire qu’une fonction qui vérifie si un tableau est trié. .. code:: ipython3 def est_trie(tab): for i in range(1,len(tab)): if tab[i-1] > tab[i] : return False return True est_trie( [1]),est_trie( [1,2,3]),est_trie( [1,2,3,0]) .. parsed-literal:: (True, True, False) Quelques élèves ont écrit quelque chose comme : .. code:: ipython3 def est_trie(tab): res = tab.copy() res.sort() return res == tab Bien que ceci soit tout-à-fait correct, le fait de trier une copie du tableau nécessite des calculs inutiles. Le coût d’un tri est en :math:`O(n \ln n)` alors que tester si le tableau est trié est au pire de :math:`O(n)` puisqu’il suffit de le parcourir une fois. J’ajoute une dernière remarque : sans copie la fonction ``est_trie`` retourne toujours vrai. .. code:: ipython3 def est_trie_nocopy(tab): res = tab res.sort() return res == tab t = [ 0,1,2 ] print( est_trie(t), est_trie_nocopy(t) ) t = [ 0,1,2,0 ] print( est_trie(t), est_trie_nocopy(t) ) .. parsed-literal:: True True False True La raison est l’instruction ``res = tab`` crée une autre variable ``res`` mais l’instruction n’implique pas la copie de la liste. Elle ne fait que donner un autre nom à la même liste. Ainsi : .. code:: ipython3 t = [0,1,2] t2 = t t2[0] = 1000000000 t,t2 .. parsed-literal:: ([1000000000, 1, 2], [1000000000, 1, 2]) Modifier la liste ``t`` revient à modifier la liste ``t2`` puisque ce sont les mêmes. Cela est dû au fait que le langage Python ne copie les listes, les dictionnaires ou les instances de classes que si ces copies sont demandées explicitement. Par défaut, le langage évite toute copie.