Ch. 04 · Leçon 2
Série d'exercices N°2 — Structures itératives et fonctions
Ce que vous saurez faire
- →Tracer l'exécution d'une fonction utilisant une structure itérative
- →Identifier le rôle d'un sous-programme à partir de son code
- →Construire le TDOL (Tableau de Déclaration des Objets Locaux) d'une fonction
- →Concevoir une solution algorithmique à base de fonctions pour un problème de calcul
id: 33-1520-serie-2-structures-iteratives-fonctions slug: 33-1520-serie-2-structures-iteratives-fonctions titre: Série d'exercices N°2 — Structures itératives et fonctions chapitre: 4 chapitre_titre: Les sous-programmes lecon: 2 niveau: 4eme-sci ordre: 20 prerequis:
- structures-iteratives
- fonctions-procedures duree_estimee_min: 70 mots_cles:
- fonction
- procedure
- structure iterative
- factorielle
- pgcd
- trace
- bac langages:
- analyse objectifs:
- Tracer l'exécution d'une fonction utilisant une structure itérative
- Identifier le rôle d'un sous-programme à partir de son code
- Construire le TDOL (Tableau de Déclaration des Objets Locaux) d'une fonction
- Concevoir une solution algorithmique à base de fonctions pour un problème de calcul status: published source_pdf: 33_1520.pdf source_pages:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10 kind: exercices
Cette série d'exercices porte sur l'analyse et la conception de fonctions mettant en œuvre les structures itératives (boucles Pour, Tant que, Répéter). Pour chaque fonction proposée, il s'agit de :
- compléter le TDOL (Tableau de Déclaration des Objets Locaux),
- exécuter pas à pas la fonction sur les valeurs données et indiquer le retour,
- déduire le rôle de la fonction.
Exercice 1 — Analyse de cinq fonctions (6 pts, 20 min)
Pour chaque module ci-dessous :
- Donner le retour correspondant après exécution.
- Donner le rôle du module.
Fonction F1
Fonction F1 (a : entier) : entier
Début
R ← 1
Pour i de 1 à a faire
R ← R * i
FinPour
Retourner(R)
FIN
Question : Que retourne F1 pour a = 5 ?
Voir le corrigé
TDOL de F1
| Objet | Type/Nature |
|---|---|
| R | entier |
| i | entier |
Trace pour a = 5
| N° | Instruction | i | R |
|---|---|---|---|
| 01 | ··· | ? | ? |
| 02 | ··· | ? | ? |
| 03 | ··· | ? | ? |
| 04 | ··· | ? | ? |
| 05 | ··· | ? | ? |
| 06 | ··· | ? | ? |
Rôle : F1 calcule la factorielle de a (c'est-à-dire a!).
Fonction F2
Fonction F2 (x : entier) : booléen
DEBUT
nb ← 0
Pour i de 1 à x faire
Si x mod i = 0 alors
nb ← nb + 1
Fin Si
Fin Pour
Si nb = 2 alors
test ← vrai
Sinon
test ← faux
Fin si
Retourner(test)
FIN
Question : Que retourne F2 pour x = 8 et pour x = 5 ?
Voir le corrigé
TDOL de F2
| Objet | Type/Nature |
|---|---|
| i | entier |
| nb | entier |
| test | booléen |
Trace pour x = 8 — on compte les diviseurs de 8 :
| i | 8 mod i | nb |
|---|---|---|
| 1 | 0 | 1 |
| 2 | 0 | 2 |
| 3 | ≠ 0 | 2 |
| 4 | 0 | 3 |
| 5 | ≠ 0 | 3 |
| 6 | ≠ 0 | 3 |
| 7 | ≠ 0 | 3 |
| 8 | 0 | 4 |
nb = 4 ≠ 2 ⇒ F2(8) = faux
Trace pour x = 5 — diviseurs de 5 :
| i | 5 mod i | nb |
|---|---|---|
| 1 | 0 | 1 |
| 2 | ≠ 0 | 1 |
| 3 | ≠ 0 | 1 |
| 4 | ≠ 0 | 1 |
| 5 | 0 | 2 |
nb = 2 ⇒ F2(5) = vrai
Rôle : F2 vérifie si x est un nombre premier (un entier est premier s'il admet exactement 2 diviseurs).
Fonction F3
Fonction F3 (a, b : entier) : entier
Début
R ← 1
Pour i de 1 à b faire
R ← R × a
FinPour
Retourner(R)
FIN
Question : Que retourne F3 pour a = 2 et b = 4 ?
Voir le corrigé
TDOL de F3
| Objet | Type/Nature |
|---|---|
| R | entier |
| i | entier |
Trace pour a = 2, b = 4
| N° | Instruction | i | R |
|---|---|---|---|
| 01 | ··· | ? | ? |
| 02 | ··· | ? | ? |
| 03 | ··· | ? | ? |
| 04 | ··· | ? | ? |
| 05 | ··· | ? | ? |
Rôle : F3 calcule a à la puissance b (soit a^b).
Fonction F4
Fonction F4 (ch : chaîne) : booléen
Début
test ← vrai
i ← 0
Répéter
si ch[i] ∈ ["a".."z", "A".."Z"] alors
i ← i + 1
sinon
test ← faux
finSi
jusqu'à (i = long(ch)) ou (test = faux)
Retourner(test)
FIN
Question : Que retourne F4 pour ch = 'CD Rom' et pour ch = 'CDrom' ?
Voir le corrigé
TDOL de F4
| Objet | Type/Nature |
|---|---|
| test | booléen |
| i | entier |
Trace pour ch = 'CD Rom' (longueur 6)
| i | ch[i] | alphabétique ? | test |
|---|---|---|---|
| 0 | 'C' | oui | vrai |
| 1 | 'D' | oui | vrai |
| 2 | ' ' | non | faux |
Arrêt : test = faux ⇒ F4('CD Rom') = faux
Trace pour ch = 'CDrom' (longueur 5)
| i | ch[i] | alphabétique ? | test |
|---|---|---|---|
| 0 | 'C' | oui | vrai |
| 1 | 'D' | oui | vrai |
| 2 | 'r' | oui | vrai |
| 3 | 'o' | oui | vrai |
| 4 | 'm' | oui | vrai |
À ce stade i devient 5, donc i = long(ch) ⇒ arrêt. F4('CDrom') = vrai
Rôle : F4 vérifie si une chaîne est alphabétique (uniquement composée de lettres).
Amélioration possible : on peut écrire la condition de manière plus lisible avec majus(ch[i]) ∈ ["A".."Z"].
Fonction F5
Fonction F5 (a, b : entier) : entier
Début
Tant que (a ≠ b) faire
Si (a > b) Alors
a ← a - b
sinon
b ← b - a
FinSi
Fin Tantque
Retourner(a)
FIN
Question : Que retourne F5 pour a = 20 et b = 14 ?
Voir le corrigé
TDOL de F5 : aucune variable locale supplémentaire (les paramètres a et b sont modifiés directement).
Trace pour a = 20, b = 14
| N° | Instruction | a | b |
|---|---|---|---|
| 01 | ··· | ? | ? |
| 02 | ··· | ? | ? |
| 03 | ··· | ? | ? |
| 04 | ··· | ? | ? |
| 05 | ··· | ? | ? |
| 06 | ··· | ? | ? |
| 07 | ··· | ? | ? |
Rôle : F5 détermine le PGCD (Plus Grand Commun Diviseur) de a et b par la méthode des soustractions successives.
Exercice 2 — Analyse d'algorithme (Bac 2019, 5 pts, 15 min)
Soit l'algorithme suivant :
Algorithme Inconnu
Début
Lire(c1)
Lire(c2)
c3 ← 0
Pour i de 0 à Long(c2) - 1 Faire
Si Majus(c2[i]) = Majus(c1) Alors
c3 ← c3 + 1
Fin Si
Fin Pour
Ecrire(c3)
Fin
Question 1 — Bonne proposition de TDO
Voici les quatre propositions de tableau de déclaration des objets :
| Proposition | c1 | c2 | c3 |
|---|---|---|---|
| 1 | chaîne | chaîne | entier |
| 2 | caractère | caractère | entier |
| 3 | chaîne | caractère | réel |
| 4 | caractère | chaîne | entier |
Quelle est la bonne proposition ?
Voir le corrigé
On analyse les indices fournis par l'algorithme :
c3 ← 0puisc3 ← c3 + 1:c3est un entier.Long(c2)et l'accèsc2[i]:c2est une chaîne.Majus(c1)(sans indice) :c1est un caractère.
✅ Proposition 4 : c1 caractère, c2 chaîne, c3 entier.
Question 2 — Message d'affichage significatif
Parmi les instructions suivantes, laquelle remplace utilement Ecrire(c3) ?
- A.
Ecrire("Le nombre de caractères majuscules de", c1, "et", c2, "est :", c3) - B.
Ecrire("Le nombre d'occurrences de", c1, "dans", c2, "est :", c3) - C.
Ecrire("Le nombre de chiffres dans", c2, "est :", c3) - D.
Ecrire("Le nombre de caractères communs entre", c1, "dans", c2, "est :", c3)
Voir le corrigé
L'algorithme compare la majuscule de chaque caractère de la chaîne c2 à la majuscule du caractère c1, et compte le nombre de correspondances : il compte donc les occurrences de c1 dans c2 (en ignorant la casse).
Exemple : pour c1 = "B" et c2 = "Bombom" :
| i | c2[i] | Majus(c2[i]) = Majus(c1) ? | c3 |
|---|---|---|---|
| 0 | 'B' | oui | 1 |
| 1 | 'o' | non | 1 |
| 2 | 'm' | non | 1 |
| 3 | 'b' | oui | 2 |
| 4 | 'o' | non | 2 |
| 5 | 'm' | non | 2 |
Résultat : c3 = 2.
✅ Réponse B : Ecrire("Le nombre d'occurrences de", c1, "dans", c2, "est :", c3)
Exercice 3 — Séquence sur un entier (Bac 2019, 5 pts, 15 min)
Soit la séquence algorithmique suivante, où x est un entier naturel :
nb ← 1
TantQue (x div 10) ≠ 0 Faire
nb ← nb + 1
x ← x div 10
Fin TantQue
Question 1 — Valeur finale de nb
Calculer la valeur finale de nb pour :
x = 5403→ ?x = 176→ ?x = 3→ ?
Voir le corrigé
Pour x = 5403 :
| x | x div 10 | nb |
|---|---|---|
| 5403 | 540 | 2 |
| 540 | 54 | 3 |
| 54 | 5 | 4 |
| 5 | 0 | arrêt |
⇒ nb = 4
Pour x = 176 :
| x | x div 10 | nb |
|---|---|---|
| 176 | 17 | 2 |
| 17 | 1 | 3 |
| 1 | 0 | arrêt |
⇒ nb = 3
Pour x = 3 :
| x | x div 10 | nb |
|---|---|---|
| 3 | 0 | arrêt (la boucle ne s'exécute pas) |
⇒ nb = 1
Question 2 — Rôle de la séquence
Voir le corrigé
Cette séquence détermine le nombre de chiffres de l'entier naturel x.
Question 3 — Version sans structure itérative
Écrire une séquence algorithmique équivalente sans utiliser de boucle.
Voir le corrigé
On peut convertir l'entier en chaîne puis prendre sa longueur :
nb ← long(convch(x))
où convch convertit un entier en chaîne de caractères.
Exercice 4 — Propagation Covid-19 (Prototype Bac 2022, 5 pts, 20 min)
La propagation de l'épidémie Covid-19 suit une croissance exponentielle. Pour déterminer le nombre total de personnes contaminées pendant un nombre de jours N donné et pour x personnes initialement contaminées, on utilise la formule :
$$ S = \sum_{i=0}^{N} \frac{x^{i}}{i!} = 1 + x + \frac{x^{2}}{2!} + \frac{x^{3}}{3!} + \cdots + \frac{x^{N}}{N!} $$
Donner un algorithme solution à ce problème, sachant que x et N sont deux entiers strictement supérieurs à 0.
Voir le corrigé
La solution s'appuie naturellement sur deux fonctions déjà rencontrées dans l'exercice 1 :
factoriel(i)calculei!puissance(x, i)calculex^i
Algorithme principal
Algorithme Epidemie
Début
Répéter
Ecrire("Donner x : "), Lire(x)
Ecrire("Donner N : "), Lire(N)
jusqu'à (x > 0) et (N > 0)
S <- 1
Pour i de 1 à N faire
S <- S + puissance(x, i) / factoriel(i)
Fin Pour
Ecrire("La somme = ", S)
Fin
TDO principal
| Objet | Type/Nature |
|---|---|
| x, N, i | entier |
| S | réel |
| puissance | fonction |
| factoriel | fonction |
Fonction factoriel
Fonction factoriel (a : entier) : entier
Début
R ← 1
Pour i de 1 à a faire
R ← R * i
FinPour
Retourner(R)
FIN
Fonction puissance
Fonction puissance (a, b : entier) : entier
Début
R ← 1
Pour i de 1 à b faire
R ← R × a
FinPour
Retourner(R)
FIN