Devoir de contrôle n°1 : 1er trimestre
Les algorithmes s'écrivent en notation algorithmique, les programmes en Python. Barème sur 20 points.
Exercice 1 : lire un programme (5 pts)
On considère le programme Python suivant.
a = 17
b = 5
c = a // b
d = a % b
if c > d:
print("A")
else:
print("B")
x = a / b
print(c, d, x)
s = ""
for i in range(1, 5):
s = s + str(i * 2)
print(s)
- 1) Donner l'affichage exact produit par ce programme (3 pts).
- 2) Que représentent c et d par rapport à a et b ? (1 pt)
- 3) Donner le type de x et le type de s. (1 pt)
Exercice 2 : nombre d'Armstrong (7 pts)
Un nombre à trois chiffres est un nombre d'Armstrong si la somme des cubes de ses chiffres est égale à lui-même. Exemple : 153 = 1³ + 5³ + 3³ = 1 + 125 + 27.
Écrire un programme qui lit un entier n compris entre 100 et 999 (la saisie est répétée tant que n n'est pas dans cet intervalle), puis affiche « n est un nombre d'Armstrong » ou « n n'est pas un nombre d'Armstrong ».
- 1) Donner l'algorithme avec son tableau de déclaration des objets (4 pts).
- 2) Traduire l'algorithme en Python (3 pts).
Exemple : si l'utilisateur saisit 50, puis 1000, puis 370, le programme affiche : 370 est un nombre d'Armstrong
Exercice 3 : une chaîne de caractères (8 pts)
Écrire un programme qui lit une chaîne ch non vide et affiche, sur trois lignes : sa longueur, son nombre de voyelles (a, e, i, o, u, y, en majuscule ou en minuscule) et la chaîne lue à l'envers.
Exemple : pour Carthage, le programme affiche :
Longueur : 8
Voyelles : 3
Inversée : egahtraC
- 1) Donner l'analyse du problème : les résultats et les traitements (2 pts).
- 2) Écrire l'algorithme (3 pts).
- 3) Traduire en Python (3 pts).
Correction détaillée
Ce devoir est un exemple gratuit : sa correction est ouverte à tous.
Exercice 1 : lire un programme
1) Affichage
On calcule les variables ligne par ligne : c = 17 // 5 = 3 et d = 17 % 5 = 2. Comme 3 > 2, le programme affiche A. Ensuite x = 17 / 5 = 3.4 et on affiche c, d et x sur une même ligne. La boucle ajoute à s les textes "2", "4", "6", "8" (i prend les valeurs 1, 2, 3, 4).
a = 17
b = 5
c = a // b
d = a % b
if c > d:
print("A")
else:
print("B")
x = a / b
print(c, d, x)
s = ""
for i in range(1, 5):
s = s + str(i * 2)
print(s)
Affichage : A puis 3 2 3.4 puis 2468.
2) Rôle de c et de d
c est le quotient de la division entière de 17 par 5 et d en est le reste : 17 = 5 × 3 + 2.
3) Types
x est de type réel (float) car l'opérateur / donne toujours un réel. s est une chaîne de caractères (str), car on lui ajoute des textes obtenus avec str(). Ce n'est pas le nombre 2468 mais le texte "2468".
Erreurs fréquentes
- Écrire 3.4 pour c : // donne un entier, pas un réel.
- Additionner les nombres (2 + 4 + 6 + 8 = 20) au lieu de les coller : s est une chaîne, + la concatène.
Exercice 2 : nombre d'Armstrong
Analyse
- Résultat : un message qui dépend de la comparaison entre n et la somme des cubes des chiffres.
- Chiffre des centaines : c = n div 100.
- Chiffre des dizaines : d = (n div 10) mod 10.
- Chiffre des unités : u = n mod 10.
- Saisie contrôlée : on répète la lecture jusqu'à ce que n soit dans [100, 999].
Tableau de déclaration des objets (TDO)
- n : entier : le nombre lu
- c, d, u : entier : les trois chiffres de n
Algorithme
0) Début Armstrong
1) Répéter
Ecrire("Donner n : ")
Lire(n)
Jusqu'à (n >= 100) ET (n <= 999)
2) c ← n div 100
3) d ← (n div 10) mod 10
4) u ← n mod 10
5) Si (c^3 + d^3 + u^3 = n) Alors
Ecrire(n, " est un nombre d'Armstrong")
Sinon
Ecrire(n, " n'est pas un nombre d'Armstrong")
FinSi
6) Fin Armstrong
Programme Python
Python n'a pas de boucle « répéter … jusqu'à » : on lit n une première fois, puis on relit tant que la condition d'arrêt est fausse. La condition devient donc l'inverse de celle du Jusqu'à : n < 100 ou n > 999.
n = int(input())
while n < 100 or n > 999:
n = int(input())
c = n // 100
d = (n // 10) % 10
u = n % 10
if c ** 3 + d ** 3 + u ** 3 == n:
print(n, "est un nombre d'Armstrong")
else:
print(n, "n'est pas un nombre d'Armstrong")
Vérification à la main
Pour 123 : 1³ + 2³ + 3³ = 1 + 8 + 27 = 36, qui est différent de 123. Pour 370 : 27 + 343 + 0 = 370.
Erreurs fréquentes
- Oublier la saisie contrôlée ou inverser la condition d'arrêt (utiliser la même condition que le Jusqu'à dans le while).
- Écrire c ** 3 + d ** 3 + u ** 3 = n avec un seul signe = : pour comparer on écrit ==.
- Utiliser n / 100 : on obtient un réel. Pour les chiffres, on utilise // (div) et % (mod).
Exercice 3 : une chaîne de caractères
Analyse
- Résultats : la longueur, le nombre de voyelles nv, la chaîne inversée inv.
- La longueur s'obtient avec long(ch) (len(ch) en Python).
- Pour compter les voyelles, on parcourt les positions 0 à long(ch)-1 et on teste si la lettre, mise en minuscule, appartient à « aeiouy ».
- Pour inverser, on parcourt la chaîne de la fin vers le début en ajoutant chaque lettre à inv.
TDO
- ch : chaîne : le texte lu
- nv : entier : compteur de voyelles
- inv : chaîne : la chaîne inversée
- i : entier : indice de parcours
Algorithme
0) Début Chaine
1) Lire(ch)
2) nv ← 0
3) Pour i de 0 à long(ch) - 1 Faire
Si pos(minus(ch[i]), "aeiouy") <> -1 Alors
nv ← nv + 1
FinSi
FinPour
4) inv ← ""
5) Pour i de long(ch) - 1 à 0 (pas = -1) Faire
inv ← inv + ch[i]
FinPour
6) Ecrire("Longueur : ", long(ch))
7) Ecrire("Voyelles : ", nv)
8) Ecrire("Inversée : ", inv)
9) Fin Chaine
Programme Python
ch = input()
nv = 0
for i in range(len(ch)):
if ch[i].lower() in "aeiouy":
nv = nv + 1
inv = ""
for i in range(len(ch) - 1, -1, -1):
inv = inv + ch[i]
print("Longueur :", len(ch))
print("Voyelles :", nv)
print("Inversée :", inv)
Remarques
- range(len(ch) - 1, -1, -1) commence au dernier indice et s'arrête à 0 : la borne -1 est exclue.
- Sans .lower(), les voyelles en majuscule ne seraient pas comptées (A est différent de a).
- Les indices d'une chaîne commencent à 0 : le dernier caractère est ch[len(ch) - 1], pas ch[len(ch)] qui provoque une IndexError.
Sujet original écrit pour Mission Carthage, dans le style des devoirs du 1er trimestre.
Tout le programme : 2ème année Technologies de l'informatique (TI)