Informatique (INFO-F-206) Exemple de questionnaire d examen Jean Cardinal Année académique 2010 2011 Consignes : 1. Les réponses doivent figurer sur des feuilles distinctes, indiquant le numéro de la question, ainsi que vos nom et prénom. 2. On demande pour chaque question, outre le code Python, des explications claires et concises en français. 3. La consultation du syllabus (transparents) est autorisée. 4. L examen dure quatre heures. Question 1 Que fait la fonction suivante? (On suppose que le paramètre n est entier.) Donner la valeur de f(4). def f(n): res = 0 y = n for i in range(y): res = res + n n = n * y return res Question 2 Ecrire un petit programme qui effectue les opérations suivantes : demander à l utilisateur un nom de fichier contenant une liste de mots, ouvrir le fichier, afficher les mots du fichier qui possèdent au moins deux lettres consécutives identiques. Les mots bee, attention et book, par exemple, seraient affichés (double e, t, o, respectivement), tandis que les mots word, testify et cambridge ne le seraient pas. On supposera que le fichier dont le nom est introduit par l utilisateur existe, et qu il ne contient qu un seul mot par ligne (comme le fichier words.txt utilisé en cours). 1
Question 3 On considère des chaînes de caractères dans l alphabet {A, C, G, T }, représentant des séquences ADN. Une telle chaîne est dite complémentaire d une autre, si on obtient la deuxième en remplaçant chaque occurrence de la lettre A par T, T par A, G par C, et C par G dans la première. Par exemple, les séquences ACCGAT et T GGCT A sont complémentaires. Ecrire une fonction qui reçoit en paramètre une liste de telles chaînes, et renvoie une nouvelle liste dans laquelle les paires complémentaires sont éliminées. Pour chaque paire complémentaire présente dans la liste de départ, seule la seconde chaîne de la paire sera conservée dans la liste résultat. Par exemple, la liste suivante : [ ATCC, ACGG, TGCC, ACC, TAGG ] contient deux paires complémentaires : ACGG et TGCC d une part, et ATCC et TAGG d autre part. On doit éliminer la première chaîne (dans l ordre de la liste) de chaque paire. La liste renvoyée par la fonction sera donc : [ TGCC, ACC, TAGG ] On supposera que toutes les chaînes de la liste de départ sont distinctes. Question 4 La transposée d une matrice M de taille n n est une matrice M de taille n n telle que M ij = M ji, i, j = 1,..., n. Ecrire une fonction qui reçoit une matrice en paramètre (sous forme d une liste de listes, chacune représentant une ligne de la matrice) et la transpose. La fonction ne renverra aucune valeur, mais modifie la matrice passée en paramètre. Voici le résultat renvoyé par la fonction sur un petit exemple : >>> m = [[1,2,3],[4,5,6],[7,8,9]] >>> transpose(m) >>> m [[1,4,7],[2,5,8],[3,6,9]] Question 5 La célèbre courbe du flocon de Von Koch est construite récursivement de la manière suivante. Partant d un segment de longueur 3, on définit quatre segments de longueurs 1, formant une ligne polygonale ayant les mêmes extrémités que le segment de départ. Les deux segments du milieu forment un triangle équilatéral, tandis que le premier et le dernier sont horizontaux. On dessine récursivement la même courbe sur les quatre segments. La figure ci-dessous illustre les étapes successives de la construction. 2
Pour dessiner un flocon de longueur x récursivement, vous devez simplement : 1. dessiner un flocon de longueur x/3, 2. tourner à gauche de 60 degrés, 3. dessiner un flocon de longueur x/3, 4. tourner à droite de 120 degrés, 5. dessiner un flocon de longueur x/3, 6. tourner à gauche de 60 degrés, 7. dessiner un flocon de longueur x/3. La seule exception survient lorsque x est inférieur à 3. Dans ce cas, il suffit de dessiner un segment de droite de longueur x. Ecrire une fonction récursive qui dessine un flocon de Von Koch, en utilisant les fonctions suivantes de la librairie Swampy : lt(t, angle) effectue une rotation vers la gauche d angle angle de la tortue t, rt(t, angle) effectue une rotation vers la droite d angle angle, et fd(t, longueur) dessine un segment de longueur longueur. 3
Solutions Rédigées Question 1 La fonction calcule la somme suivante : n n i. i=1 Pour n = 4, la valeur renvoyée par f est 340 (= 4 + 16 + 64 + 256). Question 2 Le programme suivant effectue ces opérations. Pour plus de lisibilité et de modularité, on définit une fonction séparée qui teste le critère retenu, à savoir qu il existe deux lettres consécutives identiques dans le mot. Cette fonction booléenne est appelée sur chaque mot lu dans le fichier. def test_double(mot): """ cette fonction teste si un mot contient une lettre doublée """ res = False n = len(mot) for i in range(n-1): if mot[i] == mot[i+1]: res = True return res # ouverture du fichier nom = raw_input( introduire le nom du fichier ) fichier = open(nom) # on affiche les mots qui passent le test for mot in fichier: if test_double(mot): print mot Question 3 Comme dans la question précédente, il est utile de définir une fonction booléenne qui teste si deux chaînes sont complémentaires l une de l autre. Pour cela, on peut appliquer les subtitutions dans la première, et vérifier que le résultat est identique à la seconde. Voici cette fonction : def test_complement (c1, c2): trans = # transformation de c1 for x in c1: if x == A : trans = trans + T elif x == T : trans = trans + A 4
elif x == C : trans = trans + G elif x == G : trans = trans + C return trans == c2 # le résultat de la transformation est-il égal à c2? La fonction principale va parcourir la liste, et construire à la volée une seconde liste qui ne reprendra que les chaînes qui n ont pas leur complémentaire plus loin dans la liste. Pour tester cette condition, une seconde boucle imbriquée est nécessaire, qui parcourt tous les indices supérieurs à l indice courant i. Le booléen test est mis à faux dès que le complémentaire est rencontré. Ainsi, seule la seconde chaîne de chaque paire complémentaire sera retenue. Pour construire la nouvelle liste, on utilise la méthode append(x). def elimine_complementaire (liste): n = len(liste) res = [] for i in range(n): test = True for j in range(i+1, n): if test_complement (liste[i], liste[j]): test = False if test: res.append (liste[i]) return res Question 4 La fonction parcourt les cellules i, j de la matrice telles que j > i, et pour chacune d elle, échange les valeurs de M ij et M ji. Il s agit donc de deux boucles imbriquées : def transpose(m): n = len (M) for i in range (n): for j in range (i+1,n): tmp = M[i][j] M[i][j] = M[j][i] M[j][i] = tmp Question 5 On peut simplement transcrire les instructions données en utilisant les trois fonctions lt, rt, et fd. Les appels récursifs s écrivent naturellement, et le cas de base n < 3 stoppe la récursion. Celui-ci survient toujours finalement, puisque n diminue (est divisé par 3) à chaque appel récursif. def koch (t, n): if n < 3: fd (t, n) return m = n / 3.0 koch (t, m) lt (t, 60) 5
koch (t, m) rt (t, 120) koch (t, m) lt (t, 60) koch (t, m) 6