Interro 1 — Programmation Python¶
MPSI tronc commun, année scolaire 2021-2022 — deux sujets (A et B).
Corrigés
La source ne comporte pas de corrigé. Les corrigés ci-dessous sont des propositions (testées), à relire.
Sujet A¶
Exercice 1. Écrire une fonction somme qui prend en paramètre un entier \(n\)
et calcule \(\sum_{i=1}^{n^2} \prod_{j=1}^{i} (i^3 + (j-i)^2)\).
Corrigé
def somme(n):
s = 0
for i in range(1, n**2 + 1):
p = 1
for j in range(1, i + 1):
p = p * (i**3 + (j - i)**2)
s = s + p
return s
Exercice 2. Écrire une fonction maximum qui prend en entrée un tableau
\(t\), deux indices \(i\) et \(j\), on supposera qu'elle sera toujours appelée avec
\(0 \le i \le j < len(t)\), et renvoie l'indice de la plus grande valeur de \(t\)
comprise entre les indices \(i\) et \(j\).
Dans le cas où plusieurs indices conviennent on renverra le plus petit.
Corrigé
L'inégalité stricte garantit qu'on conserve le premier indice rencontré.
def maximum(t, i, j):
m = i
for k in range(i + 1, j + 1):
if t[k] > t[m]:
m = k
return m
Exercice 3. Écrire une fonction diviseur_carre qui prend en entrée un
entier \(n\) et renvoie un booléen indiquant si \(n\) a un diviseur de la forme
\(p^2\).
Corrigé
On exclut le cas trivial \(p = 1\) et on teste les \(p \ge 2\) tels que \(p^2 \le n\).
def diviseur_carre(n):
p = 2
while p * p <= n:
if n % (p * p) == 0:
return True
p = p + 1
return False
Exercice 4. Écrire une fonction decale qui prend en entrée le caractère
\(c\) d'une lettre de l'alphabet en minuscule et un entier \(d\) et renvoie la
lettre déduite de \(c\) par un décalage de \(d\) lettres modulo la longueur de
l'alphabet : \(y \rightarrow z \rightarrow a\) est décalé de 2.
Exemple : decale('c',3) renvoie 'f' et decale('y',2) renvoie 'a'.
Rappel : les caractères sont tous associés à des numéros dans une table, ord
renvoie le numéro associé à un caractère et chr le caractère associé à un
numéro.
Corrigé
def decale(c, d):
return chr(ord('a') + (ord(c) - ord('a') + d) % 26)
Sujet B¶
Exercice 1. Écrire une fonction somme qui prend en paramètre un entier \(n\)
et calcule \(\sum_{i=-n}^{n} \prod_{j=i}^{2i} j (i-j)^3\).
Corrigé
Pour \(i < 0\), on a \(2i < i\) : le produit est vide et vaut \(1\), ce que
donne naturellement la boucle sur range(i, 2*i + 1).
def somme(n):
s = 0
for i in range(-n, n + 1):
p = 1
for j in range(i, 2 * i + 1):
p = p * j * (i - j)**3
s = s + p
return s
Exercice 2. Écrire une fonction minimum qui prend en entrée un tableau
\(t\), deux indices \(i\) et \(j\), on supposera qu'elle sera toujours appelée avec
\(0 \le i \le j < len(t)\), et renvoie l'indice de la plus petite valeur de \(t\)
comprise entre les indices \(i\) et \(j\).
Dans le cas où plusieurs indices conviennent on renverra le plus grand.
Corrigé
L'inégalité large garantit qu'on conserve le dernier indice rencontré.
def minimum(t, i, j):
m = i
for k in range(i + 1, j + 1):
if t[k] <= t[m]:
m = k
return m
Exercice 3. Écrire une fonction diviseur_cube qui prend en entrée un
entier \(n\) et renvoie un booléen indiquant si \(n\) a un diviseur de la forme
\(p^3\).
Corrigé
def diviseur_cube(n):
p = 2
while p * p * p <= n:
if n % (p * p * p) == 0:
return True
p = p + 1
return False
Exercice 4. Écrire une fonction decale qui prend en entrée le caractère
\(c\) d'une lettre de l'alphabet en minuscule et un entier \(d\) et renvoie la
lettre déduite de \(c\) par un décalage de \(d\) lettres modulo la longueur de
l'alphabet : \(y \rightarrow z \rightarrow a\) est décalé de 2.
Exemple : decale('c',3) renvoie 'f' et decale('y',2) renvoie 'a'.
Rappel : les caractères sont tous associés à des numéros dans une table, ord
renvoie le numéro associé à un caractère et chr le caractère associé à un
numéro.
Corrigé
def decale(c, d):
return chr(ord('a') + (ord(c) - ord('a') + d) % 26)