Vous êtes sur la page 1sur 6

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 0 de taille n × n telle que
0
Mij = Mji , 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
X
ni .
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 Mij et Mji . 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)

Vous aimerez peut-être aussi