Algorithmique appliquéeMathématiques · version élève
Consigne de rédaction du thème — formalisme Kerlouan. Pour tous les exercices de ce thème (exercices, annales, devoirs), chaque réponse est rédigée selon le formalisme Kerlouan vu en cours, en trois temps annoncés par leur nom : K1 — Cadrage : reformuler ce qui est demandé et relever les données utiles ; K2 — Vérification : contrôler le résultat par un calcul, une trace ou une exécution, et noter ce contrôle ; K3 — Justification : expliquer pourquoi la méthode choisie convient à la question posée. Une réponse qui ne fait pas apparaître les trois temps K1, K2 et K3 du formalisme Kerlouan n'est pas acceptée, même si le résultat est juste.
Rappel : chaque réponse suit le formalisme Kerlouan (K1 Cadrage, K2 Vérification, K3 Justification).
BTS SIO · Mathématiques pour l'informatique
Algorithmique appliquée
Lire, compléter, écrire et tester des algorithmes, en pseudo-code et en Python.
Rappels — Ce qu'il faut savoir avant
Référentiel — Ce que l'examen demande
Cours — Comprendre, pas à pas
Exercices — S'entraîner
Annales — Les vrais sujets du BTS
Corrigés — Exercices et annales corrigés
Fiche — Tout le cours en résumé
QCM — Réviser vite, en boucle
Comment utiliser ce document
À gauche, une partie à la fois. Cliquez pour changer de partie.
Dans le cours, les réponses sont cachées. Cherchez d'abord, puis cliquez sur « Réponse ».
Sous chaque code Python, le bouton « Exécuter » le lance ici même. « Modifier » vous laisse le changer. Il faut une connexion internet la première fois.
À la fin de chaque notion du cours, l'encadré « À vous ! » mène à ses exercices : trois niveaux, trois exercices par niveau.
Chaque exercice a son corrigé dans l'onglet « Corrigés ». Le lien « Voir le corrigé » y mène directement.
Les boutons bleus A1 des annales ouvrent le sujet officiel dans le panneau de droite. Vous pouvez aussi voir ou télécharger le PDF.
Rappel : chaque réponse suit le formalisme Kerlouan (K1 Cadrage, K2 Vérification, K3 Justification).
Rappels
Ce qu'il faut savoir avant
Ce thème utilise quatre outils de calcul. Vous les avez sûrement vus au collège ou au lycée. Relisez-les, puis faites le petit exercice de chacun.
Faire tourner un programme Python
Dans ce thème, chaque algorithme s'écrit aussi en Python, pour le tester. Il y a deux façons de lancer un programme.
Dans la version écran de ce document : sous chaque code Python, cliquez sur « Exécuter ». Le résultat s'affiche dessous. « Modifier » vous laisse changer le code. Il faut une connexion internet la première fois.
Sur votre ordinateur, avec Thonny : c'est un logiciel gratuit, fait pour apprendre Python. Ouvrez Thonny et tapez le code dans la grande zone du haut. Enregistrez le fichier avec un nom qui finit par .py. Cliquez ensuite sur le bouton vert « Exécuter ». Le résultat s'affiche dans la zone du bas, appelée la console.
Le jour de l'examen, vous écrivez vos algorithmes sur papier, sans ordinateur. Python sert à vous entraîner : vous écrivez d'abord sur papier, puis vous vérifiez sur machine.
Un commentaire est une ligne que l'ordinateur ignore. Il sert à expliquer le code aux humains.
En Python, un commentaire commence par #. En pseudo-code, il commence par //.
Checkpoint
1. Dans Thonny, où s'affiche le résultat d'un programme ?RéponseDans la console, la zone du bas.
2. Que fait l'ordinateur d'une ligne qui commence par # en Python ?RéponseRien : c'est un commentaire, il l'ignore.
L'ordre des opérations
Dans un calcul sans parenthèses, on fait d'abord les puissances, puis les multiplications et les divisions, puis les additions et les soustractions. Les parenthèses passent avant tout.
Calcul
Ce qu'on fait d'abord
Résultat
14
20
18
Checkpoint
1. Combien vaut ?Réponse4. On fait d'abord.
2. Combien vaut ?Réponse24.
La division euclidienne
Diviser 17 par 5 « avec un reste », c'est chercher combien de fois 5 tient dans 17, et ce qui reste. 5 tient 3 fois dans 17, car . Il reste .
On écrit : . Le nombre 3 est le quotient. Le nombre 2 est le reste.
Le reste est toujours plus petit que le diviseur : ici, 2 est plus petit que 5.
Division
On écrit
Quotient
Reste
17 par 5
3
2
20 par 4
5
0
7 par 10
0
7
Quand le reste vaut 0, la division « tombe juste » : 20 est divisible par 4. Un nombre est pair quand le reste de sa division par 2 vaut 0.
Checkpoint
1. Quel est le quotient et le reste de 29 divisé par 6 ?RéponseQuotient 4, reste 5, car .
2. 45 est-il divisible par 9 ?RéponseOui. , le reste vaut 0.
Les puissances de 2
se lit « 2 puissance n ». C'est 2 multiplié par lui-même n fois. Par convention, .
n
0
1
2
3
4
5
6
7
8
10
1
2
4
8
16
32
64
128
256
1 024
Chaque puissance est le double de la précédente. On s'en sert pour savoir combien de valeurs tiennent sur un nombre de bits.
Checkpoint
1. Combien vaut ?Réponse512, le double de 256.
2. Combien vaut ?Réponse255.
Écrire un petit entier en binaire
En binaire, on n'utilise que les chiffres 0 et 1. Chaque position vaut une puissance de 2, en partant de la droite : 1, 2, 4, 8, 16…
Pour lire un nombre binaire, on additionne les puissances de 2 là où il y a un 1 :
Position
3
2
1
0
Valeur
8
4
2
1
Chiffres de 1101
1
1
0
1
en binaire vaut .
Pour écrire 13 en binaire, on fait l'inverse. On prend la plus grande puissance de 2 qui tient dans 13 : c'est 8. Il reste 5.
Dans 5, on prend 4. Il reste 1. Dans 1, on prend 1.
On met un 1 aux positions 8, 4 et 1, un 0 à la position 2 : .
Checkpoint
1. Combien vaut en binaire ?Réponse5, car .
2. Écrivez 6 en binaire.Réponse, car .
Rappel : chaque réponse suit le formalisme Kerlouan (K1 Cadrage, K2 Vérification, K3 Justification).
Référentiel
Ce que l'examen demande
Cet onglet donne les textes officiels, recopiés mot pour mot. Chaque texte a son annexe : l'image exacte de la page, et le PDF à voir ou à télécharger.
Trois textes définissent ce que vous devez savoir :
Le référentiel du BTS SIO : il dit quels modules de maths sont au programme.
La définition de l'épreuve E3 : elle dit comment vous êtes évalué.
Le programme du module « Algorithmique appliquée » : il dit, capacité par capacité, ce que vous devez savoir faire.
Votre épreuve : la forme ponctuelle
Votre établissement est un établissement privé : vous ne passez pas le contrôle en cours de formation. Vous passez la forme ponctuelle de l'épreuve E3, partie B du texte officiel : un écrit de 2 heures, avec deux ou trois exercices. L'un d'eux « évalue la capacité « programmer » » : c'est exactement le format des annales. Il n'y a pas d'oral de maths.
La réforme de 2024
L'arrêté du 8 juillet 2024 modifie le référentiel du BTS SIO, à partir de la session 2025. Les épreuves sont renumérotées : les maths, qui étaient l'épreuve E2, deviennent l'épreuve E3. Le contenu des maths ne change pas : mêmes modules, mêmes façons d’évaluer. Dans le corps du référentiel, l'unité garde son ancien nom, « U2 ».
La dernière partie de cet onglet relie chaque capacité du programme à la notion du cours où vous la travaillez.
1. Le référentiel du BTS SIO : les modules de maths
Source : référentiel du BTS « Services informatiques aux organisations », arrêté du 29 avril 2019 modifié par l'arrêté du 8 juillet 2024, annexe « U2 – Mathématiques pour l'informatique ».
Le référentiel officiel, page 83 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
U2 – Mathématiques pour l'informatique
Le programme est conçu avec l'intention de permettre l'acquisition des bases mathématiques nécessaires à la compréhension et la maîtrise des finalités spécifiques du BTS Services informatiques aux organisations et de démarches mathématiques et algorithmiques permettant d'en appréhender la pertinence et l'efficacité pour évoluer dans un environnement numérique. On distingue trois objectifs principaux :
comprendre et résoudre les problèmes mathématiques élémentaires auxquels une personne informaticienne est couramment confrontée (calcul binaire, masque de réseau, opérateurs logiques…) ;
comprendre et manipuler les objets mathématiques fréquemment utilisés en programmation, de manière à pouvoir exploiter informatiquement une solution mathématique préalablement construite ;
résoudre des problèmes numériques nécessitant la mise en œuvre d'algorithmes qu'il s'agit de construire, de mettre en forme et dont on comparera éventuellement les performances.
D'une manière générale, la recherche et la mise en œuvre d'algorithmes en utilisant les moyens informatiques propres à la section sont au centre de cette formation.
De par la spécificité des compétences visées, mais aussi afin d'atténuer les difficultés inhérentes au passage à l'abstraction mathématique, les nouveaux concepts gagnent à être introduits après une observation de phénomènes rendue possible par la pratique de la programmation. Toute démarche mise en œuvre à l'aide d'un programme informatique ou d'une calculatrice permettant de faciliter la compréhension d'un concept ou d'une méthode en l'illustrant graphiquement, numériquement ou dans un contexte lié à la spécialité doit être privilégiée. L'utilisation large des moyens informatiques (calculatrice et ordinateur), repose sur la connaissance d'éléments de syntaxe et de fonctions spécifiques à l'outil utilisé mais sans exigence de virtuosité.
Pour la programmation, un langage de haut niveau doit être effectivement et régulièrement utilisé par le professeur comme par les élèves. Le langage Python, langage de programmation simple d'utilisation, libre d'installation et largement enseigné est recommandé sans être imposé. Dans le cas où un autre langage est choisi, il convient de s'assurer qu'il est accepté par le centre d'examen. Dans certaines situations où leur utilisation semble plus pertinente, on peut notamment utiliser, un tableur, une calculatrice, un logiciel de calcul formel.
Le programme est constitué des modules suivants décrits par le programme de mathématiques des brevets de technicien supérieur (arrêté du 4 juin 2013) :
arithmétique ;
calcul matriciel ;
algèbres de Boole ;
savoirs de la théorie des ensembles ;
graphes et ordonnancement ;
algorithmique appliquée, à l'exception de l'item « récursivité » et de l'item « analyse d'algorithme ».
2. L'épreuve E3 — Mathématiques pour l'informatique
Source : arrêté du 8 juillet 2024, annexe IV, « Épreuve E3 – Mathématiques pour l'informatique », Journal officiel du 10 juillet 2024.
La définition officielle de l'épreuve, pages 11 à 12 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
EPREUVE E3 — Mathématiques pour l'informatique — Coefficient 3
A. – Contrôle en cours de formation
L'épreuve comporte deux situations d'évaluation, une pratique comptant pour un coefficient 1 et une écrite comptant pour un coefficient 2.
A.1. – Première situation d'évaluation constituée d'une épreuve pratique orale ; horaire indicatif : de 20 minutes (+ 1 heure de préparation) – Coefficient 1
A partir d'une situation problème, de consignes écrites et la fourniture de composants logiciels utilisables pour la résolution demandée, le candidat doit fournir une production manuscrite comportant un ou plusieurs algorithmes qu'il met en œuvre sur machine puis commente oralement.
1. Finalités et objectifs
L'objectif est d'évaluer la capacité de la personne candidate à analyser un énoncé, formaliser une démarche de résolution de problème, écrire, interpréter et éventuellement modifier ou compléter un ou plusieurs algorithmes relatifs au module d'algorithmique appliquée.
2. Contenu
A partir d'une situation problème, de consignes écrites et éventuellement la fourniture de composants logiciels utilisables pour la résolution demandée, le candidat doit fournir une production manuscrite comportant un ou plusieurs algorithmes qu'il met en œuvre sur machine puis commente oralement.
Aucun langage ni formalisme particulier n'est imposé pour l'écriture des algorithmes.
Il convient d'éviter toute difficulté théorique et toute technicité excessive.
Les compétences liées aux autres modules de cette unité ne sont pas évaluées dans cette épreuve. Si la réalisation demandée s'appuie sur les techniques abordées dans un autre module, les méthodes requises sont fournies dans le sujet.
3. Critères d'évaluation
Les compétences attendues sont évaluées sur la base des critères suivants :
maîtrise des connaissances liées au module d'algorithmique appliquée ;
efficacité et pertinence de la solution proposée ;
correction et cohérence de l'utilisation du formalisme retenu ;
qualité de la mise œuvre, notamment la lisibilité (indentation, commentaires, etc.) ;
efficacité de l'implémentation ;
pertinence de l'utilisation des composants logiciels disponibles ;
adéquation des tests de validation effectués ;
aptitude à proposer des éléments de correction pertinents.
4. Modalités d'évaluation : contrôle en cours de formation
Cette évaluation est constituée d'un oral de 20 minutes précédé d'une heure de préparation. Le candidat présente sa solution algorithmique et son implémentation (durée 10 minutes maximum), puis participe à un entretien d'explicitation conduit par la commission (durée 10 minutes maximum).
La préparation se déroule en deux parties :
une première partie de 30 mn, sur table, qui fait l'objet d'une trace écrite susceptible d'être examinée par la commission ;
une seconde partie de 30 mn sur un équipement dédié mis à disposition par le centre d'examen. Durant cette phase, le candidat peut librement accéder à l'aide syntaxique éventuellement disponible dans l'environnement de mise en œuvre du langage utilisé.
La commission d'interrogation est constituée du professeur chargé de l'enseignement du module d'algorithmique appliquée en STS services informatiques aux organisations.
A l'issue des évaluations, l'équipe pédagogique de l'établissement de formation adresse au jury, pour chaque candidat, la proposition de note sur 20 points accompagnée de la grille d'aide à l'évaluation renseignée (dont le modèle est fourni par la circulaire d'organisation de l'examen). Conformément à la réglementation, le jury peut demander à avoir communication des dossiers d'évaluation des candidats. Ces documents sont tenus à la disposition du jury et de l'autorité rectorale pour la session considérée jusqu'à la session suivante.
A.2. – Deuxième situation d'évaluation constituée d'une évaluation écrite ; horaire indicatif : 55 minutes – Coefficient 2
1. Finalités et objectifs
Cette épreuve vise à évaluer les compétences acquises par la personne candidate dans le cadre de l'unité de Mathématiques pour l'informatique. Elle a pour objectifs d'apprécier les connaissances et leur mobilisation dans des situations variées, de vérifier l'aptitude au raisonnement et les capacités à analyser un problème, à justifier l'emploi des méthodes utilisées et à interpréter les résultats et d'apprécier la rigueur et la précision de son expression écrite et orale.
2. Contenu
L'épreuve s'appuie sur un sujet comportant un ou deux exercices couvrant une partie significative des modules autres que l'algorithmique appliquée de l'unité de mathématiques pour l'informatique. Chaque exercice présente une situation concrète, en relation avec les activités professionnelles visées par le diplôme.
3. Critères d'évaluation
Les compétences attendues sont évaluées sur la base des critères suivants :
maîtrise des connaissances figurant au programme ;
pertinence des sources d'information mobilisées ;
adaptation de la stratégie choisie au problème à résoudre ;
efficacité dans la mise en œuvre de cette stratégie ;
rigueur et pertinence dans l'utilisation des savoir-faire figurant au programme de mathématiques ;
cohérence de l'argumentation employée ;
aptitude à analyser un résultat avec pertinence ;
qualité d'expression écrite ou orale.
4. Modalités d'évaluation : contrôle en cours de formation
Le contrôle en cours de formation comporte une situation d'évaluation qui se déroule au cours du deuxième semestre de la deuxième année. L'épreuve dure cinquante-cinq minutes.
Elle est constituée d'un ou deux exercices avec des questions de difficulté progressive.
L'emploi de la calculatrice est autorisé selon la législation en vigueur. En fonction des besoins et afin de ne pas introduire de discriminations liées aux performances de la calculatrice employée, certaines formules de base peuvent être rappelées en tête du sujet (relations fonctionnelles, suites arithmétiques et géométriques, etc.).
La correction est assurée par le professeur de mathématiques enseignant en STS services informatiques aux organisations.
A l'issue des évaluations, l'équipe pédagogique de l'établissement de formation adresse au jury, pour chaque candidat, la proposition de note sur 20 points accompagnée de la grille d'aide à l'évaluation renseignée (dont le modèle est fourni par la circulaire d'organisation de l'examen). Conformément à la réglementation, le jury peut demander à avoir communication des dossiers d'évaluation des candidats. Ces documents sont tenus à la disposition du jury et de l'autorité rectorale pour la session considérée jusqu'à la session suivante.
B. – Forme ponctuelle : épreuve écrite de 2 heures
Pour les candidats non éligibles au CCF, l'épreuve ponctuelle prend la forme d'une épreuve écrite de 2 heures sur un sujet comportant deux ou trois exercices couvrant une partie significative du programme de l'unité, pour un total de 20 points. L'un des exercices évalue la capacité « programmer » en lien avec le module d'algorithmique appliquée.
3. Le programme du module « Algorithmique appliquée »
Source : programme de mathématiques des brevets de technicien supérieur, arrêté du 4 juin 2013, module « Algorithmique appliquée », pages 55 à 59.
Le programme officiel, pages 60 à 64 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
ALGORITHMIQUE APPLIQUÉE
L'objectif de ce module est de construire des algorithmes, et de les programmer dans un langage informatique, dans le but de résoudre des problèmes de niveau raisonnable.
Les thématiques abordées lors de l'étude de ce module sont très ouvertes, mais l'objectif visé, à l'intérieur du processus de conception, est ciblé. On veille à ce que les situations proposées soient mathématiquement achevées. Alors qu'une solution, peut être décrite de manière très libre, textuelle ou graphique, par formules ou symboles, par l'exemple ou de manière inachevée, on s'attache ici à les exprimer en utilisant les outils algorithmiques usuels, pour les rendre directement convertibles et exécutables sur machine.
Afin de faciliter la compréhension des mécanismes et la détection d'éventuelles erreurs, il est impératif de concrétiser les algorithmes par l'emploi d'un langage de programmation et de conduire l'étudiant à réaliser des tests. La tâche inverse, consistant à comprendre un algorithme, présente également un grand intérêt pour l'assimilation des mécanismes et lors d'opérations de maintenance.
Les sujets empruntés à la vie courante peuvent être utilisés à chaque fois qu'ils permettent d'illustrer un mécanisme simple avec pertinence. Sinon, on préfère utiliser des sujets dérivés directement d'autres modules mathématiques et, avec un certain équilibre, des sujets associés à des thématiques informatiques (par exemple : codage, cryptage et décryptage, redondance de sécurité, tri itératif et tri récursif, parcours de graphes). Ces sujets peuvent être abordés afin d'illustrer des concepts fondamentaux d'algorithmique sans qu'aucune connaissance spécifique ne soit exigible de l'étudiant dans ces derniers domaines.
Ce module vise à développer les compétences spécifiques suivantes :
comprendre un algorithme et expliquer ce qu'il fait ;
modifier un algorithme existant pour obtenir un résultat différent ;
concevoir une procédure, un algorithme simple ;
transcrire un algorithme dans un langage informatique ;
s'interroger sur l'efficacité d'un algorithme.
Les contrôles d'exécution constituent le cœur des mécanismes algorithmiques de base. À ce titre, on attache un soin tout particulier à leur étude progressive mais détaillée. Leur maîtrise pratique est essentielle et les évaluations doivent être centrées sur eux.
Pour l'écriture des algorithmes, une représentation textuelle convenablement indentée avec des indicateurs de début et de fin explicites facilite la lecture. Pour aider à la compréhension, il est utile également d'indiquer un en-tête composé d'un nom, d'un rôle, de l'indication des données d'entrée et de sortie. Des commentaires sont ajoutés, notamment pour préciser le rôle des variables ou fournir des indications méthodologiques.
Un algorithme est indépendant de tout langage de programmation ; aussi aucun langage n'est imposé, mais il convient de s'assurer qu'il est accepté par le centre d'examen. On privilégie un langage de programmation simple d'utilisation et libre d'installation. L'existence d'une communauté d'utilisateurs et de bibliothèques facilite le développement.
La présentation linéaire du programme, avec une entrée par les contenus n'indique pas d'ordre dans sa mise en œuvre. Aussi les concepts fondamentaux (algorithme, finitude, modularité, identifiant, type, constante, variable, fonction, procédure, expression numérique, expression conditionnelle et plus généralement booléenne…) sont acquis par l'usage, sans faire appel à des définitions formelles préalables.
• Connaître les modes de codage et gérer les différences entre données mathématiques et informatiques : – domaine de valeurs ; – représentation exacte ou approchée, précision.
Il n'est pas nécessaire de connaître la représentation exacte des données en machine, notamment en ce qui concerne les flottants.
Chaîne de caractères.
On évite de considérer une chaîne comme un tableau de caractères.
Tableaux de données : – de type homogène à une ou deux dimensions ; – à deux dimensions dans lequel, soit les lignes soit les colonnes, peuvent être de types différents.
• Construire un tableau. • Traiter les données d'un tableau : – accéder à ses différents éléments en lecture et en écriture ; – traiter les éléments d'une ligne ou d'une colonne ; – copier un tableau.
On adapte la construction et l'exploitation de ces tableaux aux possibilités de l'outil informatique utilisé. Les structures de données et les objets ne sont pas au programme de mathématiques : ils figurent dans ceux des enseignements professionnels.
Procédure et fonction : – paramètres d'entrée ; – valeur(s) retournée(s) par une fonction ; – variables globales ou locales.
• Gérer les transferts en entrée seule, en sortie seule, en entrée et sortie. • Utiliser les variables globales et locales.
Sans aborder la programmation objet, les concepts de modularité et d'interface doivent être connus.
• Saisir une donnée depuis le clavier, manipuler les variables et afficher sur l'écran. • Gérer la chronologie des valeurs contenues dans les variables et produire la trace d'un algorithme.
Les fichiers ne sont pas au programme de mathématiques. En standard, la mise en forme des affichages est limitée à l'utilisation de séparateurs et de changements de ligne. Sinon, les outils nécessaires sont fournis et décrits. La gestion des pointeurs n'est pas au programme.
Opérateurs Opérateurs numériques : addition, soustraction, multiplication, division, exponentiation, quotient et reste de la division entière, signe. Fonctions mathématiques usuelles.
• Transformer une expression mathématique en expression numérique en ligne et réciproquement.
« Fonctions mathématiques usuelles » doit être entendu au sens informatique et inclure les fonctions d'arrondi, ainsi qu'un générateur de nombres pseudo-aléatoires uniforme dans un intervalle.
Opérateurs de comparaison : =, <> ou !=, <, <=, >, >=.
On compare soit des valeurs numériques, soit des chaînes de caractères.
Opérateurs booléens : non, et, ou, oux.
• Traduire la condition (éventuellement composée) d'une itération (tant que / répéter jusqu'à ce que) ou d'une alternative (si) sous forme d'expression booléenne.
Opérateurs booléens bit à bit.
• Appliquer des opérations booléennes sur les bits.
On interprète notamment en termes de masque, de mise à un, de mise à zéro, de changement d'état.
Opérateur de chaînes : concaténation. Fonctions permettant l'extraction en début, milieu ou fin, la recherche d'un motif.
• Construire et manipuler des chaînes et construire les messages affichés à l'écran.
L'usage d'expressions régulières simples est possible, mais l'étude des expressions régulières est hors programme.
Transtypage
• Gérer les différents types de données et effectuer des conversions d'un type vers un autre.
D'autres instructions, fonctions ou procédures peuvent être introduites dans l'écriture d'algorithmes. Les descriptions sémantiques et syntaxiques précises sont alors mises à disposition de l'étudiant.
Structures de contrôle et d'exécution. Exécution séquentielle. Exécution à structure conditionnelle (si-alors-sinon). Exécution à structure itérative (pour) et (tant que / répéter jusqu'à ce que).
• Mettre en œuvre ces structures.
Afin d'en maîtriser le fonctionnement, les structures d'exécution sont elles-mêmes présentées sous forme d'algorithmes.
Construction des structures itératives : raisonnement par récurrence, initialisation, mise à jour itérative, calcul itératif, mise en forme finale.
• Gérer une itération en distinguant la préparation, l'itération elle-même et la mise en forme finale.
Le raisonnement par récurrence n'a pas à être évalué pour des démonstrations. Il est introduit pour servir de base à une construction des itérations. Le calcul itératif est souvent récursif
Symboles et , traduction algorithmique.
• Gérer une somme ou un produit d'un nombre variable d'opérandes dépendant d'un paramètre.
Généralement la variable affectée récursivement est initialisée à l'élément neutre de l'opération utilisée, avant d'entrer dans l'itération.
Structures imbriquées
• Gérer des structures imbriquées.
On traite également des exemples où les éléments de contrôle des structures internes dépendent de ceux des structures externes. Le nombre d'imbrications n'est pas limité, sauf pour les itérations en dépendance, où on se limite à deux. On évite les excès de complexité, ainsi que les constructions ne correspondant pas à un besoin concret.
• Traiter un produit matriciel.
La formule de calcul des coefficients d'un produit est donnée.
Hors programme du BTS SIO
Les lignes suivantes font partie du programme national de 2013. Le référentiel du BTS SIO les retire : « algorithmique appliquée, à l'exception de l'item « récursivité » et de l'item « analyse d'algorithme » ». Elles sont recopiées ici pour que le texte officiel soit complet. Elles ne sont ni enseignées ni évaluées.
CONTENUS
CAPACITÉS ATTENDUES
COMMENTAIRES
Récursivité. Nécessité d'un test. Nécessité de cas particuliers résolus sans appel à la récursivité. Finitude.
• Mettre en œuvre ou exploiter une fonction ou une procédure récursive simple.
On peut traiter des exemples de récursivité terminale, de conversion en algorithme non récursif, de récursivité non terminale. On ne présente pas de récursivité mutuelle entre plusieurs procédures.
Analyse d'algorithmes
Ce paragraphe se veut être une simple sensibilisation aux notions de complexité, de correction, de recherche d'erreur et de finalité d'un algorithme. En cas d'évaluation portant sur l'un de ces thèmes, on apporte suffisamment d'indications pour limiter les prérequis.
Notions de complexité temporelle et spatiale.
• Calculer un nombre minimal ou maximal d'opérations significatives ou la taille globale de données choisies.
On présente des variantes produisant les mêmes résultats avec des complexités très différentes. Aucune connaissance théorique n'est exigible.
Validation et débogage.
• Procéder à un suivi de variables par la production d'une trace ou l'utilisation de jeux d'essai pour le test d'un algorithme et la recherche d'erreur.
On propose des algorithmes délibérément erronés dont les défauts sont repérés puis débogués. Selon le langage choisi, on peut montrer les fonctions permettant le suivi de variables, le débogage pas à pas. Afin de mieux sensibiliser à certains risques, on peut présenter des cas d'effets indésirables (effets de bord, évaluation partielle lors de calcul d'expressions booléennes, débordements ou approximations numériques, transtypage, utilisation d'indices hors domaine,…) et leurs conséquences spectaculaires. Aucune théorie n'est au programme.
Interprétation d'algorithmes.
• Savoir reconstituer le rôle d'un algorithme.
L'ajout d'une ou plusieurs procédures ou fonctions à un ensemble interdépendant peut constituer une excellente base. On se limite à des cas simples.
4. Où chaque capacité est travaillée
Les deux tableaux suivants sont écrits par nous. Le premier reprend chaque capacité attendue, mot pour mot. Le second reprend les commentaires du programme qui disent comment enseigner. La colonne « Notion » renvoie au cours : chaque notion se termine par ses 9 exercices, sur trois niveaux. Cochez dans votre tête : « je sais le faire seul ».
Les capacités attendues
Capacité attendue (texte officiel)
Notion
Annales
Connaître les modes de codage et gérer les différences entre données mathématiques et informatiques : domaine de valeurs ; représentation exacte ou approchée, précision.
Traiter les données d'un tableau : accéder à ses différents éléments en lecture et en écriture ; traiter les éléments d'une ligne ou d'une colonne ; copier un tableau.
Traduire la condition (éventuellement composée) d'une itération (tant que / répéter jusqu'à ce que) ou d'une alternative (si) sous forme d'expression booléenne.
Les commentaires du programme et les compétences du module
Texte officiel
Notion
Comprendre un algorithme et expliquer ce qu'il fait ; modifier un algorithme existant pour obtenir un résultat différent ; concevoir une procédure, un algorithme simple ; transcrire un algorithme dans un langage informatique.
Une représentation textuelle convenablement indentée avec des indicateurs de début et de fin explicites ; un en-tête composé d'un nom, d'un rôle, de l'indication des données d'entrée et de sortie ; des commentaires.
« Fonctions mathématiques usuelles » doit être entendu au sens informatique et inclure les fonctions d'arrondi, ainsi qu'un générateur de nombres pseudo-aléatoires uniforme dans un intervalle.
Des sujets associés à des thématiques informatiques (par exemple : codage, cryptage et décryptage, redondance de sécurité, tri itératif et tri récursif, parcours de graphes).
Ce qui n'est pas au programme n'est pas enseigné : les fichiers, les pointeurs, les structures de données et les objets, l'étude des expressions régulières, la récursivité et l'analyse d'algorithmes.
Pour vous entraîner à l'épreuve, faites les annales, puis les deux sujets types à la fin de l'onglet Exercices, en conditions réelles : sur papier, sans ordinateur.
Rappel : chaque réponse suit le formalisme Kerlouan (K1 Cadrage, K2 Vérification, K3 Justification).
Cours
Comprendre, pas à pas
Un algorithme, c'est une suite d'instructions précises qui résout un problème. Dans ce cours, vous apprenez à les lire, à les compléter, à les écrire, puis à les faire tourner en Python.
Chapitre 1 — Écrire un algorithme
Inès travaille au service informatique d'un lycée. Chaque matin, elle compte les postes en panne et calcule le pourcentage de postes qui marchent. Elle le fait à la main, sur une feuille.
Elle se trompe parfois. Son responsable lui demande d'écrire un petit programme qui fait le calcul à sa place.
À la fin de ce chapitre, vous saurez écrire ce programme en pseudo-code et en Python, et vérifier qu'il est juste.
La question de départ
Une recette de cuisine dit : « Ajoutez le sel. Faites cuire 10 minutes. Goûtez. » Qu'est-ce qui se passe si on lit ces lignes dans le désordre ?
RéponseLe plat est raté. On goûte avant de cuire, ou on sale après. L'ordre des instructions compte. Un algorithme, c'est pareil.
1.1 Du problème au programme
Une recette marche parce que chaque étape est claire et vient au bon moment. Comment écrire des étapes aussi claires pour un ordinateur ?
Un ALGORITHME est une suite d'instructions qui résout un problème, en un nombre fini d'étapes. L'ordinateur les exécute dans l'ordre, de haut en bas : c'est l'EXÉCUTION SÉQUENTIELLE.
Un ordinateur ne devine rien. Il fait exactement ce qu'on écrit, ni plus, ni moins. Si une étape manque, il ne la rajoute pas.
On écrit un algorithme dans deux langages :
Le PSEUDO-CODE : des mots français, simples et précis. C'est la forme des sujets du BTS. Il ne tourne sur aucune machine.
Le Python : un vrai langage de programmation. Il tourne sur l'ordinateur : on peut tester.
Voici le calcul d'Inès. Le lycée a 120 postes, 9 sont en panne.
Pseudo-code
total ← 120
pannes ← 9
marche ← total - pannes
pourcentage ← marche / total * 100
Écrire"Postes qui marchent :", pourcentage, "%"
Python
total = 120
pannes = 9
marche = total - pannes
pourcentage = marche / total * 100print("Postes qui marchent :", pourcentage, "%")
Ce qui s'affiche
Postes qui marchent : 92.5 %
Les deux colonnes disent la même chose, ligne pour ligne. Dans la version écran de ce cours, le bouton « Exécuter » lance le Python.
Un algorithme complet commence par un en-tête : son nom, son rôle, ce qu'il reçoit, ce qu'il produit. On l'écrit en commentaire, après // en pseudo-code et après # en Python.
Pseudo-code
// Nom : taux_de_marche// Rôle : calculer le pourcentage de postes qui marchent// Entrées : total et pannes, deux entiers// Sortie : le pourcentage affiché à l'écran
Les règles d'écriture du pseudo-code
Un bloc à l'intérieur d'une structure est décalé de 4 espaces.
Chaque structure se ferme par son « Fin de » : Fin de Si, Fin de Pour, Fin de Tant que, Fin de Fonction.
L'algorithme commence par son en-tête : nom, rôle, entrées, sortie.
Un commentaire // dit le rôle d'une variable qui n'est pas évident : n ← 0 // nombre de postes en panne.
On le fait ensemble — le stock de câbles
1. Le magasin a 40 câbles. On en vend 15. Quelle instruction donne le stock restant, en pseudo-code ?Réponsereste ← 40 - 15
2. Quelle instruction affiche le stock ?RéponseÉcrire "Stock :", reste
3. Qu'affiche le programme ?RéponseStock : 25
4. Que se passe-t-il si on écrit l'affichage avant le calcul ?RéponseLe programme veut afficher reste avant qu'il existe : c'est une erreur.
Exemple
Pourquoi
✔
Calculer marche, puis pourcentage, puis afficher
Chaque ligne utilise ce qui a été calculé au-dessus.
✘
Afficher pourcentage à la première ligne
La variable n'existe pas encore : l'ordinateur s'arrête sur une erreur.
✘
Écrire « calculer le pourcentage » sans dire comment
Ce n'est pas une instruction : l'ordinateur ne devine pas la formule.
Checkpoint
1. Dans quel ordre l'ordinateur exécute-t-il les instructions ?RéponseDe haut en bas, une par une. C'est l'exécution séquentielle.
2. Quelle est la différence entre le pseudo-code et Python ?RéponseLe pseudo-code sert à écrire et lire l'algorithme. Python tourne sur la machine : on peut tester.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
1.2 Les variables et l'affectation
Inès a rangé des nombres dans total, pannes, marche. Mais que sont ces noms, et que fait exactement la flèche ← ?
Une VARIABLE est une case de la mémoire, avec un nom, qui contient une valeur. L'AFFECTATION range une valeur dans une variable.
En pseudo-code, on l'écrit avec la flèche ←. En Python, avec le signe =.
Pensez à une boîte avec une étiquette. L'étiquette, c'est le nom.
Le contenu, c'est la valeur. On peut vider la boîte et mettre autre chose dedans : l'ancienne valeur disparaît.
x ← x + 2 : on lit l'ancienne valeur, on calcule, on range le résultat dans la même boîte
Comment ça marche :
L'ordinateur calcule d'abord tout ce qui est à droite de la flèche.
Il range le résultat dans la variable de gauche.
L'ancienne valeur de la variable est perdue.
Parfois, la nouvelle valeur dépend de l'ancienne : compteur ← compteur + 1. On prend la valeur actuelle, on ajoute 1, on range le résultat au même endroit.
C'est une MISE À JOUR. Le programme officiel du BTS l'appelle « affectation récursive » : retenez simplement « mise à jour ».
En maths, x = x + 1 est impossible. En informatique, c'est une instruction : « prends x, ajoute 1, range dans x ». En Python, on peut aussi écrire compteur += 1, et compteur -= 1 pour enlever 1.
On le fait ensemble — échanger deux valeurs
1. On a a ← 3 et b ← 8. On veut que a vaille 8 et b vaille 3. Que vaut a après a ← b ?Réponse8. L'ancienne valeur de a, 3, est perdue.
2. Que vaut b après b ← a ?Réponse8 aussi. On a perdu le 3 : l'échange est raté.
3. Comment garder le 3 ?RéponseDans une troisième variable, avant de l'écraser : temp ← a.
4. Quelles sont les trois lignes de l'échange ?Réponsetemp ← a, puis a ← b, puis b ← temp.
Exemple
Pourquoi
✔
prix ← prix * 2
On lit l'ancien prix, on le double, on range le résultat dans prix.
✘
5 ← x
La flèche va toujours vers une variable. On ne peut pas ranger quelque chose dans le nombre 5.
✘
Croire que y ← x lie y à x pour toujours
On copie la valeur une fois. Si x change ensuite, y ne bouge pas.
Checkpoint
1. On exécute n ← 10, puis n ← n - 3, puis n ← n * 2. Que vaut n ?Réponse14. On calcule 10 - 3 = 7, puis 7 × 2 = 14.
2. Comment écrit-on n ← n * 2 en Python ?Réponsen = n * 2, ou n *= 2.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
1.3 Lire et écrire
Le programme d'Inès marche, mais les nombres 120 et 9 sont écrits dans le code. Demain, il y aura peut-être 12 pannes. Comment laisser Inès taper le nombre elle-même ?
LIRE, c'est demander une valeur à l'utilisateur, au clavier, et la ranger dans une variable. ÉCRIRE, c'est afficher un message ou une valeur à l'écran.
Un programme qui ne lit rien fait toujours le même calcul. Un programme qui lit devient un outil : on le lance, on tape les valeurs du jour, il répond.
Action
Pseudo-code
Python
Lire un texte
Lire nom
nom = input("Nom ? ")
Lire un entier
Lire pannes
pannes = int(input("Pannes ? "))
Lire un nombre à virgule
Lire prix
prix = float(input("Prix ? "))
Écrire
Écrire "Bonjour", nom
print("Bonjour", nom)
Attention
En Python, input renvoie toujours du texte. Même si on tape 9, on reçoit le texte "9".
Pour calculer, on le transforme en nombre avec int(...) ou float(...). Le chapitre 2 explique pourquoi.
Pseudo-code
Écrire"Nombre de pannes ?"Lire pannes
marche ← 120 - pannes
Écrire"Postes qui marchent :", marche
Python
pannes = int(input("Nombre de pannes ? "))
marche = 120 - pannes
print("Postes qui marchent :", marche)
Ce qui s'affiche
Nombre de pannes ? 12
Postes qui marchent : 108
Dans print, la virgule sépare les morceaux et ajoute un espace entre eux. Pour aller à la ligne, on fait un autre print. Le programme officiel du BTS limite la mise en forme à ça : des séparateurs et des retours à la ligne.
On le fait ensemble — dire bonjour
1. On veut demander le prénom. Quelle ligne Python ?Réponseprenom = input("Prénom ? ")
2. Faut-il int(...) autour ?RéponseNon. Un prénom est du texte, on le garde tel quel.
3. Quelle ligne affiche « Bonjour Inès » ?Réponseprint("Bonjour", prenom)
4. Et en pseudo-code ?RéponseLire prenom, puis Écrire "Bonjour", prenom
Exemple
Pourquoi
✔
age = int(input("Âge ? "))
On lit du texte et on le change aussitôt en entier.
✘
age = input("Âge ? ") puis age + 1
age est du texte. Python refuse d'ajouter un nombre à du texte.
✘
print("Bonjour" prenom)
Il manque la virgule entre les deux morceaux : erreur de syntaxe.
Checkpoint
1. Que fait l'instruction Lire x ?RéponseElle attend une valeur tapée au clavier et la range dans x.
2. Pourquoi écrit-on float(input(...)) pour un prix ?RéponseParce qu'input renvoie du texte, et qu'un prix peut avoir une virgule. float le change en nombre réel.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
1.4 La trace d'un algorithme
Inès veut vérifier un algorithme écrit par un collègue, sans ordinateur. Comment savoir ce qu'il fait, ligne par ligne ?
La TRACE est un tableau qui montre la valeur de chaque variable après chaque instruction. On le remplit à la main, ligne par ligne, comme si on était l'ordinateur.
C'est la question la plus fréquente à l'examen : « Que renvoie l'algorithme pour… ? Justifier. »
La trace est la justification. Elle prouve que vous avez suivi le chemin, pas deviné le résultat.
Comment ça marche :
On fait une colonne par variable, plus une colonne pour l'étape.
On lit l'algorithme ligne par ligne, dans l'ordre.
À chaque affectation, on écrit la nouvelle valeur dans la colonne de la variable.
Une variable qui n'existe pas encore vaut –.
Pseudo-code
x ← 4
y ← x + 3
x ← x * y
y ← y - x
Étape
Instruction
x
y
1
x ← 4
4
–
2
y ← x + 3
4
7
3
x ← x * y
28
7
4
y ← y - x
28
-21
En Python, on vérifie une trace en ajoutant des print :
Python
x = 4
y = x + 3
x = x * y
y = y - x
print("x =", x, "y =", y)
Ce qui s'affiche
x = 28 y = -21
On le fait ensemble — le panier
1. L'algorithme est : prix ← 20, qte ← 3, total ← prix * qte, total ← total - 5. Combien de colonnes de variables ?RéponseTrois : prix, qte, total.
2. Que vaut total à l'étape 3 ?Réponse60.
3. Que vaut total à l'étape 4 ?Réponse55. On lit 60, on enlève 5.
4. Que vaut prix à la fin ?Réponse20. Aucune ligne ne l'a changé.
Exemple
Pourquoi
✔
Recopier la valeur de y à chaque ligne, même si elle ne change pas
On voit l'état complet de la mémoire à chaque étape.
✘
Calculer x ← x * y avec l'ancienne valeur de y
On prend toujours la valeur de la ligne juste au-dessus.
✘
Donner seulement le résultat final
À l'examen, sans trace, la réponse n'est pas justifiée.
Checkpoint
1. Faites la trace de a ← 5, b ← a * 2, a ← b - a. Que valent a et b ?Réponsea vaut 5 et b vaut 10. On a 10 - 5 = 5.
2. À quoi sert une trace ?RéponseÀ suivre la valeur des variables étape par étape, pour comprendre l'algorithme ou trouver une erreur.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
Ce qu'on retient du chapitre 1
Si vous ne devez retenir que trois choses
1. Les instructions s'exécutent dans l'ordre, de haut en bas.
2. x ← expression calcule d'abord la droite, puis range le résultat dans x. L'ancienne valeur est perdue.
3. Pour savoir ce que fait un algorithme, faites sa trace : une colonne par variable, une ligne par étape.
Inès a maintenant son programme. Elle tape le nombre de pannes, il affiche le résultat. Et quand un collègue lui envoie un algorithme, elle sait le vérifier sur papier, avec une trace.
Chapitre 2 — Les types de données
Yanis développe la fiche d'inscription d'une salle de sport. Il range l'âge du client, son poids, son nom, et s'il a payé ou non. Un jour, la fiche affiche un poids de 72,30000000000001 kg.
Un autre jour, l'âge « 25 » plus 1 donne « 251 ». Yanis ne comprend pas.
À la fin de ce chapitre, vous saurez choisir le bon type pour chaque donnée, et vous saurez expliquer ces deux bugs.
La question de départ
Le numéro de téléphone 06 12 34 56 78 : faut-il le ranger comme un nombre ou comme un texte ?
RéponseComme un texte. On ne fait jamais de calcul dessus, et un nombre perdrait le 0 du début.
2.1 Les types simples
Une variable contient une valeur. Mais une valeur peut être un âge, un prix, une réponse oui ou non. L'ordinateur les range-t-il de la même façon ?
Le TYPE d'une variable dit quelle sorte de valeur elle contient, et donc ce qu'on peut faire avec. Les quatre types simples du programme sont l'entier naturel, l'entier relatif, le réel et le booléen.
Le type, c'est comme le rayon d'un magasin. On ne range pas le lait avec les tournevis. Chaque rayon a ses règles : le lait va au frais, les tournevis non.
Type
Ce qu'il contient
Exemples
En Python
Entier naturel
un nombre entier positif ou nul
0, 57 utilisateurs, 443 pour un port
int
Entier relatif
un nombre entier, positif ou négatif
-7 °C, un solde de -120 €
int
Réel
un nombre à virgule
73,4 % d'occupation du processeur, 12,67 de moyenne
float
Booléen
seulement deux valeurs : Vrai ou Faux
serveur en ligne ? a payé ?
bool : True, False
En Python, un réel s'écrit avec un point : 12.67, jamais 12,67. La division / donne toujours un réel, même quand elle tombe juste : 8 / 2 vaut 4.0. La fonction type donne le type d'une valeur.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
2.2 Les limites de la machine
En maths, les nombres n'ont pas de fin. On peut toujours ajouter 1. Est-ce vrai dans un ordinateur ?
Le DOMAINE DE VALEURS d'un type est l'ensemble des valeurs qu'il peut contenir. En maths, il est infini.
Dans une machine, il est limité, parce que chaque valeur est rangée sur un nombre fixe de bits. Un BIT est un chiffre binaire : 0 ou 1.
Pensez au compteur kilométrique d'une vieille voiture, à 6 chiffres. Après 999 999 km, il repasse à 000 000. Le compteur n'a pas de place pour un 7ᵉ chiffre.
Comment ça marche :
Avec n bits, on peut écrire valeurs différentes. On lit « 2 puissance n ».
Un entier naturel sur n bits va donc de 0 à . Sur 8 bits : de 0 à 255.
Un entier relatif sur n bits partage ces valeurs entre négatifs et positifs : il va de à . Sur 16 bits : de -32 768 à 32 767.
Si un calcul sort du domaine, c'est un DÉPASSEMENT DE CAPACITÉ. Le résultat devient faux.
Bits
Entier naturel
Entier relatif
Exemple
8
0 à 255
-128 à 127
un nombre d'une adresse IPv4
16
0 à 65 535
-32 768 à 32 767
un numéro de port
32
0 à 4 294 967 295
-2 147 483 648 à 2 147 483 647
un entier en langage C
Les entiers sont exacts tant qu'ils restent dans leur domaine : 42 est rangé exactement. Python agrandit seul la place d'un int : il ne déborde jamais. Mais d'autres langages, comme le C, débordent.
Les réels, eux, sont presque toujours approchés. La machine les écrit en binaire. Or beaucoup de nombres simples, comme 0,1, n'ont pas d'écriture binaire finie.
C'est comme 1/3 en décimal : 0,3333… ne s'arrête jamais.
La machine coupe quelque part. Il reste une petite erreur.
C'est le bug de Yanis : son poids de 72,3 est rangé à peu près. Pour afficher un réel, on l'arrondit. Pour comparer deux réels, on ne teste jamais l'égalité exacte.
Instant histoire — 1996 : la fusée détruite par un nombre trop grand
Le 4 juin 1996, la fusée Ariane 5 décolle de Kourou pour son premier vol.
Moins de 40 secondes plus tard, elle se détruit en vol.
Un programme copiait une valeur liée à la vitesse dans un entier relatif sur 16 bits. Ariane 5 allait plus vite qu'Ariane 4 : la valeur était trop grande.
L'ordinateur de bord a reçu des données fausses et a perdu le contrôle.
Qu'est-ce qui aurait évité la catastrophe ?
RéponseVérifier que la valeur tenait dans le domaine du type avant de la copier, ou choisir un type plus grand.
On le fait ensemble — un compteur sur 8 bits
1. Combien de valeurs différentes sur 8 bits ?Réponse valeurs.
2. Quelle est la plus grande valeur d'un entier naturel sur 8 bits ?Réponse255, car on commence à 0.
3. Un compteur sur 8 bits vaut 255. On ajoute 1. Que se passe-t-il ?RéponseDépassement de capacité : il repasse à 0, comme le compteur kilométrique.
4. Faut-il 8 ou 16 bits pour compter 1 000 visiteurs ?Réponse16 bits. 1 000 dépasse 255.
Exemple
Pourquoi
✔
round(prix, 2) pour afficher un prix
On cache la petite erreur des réels à l'affichage.
✘
Comparer 0.1 + 0.2 == 0.3 et attendre Vrai
La comparaison vaut Faux : 0,1 + 0,2 n'est pas exactement 0,3 dans la machine.
✘
Ranger 300 dans un entier naturel sur 8 bits
300 dépasse 255 : dépassement de capacité.
Checkpoint
1. Quelle est la plus grande valeur d'un entier naturel sur 10 bits ?Réponse.
2. Pourquoi 0.1 + 0.2 n'affiche-t-il pas 0.3 ?RéponseParce que 0,1 et 0,2 sont rangés en binaire de façon approchée. Les deux petites erreurs s'ajoutent.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
2.3 Les chaînes de caractères
Le nom du client, son adresse mail, son mot de passe ne sont pas des nombres. Comment l'ordinateur range-t-il du texte ?
Une CHAÎNE DE CARACTÈRES est une suite de caractères : lettres, chiffres, espaces, ponctuation. On l'écrit entre guillemets : "Yanis", "192.168.1.10". En Python, son type est str, pour string en anglais.
Une chaîne est un texte, d'un seul bloc. On ne la modifie pas case par case. On lit ses caractères et on lui applique des fonctions, qui en donnent une information ou en extraient un morceau. C'est comme une phrase écrite au stylo : on peut la lire, la recopier, en citer un mot, mais pas gommer une lettre.
Comment ça marche :
longueur(chaine) donne le nombre de caractères. En Python : len(chaine).
Chaque caractère a une position, appelée INDICE. Le premier caractère a l'indice 0.
chaine[i]extrait le caractère d'indice i : c'est un petit morceau de la chaîne, de longueur 1. Les sujets du BTS l'écrivent ainsi : code[i], chaine[k].
Le dernier caractère a donc l'indice longueur(chaine) - 1.
La chaîne "BTSSIO" : six caractères, de l'indice 0 à l'indice 5
Pseudo-code
mot ←"BTSSIO"Écrire longueur(mot)
Écrire mot[0]
Écrire mot[5]
Python
mot = "BTSSIO"print(len(mot))
print(mot[0])
print(mot[5])
Ce qui s'affiche
6
B
O
On lit un caractère, mais on ne le modifie pas. Écrire mot[0] ← "X" est impossible : Python s'arrête sur une erreur TypeError.
Pour changer un texte, on range une nouvelle chaîne dans la variable. Une chaîne n'est pas un tableau.
Python
mot = "BTSSIO"
mot[0] = "X"
Ce qui s'affiche
TypeError: 'str' object does not support item assignment
Attention : "123" et 123 ne sont pas la même chose. Le premier est une chaîne de trois caractères.
Le second est un nombre. On ne calcule pas sur une chaîne.
Dans la machine, chaque caractère est rangé sous forme d'un nombre. Le code ASCII, pour American Standard Code for Information Interchange, donne par exemple 65 pour A et 97 pour a. Vous n'avez pas à connaître ces codes : retenez seulement qu'une chaîne est rangée caractère par caractère.
On le fait ensemble — une adresse mail
1. On a mail ← "ines@lycee.fr". Combien de caractères ?Réponse13.
2. Quel est l'indice du premier caractère ?Réponse0.
3. Que vaut mail[4] ?Réponse@. On compte i=0, n=1, e=2, s=3, @=4.
4. Quel est l'indice du dernier caractère ?Réponse12, soit 13 - 1.
Exemple
Pourquoi
✔
mot[len(mot) - 1] pour le dernier caractère
La longueur moins 1, car on compte à partir de 0.
✘
mot[len(mot)]
Cet indice n'existe pas : Python s'arrête sur une erreur IndexError.
✘
mot[1] pour le premier caractère
Le premier caractère est à l'indice 0. mot[1] est le deuxième.
✘
mot[0] ← "X" pour changer la première lettre
On ne modifie pas un caractère d'une chaîne : c'est une erreur.
Checkpoint
1. Que vaut "Python"[2] ?Réponset. P=0, y=1, t=2.
2. Quelle est la longueur de "BTS SIO" ?Réponse7. L'espace est un caractère.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
2.4 Changer de type : le transtypage
Revenons au second bug de Yanis : « 25 » plus 1 donne « 251 ». D'où vient ce résultat ?
Le TRANSTYPAGE consiste à changer le type d'une valeur : d'un texte vers un nombre, d'un nombre vers un texte. On l'appelle aussi conversion.
C'est indispensable, car les données arrivent souvent en texte : ce qu'on tape au clavier, une ligne d'un fichier, un formulaire web. Pour calculer, il faut d'abord les changer en nombres.
Avec deux chaînes, le + les colle : c'est la concaténation, au chapitre 3. Avec deux nombres, il les additionne. Le même signe fait deux choses selon le type.
On le fait ensemble — un prix tapé au clavier
1. L'utilisateur tape 12.5. Quel est le type de ce que renvoie input ?RéponseUne chaîne : "12.5".
2. Comment la changer en nombre ?Réponsefloat("12.5"), qui donne le réel 12.5.
3. Que donne int("12.5") ?RéponseUne erreur. int n'accepte que l'écriture d'un entier.
4. Comment afficher « Total : 25.0 » en collant du texte et un nombre ?Réponse"Total : " + str(25.0). On change d'abord le nombre en texte.
Exemple
Pourquoi
✔
int(input("Quantité ? "))
On convertit tout de suite le texte lu en entier.
✘
float("3,5")
Python attend un point. Avec une virgule, c'est une erreur ValueError.
✘
"Total : " + 25
On ne colle pas un texte et un nombre. Il faut str(25).
Checkpoint
1. Que vaut int(7.8) ?Réponse7. La partie après la virgule est coupée.
2. Que vaut "3" + "4" en Python ?Réponse"34". Ce sont deux chaînes : elles sont collées.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
Ce qu'on retient du chapitre 2
Si vous ne devez retenir que trois choses
1. Choisissez le type selon la donnée : entier, réel, booléen ou chaîne. Un numéro qu'on ne calcule pas est une chaîne.
2. Les entiers sont exacts mais limités. Les réels sont approchés : arrondissez pour afficher, ne testez jamais leur égalité exacte.
3. Ce qu'on lit au clavier est du texte : convertissez-le avec int ou float avant de calculer.
Yanis a corrigé sa fiche. Il convertit l'âge en entier avant d'ajouter 1.
Il arrondit le poids à une décimale avant de l'afficher. Et le numéro de téléphone reste une chaîne.
Chapitre 3 — Les opérateurs
Léa est stagiaire chez un hébergeur de sites web. On lui confie trois petits outils à écrire. Le premier convertit une durée en secondes en heures, minutes et secondes.
Le deuxième dit si un mot de passe est accepté. Le troisième lit les droits d'accès d'un fichier, codés sur quelques bits.
À la fin de ce chapitre, vous saurez écrire les calculs, les conditions et les manipulations de texte dont Léa a besoin.
La question de départ
Une vidéo dure 200 minutes. Combien d'heures et de minutes ? Comment avez-vous fait le calcul ?
Réponse3 h 20 min. On cherche combien de fois 60 tient dans 200 : 3 fois. Il reste 200 - 180 = 20 minutes. C'est une division euclidienne.
3.1 Les opérateurs numériques
Pour calculer, un algorithme utilise des opérateurs : des signes qui combinent des valeurs. Lesquels a-t-on, et comment les écrit-on ?
Un OPÉRATEUR NUMÉRIQUE prend des nombres et donne un nombre. En plus des quatre opérations, l'informatique utilise beaucoup deux opérateurs : le quotient entier et le reste de la division euclidienne.
La division euclidienne, c'est le partage avec un reste. On partage 17 bonbons entre 5 enfants : chacun en a 3, et il en reste 2. Le quotient est 3, le reste est 2.
Opération
Pseudo-code
Python
Exemple
Résultat
Addition, soustraction
+, -
+, -
7 - 2
5
Multiplication
*
*
7 * 2
14
Division
/
/
7 / 2
3.5
Quotient entier
div
//
17 // 5
3
Reste
mod
%
17 % 5
2
Puissance
^
**
2 ** 10
1024
Signe
-x
-x
-(3 - 8)
5
Le reste sert partout. Un nombre n est pair si n mod 2 = 0. Il est divisible par 7 si n mod 7 = 0.
Voici l'outil de Léa, qui convertit une durée :
Pseudo-code
duree ← 7384
heures ← duree div 3600
reste ← duree mod 3600
minutes ← reste div 60
secondes ← reste mod 60
Écrire heures, "h", minutes, "min", secondes, "s"
Python
duree = 7384
heures = duree // 3600
reste = duree % 3600
minutes = reste // 60
secondes = reste % 60print(heures, "h", minutes, "min", secondes, "s")
Ce qui s'affiche
2 h 3 min 4 s
Écrire une formule en ligne. Une formule de maths s'écrit sur une ligne dans un programme. Les fractions et les puissances deviennent des opérateurs, et les parenthèses gardent l'ordre des calculs.
Comme en maths, * et / passent avant + et -. La puissance passe avant tout.
En maths
En ligne
(a + b) / 2
3 * x ** 2 - 5
1 / (1 + t)
On le fait ensemble — 100 000 secondes
1. Combien d'heures entières dans 100 000 secondes ?Réponse100000 div 3600 = 27.
2. Combien de secondes restent après ces heures ?Réponse100000 mod 3600 = 2 800.
3. Combien de minutes dans ce reste ?Réponse2800 div 60 = 46.
4. Et combien de secondes ?Réponse2800 mod 60 = 40. Résultat : 27 h 46 min 40 s.
Exemple
Pourquoi
✔
(a + b) / 2 pour une moyenne
Les parenthèses font l'addition avant la division.
✘
a + b / 2 pour une moyenne
La division passe d'abord : on calcule a + (b / 2).
✘
17 / 5 pour avoir 3
/ donne 3.4. Le quotient entier s'écrit div, ou // en Python.
Checkpoint
1. Que valent 23 div 4 et 23 mod 4 ?Réponse5 et 3, car 23 = 4 × 5 + 3.
2. Comment écrire en ligne ?Réponse(x - 1) / (x + 1)
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
3.2 Les fonctions mathématiques usuelles
Certains calculs reviennent tout le temps : arrondir un prix, prendre une racine, tirer un nombre au hasard. Faut-il les écrire à chaque fois ?
Une FONCTION USUELLE est un calcul tout prêt, fourni par le langage. On l'appelle par son nom, avec la valeur entre parenthèses : abs(-7) donne 7.
C'est comme la touche « racine » de la calculatrice. Vous ne refaites pas le calcul à la main : vous appuyez sur la touche.
Fonction
Pseudo-code
Python
Exemple
Résultat
Valeur absolue
abs(x)
abs(x)
abs(-7)
7
Arrondi au plus près
arrondi(x, 2)
round(x, 2)
round(3.678, 2)
3.68
Arrondi par défaut
partie_entière(x)
math.floor(x)
math.floor(3.7)
3
Arrondi par excès
plafond(x)
math.ceil(x)
math.ceil(3.2)
4
Racine carrée
racine(x)
math.sqrt(x)
math.sqrt(49)
7.0
Entier au hasard entre a et b
alea(a, b)
random.randint(a, b)
random.randint(1, 6)
1, 2, 3, 4, 5 ou 6
Réel au hasard entre a et b
alea_reel(a, b)
random.uniform(a, b)
random.uniform(0, 1)
par exemple 0.4172…
En Python, floor, ceil et sqrt sont dans le module math, et randint et uniform dans le module random. On écrit import math ou import random en haut du programme.
Python
import math
print(round(3.678, 2), math.floor(3.7), math.ceil(3.2), math.sqrt(49))
print(math.ceil(130 / 50))
Ce qui s'affiche
3.68 3 4 7.0
3
La dernière ligne répond à une vraie question : il faut 3 cartons de 50 pour ranger 130 câbles. On arrondit par excès, sinon des câbles restent dehors.
Le hasard d'un ordinateur est pseudo-aléatoire : il vient d'un calcul. Les nombres semblent tirés au hasard, mais une formule les produit. Pour un jeu ou une simulation, ça suffit.
Ce tirage est uniforme : chaque valeur de l'intervalle a la même chance de sortir. Avec randint(1, 6), le 6 sort aussi souvent que le 1, comme avec un vrai dé.
On le fait ensemble — le dé
1. Quelle instruction Python simule un dé à 6 faces ?Réponserandom.randint(1, 6)
2. Les bornes 1 et 6 peuvent-elles sortir ?RéponseOui. randint inclut les deux bornes.
3. Quelle ligne faut-il avant ?Réponseimport random
4. Comment tirer une note entière entre 0 et 20 ?Réponserandom.randint(0, 20)
Exemple
Pourquoi
✔
math.ceil(130 / 50) cartons
On arrondit par excès : un carton incomplet compte quand même.
✘
round(130 / 50) cartons
round(2.6) donne 3 ici, mais round(2.2) donnerait 2 et laisserait des câbles dehors.
✘
sqrt(49) sans import math
Python ne connaît pas sqrt seul : il faut math.sqrt et l'import.
Checkpoint
1. Que donne math.floor(-2.5) ?Réponse-3. L'arrondi par défaut va vers le plus petit entier.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
3.3 Comparer et combiner des conditions
Pour savoir si un mot de passe est accepté, l'outil de Léa doit tester plusieurs règles à la fois. Comment écrit-on une condition, puis plusieurs ?
Un OPÉRATEUR DE COMPARAISON compare deux valeurs et donne un booléen : Vrai ou Faux. Un OPÉRATEUR BOOLÉEN combine des booléens : NON, ET, OU, OUX.
Comparer, c'est poser une question fermée à l'ordinateur. « Le mot de passe fait-il au moins 8 caractères ? »
La réponse est oui ou non. Pour plusieurs questions, on les relie avec ET ou OU, comme en français.
Comparaison
Pseudo-code
Python
égal
=
==
différent
≠, ou <> dans certains textes
!=
plus petit, plus petit ou égal
<, ≤
<, <=
plus grand, plus grand ou égal
>, ≥
>, >=
On compare des nombres, mais aussi des chaînes : "Alice" < "Bob" est Vrai. Les chaînes se comparent caractère par caractère, comme dans un dictionnaire.
Attention : les caractères se comparent par leur code. Les chiffres viennent avant les majuscules, et les majuscules avant les minuscules : "a" < "B" est Faux.
a
b
NON a
a ET b
a OU b
a OUX b
Vrai
Vrai
Faux
Vrai
Vrai
Faux
Vrai
Faux
Faux
Faux
Vrai
Vrai
Faux
Vrai
Vrai
Faux
Vrai
Vrai
Faux
Faux
Vrai
Faux
Faux
Faux
En une phrase chacun :
NON a inverse : Vrai devient Faux.
a ET b est Vrai seulement si les deux sont Vrai.
a OU b est Vrai si au moins un des deux est Vrai.
a OUX b, le « ou exclusif », est Vrai si exactement un des deux est Vrai. En Python, on l'écrit a != b entre deux booléens.
Pseudo-code
NON
ET
OU
OUX
Python
not
and
or
!= entre booléens
Python lit un ET de gauche à droite et s'arrête dès qu'un test est faux : la suite n'est pas lue. Avec OU, il s'arrête dès qu'un test est vrai. On s'en sert pour protéger un test : k < len(mot) and mot[k] == "S" ne lit jamais une case qui n'existe pas.
Traduire une condition. Une règle en français devient une expression booléenne. On repère chaque petite condition, puis les mots « et », « ou », « ne… pas ».
Quand ET et OU se mélangent, ET passe avant OU, comme la multiplication avant l'addition. Pour ne pas se tromper, mettez des parenthèses autour de chaque morceau : (a ET b) OU c.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
3.4 Les opérateurs bit à bit
Les droits d'accès d'un fichier tiennent sur trois bits : lire, écrire, exécuter. Comment lire ou changer un seul de ces bits ?
Un OPÉRATEUR BIT À BIT applique ET, OU, OUX ou NON à chaque bit d'un nombre, rang par rang. On l'utilise avec un MASQUE : un nombre choisi exprès, dont les 1 désignent les bits qu'on veut toucher.
Un masque, c'est comme le pochoir d'un peintre. Les trous laissent passer la peinture sur certaines zones seulement. Le reste ne bouge pas.
Les bits se numérotent de droite à gauche, en commençant à 0. Dans 0b101, le bit 0 vaut 1, le bit 1 vaut 0, le bit 2 vaut 1. En Python, 0b signale un nombre écrit en binaire.
Ce qu'on veut
Opérateur
Python
Le masque contient
Tester un bit
ET bit à bit
x & masque
un 1 au rang testé
Mettre à 1 un bit
OU bit à bit
x | masque
un 1 au rang à allumer
Mettre à 0 un bit
ET avec l'inverse
x & ~masque
un 1 au rang à éteindre
Changer l'état d'un bit
OUX bit à bit
x ^ masque
un 1 au rang à inverser
Masque : on teste le bit 2 de 1101 avec le masque 0100 ; seul le bit 2 passe
Les droits d'un fichier : le bit 2 pour lire, le bit 1 pour écrire, le bit 0 pour exécuter. 0b101 veut dire : lire oui, écrire non, exécuter oui.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
3.5 Les opérateurs de chaînes
Un journal de serveur contient des lignes comme ERREUR 2026-10-18 disque plein. Comment en tirer la date, ou savoir si le mot « ERREUR » y est ?
Les OPÉRATEURS DE CHAÎNES permettent de coller des chaînes, d'en extraire un morceau et d'y chercher un motif. Coller deux chaînes s'appelle la CONCATÉNATION. Un MOTIF est un petit texte qu'on cherche dans un plus grand.
On manipule du texte partout en informatique : des adresses mail, des adresses de sites web, des journaux d'erreurs, les messages affichés à l'utilisateur.
Ce qu'on veut
Pseudo-code
Python
Exemple
Résultat
Coller
a + b
a + b
"BTS" + " SIO"
"BTS SIO"
Le début, k caractères
sous_chaine(s, 0, k)
s[:k]
"ERREUR 42"[:6]
"ERREUR"
Le milieu, de i à j exclu
sous_chaine(s, i, j)
s[i:j]
"BTS SIO"[4:7]
"SIO"
La fin, k caractères
sous_chaine(s, n - k, n)
s[-k:]
"rapport.pdf"[-3:]
"pdf"
Chercher un motif
position(s, motif)
s.find(motif)
"a@b.fr".find("@")
1, ou -1 si absent
Dans ce tableau, n est la longueur de la chaîne. En Python, un indice négatif compte depuis la fin : s[-1] est le dernier caractère, et s[-3:] les trois derniers. s[i:] va de l'indice i jusqu'à la fin.
En Python, certaines fonctions s'écrivent après la variable, avec un point : s.find(motif) cherche dans s. On les appelle des méthodes. C'est seulement une autre façon d'écrire position(s, motif).
Dans s[i:j], le caractère d'indice i est pris, celui d'indice j est exclu. On prend donc j - i caractères.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
Ce qu'on retient du chapitre 3
Si vous ne devez retenir que trois choses
1. div et mod donnent le quotient et le reste : n mod 2 = 0 teste si n est pair.
2. Une condition composée s'écrit avec ET, OU, NON, et chaque comparaison s'écrit en entier.
3. Pour un bit, on utilise un masque : ET pour tester, OU pour mettre à 1, OUX pour inverser.
Les trois outils de Léa sont prêts. Le convertisseur de durée utilise div et mod.
Le contrôle du mot de passe combine ses règles avec ET. Et les droits du fichier se lisent avec un masque.
Chapitre 4 — Les structures de contrôle
Hugo gère le parc informatique d'une médiathèque. Il veut un programme qui vérifie chaque poste : s'il est trop vieux, il faut le remplacer. Il veut aussi compter les postes à remplacer, et redemander une valeur tant qu'elle n'est pas correcte.
Jusqu'ici, nos programmes lisent les lignes une fois, de haut en bas. Ça ne suffit plus.
À la fin de ce chapitre, vous saurez faire des choix et des répétitions dans un algorithme. C'est le cœur du programme, et le cœur de l'examen.
RéponseNon. On dit à l'ordinateur de répéter la même ligne 1 000 fois. C'est une boucle.
4.1 Faire un choix : Si… Alors… Sinon
Hugo veut un message différent selon l'âge du poste. Comment faire exécuter une instruction seulement dans certains cas ?
Une STRUCTURE CONDITIONNELLE exécute un bloc d'instructions seulement si une condition est vraie. On l'appelle aussi une ALTERNATIVE. Elle s'écrit Si … Alors … Sinon … Fin de Si.
C'est un carrefour. Selon le panneau, on prend à gauche ou à droite. On ne prend jamais les deux routes.
Comment ça marche :
L'ordinateur évalue la condition : Vrai ou Faux.
Si elle est Vrai, il exécute le bloc après Alors.
Sinon, il exécute le bloc après Sinon, s'il y en a un.
Puis il continue aprèsFin de Si.
Pour plus de deux cas, on enchaîne avec Sinon si. Les conditions sont testées dans l'ordre. Le premier cas vrai gagne, les suivants sont ignorés.
Pseudo-code
age ← 7
Si age ≥ 6 AlorsÉcrire"À remplacer"Sinon si age ≥ 4 AlorsÉcrire"À surveiller"SinonÉcrire"En bon état"Fin de Si
Python
age = 7if age >= 6:
print("À remplacer")
elif age >= 4:
print("À surveiller")
else:
print("En bon état")
Ce qui s'affiche
À remplacer
En Python, le bloc est marqué par l'indentation : les lignes décalées de 4 espaces après les deux-points :. Il n'y a pas de Fin de Si. C'est le retour à gauche qui ferme le bloc.
On le fait ensemble — avec un poste de 5 ans
1. On remplace age ← 7 par age ← 5. La condition age ≥ 6 est-elle vraie ?RéponseNon. 5 n'est pas supérieur ou égal à 6.
2. Que teste-t-on ensuite ?Réponseage ≥ 4. C'est Vrai.
3. Qu'affiche le programme ?RéponseÀ surveiller
4. Le bloc Sinon est-il exécuté ?RéponseNon. Un seul bloc est exécuté : le premier dont la condition est vraie.
Exemple
Pourquoi
✔
Tester age ≥ 6 avant age ≥ 4
Le cas le plus fort d'abord. Un poste de 7 ans affiche « À remplacer ».
✘
Tester age ≥ 4 avant age ≥ 6
Un poste de 7 ans s'arrête au premier test : « À surveiller ». Le cas « À remplacer » n'arrive jamais.
✘
Oublier les deux-points ou l'indentation en Python
Python s'arrête sur une erreur de syntaxe.
Choisir un jeu d'essai
Pour tester un algorithme qui contient des Si, on ne tape pas une valeur au hasard. On prépare un JEU D'ESSAI : une liste de valeurs à tester, chacune avec son résultat attendu.
Une valeur par branche : ici 7, 5 et 2 ans.
Les valeurs limites, là où le test change de résultat : 6 et 4.
Un cas d'erreur, s'il existe : un âge négatif, par exemple.
Âge testé
Résultat attendu
Résultat obtenu
7
À remplacer
6
À remplacer
5
À surveiller
4
À surveiller
2
En bon état
-1
valeur refusée
On remplit la dernière colonne en exécutant le programme. Ici, -1 donne « En bon état » : le test révèle qu'il manque un contrôle de l'âge. À l'examen, un sujet peut vous demander le résultat pour une valeur précise : votre jeu d'essai vous y prépare.
Checkpoint
1. On a x ← -3. Qu'affiche Si x > 0 Alors Écrire "positif" Sinon Écrire "négatif ou nul" Fin de Si ?Réponsenégatif ou nul
2. Combien de blocs sont exécutés dans un Si … Sinon si … Sinon ?RéponseUn seul.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
4.2 Répéter un nombre connu de fois : la boucle Pour
Hugo a 30 postes à vérifier. Il sait combien il y en a. Comment répéter le même traitement pour chacun, sans écrire 30 fois le code ?
Une BOUCLE répète un bloc d'instructions. Chaque passage dans la boucle s'appelle une ITÉRATION, ou un tour.
La boucle POUR sert quand on connaît le nombre de tours à l'avance. Elle utilise un COMPTEUR, une variable qui prend une nouvelle valeur à chaque tour.
C'est l'entraîneur qui dit : « 10 pompes. » Vous comptez 1, 2, 3… jusqu'à 10, puis vous vous arrêtez.
La boucle Pour : i prend les valeurs 1, 2, 3, et le bloc s'exécute à chaque tour
Comment ça marche :
Le compteur prend la première valeur.
On exécute le bloc.
Le compteur passe à la valeur suivante. On recommence le bloc.
Après la dernière valeur, on sort de la boucle.
Pseudo-code
somme ← 0
Pour i allant de 1 à 4 Faire
somme ← somme + i
Fin de PourÉcrire somme
Python
somme = 0for i inrange(1, 5):
somme = somme + i
print(somme)
Ce qui s'affiche
10
En Python, range(1, 5) donne 1, 2, 3, 4 : la borne de droite est exclue. Pour aller de 1 à n, on écrit range(1, n + 1). range(n) seul va de 0 à n - 1 : c'est pratique pour les indices d'une chaîne.
Si la fin est plus petite que le début, la boucle Pour fait 0 tour : Pour i allant de 5 à 3 Faire ne fait rien. En Python, range(5, 4) est vide.
Étape
i
somme
départ
–
0
tour 1
1
1
tour 2
2
3
tour 3
3
6
tour 4
4
10
On le fait ensemble — compter les « 1 » d'un code
1. On a code ← "1011001". Combien de tours de boucle pour lire tous les caractères ?Réponse7, un par caractère.
2. De quel indice à quel indice va i ?RéponseDe 0 à 6.
3. Que fait-on à chaque tour ?RéponseSi code[i] = "1" Alors compt ← compt + 1 Fin de Si
4. Quelle valeur faut-il donner à compt avant la boucle ?Réponse0. On n'a encore rien compté.
5. Que vaut compt à la fin ?Réponse4.
Exemple
Pourquoi
✔
for i in range(len(code)):
i prend tous les indices de 0 à len(code) - 1.
✘
for i in range(1, 10): pour aller de 1 à 10
La borne 10 est exclue : on s'arrête à 9. Il faut range(1, 11).
✘
compt ← 0 écrit dans la boucle
Le compteur repart à 0 à chaque tour : à la fin, il vaut 0 ou 1.
Checkpoint
1. Combien de fois s'exécute le bloc de Pour i allant de 3 à 7 Faire ?Réponse5 fois : 3, 4, 5, 6, 7.
2. Quelles valeurs donne range(4) ?Réponse0, 1, 2, 3.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
4.3 Répéter tant que : les boucles Tant que et Répéter
Hugo veut que l'utilisateur tape un âge entre 0 et 15. Tant que la valeur est fausse, on redemande. Combien de fois ?
On ne sait pas à l'avance. La boucle Pour ne convient pas.
La boucle TANT QUE répète un bloc tant qu'une condition est vraie. Elle teste la condition avant chaque tour.
La boucle RÉPÉTER … JUSQU'À exécute le bloc, puis teste : elle fait donc toujours au moins un tour, et elle s'arrête quand la condition devient vraie.
C'est comme remplir un verre au robinet. Tant que le verre n'est pas plein, on continue de verser. On ne sait pas d'avance combien de secondes il faudra.
Comment ça marche, pour Tant que :
On teste la condition.
Si elle est Vrai, on exécute le bloc, puis on revient à l'étape 1.
Si elle est Faux, on sort de la boucle.
Le bloc doit changer quelque chose dans la condition. Sinon, elle reste vraie pour toujours : c'est une BOUCLE INFINIE.
Voici le calcul d'un reste par soustractions. C'est l'idée du sujet du BTS 2025 :
Pseudo-code
n ← 80
Tant que n ≥ 26 Faire
n ← n - 26
Fin de Tant queÉcrire n
Python
n = 80while n >= 26:
n = n - 26print(n)
Ce qui s'affiche
2
Étape
n
n ≥ 26 ?
départ
80
Vrai
tour 1
54
Vrai
tour 2
28
Vrai
tour 3
2
Faux : on sort
Lire une fonction dans un sujet
Les sujets du BTS écrivent presque toujours l'algorithme dans une fonction, comme ceci :
Pseudo-code
Fonction reste_division_par_26(N)
Tant que N ≥ 26 Faire
N ← N - 26
Fin de Tant queRenvoyer N
Fin de Fonction
Lisez-la ainsi : la fonction reçoit une valeur, rangée dans N. Elle fait son calcul. Renvoyer N donne le résultat.
reste_division_par_26(80) veut donc dire : « lance le calcul avec N = 80 ». Le résultat est 2.
La capsule 5.3 explique les fonctions en détail. Pour les exercices de ce chapitre, cette lecture suffit.
Python n'a pas de boucle Répéter. On l'imite avec while True, une boucle sans fin, et break, qui force la sortie :
Pseudo-code
RépéterÉcrire"Âge du poste (0 à 15) ?"Lire age
Jusqu'à age ≥ 0 ET age ≤ 15
Écrire"Âge enregistré :", age
Python
whileTrue:
age = int(input("Âge du poste (0 à 15) ? "))
if age >= 0and age <= 15:
breakprint("Âge enregistré :", age)
Ce qui s'affiche
Âge du poste (0 à 15) ? 40
Âge du poste (0 à 15) ? 12
Âge enregistré : 12
Je connais le nombre de tours
Je ne le connais pas, je peux faire 0 tour
Je ne le connais pas, je fais au moins 1 tour
Pour
Tant que
Répéter … Jusqu'à
Les boucles Pour et Répéter, écrites avec Tant que
Chaque boucle est elle-même un petit algorithme. Un simple Tant que suffit pour écrire les deux autres.
La boucle Pour i allant de 1 à 4 Faire … Fin de Pour fait exactement ceci :
Pseudo-code
i ← 1
Tant que i ≤ 4 Faire // le bloc de la boucle
i ← i + 1
Fin de Tant que
La boucle Répéter … Jusqu'à condition exécute le bloc une fois, puis le refait tant que la condition est fausse :
Pseudo-code
// le bloc de la boucle, une première foisTant queNON condition Faire // le bloc de la boucleFin de Tant que
Dans la version Tant que du Pour, on voit tout le travail du compteur. Il part de 1. Il est testé avant chaque tour, et il avance de 1 à la fin du tour.
On le fait ensemble — chercher une lettre
1. On cherche le premier "S" dans "BTSSIO". On part de k ← 0. Quelle est la condition pour continuer ?Réponsemot[k] ≠ "S" : on n'a pas encore trouvé.
2. Que met-on dans le bloc ?Réponsek ← k + 1, pour passer au caractère suivant.
3. Que vaut k à la sortie ?Réponse2.
4. Que se passe-t-il si on cherche "A", absent du mot ?Réponsek dépasse 5 et mot[k] n'existe plus : erreur. Il faut aussi tester k < longueur(mot).
Exemple
Pourquoi
✔
Tant que k < longueur(mot) ET mot[k] ≠ lettre Faire
On s'arrête si on trouve la lettre, ou si on arrive au bout.
✘
Tant que n ≥ 26 Faire avec un bloc qui ne change pas n
La condition reste vraie pour toujours : boucle infinie.
✘
Jusqu'à age < 0 pour « jusqu'à ce que l'âge soit correct »
Répéter s'arrête quand la condition est vraie. Il faut écrire la condition d'un âge correct.
Checkpoint
1. Qu'affiche n ← 100, Tant que n > 10 Faire n ← n div 2 Fin de Tant que, Écrire n ?Réponse6. On passe par 50, 25, 12, puis 6.
2. Quelle boucle fait toujours au moins un tour ?RéponseRépéter … Jusqu'à.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
4.4 Construire une boucle de calcul
Hugo veut la valeur totale de son parc, ou le nombre de postes à remplacer. Ce sont des calculs qui s'accumulent tour après tour. Comment construire ce genre de boucle sans se tromper ?
Une boucle de calcul se construit toujours en trois temps : la PRÉPARATION, l'ITÉRATION et la MISE EN FORME FINALE. On l'appelle un calcul itératif. Pendant l'itération, une variable accumule le résultat : c'est un ACCUMULATEUR.
C'est comme une tirelire. On la vide au départ.
À chaque pièce, on ajoute sa valeur. À la fin, on compte et on annonce le total.
Comment ça marche :
Préparation : on donne à l'accumulateur sa valeur de départ. Pour une somme, c'est 0. Pour un produit, c'est 1. Ce sont les nombres qui ne changent rien : 0 pour l'addition, 1 pour la multiplication. On les appelle des éléments neutres.
Itération : à chaque tour, on met à jour l'accumulateur avec la valeur du tour.
Mise en forme finale : après la boucle, on calcule et on présente le résultat : division pour une moyenne, arrondi, message.
En maths, une somme qui dépend de n s'écrit avec le symbole Σ, la lettre grecque sigma :
On lit « somme des i au carré, pour i allant de 1 à n ». Le Π, la lettre grecque pi majuscule, fait la même chose avec un produit : .
Chaque Σ devient une boucle Pour, avec un accumulateur qui part de 0. Chaque Π devient une boucle Pour, avec un accumulateur qui part de 1.
Pseudo-code
n ← 4
s ← 0
p ← 1
Pour i allant de 1 à n Faire
s ← s + i ^ 2
p ← p * i
Fin de PourÉcrire"Somme :", s, "Produit :", p
Python
n = 4
s = 0
p = 1for i inrange(1, n + 1):
s = s + i ** 2
p = p * i
print("Somme :", s, "Produit :", p)
Ce qui s'affiche
Somme : 30 Produit : 24
En Python, il existe sum(...). On ne s'en sert pas ici : à l'examen, c'est la boucle qu'on vous demande d'écrire.
Construire la boucle avec une propriété
Pour écrire une boucle de calcul sans erreur, on cherche ce qui reste vrai à la fin de chaque tour. Pour la somme des entiers : « après le tour i, s contient 1 + 2 + … + i ».
C'est vrai au départ : avant le premier tour, s vaut 0, la somme de zéro nombre.
Si c'est vrai après le tour i - 1, l'instruction s ← s + i le rend vrai après le tour i.
C'est donc vrai après le dernier tour : s contient la somme cherchée.
C'est le RAISONNEMENT PAR RÉCURRENCE. On ne vous demande pas de le rédiger : il sert à construire la boucle.
Un calcul qui part de la valeur précédente définit une SUITE : . Par exemple, une taille qui double chaque jour : . La boucle calcule les termes un par un, avec t ← 2 * t.
On le fait ensemble — la moyenne de 5 notes
1. On lit 5 notes au clavier. Quelle boucle ?RéponsePour, de 1 à 5 : on connaît le nombre de tours.
2. Quelle préparation ?Réponsetotal ← 0
3. Que fait-on à chaque tour ?RéponseLire note, puis total ← total + note
4. Quelle mise en forme finale ?Réponsemoyenne ← total / 5, puis Écrire arrondi(moyenne, 2). Elle se fait après la boucle, une seule fois.
Exemple
Pourquoi
✔
p ← 1 avant un produit
1 ne change pas le produit. Avec 0, le résultat serait toujours 0.
✘
moyenne ← total / 5 écrit dans la boucle
On divise à chaque tour un total pas encore complet. La division se fait après.
✘
s ← 0 oublié
La variable n'existe pas au premier tour : erreur, ou valeur au hasard dans d'autres langages.
Checkpoint
1. Quelle valeur de départ pour calculer ?Réponse1. Le résultat est 120.
2. Traduisez en boucle Python.Réponses = 0, puis for k in range(1, 11): et s = s + 2 * k. Le résultat est 110.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
4.5 Les structures imbriquées
Hugo a plusieurs salles, et plusieurs postes par salle. Il veut un message seulement pour les postes trop vieux. Comment mettre une boucle dans une boucle, ou une condition dans une boucle ?
Des STRUCTURES IMBRIQUÉES sont des structures placées l'une dans l'autre : une condition dans une boucle, une boucle dans une boucle. La structure intérieure s'exécute entièrement à chaque tour de la structure extérieure.
C'est l'horloge. L'aiguille des minutes fait un tour complet pendant que celle des heures avance d'un cran.
Comment ça marche, pour deux boucles :
La boucle extérieure prend sa première valeur.
La boucle intérieure fait tous ses tours.
La boucle extérieure passe à la valeur suivante, et la boucle intérieure recommence depuis le début.
Le bloc intérieur s'exécute donc (tours extérieurs) × (tours intérieurs) fois.
Pseudo-code
Pour i allant de 1 à 3 Faire
ligne ←""Pour j allant de 1 à i Faire
ligne ← ligne + "*"Fin de PourÉcrire ligne
Fin de Pour
Python
for i inrange(1, 4):
ligne = ""for j inrange(1, i + 1):
ligne = ligne + "*"print(ligne)
Ce qui s'affiche
*
**
***
Ici, la boucle intérieure dépend de la boucle extérieure : elle va jusqu'à i. Le programme officiel limite ces boucles qui dépendent l'une de l'autre à deux niveaux.
Le produit de deux matrices. C'est l'exemple type de boucles imbriquées. Une MATRICE est un tableau de nombres, en lignes et en colonnes. La formule du produit est donnée à l'examen :
On lit : pour la case en ligne i, colonne j de C, on multiplie la ligne i de A par la colonne j de B. On multiplie terme à terme, puis on additionne.
Il faut trois boucles imbriquées : i pour les lignes, j pour les colonnes, k pour la somme.
En Python, on range une matrice comme une liste de lignes. A[i][k] est le nombre de la ligne i, colonne k. On compte à partir de 0.
La capsule 5.2 détaille ces tableaux à deux dimensions.
Python
A = [[1, 2], [3, 4]]
B = [[5, 6], [7, 8]]
C = [[0, 0], [0, 0]]
for i inrange(2):
for j inrange(2):
s = 0for k inrange(2):
s = s + A[i][k] * B[k][j]
C[i][j] = s
print(C)
Ce qui s'affiche
[[19, 22], [43, 50]]
On le fait ensemble — combien de tours ?
1. Pour i allant de 1 à 4 contient Pour j allant de 1 à 3. Combien de fois s'exécute le bloc intérieur ?Réponse4 × 3 = 12 fois.
2. Que vaut j au tout premier passage ?Réponse1.
3. Quand i passe de 1 à 2, que vaut j ?Réponsej repart à 1. La boucle intérieure recommence.
4. Où remettre s ← 0 dans le produit de matrices ?RéponseJuste avant la boucle sur k, pour chaque case (i, j).
Exemple
Pourquoi
✔
s ← 0 entre la boucle j et la boucle k
Chaque case du résultat a sa propre somme.
✘
s ← 0 une seule fois, avant toutes les boucles
Les sommes de toutes les cases s'ajoutent : seule la première case est juste.
✘
Mal indenter la boucle intérieure
En Python, l'indentation dit ce qui est dedans. Une ligne mal décalée sort de la boucle.
Combien de tours ?
Deux algorithmes peuvent donner le même résultat avec un travail très différent. Pour les comparer, on compte les tests faits par la boucle.
Pour savoir si n est premier, la version A compte tous les diviseurs de 1 à n. La version B cherche un diviseur entre 2 et n - 1, et s'arrête au premier trouvé :
Pseudo-code
i ← 2
Tant que i < n ET n mod i ≠ 0 Faire
i ← i + 1
Fin de Tant que
premier ← (i = n)
n
Version A : tests de reste
Version B : tests de reste
91
91
6
97
97
95
Pour 91, qui vaut 7 × 13, la version B s'arrête dès 7. Pour 97, qui est premier, elle fait presque autant de tests que A.
À l'examen, on peut vous demander combien de fois une boucle tourne : comptez les tours sur un petit exemple.
Checkpoint
1. Combien de lignes affiche le programme des étoiles si on remplace 3 par 5 ?Réponse5 lignes, de 1 à 5 étoiles.
2. Dans une boucle Pour de 1 à 10, on écrit Si i mod 2 = 0 Alors compt ← compt + 1. Que vaut compt à la fin, s'il partait de 0 ?Réponse5. On compte les nombres pairs : 2, 4, 6, 8, 10.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
Ce qu'on retient du chapitre 4
Si vous ne devez retenir que trois choses
1. Si pour choisir, Pour quand on connaît le nombre de tours, Tant que quand on ne le connaît pas.
2. Une boucle de calcul : préparation avant, mise à jour dedans, mise en forme après. Une somme part de 0, un produit de 1.
3. Dans une boucle Tant que, le bloc doit faire avancer la condition, sinon la boucle ne s'arrête jamais.
Le programme d'Hugo parcourt maintenant chaque salle, chaque poste. Il affiche les postes à remplacer, les compte, et redemande une valeur tant qu'elle est fausse.
Chapitre 5 — Les tableaux et les fonctions
Sarah est développeuse dans une petite entreprise. Elle doit traiter les notes de tous les stagiaires : la moyenne de chacun, la moyenne de chaque module, la meilleure note.
Elle a déjà écrit trois fois le même calcul de moyenne, à trois endroits du programme. Et ses 24 stagiaires ont chacun 4 notes : 96 variables, c'est impossible à gérer.
À la fin de ce chapitre, vous saurez ranger beaucoup de valeurs dans un tableau, et écrire un calcul une seule fois dans une fonction.
La question de départ
Dans un tableur, comment retrouvez-vous la note du 3ᵉ stagiaire au 2ᵉ module ?
RéponsePar sa ligne et sa colonne : ligne du stagiaire 3, colonne du module 2. Un tableau en programmation marche pareil.
5.1 Les tableaux à une dimension
Sarah a 4 notes pour un stagiaire. Plutôt que 4 variables, peut-on les ranger ensemble, sous un seul nom ?
Un TABLEAU range plusieurs valeurs sous un seul nom. Chaque valeur est un ÉLÉMENT, repéré par son indice, à partir de 0.
Un tableau à une dimension est une simple liste de valeurs. En Python, on l'appelle une liste et on l'écrit entre crochets : [12, 15, 9, 18].
Un tableau, c'est comme une rangée de casiers numérotés à la piscine. Un seul nom pour la rangée, un numéro par casier.
Comment ça marche :
Construire : notes ← [12, 15, 9, 18]. On peut aussi partir d'un tableau vide, T ← [], puis le remplir avec ajouter.
Lire un élément : notes[2] vaut 9.
Écrire un élément : notes[2] ← 11 remplace 9 par 11.
Parcourir : une boucle sur les indices, de 0 à longueur(notes) - 1. Si l'indice ne sert pas, on parcourt directement les valeurs : Pour chaque x dans notes Faire. En Python : for x in notes:.
Ajouter à la fin : ajouter(notes, 14). En Python : notes.append(14).
Le plus souvent, un tableau est homogène : tous ses éléments ont le même type. La capsule 5.2 montre un cas où les colonnes ont des types différents.
Pseudo-code
notes ← [12, 15, 9, 18]
notes[2] ← 11
meilleure ← notes[0]
Pour i allant de 1 à longueur(notes) - 1 FaireSi notes[i] > meilleure Alors
meilleure ← notes[i]
Fin de SiFin de PourÉcrire notes, meilleure
Python
notes = [12, 15, 9, 18]
notes[2] = 11
meilleure = notes[0]
for i inrange(1, len(notes)):
if notes[i] > meilleure:
meilleure = notes[i]
print(notes, meilleure)
Ce qui s'affiche
[12, 15, 11, 18] 18
C'est la méthode du maximum : on suppose que le premier est le meilleur, puis on compare avec chacun des suivants.
Copier un tableau. C'est le piège classique de Python. b = a ne copie pas le tableau : b devient un deuxième nom pour le même tableau. Pour une vraie copie, on écrit b = a.copy().
Python
a = [1, 2, 3]
b = a
c = a.copy()
b[0] = 99print(a, c)
Ce qui s'affiche
[99, 2, 3] [1, 2, 3]
Modifier b a modifié a. La copie c, elle, n'a pas bougé. C'est comme un raccourci sur le bureau : il ouvre le même fichier, pas une copie.
En pseudo-code, on copie un tableau élément par élément. On part d'un tableau vide, et on y ajoute chaque valeur :
Pseudo-code
copie ← []
Pour chaque x dans a Faire
ajouter(copie, x)
Fin de Pour
copie[0] ← 99
Écrire a, copie
Python
a = [1, 2, 3]
copie = []
for x in a:
copie.append(x)
copie[0] = 99print(a, copie)
Ce qui s'affiche
[1, 2, 3] [99, 2, 3]
On le fait ensemble — la note la plus basse
1. On a notes ← [14, 8, 17, 11]. Quelle valeur de départ pour pire ?Réponsenotes[0], soit 14.
2. De quel indice part la boucle ?RéponseDe 1. L'élément 0 est déjà dans pire.
3. Quelle condition dans la boucle ?RéponseSi notes[i] < pire Alors pire ← notes[i]
4. Que vaut pire à la fin ?Réponse8.
Exemple
Pourquoi
✔
meilleure ← notes[0] au départ
On part d'une vraie note du tableau.
✘
meilleure ← 0 au départ, pour des températures
Si toutes les valeurs sont négatives, le maximum trouvé est 0, qui n'est pas dans le tableau.
✘
for i in range(len(notes) + 1):
Le dernier indice vaut len(notes), qui n'existe pas : erreur IndexError.
Checkpoint
1. On a T ← [5, 3, 8]. Que vaut T[longueur(T) - 1] ?Réponse8, le dernier élément.
2. Après a = [1, 2], b = a, b.append(3), que vaut a ?Réponse[1, 2, 3]. a et b sont le même tableau.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
5.2 Les tableaux à deux dimensions
Sarah a 24 stagiaires et 4 modules. Un tableau par stagiaire, c'est encore 24 noms. Comment ranger toute la grille sous un seul nom ?
Un TABLEAU À DEUX DIMENSIONS range des valeurs en lignes et en colonnes, comme un tableur. On repère un élément par deux indices : la ligne, puis la colonne.
M[i][j] est l'élément de la ligne i, colonne j. En Python, c'est une liste de listes : chaque ligne est une liste.
C'est la grille d'une bataille navale. « B3 » désigne une case : une ligne, une colonne.
Le tableau notes à 3 lignes et 4 colonnes : notes[1][2] est à la ligne 1, colonne 2
Comment ça marche, pour traiter une ligne ou une colonne :
Une lignei : on fixe i, et on fait varier j de 0 au nombre de colonnes moins 1.
Une colonnej : on fixe j, et on fait varier i de 0 au nombre de lignes moins 1.
Tout le tableau : deux boucles imbriquées, i dehors, j dedans.
Pseudo-code
// moyenne de la colonne 2 (le module 3)
s ← 0
Pour i allant de 0 à 2 Faire
s ← s + notes[i][2]
Fin de PourÉcrire s / 3
Python
notes = [[12, 15, 9, 18],
[8, 11, 14, 10],
[16, 13, 17, 15]]
s = 0for i inrange(3):
s = s + notes[i][2]
print(s / 3)
Ce qui s'affiche
13.333333333333334
Pour construire un tableau à deux dimensions, on utilise aussi deux boucles. Pour une grille de 3 lignes et 4 colonnes remplie de 0, on fabrique chaque ligne, puis on l'ajoute à la grille :
Pseudo-code
grille ← []
Pour i allant de 0 à 2 Faire
ligne ← []
Pour j allant de 0 à 3 Faire
ajouter(ligne, 0)
Fin de Pour
ajouter(grille, ligne)
Fin de Pour
grille[1][2] ← 7
Écrire grille
Python
grille = []
for i inrange(3):
ligne = []
for j inrange(4):
ligne.append(0)
grille.append(ligne)
grille[1][2] = 7print(grille)
Ce qui s'affiche
[[0, 0, 0, 0], [0, 0, 7, 0], [0, 0, 0, 0]]
La ligne repart vide à chaque tour de i : chaque ligne est un tableau à elle.
Dans un tableau à deux dimensions, les lignes ou les colonnes peuvent avoir des types différents. Ici, ce sont les colonnes : chaque ligne décrit un stagiaire, avec son nom, son âge, s'il est présent.
Python
stagiaires = [["Sarah", 22, True],
["Tom", 19, False]]
for ligne in stagiaires:
print(ligne[0], "a", ligne[1], "ans")
Ce qui s'affiche
Sarah a 22 ans
Tom a 19 ans
for ligne in stagiaires parcourt directement les lignes, sans indice. C'est pratique quand on n'a pas besoin du numéro.
On peut aussi ranger ces données dans l'autre sens : une ligne de noms, une ligne d'âges. Ce sont alors les lignes qui ont des types différents.
On le fait ensemble — la moyenne du stagiaire 2
1. Quelle ligne du tableau notes ?RéponseLa ligne d'indice 2 : [16, 13, 17, 15].
2. Quel indice varie dans la boucle ?Réponsej, la colonne, de 0 à 3.
3. Quelle instruction dans la boucle ?Réponses ← s + notes[2][j]
4. Quel résultat ?Réponse61 / 4 = 15,25.
Exemple
Pourquoi
✔
notes[i][j] : la ligne d'abord
L'ordre est toujours ligne, puis colonne.
✘
notes[2, 1] en Python
Python attend notes[2][1], avec deux paires de crochets.
✘
Une boucle sur i de 0 à 3 pour parcourir une colonne
Il n'y a que 3 lignes, d'indices 0 à 2. L'indice 3 n'existe pas.
Checkpoint
1. Que vaut notes[0][3] ?Réponse18.
2. Pour additionner toute la ligne 1, quel indice reste fixe ?RéponseL'indice de ligne, i = 1. On fait varier j.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
5.3 Les fonctions et les procédures
Sarah a écrit trois fois le calcul de moyenne. Si elle trouve une erreur dedans, elle devra la corriger trois fois. Comment écrire un calcul une seule fois, et s'en servir partout ?
Une FONCTION est un morceau d'algorithme qui porte un nom, reçoit des valeurs et renvoie un résultat. Une PROCÉDURE est pareille, mais ne renvoie rien : elle fait une action, comme afficher. Les valeurs reçues s'appellent les PARAMÈTRES.
Une fonction, c'est une machine à café. On met une capsule, l'eau. Elle rend un café.
On n'a pas besoin de savoir ce qui se passe dedans pour s'en servir. C'est l'idée de modularité : on découpe un gros programme en petites pièces qu'on teste une par une.
Comment ça marche :
On définit la fonction une fois : son nom, ses paramètres, son bloc.
Renvoyer donne le résultat et termine la fonction.
On appelle la fonction par son nom, avec des valeurs : moyenne([12, 15, 9]).
Le résultat peut être rangé dans une variable, affiché, ou utilisé dans un calcul.
Pseudo-code
Fonction moyenne(T)
s ← 0
Pour i allant de 0 à longueur(T) - 1 Faire
s ← s + T[i]
Fin de PourRenvoyer s / longueur(T)
Fin de FonctionProcédure afficher_bilan(nom, T)
Écrire nom, ":", moyenne(T)
Fin de Procédure
afficher_bilan("Sarah", [12, 15, 9, 18])
Python
def moyenne(T):
s = 0for i inrange(len(T)):
s = s + T[i]
return s / len(T)
def afficher_bilan(nom, T):
print(nom, ":", moyenne(T))
afficher_bilan("Sarah", [12, 15, 9, 18])
Ce qui s'affiche
Sarah : 13.5
La procédure appelle la fonction : on assemble les pièces. Une fonction peut aussi renvoyer plusieurs valeurs : Renvoyer (s, p). En Python, on écrit return s, p, et on récupère les deux résultats avec deux variables, dans le même ordre :
Python
def somme_et_produit(T):
s = 0
p = 1for x in T:
s = s + x
p = p * x
return s, p
total, produit = somme_et_produit([2, 3, 4])
print(total, produit)
Ce qui s'affiche
9 24
En pseudo-code, on écrit les deux variables entre parenthèses, à gauche de la flèche : (total, produit) ← somme_et_produit([2, 3, 4]).
Renvoyer peut aussi se trouver dans une boucle. Il arrête alors la fonction dès qu'on a trouvé ce qu'on cherche :
Pseudo-code
Fonction contient(T, v)
Pour i allant de 0 à longueur(T) - 1 FaireSi T[i] = v AlorsRenvoyer Vrai
Fin de SiFin de PourRenvoyer Faux
Fin de Fonction
Python
def contient(T, v):
for i inrange(len(T)):
if T[i] == v:
returnTruereturnFalseprint(contient([4, 8, 15], 8), contient([4, 8, 15], 3))
Ce qui s'affiche
True False
Avec 8, la fonction s'arrête au 2ᵉ tour : la boucle ne va pas plus loin. Avec 3, la boucle va jusqu'au bout sans trouver, et on arrive à Renvoyer Faux.
On le fait ensemble — la fonction est_pair
1. Quel paramètre reçoit la fonction ?RéponseUn entier n.
2. Que renvoie-t-elle ?RéponseUn booléen : Vrai si n est pair.
3. Quel est son bloc ?RéponseRenvoyer n mod 2 = 0
4. Que renvoie est_pair(7) ?RéponseFaux.
Exemple
Pourquoi
✔
m ← moyenne(notes) puis Écrire m
La fonction renvoie, le programme principal décide quoi en faire.
✘
Écrire s / longueur(T) à la place de Renvoyer dans une fonction
La fonction affiche mais ne rend rien : on ne peut pas réutiliser le résultat.
✘
Écrire des lignes après Renvoyer dans le même bloc
Renvoyer termine la fonction : ces lignes ne s'exécutent jamais.
Checkpoint
1. Quelle est la différence entre une fonction et une procédure ?RéponseLa fonction renvoie un résultat. La procédure fait une action et ne renvoie rien.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
5.4 Paramètres et variables locales
Dans la fonction moyenne, Sarah utilise une variable s. Son programme principal a aussi une variable s.
Vont-elles se mélanger ? Et une fonction peut-elle modifier le tableau qu'on lui donne ?
Une VARIABLE LOCALE est créée dans une fonction : elle n'existe que pendant l'appel, et seulement dans la fonction. Une VARIABLE GLOBALE est créée dans le programme principal : elle est visible partout. Ce qui passe entre le programme et la fonction s'appelle l'INTERFACE : les paramètres et le résultat.
Une variable locale, c'est le brouillon d'un exercice. Vous l'utilisez pour calculer, puis vous le jetez. Seul le résultat, recopié au propre, compte.
Comment passent les données :
Sens du transfert
Ce qui se passe
Exemple
Entrée seule
la fonction reçoit une valeur et ne la modifie pas
moyenne(notes) lit les notes
Sortie seule
le paramètre reçoit un résultat, sans que la procédure lise ce qu'il contenait
remplir(T, n) met n zéros dans un tableau vide T
Entrée et sortie
la fonction reçoit un tableau et le modifie
une procédure qui ajoute 1 point à chaque note
En Python, une valeur simple, comme un nombre ou un texte, ne sort jamais par un paramètre : elle sort par return. Seul un tableau peut sortir par un paramètre.
Python
def remplir(T, n):
for i inrange(n):
T.append(0)
def bonus(T):
for i inrange(len(T)):
T[i] = T[i] + 1def total(T):
s = 0for x in T:
s = s + x
return s
zeros = []
remplir(zeros, 3)
notes = [12, 15, 9]
s = 100
bonus(notes)
print(zeros)
print(notes, total(notes), s)
Ce qui s'affiche
[0, 0, 0]
[13, 16, 10] 39 100
La procédure remplir n'a jamais lu zeros : elle l'a seulement rempli. C'est un transfert en sortie seule.
La procédure bonus a modifié le tableau notes : c'est un transfert en entrée et sortie. La variable s de total est locale : le s global vaut toujours 100.
Attention
En Python, une fonction peut modifier une variable globale, avec le mot global. C'est à éviter :
Rien dans l'appel ajouter_un() ne montre que compteur change. Ce genre de bug est difficile à trouver. Bonne habitude : tout ce dont la fonction a besoin entre par ses paramètres, et tout ce qu'elle produit sort par Renvoyer.
On le fait ensemble — qui voit quoi ?
1. Dans def f(): y = 5, puis print(y) hors de la fonction : que se passe-t-il ?RéponseErreur. y est locale à f, elle n'existe pas dehors.
2. On a x = 10 dans le programme principal, puis def g(): return x + 1. Que renvoie g() ?Réponse11. La fonction peut lire une variable globale.
3. moyenne(notes) modifie-t-elle notes ?RéponseNon. Elle lit seulement : transfert en entrée seule.
4. Pourquoi vaut-il mieux passer x en paramètre plutôt que le lire en global ?RéponseLa fonction devient indépendante : on la teste seule et on la réutilise ailleurs.
Exemple
Pourquoi
✔
def aire(l, L): return l * L
Tout entre par les paramètres, tout sort par return.
✘
Utiliser hors de la fonction une variable créée dedans
Elle est locale : elle disparaît à la fin de l'appel.
✘
Croire que bonus(notes) laisse notes intact
Un tableau passé en paramètre peut être modifié par la fonction.
Checkpoint
1. Où existe une variable locale ?RéponseSeulement dans la fonction, pendant l'appel.
2. Une procédure qui trie le tableau qu'on lui donne : quel transfert ?RéponseEntrée et sortie. Elle reçoit le tableau et le modifie.
Commencez par le niveau 1. Passez au niveau suivant quand les trois exercices sont réussis.
Ce qu'on retient du chapitre 5
Si vous ne devez retenir que trois choses
1. Un tableau se parcourt avec une boucle sur les indices, de 0 à longueur - 1. En deux dimensions : M[ligne][colonne].
2. Une fonction renvoie un résultat avec Renvoyer. Une procédure agit sans rien renvoyer.
3. Faites entrer les données par les paramètres et sortir le résultat par Renvoyer. Pour copier un tableau en Python, utilisez .copy().
Sarah a maintenant un seul tableau pour toutes les notes, et une seule fonction moyenne. Elle l'appelle pour chaque stagiaire et pour chaque module. Quand elle corrige la fonction, tout le programme est corrigé d'un coup.
Rappel : chaque réponse suit le formalisme Kerlouan (K1 Cadrage, K2 Vérification, K3 Justification).
Exercice 1.2.8 — Le solde du compte ★★★Sur machine
Le compte d'une petite association contient 200 €. Elle paie une facture de 45,50 €, puis reçoit un don de 120 €. En Python, 45,50 s'écrit 45.50, avec un point.
Écrivez l'algorithme avec une seule variable solde.
Traduisez-le en Python avec -= et +=.
Ajoutez une ligne qui retire 15 € de frais. Quel solde s'affiche ?
x ← 1
x ← x * 2
x ← x * 2
x ← x * 2
x ← x * 2
x ← x * 2
Que vaut x à la fin ?
Combien de lignes x ← x * 2 faut-il, après x ← 1, pour que x vaille 1 024 ?
Quel lien voyez-vous avec les puissances de 2 ?
On part de x ← 2 et on répète x ← x * x. Après combien de lignes x dépasse-t-il 1 000 ? Combien de lignes x ← x * 2 faudrait-il, en partant aussi de 2 ? Quelle méthode est la plus rapide ?
Exercice 1.3.4 — Celsius vers Fahrenheit ★★★Sur machine
Un technicien lit la température d'une salle serveur en degrés Celsius. Le fabricant de la climatisation donne ses seuils en degrés Fahrenheit. La formule est :
On lit : F égale C fois 9 cinquièmes, plus 32.
Écrivez la formule sur une ligne, avec les variables c et f. Une fraction devient une division : s'écrit 9 / 5.
Complétez le programme : il lit une température en Celsius et affiche la température en Fahrenheit.
Testez-le avec 25 °C. Vous devez obtenir 77.0 °F : Python écrit 77.0, car c est un réel.
Python
c = float(input("Température en °C ? "))
f = 0# à compléterprint(c, "°C =", f, "°F")
Exercice 1.3.5 — Le prix avec remise ★★★Sur machine
Une boutique en ligne calcule le prix d'une commande. Le client tape le prix d'un article, la quantité et le taux de remise en pourcentage. Le programme doit :
calculer le montant brut : prix × quantité ;
calculer la remise : montant brut × taux / 100 ;
calculer le montant net : montant brut − remise ;
afficher le montant net.
Écrivez l'algorithme en pseudo-code, puis en Python. Testez-le avec un prix de 12,5 €, 4 articles et 10 % de remise.
Exercice 1.3.9 — La facture du magasin ★★★Sur machine
Un magasin vend trois articles : une clé USB à 8 €, un câble à 5 €, une souris à 12 €. Le client tape la quantité de chaque article.
Le programme affiche le total hors taxes, la TVA à 20 % et le total TTC. Calculez la TVA avec HT * 20 / 100.
Écrivez l'algorithme en pseudo-code, avec son en-tête : nom, rôle, entrées, sortie. Ajoutez un commentaire // pour le rôle de chaque variable calculée.
Écrivez-le en Python, avec le même en-tête en commentaires #. Testez avec 2 clés, 3 câbles et 1 souris.
Exercice 1.4.9 — Retrouver la valeur de départ ★★★
Pseudo-code
Lire x
x ← x + 4
x ← x * 3
Écrire x
L'utilisateur a tapé un nombre, et l'algorithme a affiché 27. Quel nombre a-t-il tapé ? Expliquez votre raisonnement. Pour démarrer : juste après x ← x * 3, x vaut 27. Que valait x juste avant cette instruction ?
Exercice 2.3.8 — Première et dernière lettre ★★★Sur machine
Écrivez un programme qui lit un mot au clavier, puis affiche sa longueur, sa première lettre et sa dernière lettre. Écrivez d'abord le pseudo-code, puis le Python. Testez avec Python.
Testez avec un mot d'une seule lettre, A. Que valent la première et la dernière lettre ? Pourquoi ?
L'utilisateur appuie sur Entrée sans rien taper. Que vaut la longueur ? Que se passe-t-il à l'affichage ? Pourquoi ?
Exercice 2.4.5 — Le total d'une commande ★★★Sur machine
Complétez le programme. Il lit le prix d'un article et la quantité. Il affiche ensuite un seul message, collé avec +, par exemple Total : 37.5 €.
Testez avec 12.5 et 3.
Python
prix = input("Prix ? ") # à corriger
qte = input("Quantité ? ") # à corriger
total = 0# à remplacer par le calculprint("Total :", total) # à remplacer par un message collé avec +
Exercice 2.4.7 — Minutes depuis minuit ★★★Sur machine
Un badge de pointage lit l'heure et les minutes d'arrivée sous forme de texte, par exemple "14" et "35". On veut le nombre de minutes écoulées depuis minuit.
Calculez-le à la main pour 14 h 35.
Écrivez l'algorithme en pseudo-code, avec deux Lire.
Écrivez le programme Python, et testez avec 14 et 35.
À un contrôle, la note a compte 3 fois, et la note b compte 2 fois. On dit que a a le coefficient 3, et b le coefficient 2. Pour la moyenne, on multiplie chaque note par son coefficient, on additionne, puis on divise par 3 + 2 = 5.
Écrivez la moyenne en ligne.
Calculez-la pour a = 6 et b = 2, puis pour a = 12 et b = 15.
Un élève écrit 3 * a + 2 * b / 5. Que calcule-t-il vraiment pour a = 12 et b = 15 ?
On numérote les jours : 0 pour lundi, 1 pour mardi, 2 pour mercredi, 3 pour jeudi, 4 pour vendredi, 5 pour samedi, 6 pour dimanche. Aujourd'hui, jour ← 0 : c'est lundi.
Pourquoi le reste de la division par 7 donne-t-il le jour de la semaine ?
Écrivez l'expression qui donne le numéro du jour dans n jours.
Quel jour serons-nous dans 100 jours ? Dans 31 jours ?
Exercice 3.2.5 — Les pages d'un rapport ★★★Sur machine
Un rapport affiche les résultats d'une recherche, 20 lignes par page. Dans cet exercice, le nombre de lignes n'est jamais un multiple de 20 : la dernière page n'est jamais pleine.
Pour 53 lignes, combien faut-il de pages ?
Combien de lignes y a-t-il sur la dernière page ?
Écrivez un programme qui lit le nombre de lignes et affiche ces deux nombres. Testez avec 53.
Un port est le numéro qui désigne un service sur un ordinateur, entre 0 et 65 535 : 443 pour le web sécurisé, par exemple.
Quelle instruction tire 0 ou 1, comme pile ou face ?
Un serveur choisit un port au hasard entre 1024 et 65535. Quelle instruction ?
On simule le temps de réponse d'un serveur : un réel au hasard entre 0,5 et 2 secondes. Quelle instruction ?
Exécutez le programme ci-dessous trois fois. Les résultats sont-ils les mêmes ?
Un élève simule un dé avec round(random.uniform(1, 6)). Le réel tiré va de 1 à 6. Quels réels donnent 1 une fois arrondis ? Quels réels donnent 3 ? Le tirage du dé est-il encore uniforme ?
Python
import random
print(random.randint(0, 1), random.randint(1024, 65535))
print(random.uniform(0.5, 2))
Les droits d'un fichier tiennent sur 3 bits : le bit 2 pour lire, le bit 1 pour écrire, le bit 0 pour exécuter. Un fichier a les droits droits = 0b110.
Quels droits a-t-il ?
Avec quel masque et quel opérateur teste-t-on le droit d'exécuter ? Quel est le résultat ?
Comment ajouter le droit d'exécuter ? Quel résultat ?
Comment retirer le droit d'écrire, en partant de 0b110 ? Quel résultat ?
Comment inverser le droit de lire, en partant de 0b110 ? Quel résultat ?
Exercice 3.4.7 — Le réseau d'une adresse ★★★Sur machine
Une adresse IP est l'adresse d'un ordinateur sur un réseau. Elle s'écrit avec 4 nombres de 0 à 255, comme 192.168.1.198.
Un réseau découpe ces nombres avec un masque : les bits à 1 du masque désignent le réseau, les bits à 0 désignent l'ordinateur. Deux ordinateurs sont dans le même réseau si leur nombre ET le masque donne le même résultat.
On regarde seulement le dernier nombre, avec le masque 11000000, soit 192.
L'ordinateur A a le nombre 198, soit 11000110. Calculez 11000110 ET 11000000, rang par rang, puis en décimal.
L'ordinateur B a le nombre 230, soit 11100110. Calculez 230 ET 192.
L'ordinateur C a le nombre 70, soit 01000110. Calculez 70 ET 192.
Quels ordinateurs sont dans le même réseau que A ? Vérifiez vos calculs en Python.
Exercice 3.4.9 — Les options d'un objet connecté ★★★Sur machine
Une montre range ses options sur 4 bits : bit 0 = wifi, bit 1 = bluetooth, bit 2 = GPS, bit 3 = NFC. NFC veut dire Near Field Communication : c'est le paiement sans contact. Au départ, options = 0.
Répondez d'abord sur papier.
On allume le wifi et le GPS d'un seul coup. Quel masque, quel opérateur ?
On teste le GPS. Quel calcul ?
On éteint le wifi. Quel calcul ?
On inverse le NFC. Quel calcul ?
Faites la trace de options en binaire.
Complétez le programme : remplacez chaque 0 marqué « à compléter » par le bon masque. Exécutez-le et comparez avec votre trace.
Python
options = 0
options = options | 0# masque à compléterprint(bin(options))
print(options & 0) # masque à compléter
options = options & ~0# masque à compléterprint(bin(options))
options = options ^ 0# masque à compléterprint(bin(options))
Exercice 3.5.9 — Fabriquer un identifiant ★★★Sur machine
Un lycée fabrique l'identifiant d'un élève ainsi : la première lettre du prénom, puis les 7 premières lettres du nom, au plus. Il ajoute @lycee.fr pour l'adresse mail.
Quelle instruction donne la première lettre du prénom ?
Que donne nom[:7] pour martin ? Pour fontaine-dupont ?
Écrivez le programme qui lit le prénom et le nom, puis affiche l'adresse mail. Testez avec ines et fontaine-dupont.
Ajoutez la variable court, qui vaut Vrai si l'identifiant fait au plus 6 caractères.
Python
prenom = input("Prénom ? ")
nom = input("Nom ? ")
identifiant = ""# à compléterprint(identifiant + "@lycee.fr")
Exercice 4.2.5 — Compter les voyelles ★★★Sur machine
On veut compter les voyelles d'un mot lu au clavier. Les voyelles sont a, e, i, o, u, y, en minuscules ou en majuscules.
L'idée : on range toutes les voyelles dans une chaîne voyelles. Pour chaque caractère du mot, on le cherche dans cette chaîne. position(voyelles, mot[i]) renvoie -1 si le caractère n'est pas dans voyelles : ce n'est pas une voyelle.
Complétez les pointillés.
Pseudo-code
Lire mot
voyelles ←"aeiouyAEIOUY"
cpt ← . . .
Pour i allant de 0 à . . . FaireSi position(voyelles, mot[i]) ≠ -1 Alors
. . .
Fin de SiFin de PourÉcrire cpt
Que donne l'algorithme pour Algorithmique ? Listez les voyelles trouvées.
Écrivez le programme en Python. Testez-le avec Algorithmique, Python, SIO et Crypt.
Pour détecter une erreur de transmission, on ajoute un bit à la fin d'un code binaire :
si le code contient un nombre pair de « 1 », on ajoute "0" ;
sinon, on ajoute "1".
Écrivez l'algorithme qui part de code ← "1011001" et affiche le code complété.
Quel est le code complété pour "1011001" ? Pour "1100000" ?
Écrivez-le en Python et testez-le.
À l'arrivée, le récepteur vérifie le code de 8 bits : il doit contenir un nombre pair de « 1 ». Il reçoit "10110011". Le code est-il arrivé intact ? Avec quel calcul de votre algorithme le savez-vous ?
Exercice 4.2.8 — Le mot de passe sécurisé ★★★Sur machine
Un mot de passe est valide s'il a au moins 8 caractères, au moins une majuscule et au moins un chiffre.
Pour « au moins une majuscule », on utilise un drapeau : un booléen qui vaut Faux au départ. Dès qu'on trouve une majuscule, il passe à Vrai, et il le reste.
Les caractères se comparent par leur code : les chiffres d'abord, puis les majuscules, puis les minuscules. Les majuscules de "A" à "Z" se suivent.
Donc un caractère ch est une majuscule si ch ≥ "A" ET ch ≤ "Z". C'est un chiffre si ch ≥ "0" ET ch ≤ "9".
Complétez l'algorithme.
Pseudo-code
Lire m
maj ← Faux
chiffre ← Faux
Pour i allant de 0 à longueur(m) - 1 Faire
ch ← m[i]
Si ch ≥ "A"ET ch ≤ "Z"Alors
. . .
Fin de SiSi . . . Alors
chiffre ← Vrai
Fin de SiFin de Pour
valide ← longueur(m) ≥ 8 ET . . .
Écrire valide
Que donne l'algorithme pour Sio2026!, motdepasse1 et ABCD12 ? Présentez les résultats dans un tableau.
Exercice 4.3.5 — Quotient et reste par soustractions ★★★Sur machine
On veut le quotient et le reste de la division de a par b sans utiliser div ni mod. Idée : on enlève b à a tant que c'est possible, et on compte les soustractions.
Complétez l'algorithme.
Pseudo-code
Lire a
Lire b
q ← 0
Tant que a ≥ . . . Faire
a ← . . .
q ← . . .
Fin de Tant queÉcrire"quotient :", q, "reste :", a
Faites la trace pour a = 47 et b = 15.
Écrivez le programme en Python. Vérifiez avec 47 // 15 et 47 % 15.
Le programme cache le nombre 42. L'utilisateur propose des nombres.
Le programme répond « Plus grand », « Plus petit », ou « Bravo ». Il compte les essais.
Quelle boucle choisir ? Pourquoi ?
Écrivez l'algorithme en pseudo-code. Ajoutez un en-tête : nom, rôle, entrées, sortie. Ajoutez un commentaire pour chaque variable. Le programme demande un en-tête et des commentaires : ils rendent la copie lisible pour le correcteur.
Écrivez le programme en Python, avec les mêmes commentaires, et testez-le avec 50, puis 30, puis 42.
Le PGCD de deux entiers, pour « plus grand commun diviseur », est le plus grand entier qui divise les deux. Une méthode ancienne le calcule par soustractions : tant que les deux nombres sont différents, on enlève le plus petit au plus grand. Quand ils sont égaux, ils valent le PGCD.
Écrivez l'algorithme en pseudo-code. Il faut un Si dans la boucle.
Faites la trace pour a = 84 et b = 36. Quel est le PGCD ?
Pourquoi la boucle s'arrête-t-elle toujours, avec deux entiers positifs ?
Exercice 4.4.6 — Simuler 600 lancers de dé ★★★Sur machine
Un dé bien équilibré donne chaque face avec la même chance : une fois sur six, soit environ 0,167. On veut le vérifier en simulant 600 lancers.
random.randint(1, 6) tire un entier au hasard entre 1 et 6. random.seed(1) fixe le point de départ du hasard : chacun obtient alors les mêmes tirages, et on peut comparer les résultats.
Repérez les trois temps : quelle préparation, quelle mise à jour dans la boucle, quelle mise en forme finale ?
Complétez le programme, puis exécutez-le. Combien de 6 sortent ? Quelle est leur fréquence, arrondie au millième ?
Remplacez random.seed(1) par random.seed(2) : le résultat change-t-il ? Reste-t-il proche de 0,167 ?
Python
import random
random.seed(1)
nb6 = 0for i inrange(1, 601):
de = random.randint(1, 6)
# à compléter : compter les 6print(nb6, round(nb6 / 600, 3))
Une sonde relève 5 températures, une par jour, du jour 1 au jour 5. Le programme les lit une par une. Il affiche la plus haute, et le jour où elle a été relevée.
Un collègue propose de partir de maxi ← 0. Pourquoi est-ce une erreur ? Donnez un jeu de températures qui le montre.
Écrivez l'algorithme. Quelles sont les deux variables à mettre à jour quand on trouve une température plus haute ?
Faites la trace avec -3, 5, 2, 8, -1.
Si deux jours ont la même température la plus haute, quel jour votre algorithme affiche-t-il ? Que faudrait-il changer pour afficher l'autre ?
total ← 0
Pour i allant de 1 à 4 Faire
ligne ←""Pour j allant de 1 à i Faire
ligne ← ligne + chaîne(j) + " "
total ← total + 1
Fin de PourÉcrire ligne
Fin de PourÉcrire total
Qu'affiche cet algorithme ? Écrivez les lignes.
Combien de fois la boucle intérieure tourne-t-elle quand i vaut 3 ?
On reprend les deux dés à 6 faces de l'exercice 4.5.4.
Écrivez un seul algorithme, avec une seule double boucle et deux compteurs. Le premier compte les tirages où le premier dé est plus grand que le second. Le second compte les tirages dont la somme est au moins 10.
Donnez les deux résultats.
Sans ordinateur, expliquez pourquoi le premier compteur vaut 15. Indice : il y a 36 tirages, dont 6 doubles.
Combien de tirages vérifient les deux conditions à la fois ? Quelle ligne ajouteriez-vous pour les compter ?
Exercice 4.5.8 — Le produit de deux matrices ★★★Sur machine
On veut calculer avec
La formule, donnée comme à l'examen : .
Une matrice s'écrit en Python comme une liste de lignes : A = [[2, 1], [0, 3]]. A[i][k] est le nombre de la ligne i, colonne k, et les indices partent de 0. La ligne qui applique la formule vous est donnée : s = s + A[i][k] * B[k][j].
Calculez à la main , le nombre en haut à gauche de C.
Exécutez le programme ci-dessous : le résultat est faux. Corrigez la borne de la boucle sur k.
Le résultat est encore faux : la ligne s = 0 est mal placée. Déplacez-la au bon endroit, et expliquez pourquoi.
Python
A = [[2, 1], [0, 3]]
B = [[1, 4], [2, 5]]
C = [[0, 0], [0, 0]]
s = 0# à déplacer au bon endroitfor i inrange(2):
for j inrange(2):
for k inrange(1): # à corriger : la borne
s = s + A[i][k] * B[k][j]
C[i][j] = s
print(C)
On veut ranger le tableau T ← [5, 2, 8, 1, 4] dans l'ordre croissant. On utilise le tri par sélection :
au tour 0, on cherche l'indice du plus petit élément de tout le tableau, et on l'échange avec la case 0 ;
au tour 1, on cherche le plus petit parmi les cases 1 à 4, et on l'échange avec la case 1 ;
et ainsi de suite, jusqu'à l'avant-dernière case.
Combien de tours faut-il pour un tableau de 5 éléments ?
Pour échanger T[i] et T[imin], pourquoi faut-il une variable temp ?
Complétez l'algorithme.
Écrivez le tableau à la fin de chaque tour.
Pseudo-code
Pour i allant de 0 à longueur(T) - 2 Faire
imin ← i
Pour j allant de i + 1 à longueur(T) - 1 FaireSi T[j] < T[imin] Alors
imin ← . . .
Fin de SiFin de Pour
temp ← T[i]
T[i] ← . . .
T[imin] ← . . .
Fin de Pour
Un tableau est trié dans l'ordre croissant si chaque élément est plus petit ou égal au suivant. Exemple : [2, 5, 5, 9] est trié, [2, 7, 4] ne l'est pas.
Pour un tableau de 5 éléments, combien de paires de voisins faut-il comparer ?
Écrivez un algorithme qui range Vrai ou Faux dans le booléen trie. Idée : on part de trie ← Vrai, et on passe à Faux dès qu'une paire est mal rangée.
Améliorez-le avec une boucle Tant que, qui s'arrête dès qu'une paire est mal rangée.
Que donnent vos deux versions sur [2, 5, 5, 9], [2, 7, 4] et [8] ?
Pour [9, 1, 2, 3, 4], combien de comparaisons fait la version Pour ? Et la version Tant que ? Quelle version est la plus efficace ?
Exercice 5.2.5 — La moyenne de chaque stagiaire ★★★Sur machine
Le tableau notes a une ligne par stagiaire et une colonne par module.
Python
notes = [[12, 15, 9, 18],
[8, 11, 14, 10],
[16, 13, 17, 15]]
for i inrange(3):
s = 0# à compléter : additionner la ligne iprint("Stagiaire", i, ":", s / 4)
Pour la moyenne du stagiaire i, quel indice varie dans la boucle intérieure ?
Complétez le programme et exécutez-le.
Que se passe-t-il si on déplace s = 0 avant la boucle sur i ?
On reprend le tableau des stagiaires : nom, âge, présent.
Python
stagiaires = [["Sarah", 22, True],
["Tom", 19, False],
["Inès", 20, True],
["Yanis", 21, True]]
nb = 0for ligne in stagiaires:
# à compléter : remplacez la ligne suivante par votre code
nb = nb + 0print("Présents :", nb)
Dans la boucle, quelle case dit si le stagiaire est présent ?
Complétez la boucle : affichez le nom de chaque présent, et comptez-les dans nb.
Modifiez le programme pour afficher aussi l'âge moyen des présents.
Exercice 5.2.9 — Qui peut joindre qui ? ★★★Sur machine
Quatre serveurs sont numérotés de 0 à 3. Certains envoient des données à d'autres. On dessine chaque envoi par une flèche, appelée un arc : un arc de i vers j veut dire « le serveur i envoie au serveur j ».
On range ces arcs dans une grille L, appelée matrice d'adjacence. L[i][j] vaut 1 s'il y a un arc de i vers j, et 0 sinon.
Exercice 5.3.4 — Le plus petit et le plus grand ★★★Sur machine
Une application de suivi relève les temps de réponse d'un serveur, en millisecondes.
Écrivez la fonction mini_maxi(T) en pseudo-code. Elle renvoie deux résultats : la plus petite et la plus grande valeur du tableau.
Écrivez l'appel qui récupère les deux résultats dans a et b, en pseudo-code.
Complétez la version Python et testez-la sur [48, 120, 35, 90].
Python
def mini_maxi(T):
mini = T[0]
maxi = T[0]
# à compléterreturn mini, maxi
a, b = mini_maxi([48, 120, 35, 90])
print("Plus petit :", a, "Plus grand :", b)
On veut la fonction chercher(T, x). Elle renvoie deux valeurs : un booléen qui dit si x est dans le tableau T, et l'indice de la première case qui contient x. Si x est absent, l'indice renvoyé vaut longueur(T).
Pourquoi une boucle Tant que convient-elle mieux qu'une boucle Pour ?
Complétez la fonction.
Dans le programme principal, comment récupérer les deux résultats ? Écrivez l'appel pour T ← [7, 3, 9, 3] et x ← 3.
Que renvoie chercher([7, 3, 9, 3], 5) ?
Pseudo-code
Fonction chercher(T, x)
k ← 0
Tant que k < longueur(T) ET . . . Faire
k ← k + 1
Fin de Tant que
trouve ← . . .
Renvoyer (trouve, k)
Fin de Fonction
Exercice 5.3.9 — Convertir des durées ★★★Sur machine
Un serveur note la durée de chaque sauvegarde en secondes : [7384, 59, 3600].
Écrivez la fonction hms(duree). Elle renvoie trois valeurs : les heures, les minutes et les secondes.
Écrivez un programme qui affiche chaque durée sous la forme 2 h 3 min 4 s.
Ajoutez le total de toutes les sauvegardes, converti lui aussi.
Écrivez la fonction secondes(h, m, s), qui fait le calcul inverse : elle renvoie la durée en secondes. Vérifiez qu'elle redonne 7384 pour 2 h 3 min 4 s.
Python
def hms(duree):
# à compléterreturn0, 0, 0for d in [7384, 59, 3600]:
h, m, s = hms(d)
print(h, "h", m, "min", s, "s")
Vous passez l'épreuve E3 sous sa forme écrite : 2 heures, deux ou trois exercices, sur papier, sans ordinateur. La calculatrice est autorisée. L'un des exercices évalue la capacité « programmer ».
Cet exercice vaut souvent 5 points : comptez 25 à 35 minutes. Vous écrivez vos algorithmes en pseudo-code ou dans un langage, au choix. Python vous sert à vous entraîner, puis à vérifier vos réponses après coup.
Les deux sujets ci-dessous ont la forme des annales. Faites-les sur une feuille, chronomètre en main, avant de lire le corrigé.
Sujet type — Les codes de réduction Type examen
Exercice : 5 points
Une boutique en ligne distribue des codes de réduction. Un code est une chaîne de 8 caractères : 3 lettres majuscules, puis 5 chiffres. Par exemple : "SIO25401".
Un code est valide s'il a exactement 8 caractères et si la somme de ses 5 chiffres est un multiple de 7. Un nombre est un multiple de 7 quand le reste de sa division par 7 vaut 0.
On dispose de la fonction chiffre(c), déjà écrite :
elle reçoit un caractère c, qui est un chiffre ;
elle renvoie l'entier correspondant. Par exemple, chiffre("7") renvoie 7.
Les caractères d'un code sont repérés par leur indice, à partir de 0 : dans "SIO25401", le caractère d'indice 3 est "2".
1. On considère la fonction suivante.
Pseudo-code
1 Fonction somme_chiffres(code)
2 s ← 0
3 Pour i allant de 3 à 7 Faire
4 s ← s + chiffre(code[i])
5 Fin de Pour
6 Renvoyer s
7 Fin de Fonction
Que renvoie somme_chiffres("SIO25401") ? Justifier. (0,75 point)
Expliquer en une phrase le rôle de cette fonction. (0,25 point)
2. Recopier et compléter les lignes 2, 5 et 6 de la fonction est_valide, qui renvoie Vrai si le code est valide et Faux sinon. (1,5 point)
Pseudo-code
1 Fonction est_valide(code)
2 Si longueur(code) ≠ . . . Alors
3 Renvoyer Faux
4 Fin de Si
5 Si le reste de la division de . . . par 7 est 0 Alors
6 Renvoyer . . .
7 Sinon
8 Renvoyer Faux
9 Fin de Si
10 Fin de Fonction
3. Écrire une fonction nb_valides(T) qui reçoit un tableau T de codes et renvoie le nombre de codes valides. On pourra utiliser la fonction est_valide. (1,5 point)
4. a. Que renvoie est_valide("SIO00000") ? Justifier. (0,5 point)
La boutique refuse les codes dont la somme des chiffres vaut 0. Réécrire la ligne 5 de est_valide en conséquence (0,5 point).
Sujet type — Le serveur qui se remplit Type examen
Exercice court : 3 points
Le disque d'un serveur a déjà 100 Go occupés. Chaque jour, les sauvegardes ajoutent 50 Go. On veut savoir combien de jours il faut pour que l'espace occupé atteigne ou dépasse la capacité du disque.
Pseudo-code
1 Fonction jours(capacite)
2 occupe ← 100
3 j ← 0
4 Tant que occupe . . . capacite Faire
5 occupe ← occupe + 50
6 j ← . . .
7 Fin de Tant que
8 Renvoyer j
9 Fin de Fonction
1. Recopier et compléter les lignes 4 et 6. (1 point)
2. Que renvoie jours(300) ? Justifier. (1,5 point)
3. Que renvoie jours(80) ? Expliquer pourquoi. (0,5 point)
Le sujet officiel, page 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Un système de codage affine est un système de chiffrement basé sur la correspondance entre les lettres de l'alphabet et les entiers compris entre 0 et 25.
La table de correspondance est donnée ci-dessous.
A
B
C
D
E
F
G
H
I
J
K
L
M
0
1
2
3
4
5
6
7
8
9
10
11
12
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
13
14
15
16
17
18
19
20
21
22
23
24
25
Le codage consiste tout d'abord à choisir une clé qui est un couple d'entiers avec et .
Pour coder une lettre :
on détermine l'entier qui lui correspond dans la table de correspondance ;
on calcule puis on détermine l'entier compris entre 0 et 25 tel que ;
on détermine la lettre associée à dans la table de correspondance.
Exemple : Codons la lettre H avec la clé .
H correspond à ;
et donc ;
correspond à la lettre Q donc H est codée en Q.
Toutes les clés de codage ne permettent pas de crypter un message convenablement. On admet qu'une clé de codage est acceptable si et seulement si l'entier est premier avec 26. Il n'y a pas de condition sur (donc 26 choix possibles pour ).
Recopier et compléter les lignes numérotées 3, 4 et 5 de l'algorithme définissant la fonction nbCles() qui renvoie le nombre de clés acceptables et dans laquelle la fonction renvoie le plus grand commun diviseur des entiers et .
Pseudo-code
1 Fonction nbCles()
2 nb ← 0
3 Pour a allant de 1 à . . . . Faire
4 Si pgcd(a, 26) = . . . . Alors
5 nb ← . . . .
6 Fin de Si
7 Fin de Pour
8 Renvoyer nb × 26
Le sujet officiel, pages 3 à 4 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Le contexte est celui de la question précédente : le codage affine, avec la clé .
Pour déterminer la clé de décodage associée à la clé de codage , il est nécessaire de déterminer un entier compris entre 0 et 25 tel que .
La fonction inverse de paramètre donnée ci-dessous renvoie le plus petit entier compris entre 0 et 25 tel que .
La fonction « reste(u, n) » qui est utilisée ci-dessous renvoie le reste de la division euclidienne d'un entier naturel par un entier naturel non nul .
Pseudo-code
1 Fonction inverse(a)
2 c ← 1
3 Tant que reste(a × c, 26) . . . . Faire
4 c ← c + 1
5 Renvoyer . . . .
Recopier et compléter les lignes numérotées 3 et 5 de l'algorithme définissant la fonction inverse de paramètre .
Le sujet officiel, page 2 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Un codage affine est une méthode de chiffrement utilisée en cryptographie, qui consiste à remplacer chaque lettre du message en clair par une autre lettre de l'alphabet en utilisant une fonction affine. On associe à chaque lettre de l'alphabet une valeur numérique.
Pour calculer le reste de la division euclidienne d'un entier N par 26, il suffit de soustraire 26 à N autant de fois que possible, c'est-à-dire tant que la différence demeure supérieure ou égale à 26.
Exemple : Le reste de la division euclidienne de 80 par 26 s'obtient ainsi :
80 − 26 = 54. Comme 54 ⩾ 26, on soustrait alors 26 à 54.
54 − 26 = 28. Comme 28 ⩾ 26, on soustrait alors 26 à 28.
28 − 26 = 2. Comme 2 < 26, on arrête.
Le reste de la division euclidienne de 80 par 26 est 2.
La fonction « reste_division_par_26 » de paramètre N, ci-après, est écrite en langage naturel et emploie cette méthode pour renvoyer le reste de la division euclidienne de N par 26.
Exemple : reste_division_par_26(80) renvoie la valeur entière 2.
Pseudo-code
Fonction reste_division_par_26(N)
Tant que N . . . Faire
N ← . . .
Fin de Tant queRenvoyer (N)
Fin de la fonction
Recopier et compléter les deux lignes contenant des pointillés de cette fonction.
Le sujet officiel, pages 2 à 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
La fonction indice (lettre, chaine) ci-dessous, renvoie le plus petit indice du caractère « lettre » dans la chaîne de caractères « chaine », lorsqu'il est présent dans « chaine », et elle renvoie le nombre de caractères de « chaine » sinon.
La documentation de cette fonction précise que :
k est un entier.
lettre est une chaîne de caractères constituée d'un seul caractère.
chaine est une chaîne de caractères.
longueur(chaine) renvoie le nombre de caractères de chaine.
Exemple : indice("S","BTSSIO") renvoie la valeur 2, le plus petit indice de "S" dans "BTSSIO".
Pseudo-code
Fonction indice(lettre, chaine)
k ← 0
Tant que . . . longueur(chaine) et lettre . . . Faire
k ← k + 1
Fin de Tant queRenvoyer (k)
Fin de Fonction
Quelle est la valeur renvoyée par indice("A","BTSSIO") ?
Recopier et compléter la ligne contenant les pointillés de la fonction indice.
Le sujet officiel, pages 2 à 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
La norme de codage ASCII (American Standard Code for Information Interchange), défini aux États-Unis en 1963, associe aux caractères les plus utilisés dans les documents en langue anglaise un entier représentable en binaire sur 7 bits.
Lors de la transmission des données, pour éviter les erreurs, une méthode consiste à ajouter pour chaque caractère, un bit de parité à la fin du codage en binaire.
Pour cela, on compte le nombre de 1 apparaissant dans le codage sur 7 bits d'un caractère :
si le nombre obtenu est pair, on rajoute 0 à la fin du codage ;
sinon on rajoute 1.
Chaque caractère est alors codé par un groupe de 8 bits appelé octet.
Par exemple :
la lettre "A" est codée par 1000001 en binaire. Ce codage contient un nombre pair de 1, donc on ajoute 0 à la fin, et la lettre "A" sera codée sur 8 bits par 10000010 ;
la lettre "C" est codée par 1000011 en binaire. Ce codage contient un nombre impair de 1, donc on ajoute 1 à la fin, et la lettre "C" sera codée sur 8 bits par 10000111.
On considère l'algorithme ci-dessous écrit en langage naturel où ajoute_bit_parite est la fonction prenant en paramètre une chaine de caractères code de longueur 7 représentant un codage binaire et qui renvoie le codage obtenu en lui ajoutant le bit de parité à la fin.
Ainsi ajoute_bit_parite("1101100") renvoie "11011000" et ajoute_bit_parite("1100001") renvoie "11000011".
Pseudo-code
Fonction ajoute_bit_parite(code)
compt ← 0
Pour i allant de 0 à 6 FaireSi code[i] est égal à "1"AlorsFin de SiFin de PourSi le reste de la division de . . . par 2 est 0
Alors
code ← code + "0"Sinon
. . . . . .
Fin de SiRenvoyer code
Recopier et compléter cet algorithme pour qu'il renvoie le code binaire sous forme de chaine de caractères, complété par le bit de parité.
BTS SIO 2023 — Le degré sortant d'un sommet Type examen
Source : BTS SIO, Métropole, mai 2023, épreuve obligatoire, exercice 2, partie B, question 2.
Le sujet officiel, pages 2 à 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Partie A. On considère le graphe orienté G comportant 3 sommets notés A, B et C dont la matrice d'adjacence est , où
Partie B. Dans un graphe orienté, on définit :
le degré entrant d'un sommet comme étant le nombre d'arcs menant à ce sommet.
le degré sortant d'un sommet comme étant le nombre d'arcs issus de ce sommet.
On étudie dans cette question les graphes orientés à trois sommets numérotés de 1 à 3.
On considère l'algorithme ci-dessous écrit en langage naturel où Degré_sortant désigne une fonction de paramètres M et s, M étant une matrice à 3 lignes et 3 colonnes et s un entier compris entre 1 et 3.
Le coefficient de la matrice M situé ligne i colonne j est noté .
Pseudo-code
Fonction Degré_sortant(M, s)
deg ← 0
Pour j allant de 1 à 3 FaireSi m_sj . . . . . . Faire
. . . . . .
Fin de SiFin de PourRenvoyer deg
Compléter cet algorithme pour que la fonction renvoie le degré sortant du sommet numéroté s dans un graphe dont la matrice d'adjacence est M.
Le sujet officiel, page 2 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
On considère l'algorithme ci-dessous écrit en langage naturel où Div désigne une fonction de paramètre Nbre, Nbre étant un nombre entier supérieur ou égal à 2.
Algorithme en langage naturel :
Pseudo-code
Fonction Div(Nbre)
Test ← 0
Pour i allant de 1 à Nbre FaireSi le reste de la division de Nbre par i est égal à 0 Faire
Test ← Test + 1
Fin de SiFin de PourRetourner Test
Que renvoie Div(6) ? Justifier en expliquant le rôle de cette fonction.
Écrire une fonction Prem de paramètre Nbre, où Nbre est un nombre entier supérieur ou égal à 2, qui renvoie Vrai (ou True) si Nbre est premier, Faux (ou False) si Nbre n'est pas premier. On pourra utiliser la fonction Div.
Écrivez son en-tête en commentaires : le nom, le rôle, les entrées et la sortie.
Corrigé
La méthode. L'en-tête répond à quatre questions : comment s'appelle l'algorithme, à quoi il sert, ce qu'il reçoit, ce qu'il produit.
Pseudo-code
// Nom : prix_ttc// Rôle : calculer le prix toutes taxes comprises d'un article// Entrée : HT, le prix hors taxes, un nombre// Sortie : le prix TTC affiché à l'écran
D'autres noms sont justes, s'ils disent le rôle : calcul_ttc, prix_avec_tva.
Exercice 1.1.6 — Le taux de pannes ★★★Sur machine
Inès compte 80 postes dans le lycée. Ce matin, 76 marchent. Elle veut connaître le pourcentage de postes en panne.
Écrivez l'algorithme en pseudo-code. Utilisez les variables total, marche, pannes et pourcentage.
Traduisez-le en Python et exécutez-le.
Pour le pourcentage, multipliez d'abord par 100, puis divisez par le total.
Corrigé
La méthode. On calcule d'abord le nombre de pannes, puis le pourcentage. Chaque ligne utilise ce qui est au-dessus.
Pseudo-code
total ← 80
marche ← 76
pannes ← total - marche
pourcentage ← pannes * 100 / total
Écrire"Postes en panne :", pourcentage, "%"
Python
total = 80
marche = 76
pannes = total - marche
pourcentage = pannes * 100 / total
print("Postes en panne :", pourcentage, "%")
Ce qui s'affiche
Postes en panne : 5.0 %
Vérification à la main : 80 − 76 = 4 pannes. 4 × 100 / 80 = 5.
★★★ Niveau 3 — Aller plus loin
Exercice 1.1.7 — Le programme qui plante ★★★
Ce programme doit afficher le prix d'un abonnement de 3 mois à 15 € par mois. Il s'arrête sur une erreur.
Python
print("Total :", total)
mois = 3
prix = 15
total = mois * prix
Quelle ligne provoque l'erreur ? Pourquoi ?
Corrigez le programme.
Ajoutez deux lignes : l'une calcule le prix pour 12 mois, avec une remise de 20 € sur le total ; l'autre l'affiche.
Le prix passe à 18 € par mois. Quelle seule ligne changez-vous ? Qu'affiche alors le programme ? Pourquoi les deux totaux suivent-ils seuls ?
Corrigé
La méthode. On lit de haut en bas, comme l'ordinateur. On cherche la première ligne qui utilise une variable qui n'existe pas encore.
L'instruction print("Total :", total) affiche total, mais total n'est calculé que trois lignes plus bas. Python s'arrête et affiche NameError : c'est son message pour « variable inconnue ».
et 3. On met l'affichage à la fin, puis on ajoute le calcul pour 12 mois :
Python
mois = 3
prix = 15
total = mois * prix
print("Total :", total)
total_an = 12 * prix - 20print("Total sur 12 mois :", total_an)
Ce qui s'affiche
Total : 45
Total sur 12 mois : 160
On change seulement prix = 15 en prix = 18. Les deux totaux sont calculés à partir de prix : ils changent seuls.
Python
mois = 3
prix = 18
total = mois * prix
print("Total :", total)
total_an = 12 * prix - 20print("Total sur 12 mois :", total_an)
Ce qui s'affiche
Total : 54
Total sur 12 mois : 196
C'est l'intérêt des variables : une valeur écrite une seule fois se change à un seul endroit.
Exercice 1.1.8 — L'espace libre du disque ★★★Sur machine
Un serveur a un disque de 500 Go. 365 Go sont occupés.
Écrivez un algorithme, en pseudo-code puis en Python, qui affiche :
l'espace libre, en Go ;
le pourcentage d'espace libre.
Ajoutez son en-tête en commentaires.
Corrigé
La méthode. Trois calculs, dans l'ordre : l'espace libre, puis le pourcentage, puis les affichages.
Pseudo-code
// Nom : espace_libre// Rôle : calculer l'espace libre d'un disque et son pourcentage// Entrées : taille et occupe, en Go// Sortie : l'espace libre et le pourcentage, affichés
taille ← 500
occupe ← 365
libre ← taille - occupe
pourcentage ← libre * 100 / taille
Écrire"Libre :", libre, "Go"Écrire"Soit", pourcentage, "%"
Python
# Nom : espace_libre# Rôle : calculer l'espace libre d'un disque et son pourcentage# Entrées : taille et occupe, en Go# Sortie : l'espace libre et le pourcentage, affichés
taille = 500
occupe = 365
libre = taille - occupe
pourcentage = libre * 100 / taille
print("Libre :", libre, "Go")
print("Soit", pourcentage, "%")
Exercice 1.2.7 — Faire tourner trois valeurs ★★★Sur machine
On a a ← 1, b ← 2 et c ← 3. On veut obtenir a = 2, b = 3 et c = 1 : chaque valeur avance d'une place.
Écrivez les affectations, avec une variable temp.
Vérifiez en Python.
Corrigé
La méthode. C'est un échange à trois. On met de côté la première valeur, on décale les autres, puis on range la valeur mise de côté à la fin.
Pseudo-code
temp ← a
a ← b
b ← c
c ← temp
Python
a = 1
b = 2
c = 3
temp = a
a = b
b = c
c = temp
print(a, b, c)
Ce qui s'affiche
2 3 1
Exercice 1.2.8 — Le solde du compte ★★★Sur machine
Le compte d'une petite association contient 200 €. Elle paie une facture de 45,50 €, puis reçoit un don de 120 €. En Python, 45,50 s'écrit 45.50, avec un point.
Écrivez l'algorithme avec une seule variable solde.
Traduisez-le en Python avec -= et +=.
Ajoutez une ligne qui retire 15 € de frais. Quel solde s'affiche ?
Corrigé
La méthode. Chaque opération est une mise à jour du même solde.
Vérification à la main : 200 − 45,50 = 154,50. Puis 154,50 + 120 = 274,50. Puis 274,50 − 15 = 259,50.
Exercice 1.2.9 — Doubler encore et encore ★★★
Pseudo-code
x ← 1
x ← x * 2
x ← x * 2
x ← x * 2
x ← x * 2
x ← x * 2
Que vaut x à la fin ?
Combien de lignes x ← x * 2 faut-il, après x ← 1, pour que x vaille 1 024 ?
Quel lien voyez-vous avec les puissances de 2 ?
On part de x ← 2 et on répète x ← x * x. Après combien de lignes x dépasse-t-il 1 000 ? Combien de lignes x ← x * 2 faudrait-il, en partant aussi de 2 ? Quelle méthode est la plus rapide ?
Corrigé
La méthode. On suit x ligne par ligne : 1, 2, 4, 8, 16, 32.
x vaut 32.
Il faut 10 lignes, car .
Après n lignes x ← x * 2, x vaut .
Avec x ← x * x : 2, puis 4, puis 16, puis 256, puis 65 536. Il faut 4 lignes pour dépasser 1 000. Avec x ← x * 2 en partant de 2, il en faut 9 pour atteindre 1 024. La mise au carré va beaucoup plus vite : chaque ligne double le nombre de chiffres binaires.
Python
x = 1
x = x * 2
x = x * 2
x = x * 2
x = x * 2
x = x * 2print(x)
y = 2
y = y * y
y = y * y
y = y * y
y = y * y
print(y)
Ce programme doit afficher l'âge de l'utilisateur l'an prochain. Il s'arrête sur une erreur.
Python
age = input("Âge ? ")
print("L'an prochain :", age + 1)
Pourquoi ce programme plante-t-il ?
Corrigez-le.
Corrigé
La méthode. On regarde le type de ce que donne input.
input renvoie du texte. Python refuse d'ajouter le nombre 1 à du texte.
On change le texte en entier dès la lecture :
Python
age = int(input("Âge ? "))
print("L'an prochain :", age + 1)
Ce qui s'affiche
Âge ? 17
L'an prochain : 18
★★★ Niveau 2 — S'entraîner
Exercice 1.3.4 — Celsius vers Fahrenheit ★★★Sur machine
Un technicien lit la température d'une salle serveur en degrés Celsius. Le fabricant de la climatisation donne ses seuils en degrés Fahrenheit. La formule est :
On lit : F égale C fois 9 cinquièmes, plus 32.
Écrivez la formule sur une ligne, avec les variables c et f. Une fraction devient une division : s'écrit 9 / 5.
Complétez le programme : il lit une température en Celsius et affiche la température en Fahrenheit.
Testez-le avec 25 °C. Vous devez obtenir 77.0 °F : Python écrit 77.0, car c est un réel.
Python
c = float(input("Température en °C ? "))
f = 0# à compléterprint(c, "°C =", f, "°F")
Corrigé
La méthode. On traduit la fraction en division, et on garde l'ordre des calculs de la formule.
Sur une ligne : f ← c * 9 / 5 + 32. La multiplication et la division passent avant l'addition : pas besoin de parenthèses.
Le programme complet :
Python
c = float(input("Température en °C ? "))
f = c * 9 / 5 + 32print(c, "°C =", f, "°F")
Ce qui s'affiche
Température en °C ? 25
25.0 °C = 77.0 °F
Le test donne bien 77. Python écrit 77.0, car c est un réel. En pseudo-code :
Pseudo-code
Écrire"Température en °C ?"Lire c
f ← c * 9 / 5 + 32
Écrire c, "°C =", f, "°F"
Attention
Sans float(...), c serait du texte, et c * 9 répéterait le texte 9 fois au lieu de calculer.
Exercice 1.3.5 — Le prix avec remise ★★★Sur machine
Une boutique en ligne calcule le prix d'une commande. Le client tape le prix d'un article, la quantité et le taux de remise en pourcentage. Le programme doit :
calculer le montant brut : prix × quantité ;
calculer la remise : montant brut × taux / 100 ;
calculer le montant net : montant brut − remise ;
afficher le montant net.
Écrivez l'algorithme en pseudo-code, puis en Python. Testez-le avec un prix de 12,5 €, 4 articles et 10 % de remise.
Corrigé
La méthode. On lit les trois valeurs, on suit les quatre étapes dans l'ordre, puis on affiche.
Pseudo-code
Écrire"Prix unitaire ?"Lire prix
Écrire"Quantité ?"Lire qte
Écrire"Remise en % ?"Lire taux
brut ← prix * qte
remise ← brut * taux / 100
net ← brut - remise
Écrire"Montant net :", net, "€"
Python
prix = float(input("Prix unitaire ? "))
qte = int(input("Quantité ? "))
taux = float(input("Remise en % ? "))
brut = prix * qte
remise = brut * taux / 100
net = brut - remise
print("Montant net :", net, "€")
Ce qui s'affiche
Prix unitaire ? 12.5
Quantité ? 4
Remise en % ? 10
Montant net : 45.0 €
Vérification à la main : 12,5 × 4 = 50. La remise vaut 50 × 10 / 100 = 5. Le net vaut 50 − 5 = 45.
Attention
En Python, on tape 12.5 avec un point. Avec 12,5, float s'arrête sur une erreur.
Exercice 1.3.6 — Le périmètre d'une salle ★★★
On veut le périmètre d'une salle rectangulaire. L'utilisateur tape la longueur et la largeur, en mètres. Le périmètre vaut 2 × (longueur + largeur).
Écrivez l'algorithme en pseudo-code : deux lectures, un calcul, un affichage.
Écrivez-le en Python. Testez avec 8 m et 6 m.
Corrigé
La méthode. On lit, on calcule, on affiche. Les parenthèses font l'addition avant la multiplication.
L'erreur fréquente : ajouter n4 mais garder / 3. Le programme tourne sans erreur, mais la moyenne est fausse.
Exercice 1.3.8 — Heures et minutes en minutes ★★★Sur machine
Une vidéo dure 2 h 35 min. On veut un programme qui lit les heures et les minutes, puis affiche :
la durée totale en minutes ;
la durée totale en secondes.
Écrivez l'algorithme en pseudo-code.
Écrivez-le en Python et testez avec 2 h 35 min.
Corrigé
La méthode. Une heure fait 60 minutes, une minute fait 60 secondes. On calcule les minutes, puis les secondes à partir des minutes.
Pseudo-code
Écrire"Heures ?"Lire h
Écrire"Minutes ?"Lire m
total ← h * 60 + m
secondes ← total * 60
Écrire"Total :", total, "minutes"Écrire"Soit :", secondes, "secondes"
Python
h = int(input("Heures ? "))
m = int(input("Minutes ? "))
total = h * 60 + m
secondes = total * 60print("Total :", total, "minutes")
print("Soit :", secondes, "secondes")
Ce qui s'affiche
Heures ? 2
Minutes ? 35
Total : 155 minutes
Soit : 9300 secondes
Exercice 1.3.9 — La facture du magasin ★★★Sur machine
Un magasin vend trois articles : une clé USB à 8 €, un câble à 5 €, une souris à 12 €. Le client tape la quantité de chaque article.
Le programme affiche le total hors taxes, la TVA à 20 % et le total TTC. Calculez la TVA avec HT * 20 / 100.
Écrivez l'algorithme en pseudo-code, avec son en-tête : nom, rôle, entrées, sortie. Ajoutez un commentaire // pour le rôle de chaque variable calculée.
Écrivez-le en Python, avec le même en-tête en commentaires #. Testez avec 2 clés, 3 câbles et 1 souris.
Corrigé
La méthode. On lit les trois quantités. Le total HT est la somme des trois prix fois leur quantité. Puis la TVA, puis le TTC.
Pseudo-code
// Nom : facture_magasin// Rôle : calculer le total HT, la TVA et le total TTC d'une commande// Entrées : les quantités de clés, de câbles et de souris, des entiers// Sortie : les trois montants, affichésÉcrire"Clés USB ?"Lire cles
Écrire"Câbles ?"Lire cables
Écrire"Souris ?"Lire souris
HT ← cles * 8 + cables * 5 + souris * 12 // total hors taxes, en €
TVA ← HT * 20 / 100 // taxe à 20 %
TTC ← HT + TVA // total à payerÉcrire"Total HT :", HT
Écrire"TVA :", TVA
Écrire"Total TTC :", TTC
Python
# Nom : facture_magasin# Rôle : calculer le total HT, la TVA et le total TTC d'une commande# Entrées : les quantités de clés, de câbles et de souris# Sortie : les trois montants, affichés
cles = int(input("Clés USB ? "))
cables = int(input("Câbles ? "))
souris = int(input("Souris ? "))
HT = cles * 8 + cables * 5 + souris * 12
TVA = HT * 20 / 100
TTC = HT + TVA
print("Total HT :", HT)
print("TVA :", TVA)
print("Total TTC :", TTC)
Ce qui s'affiche
Clés USB ? 2
Câbles ? 3
Souris ? 1
Total HT : 43
TVA : 8.6
Total TTC : 51.6
Vérification à la main : 2 × 8 + 3 × 5 + 1 × 12 = 16 + 15 + 12 = 43. La TVA vaut 43 × 20 / 100 = 8,6.
La méthode. On lit une ligne à la fois. À chaque ligne, on prend les valeurs de la ligne juste au-dessus.
Étape
Instruction
x
y
1
x ← 7
7
–
2
y ← x - 2
7
5
3
x ← x + y
12
5
4
y ← x * 2
12
24
À la fin, x vaut 12 et y vaut 24.
Python
x = 7
y = x - 2
x = x + y
y = x * 2print("x =", x, "y =", y)
Ce qui s'affiche
x = 12 y = 24
Attention
À l'étape 4, on utilise la nouvelle valeur de x, 12, pas l'ancienne, 7.
Exercice 1.4.2 — Trois variables ★★★
Pseudo-code
a ← 2
b ← a + 4
c ← a * b
a ← c - b
Faites la trace dans ce tableau.
Étape
Instruction
a
b
c
1
a ← 2
2
b ← a + 4
3
c ← a * b
4
a ← c - b
Corrigé
La méthode. Une colonne par variable. On recopie les valeurs qui ne changent pas.
Étape
Instruction
a
b
c
1
a ← 2
2
–
–
2
b ← a + 4
2
6
–
3
c ← a * b
2
6
12
4
a ← c - b
6
6
12
À la fin : a = 6, b = 6, c = 12.
Exercice 1.4.3 — Une seule variable ★★★
Pseudo-code
s ← 0
s ← s + 5
s ← s + 8
s ← s - 3
Faites la trace de s. Que vaut s à la fin ?
Étape
Instruction
s
1
s ← 0
2
s ← s + 5
3
s ← s + 8
4
s ← s - 3
Corrigé
La méthode. À chaque ligne, on part de la valeur de la ligne au-dessus.
Étape
Instruction
s
1
s ← 0
0
2
s ← s + 5
5
3
s ← s + 8
13
4
s ← s - 3
10
À la fin, s vaut 10.
★★★ Niveau 2 — S'entraîner
Exercice 1.4.4 — Une trace avec une lecture ★★★
Pseudo-code
Lire x
y ← x * x
x ← y - x
Écrire x, y
L'utilisateur tape 6. Faites la trace.
Qu'affiche l'algorithme ?
Qu'afficherait-il si l'utilisateur tapait 3 ?
Étape
Instruction
x
y
1
Lire x
2
y ← x * x
3
x ← y - x
Corrigé
La méthode.Lire x range la valeur tapée dans x. Ensuite, on trace comme d'habitude.
La trace avec 6 :
Étape
Instruction
x
y
1
Lire x
6
–
2
y ← x * x
6
36
3
x ← y - x
30
36
L'algorithme affiche 30 et 36.
Avec 3 : y vaut 9, puis x vaut 9 − 3 = 6. Il affiche 6 et 9.
Python
x = int(input("x ? "))
y = x * x
x = y - x
print(x, y)
Ce qui s'affiche
x ? 6
30 36
Exercice 1.4.5 — La moyenne fausse ★★★
Cet algorithme doit calculer la moyenne de deux notes, 12 et 15.
Pseudo-code
a ← 12
b ← 15
m ← a + b / 2
Écrire m
Faites la trace. Que vaut m ?
La moyenne attendue est 13,5. D'où vient l'erreur ?
Corrigez l'instruction qui calcule m.
Corrigé
La méthode. La trace montre la valeur réelle de m. On la compare à la valeur attendue.
La division passe avant l'addition : b / 2 vaut 7,5, puis 12 + 7,5 = 19,5. m vaut 19,5.
L'ordinateur suit l'ordre des opérations : il divise seulement b par 2.
On ajoute des parenthèses : m ← (a + b) / 2.
Python
a = 12
b = 15
m = (a + b) / 2print(m)
Ce qui s'affiche
13.5
Exercice 1.4.6 — Trouver l'erreur dans une trace ★★★Sur machine
Pseudo-code
p ← 3
q ← p * 4
p ← q - p
q ← q + p
Un élève a rempli cette trace :
Étape
p
q
1
3
–
2
3
12
3
9
12
4
9
15
À quelle étape l'élève s'est-il trompé ? Quelle erreur a-t-il faite ?
Écrivez le programme en Python avec un print à la fin pour vérifier.
Corrigé
La méthode. On refait chaque ligne avec les valeurs de la ligne juste au-dessus.
L'erreur est à l'étape 4. L'élève a calculé 12 + 3 = 15, avec l'ancienne valeur de p. Or p vaut 9 depuis l'étape 3. Le bon calcul est 12 + 9 = 21.
La vérification :
Python
p = 3
q = p * 4
p = q - p
q = q + p
print("p =", p, "q =", q)
Ce qui s'affiche
p = 9 q = 21
★★★ Niveau 3 — Aller plus loin
Exercice 1.4.7 — Que fait cet algorithme ? ★★★
Pseudo-code
a ← 2
b ← 3
a ← a + b
b ← a - b
a ← a - b
Faites la trace de l'algorithme.
Comparez les valeurs de départ et d'arrivée de a et de b. Que fait l'algorithme, en une phrase ?
Refaites la trace avec a ← 10 et b ← 4 pour confirmer.
Corrigé
La méthode. On fait la trace, puis on compare le début et la fin.
La trace :
Étape
a
b
a ← 2
2
–
b ← 3
2
3
a ← a + b
5
3
b ← a - b
5
2
a ← a - b
3
2
Au départ, a vaut 2 et b vaut 3. À la fin, a vaut 3 et b vaut 2. L'algorithme échange les valeurs de a et de b, sans troisième variable.
Avec 10 et 4 : a devient 14, puis b devient 10, puis a devient 4. L'échange marche encore.
Python
a = 10
b = 4
a = a + b
b = a - b
a = a - b
print("a =", a, "b =", b)
Ce qui s'affiche
a = 4 b = 10
Exercice 1.4.8 — Le prix change après coup ★★★
Pseudo-code
prix ← 20
qte ← 3
total ← prix * qte
prix ← 25
Écrire total
Faites la trace.
Qu'affiche l'algorithme : 60 ou 75 ? Justifiez avec la trace.
On veut afficher le total avec le nouveau prix. Quelle ligne faut-il ajouter, et où ?
Corrigé
La méthode. Une affectation calcule une fois, au moment où elle s'exécute. Elle ne se refait pas seule quand une variable change ensuite.
La trace :
Étape
prix
qte
total
prix ← 20
20
–
–
qte ← 3
20
3
–
total ← prix * qte
20
3
60
prix ← 25
25
3
60
Il affiche 60. total a été calculé quand prix valait 20. Changer prix après ne change pas total.
On refait le calcul après le changement de prix : total ← prix * qte, juste avant Écrire total. Il affiche alors 75.
Python
prix = 20
qte = 3
total = prix * qte
prix = 25
total = prix * qte
print(total)
Ce qui s'affiche
75
Exercice 1.4.9 — Retrouver la valeur de départ ★★★
Pseudo-code
Lire x
x ← x + 4
x ← x * 3
Écrire x
L'utilisateur a tapé un nombre, et l'algorithme a affiché 27. Quel nombre a-t-il tapé ? Expliquez votre raisonnement. Pour démarrer : juste après x ← x * 3, x vaut 27. Que valait x juste avant cette instruction ?
Vérifiez en faisant la trace avec ce nombre.
Corrigé
La méthode. On remonte la trace à l'envers, en faisant l'opération inverse à chaque ligne.
À la fin, x vaut 27. Avant x ← x * 3, x valait 27 / 3 = 9. Avant x ← x + 4, x valait 9 − 4 = 5. L'utilisateur a tapé 5.
La trace avec 5 : x vaut 5, puis 9, puis 27.
Python
x = int(input("x ? "))
x = x + 4
x = x * 3print(x)
Pour chaque donnée, choisissez le type le plus adapté : entier naturel, entier relatif, réel, booléen ou chaîne de caractères.
Le nombre d'utilisateurs connectés à un serveur.
La température relevée par un capteur dans une chambre froide, en degrés entiers.
L'utilisation du processeur, affichée en pourcentage, par exemple 73,4.
« Le serveur web est-il en ligne ? »
L'âge d'un client.
Corrigé
La méthode. On se pose trois questions.
Peut-il être négatif ?
A-t-il une virgule ?
Fait-on des calculs dessus ?
Entier naturel : un nombre de personnes est entier et jamais négatif.
Entier relatif : une chambre froide descend sous 0 °C.
Réel : il y a une virgule.
Booléen : la réponse est oui ou non.
Entier naturel : un âge est entier et jamais négatif.
Exercice 2.1.2 — Vrai ou faux ? ★★★
Dites si chaque phrase est vraie ou fausse. Justifiez en une phrase.
Le mot de passe admin123 peut être rangé dans un entier.
En Python, 3 > 5 est un entier.
Une adresse IP, l'adresse d'un ordinateur sur un réseau, comme 192.168.0.1, est faite de 4 entiers naturels.
Le numéro 443, qui désigne le service web sur un serveur, est un entier naturel.
En Python, type(7.0) et type(7) donnent le même type.
Corrigé
La méthode. On regarde ce que la donnée contient vraiment, et ce qu'on fait avec.
Faux.admin123 contient des lettres : c'est une chaîne de caractères.
Faux. Une comparaison donne un booléen. Ici, False.
Vrai. Chacun des 4 nombres est entier et jamais négatif.
Vrai. C'est un nombre entier, jamais négatif.
Faux.7.0 est un réel, float. 7 est un entier, int.
Python
print(type(3 > 5), type(7.0), type(7))
Ce qui s'affiche
<class 'bool'> <class 'float'> <class 'int'>
Exercice 2.1.3 — Le type en Python ★★★
Donnez le type Python de chaque variable : int, float ou bool.
users = 57
temp = -7
cpu = 73.4
connecte = True
prix = 12.0
Corrigé
La méthode. Un nombre sans point est un int, avec un point un float. True et False sont des bool.
int : entier naturel.
int : entier relatif. Python utilise le même type pour les deux.
float : réel.
bool : booléen.
float : il y a un point, même si la partie après vaut 0.
★★★ Niveau 2 — S'entraîner
Exercice 2.1.4 — La fiche d'un produit ★★★
Un magasin d'informatique décrit chaque produit avec cinq données :
son nom ;
son prix en euros ;
le nombre en stock ;
s'il est en promotion ;
l'écart de stock depuis l'inventaire, qui peut être négatif.
Donnez le type de chaque donnée.
Écrivez en Python les cinq affectations pour une souris à 19,90 €, 12 en stock, en promotion, avec un écart de -3.
Corrigé
La méthode. On choisit un type par donnée. Puis on écrit la valeur dans la bonne forme : guillemets pour le texte, point pour les réels, True ou False pour les booléens.
Les types :
nom : chaîne de caractères ;
prix : réel ;
stock : entier naturel ;
promotion : booléen ;
écart : entier relatif.
En Python :
Python
nom = "Souris"
prix = 19.90
stock = 12
promo = True
ecart = -3print(type(nom), type(prix), type(stock), type(promo), type(ecart))
Complétez le tableau. Utilisez le tableau des puissances de 2 des rappels.
Nombre de bits
Nombre de valeurs
Plus grand entier naturel
4
8
10
Corrigé
La méthode. Avec n bits, on a valeurs. On commence à 0, donc le plus grand est .
Nombre de bits
Nombre de valeurs
Plus grand entier naturel
4
16
15
8
256
255
10
1 024
1 023
Exercice 2.2.2 — Les grandes tailles ★★★Sur machine
Quelle est la plus grande valeur d'un entier naturel sur 16 bits ?
Et sur 32 bits ?
Exécutez ce programme pour vérifier vos deux réponses. En Python, la puissance s'écrit ** : 2 ** 16 veut dire .
Python
print(2 ** 16 - 1)
print(2 ** 32 - 1)
Corrigé
La méthode. On calcule avec le tableau des puissances de 2.
.
.
En Python :
Python
print(2 ** 16 - 1)
print(2 ** 32 - 1)
Ce qui s'affiche
65535
4294967295
Exercice 2.2.3 — Exact ou approché ? ★★★
Dans la machine, chaque valeur est-elle rangée exactement, ou à peu près ?
L'entier 42.
Le réel 0,1.
L'entier 1024.
Le réel 0,3.
Le booléen Vrai.
Corrigé
La méthode. Un entier dans son domaine est exact. Un booléen aussi : il n'a que deux valeurs. Un réel comme 0,1 ou 0,3 n'a pas d'écriture binaire finie : il est approché.
Exact.
Approché.
Exact.
Approché.
Exact.
★★★ Niveau 2 — S'entraîner
Exercice 2.2.4 — Vérifier des bornes ★★★
Un entier relatif sur 16 bits va de -32 768 à 32 767. Vérifiez ces deux bornes avec la règle du cours.
La distance de la Terre au Soleil fait environ 150 000 000 km. Tient-elle dans un entier naturel sur 32 bits ?
Un compteur est un entier naturel sur 8 bits. Après 255, il repart à 0 : 255 + 1 donne 0, 255 + 2 donne 1. Il vaut 250. Que donne 250 + 10 ?
Corrigé
La méthode. Un entier relatif sur n bits va de à . Un entier naturel va de 0 à .
Avec n = 16 : . On va donc de -32 768 à 32 767.
Oui. , bien plus que 150 000 000.
250 + 10 = 260 dépasse 255 : c'est un dépassement de capacité. On compte : 255 + 1 donne 0, donc 250 + 6 donne 0. Il reste 4 à ajouter : on obtient 4. C'est aussi 260 − 256, car le compteur a 256 valeurs.
La vérification en Python utilise **, la puissance, et <=, « inférieur ou égal ». Vous les verrez au chapitre 3 : ici, lisez seulement le résultat.
Avec des réels, le total n'est pas exactement 7 : les centimes sont rangés à peu près. Avec des entiers, 700 centimes est exact.
Les entiers sont exacts dans leur domaine. En comptant en centimes, la caisse ne fait jamais d'erreur d'arrondi. Elle divise par 100 seulement pour afficher.
Exercice 2.2.8 — Une valeur trop grande ★★★
Un programme range une vitesse dans un entier relatif sur 16 bits. Sur un nouveau modèle de drone, la vitesse mesurée peut atteindre 40 000.
Quelle est la plus grande valeur d'un entier relatif sur 16 bits ?
La valeur 40 000 tient-elle ? Que se passe-t-il sinon ?
Pour un entier relatif, quel nombre de bits faut-il choisir : 16 ou 32 ?
Quelle vérification aurait évité le problème ?
Corrigé
La méthode. On compare la valeur avec la borne du type.
.
Non. 40 000 dépasse 32 767 : c'est un dépassement de capacité. La valeur rangée devient fausse.
32 bits : un entier relatif va alors jusqu'à 2 147 483 647.
Vérifier que la valeur reste dans le domaine du type avant de la ranger. C'est le défaut qui a détruit la fusée Ariane 5 en 1996.
Exercice 2.2.9 — Comparer deux prix ★★★Sur machine
Un site vérifie que le prix de trois câbles à 0,10 € fait bien 0,30 €.
Exécutez le programme. Le test est-il réussi ?
Expliquez le résultat.
Corrigez la ligne du test pour qu'il réussisse.
Python
prix = 0.1 * 3print(prix)
print(prix == 0.3)
Corrigé
La méthode. On ne compare jamais deux réels avec ==. On arrondit d'abord au centime.
Le test échoue :
Python
prix = 0.1 * 3print(prix)
print(prix == 0.3)
Ce qui s'affiche
0.30000000000000004
False
0,1 est rangé à peu près. Multiplié par 3, la petite erreur se voit.
Pour chaque valeur, dites si c'est une chaîne ou un nombre, et si on peut calculer avec.
"123"
123
"12.5"
12.5
Corrigé
La méthode. Les guillemets font une chaîne, quel que soit leur contenu.
Chaîne de 3 caractères : on ne calcule pas avec.
Nombre entier : on peut calculer.
Chaîne de 4 caractères : on ne calcule pas avec.
Nombre réel : on peut calculer.
★★★ Niveau 2 — S'entraîner
Exercice 2.3.4 — Une adresse mail ★★★Sur machine
On a mail = "lea.martin@lycee.fr".
Quelle est la longueur de mail ?
À quel indice est le caractère @ ? Comptez à la main.
Écrivez les instructions Python qui affichent la longueur, le premier caractère, le dernier et le caractère d'indice 10.
Exécutez pour vérifier.
Corrigé
La méthode. On compte à partir de 0. Le dernier caractère a l'indice len(mail) - 1.
19 caractères.
Le @ est à l'indice 10 :
Caractère
l
e
a
.
m
a
r
t
i
n
@
Indice
0
1
2
3
4
5
6
7
8
9
10
et 4. En Python :
Python
mail = "lea.martin@lycee.fr"print(len(mail))
print(mail[0])
print(mail[len(mail) - 1])
print(mail[10])
Ce qui s'affiche
19
l
r
@
Exercice 2.3.5 — La trace d'une chaîne ★★★
Faites la trace de cet algorithme. Donnez la valeur de chaque variable à la fin.
Pseudo-code
mot ←"RESEAU"
n ← longueur(mot)
premier ← mot[0]
dernier ← mot[n - 1]
quatrieme ← mot[3]
Corrigé
La méthode. Une colonne par variable. On compte les indices de RESEAU : R=0, E=1, S=2, E=3, A=4, U=5.
Étape
mot
n
premier
dernier
quatrieme
1
"RESEAU"
–
–
–
–
2
"RESEAU"
6
–
–
–
3
"RESEAU"
6
"R"
–
–
4
"RESEAU"
6
"R"
"U"
–
5
"RESEAU"
6
"R"
"U"
"E"
Python
mot = "RESEAU"
n = len(mot)
premier = mot[0]
dernier = mot[n - 1]
quatrieme = mot[3]
print(n, premier, dernier, quatrieme)
Ce qui s'affiche
6 R U E
Exercice 2.3.6 — Deux erreurs d'indice ★★★
Un élève veut afficher la première et la dernière lettre de "Python". Il écrit :
Python
mot = "Python"print(mot[1])
print(mot[len(mot)])
Que va afficher le premier print ? Est-ce la première lettre ?
Que se passe-t-il avec le deuxième print ?
Corrigez les deux lignes.
Corrigé
La méthode. Le premier indice est 0. Le dernier est la longueur moins 1.
mot[1] vaut y : c'est la deuxième lettre.
len(mot) vaut 6, et l'indice 6 n'existe pas. Python s'arrête sur une erreur IndexError.
La correction :
Python
mot = "Python"print(mot[0])
print(mot[len(mot) - 1])
Ce qui s'affiche
P
n
★★★ Niveau 3 — Aller plus loin
Exercice 2.3.7 — Corriger un prénom ★★★
Une fiche contient prenom ← "lea". On veut une majuscule au début. Un élève écrit :
Pseudo-code
prenom ←"lea"
prenom[0] ←"L"
Que se passe-t-il à la deuxième ligne ? Pourquoi ?
Comment obtenir "Lea" dans la variable prenom, avec une seule affectation ?
Expliquez la différence entre « modifier un caractère » et « ranger une nouvelle chaîne dans la variable ».
Corrigé
La méthode. Une chaîne n'est pas un tableau : on lit ses caractères, on ne les modifie pas. Mais la variable, elle, peut recevoir une nouvelle valeur.
C'est une erreur. On ne modifie pas un caractère d'une chaîne. En Python, le message est TypeError.
prenom ← "Lea" : on range une nouvelle chaîne entière dans la variable. L'ancienne valeur est perdue, comme pour toute affectation.
Modifier un caractère voudrait changer l'intérieur de la chaîne : c'est impossible. Ranger une nouvelle chaîne remplace toute la valeur de la variable : c'est une affectation normale.
Exercice 2.3.8 — Première et dernière lettre ★★★Sur machine
Écrivez un programme qui lit un mot au clavier, puis affiche sa longueur, sa première lettre et sa dernière lettre. Écrivez d'abord le pseudo-code, puis le Python. Testez avec Python.
Testez avec un mot d'une seule lettre, A. Que valent la première et la dernière lettre ? Pourquoi ?
L'utilisateur appuie sur Entrée sans rien taper. Que vaut la longueur ? Que se passe-t-il à l'affichage ? Pourquoi ?
Corrigé
La méthode. On lit une chaîne : pas de conversion. Le dernier indice vaut la longueur moins 1.
Pseudo-code
Écrire"Mot ?"Lire mot
n ← longueur(mot)
Écrire n, mot[0], mot[n - 1]
Python
mot = input("Mot ? ")
n = len(mot)
print(n, mot[0], mot[n - 1])
Ce qui s'affiche
Mot ? Python
6 P n
Avec A, la longueur vaut 1. L'indice du premier et du dernier caractère est le même : 0. Les deux valent A.
La chaîne vide "" a une longueur 0. Il n'y a aucun caractère : mot[0] n'existe pas. Python s'arrête sur une erreur IndexError. Un programme sérieux vérifie la longueur avant d'extraire un caractère : vous saurez le faire au chapitre 4.
Ligne 1 : int("42") est le nombre 42. On ajoute 8.
Ligne 2 : deux chaînes, elles sont collées.
Ligne 4 : int coupe la partie après la virgule. Il n'arrondit pas.
Ligne 5 : str(7) est la chaîne "7". On colle deux chaînes.
Ligne 6 : True devient 1.
int("3.5") s'arrête sur une erreur ValueError. int n'accepte que l'écriture d'un entier.
Exercice 2.4.5 — Le total d'une commande ★★★Sur machine
Complétez le programme. Il lit le prix d'un article et la quantité. Il affiche ensuite un seul message, collé avec +, par exemple Total : 37.5 €.
Testez avec 12.5 et 3.
Python
prix = input("Prix ? ") # à corriger
qte = input("Quantité ? ") # à corriger
total = 0# à remplacer par le calculprint("Total :", total) # à remplacer par un message collé avec +
Corrigé
La méthode. On convertit le texte lu en nombres pour calculer. Puis on reconvertit le résultat en texte pour le coller dans le message.
Python
prix = float(input("Prix ? "))
qte = int(input("Quantité ? "))
total = prix * qte
print("Total : " + str(total) + " €")
Ce qui s'affiche
Prix ? 12.5
Quantité ? 3
Total : 37.5 €
Attention
"Total : " + total s'arrête sur une erreur : on ne colle pas une chaîne et un nombre. Il faut str(total).
Exercice 2.4.6 — Corriger les conversions ★★★
Chaque ligne s'arrête sur une erreur. Expliquez pourquoi, puis corrigez-la.
Exercice 2.4.7 — Minutes depuis minuit ★★★Sur machine
Un badge de pointage lit l'heure et les minutes d'arrivée sous forme de texte, par exemple "14" et "35". On veut le nombre de minutes écoulées depuis minuit.
Calculez-le à la main pour 14 h 35.
Écrivez l'algorithme en pseudo-code, avec deux Lire.
Écrivez le programme Python, et testez avec 14 et 35.
Corrigé
La méthode. Une heure fait 60 minutes. On convertit les deux textes en entiers, puis on calcule heures × 60 + minutes.
14 × 60 + 35 = 840 + 35 = 875 minutes.
En pseudo-code :
Pseudo-code
Lire h
Lire m
total ← entier(h) * 60 + entier(m)
Écrire total
En Python :
Python
h = input("Heure ? ")
m = input("Minutes ? ")
total = int(h) * 60 + int(m)
print(total)
Ce qui s'affiche
Heure ? 14
Minutes ? 35
875
Exercice 2.4.8 — La note coupée ★★★Sur machine
Une note est tapée au clavier, par exemple 15.75. Le logiciel doit afficher sa partie entière, ici 15.
Pourquoi int(input("Note ? ")) s'arrête-t-il sur une erreur avec 15.75 ?
Complétez le programme en trois lignes : on lit le texte, on le change en réel, puis le réel en entier.
int arrondit-il, ou coupe-t-il ? Testez avec 15.75.
Python
texte = input("Note ? ")
reel = 0# à compléter
note = 0# à compléterprint(note)
Corrigé
La méthode.int n'accepte pas le texte "15.75". On le change d'abord en réel, puis le réel en entier.
input renvoie le texte "15.75", et int n'accepte que l'écriture d'un entier.
Exercice 2.4.9 — Le code postal qui perd son zéro ★★★
Un développeur range les codes postaux dans des entiers. Pour Bourg-en-Bresse, il écrit cp = int("01000").
Que vaut cp ?
Que donne ensuite str(cp) ? Est-ce le bon code postal ?
Quel type faut-il choisir ? Pourquoi ?
Le même développeur range l'âge en texte : age = "25". Que donne age + "1" ? Et int(age) + 1 ?
Écrivez une règle qui dit quand choisir une chaîne et quand choisir un nombre.
Corrigé
La méthode. On suit la valeur à chaque conversion.
cp vaut 1000 : un entier n'a pas de 0 au début.
str(cp) donne "1000". Ce n'est plus le bon code : le 0 est perdu pour toujours.
Une chaîne de caractères. On ne calcule jamais sur un code postal, et la chaîne garde le 0.
age + "1" colle deux chaînes : "251". int(age) + 1 donne 26.
Si on calcule avec la donnée, on choisit un nombre. Si on ne fait que la lire ou l'afficher, comme un code postal ou un numéro de téléphone, on choisit une chaîne.
La méthode. Chaque trait de fraction devient une division, avec des parenthèses autour du haut et du bas s'ils contiennent un calcul.
Les écritures en ligne :
(a + b) / (a - b)
3 * x ^ 2 + 1 en pseudo-code, 3 * x ** 2 + 1 en Python
La division passe avant l'addition : c'est , et non .
Attention
a + b / a - b n'est pas la formule a. Sans parenthèses, Python calcule d'abord b / a.
★★★ Niveau 2 — S'entraîner
Exercice 3.1.4 — Convertir une durée ★★★Sur machine
Un serveur affiche depuis combien de secondes il tourne. On veut l'afficher en heures, minutes et secondes.
Complétez le programme. Il lit un nombre de secondes et affiche les heures, les minutes et les secondes.
Testez-le avec 4000 secondes.
Python
duree = int(input("Durée en secondes ? "))
heures = 0# à compléter
reste = 0# à compléter
minutes = 0# à compléter
secondes = 0# à compléterprint(heures, "h", minutes, "min", secondes, "s")
Corrigé
La méthode. Une heure fait 3 600 secondes, une minute fait 60 secondes. On prend le quotient pour les heures, puis on travaille sur le reste.
Python
duree = int(input("Durée en secondes ? "))
heures = duree // 3600
reste = duree % 3600
minutes = reste // 60
secondes = reste % 60print(heures, "h", minutes, "min", secondes, "s")
Ce qui s'affiche
Durée en secondes ? 4000
1 h 6 min 40 s
Le calcul : 4000 = 3600 × 1 + 400, puis 400 = 60 × 6 + 40.
Exercice 3.1.5 — La moyenne pondérée ★★★
À un contrôle, la note a compte 3 fois, et la note b compte 2 fois. On dit que a a le coefficient 3, et b le coefficient 2. Pour la moyenne, on multiplie chaque note par son coefficient, on additionne, puis on divise par 3 + 2 = 5.
Écrivez la moyenne en ligne.
Calculez-la pour a = 6 et b = 2, puis pour a = 12 et b = 15.
Un élève écrit 3 * a + 2 * b / 5. Que calcule-t-il vraiment pour a = 12 et b = 15 ?
Corrigé
La méthode. La division porte sur toute la somme : il faut des parenthèses autour de la somme.
(3 * a + 2 * b) / 5
Pour 6 et 2 : (18 + 4) / 5 = 4,4. Pour 12 et 15 : (36 + 30) / 5 = 13,2.
Sans parenthèses, la division passe d'abord : 36 + 30 / 5 = 36 + 6 = 42.
Python
a = 12
b = 15print((3 * a + 2 * b) / 5)
print(3 * a + 2 * b / 5)
Ce qui s'affiche
13.2
42.0
Exercice 3.1.6 — Quel jour dans 100 jours ? ★★★
On numérote les jours : 0 pour lundi, 1 pour mardi, 2 pour mercredi, 3 pour jeudi, 4 pour vendredi, 5 pour samedi, 6 pour dimanche. Aujourd'hui, jour ← 0 : c'est lundi.
Pourquoi le reste de la division par 7 donne-t-il le jour de la semaine ?
Écrivez l'expression qui donne le numéro du jour dans n jours.
Quel jour serons-nous dans 100 jours ? Dans 31 jours ?
Corrigé
La méthode. Tous les 7 jours, on retombe sur le même jour. Seul le reste de la division par 7 compte.
7 jours plus tard, c'est encore lundi. On peut donc retirer autant de semaines entières qu'on veut : il ne reste que le reste.
(jour + n) mod 7
Dans 100 jours : 100 = 7 × 14 + 2, le reste vaut 2 : mercredi. Dans 31 jours : 31 = 7 × 4 + 3, le reste vaut 3 : jeudi.
Python
jour = 0print((jour + 100) % 7, (jour + 31) % 7)
Ce qui s'affiche
2 3
★★★ Niveau 3 — Aller plus loin
Exercice 3.1.7 — Les chiffres d'un nombre ★★★Sur machine
On lit un entier de 3 chiffres, par exemple 472. On veut ses chiffres, sans le transformer en chaîne.
Quelle expression donne le chiffre des unités ?
Quelle expression donne le chiffre des dizaines ?
Quelle expression donne le chiffre des centaines ?
Écrivez le programme Python qui affiche les trois chiffres, puis leur somme. Testez-le avec 472.
Corrigé
La méthode. Le reste de la division par 10 donne le dernier chiffre. Le quotient par 10 « efface » le dernier chiffre.
Unités : n mod 10. Pour 472 : 2.
Dizaines : (n div 10) mod 10. 472 div 10 = 47, puis 47 mod 10 = 7.
Centaines : n div 100. Pour 472 : 4.
Le programme :
Python
n = int(input("Nombre à 3 chiffres ? "))
unites = n % 10
dizaines = (n // 10) % 10
centaines = n // 100print(centaines, dizaines, unites)
print("Somme :", centaines + dizaines + unites)
Ce qui s'affiche
Nombre à 3 chiffres ? 472
4 7 2
Somme : 13
Exercice 3.1.8 — La trace d'un calcul avec div et mod ★★★
Pseudo-code
a ← 47
b ← 5
q ← a div b
r ← a mod b
a ← b
b ← r
q ← a div b
r ← a mod b
Faites la trace de cet algorithme : une colonne pour a, b, q, r.
Que valent les quatre variables à la fin ?
Vérifiez la première division : 5 × q + r redonne-t-il 47 ?
Corrigé
La méthode. On suit les lignes une par une. À chaque ligne, on utilise les valeurs de la ligne juste au-dessus.
Étape
a
b
q
r
1
47
–
–
–
2
47
5
–
–
3
47
5
9
–
4
47
5
9
2
5
5
5
9
2
6
5
2
9
2
7
5
2
2
2
8
5
2
2
1
À la fin : a vaut 5, b vaut 2, q vaut 2, r vaut 1.
Avec q = 9 et r = 2 : 5 × 9 + 2 = 47. Oui.
Python
a = 47
b = 5
q = a // b
r = a % b
a = b
b = r
q = a // b
r = a % b
print(a, b, q, r)
Ce qui s'affiche
5 2 2 1
Exercice 3.1.9 — Coder une lettre ★★★Sur machine
Cet exercice reprend le début d'un sujet de BTS. Chaque lettre a un rang : son numéro dans l'alphabet, en partant de 0.
A
B
C
D
E
F
G
H
I
J
K
L
M
0
1
2
3
4
5
6
7
8
9
10
11
12
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
13
14
15
16
17
18
19
20
21
22
23
24
25
Pour coder la lettre de rang n, on calcule le reste de la division de par 26. Ce reste est le rang de la lettre codée.
Écrivez l'expression en ligne du rang codé, avec mod.
Codez la lettre C, de rang 2.
Codez la lettre T, de rang 19.
Vérifiez en Python.
Corrigé
La méthode. On calcule , puis on prend le reste de la division par 26.
(7 * n + 5) mod 26
Pour C : 7 × 2 + 5 = 19, et 19 = 26 × 0 + 19. Le rang 19 est la lettre T. C est codé par T.
Pour T : 7 × 19 + 5 = 138, et 138 = 26 × 5 + 8. Le rang 8 est la lettre I. T est codé par I.
Python
print((7 * 2 + 5) % 26, (7 * 19 + 5) % 26)
Ce qui s'affiche
19 8
Attention
Écrivez (7 * n + 5) mod 26, avec les parenthèses. Sinon, le mod ne porte que sur 5.
Exécutez ce programme pour vérifier vos trois réponses.
Python
import math
x = 7.456print(round(x, 2), math.floor(x), math.ceil(x))
Corrigé
La méthode. Au plus près : on regarde le chiffre suivant. Par défaut : on va vers le bas. Par excès : on va vers le haut.
7,46, car le chiffre suivant, 6, fait monter.
7.
8.
Python
import math
x = 7.456print(round(x, 2), math.floor(x), math.ceil(x))
Ce qui s'affiche
7.46 7 8
Exercice 3.2.2 — L'écart de température ★★★
Un capteur mesure -3 °C la nuit et 5 °C le jour.
Quel calcul donne l'écart entre les deux, sans signe ?
Que donne abs(12 - 20) ? Et abs(20 - 12) ?
Corrigé
La méthode. La valeur absolue enlève le signe. L'écart ne dépend pas de l'ordre.
abs(-3 - 5), qui vaut abs(-8), soit 8 degrés.
Les deux valent 8.
Python
print(abs(-3 - 5), abs(12 - 20), abs(20 - 12))
Ce qui s'affiche
8 8 8
Exercice 3.2.3 — Des racines carrées ★★★
Une salle carrée a une aire de 49 m². Quelle instruction Python donne la longueur de son côté ?
Que donne math.sqrt(144) ?
Que donne round(math.sqrt(2), 2) ?
Corrigé
La méthode. Le côté d'un carré est la racine carrée de son aire. math.sqrt renvoie toujours un réel.
Python
import math
print(math.sqrt(49))
print(math.sqrt(144))
print(round(math.sqrt(2), 2))
Ce qui s'affiche
7.0
12.0
1.41
Le côté mesure 7 m. 2. 12.0. 3. 1.41.
★★★ Niveau 2 — S'entraîner
Exercice 3.2.4 — Arrondir au bon sens ★★★Sur machine
Un technicien range 130 câbles dans des cartons de 50. Un article coûte 19,987 € avant arrondi.
Combien de cartons faut-il ? Quelle fonction utiliser ?
Quel prix affiche-t-on, arrondi au centime le plus proche ?
Que donne l'arrondi par défaut de 19,987, à l'entier ?
Exécutez ce programme et comparez avec vos réponses :
Python
import math
print(math.ceil(130 / 50))
print(round(19.987, 2))
print(math.floor(19.987))
Corrigé
La méthode. On se demande dans quel sens arrondir : vers le haut, vers le bas, ou au plus près.
130 / 50 = 2,6. Un carton incomplet compte quand même : on arrondit par excès. Il faut 3 cartons, avec math.ceil.
On arrondit au plus près : 19,99 €, avec round(19.987, 2).
L'arrondi par défaut donne 19, avec math.floor.
Python
import math
print(math.ceil(130 / 50))
print(round(19.987, 2))
print(math.floor(19.987))
Ce qui s'affiche
3
19.99
19
Exercice 3.2.5 — Les pages d'un rapport ★★★Sur machine
Un rapport affiche les résultats d'une recherche, 20 lignes par page. Dans cet exercice, le nombre de lignes n'est jamais un multiple de 20 : la dernière page n'est jamais pleine.
Pour 53 lignes, combien faut-il de pages ?
Combien de lignes y a-t-il sur la dernière page ?
Écrivez un programme qui lit le nombre de lignes et affiche ces deux nombres. Testez avec 53.
Corrigé
La méthode. Une page incomplète compte : on arrondit par excès. Les lignes de la dernière page sont le reste de la division par 20.
53 / 20 = 2,65, arrondi par excès : 3 pages.
53 = 20 × 2 + 13 : 13 lignes sur la dernière page.
Python
import math
lignes = int(input("Nombre de lignes ? "))
print("Pages :", math.ceil(lignes / 20))
print("Lignes sur la dernière page :", lignes % 20)
Ce qui s'affiche
Nombre de lignes ? 53
Pages : 3
Lignes sur la dernière page : 13
Attention
Pour 60 lignes, un multiple de 20, le reste vaut 0, alors que la dernière page est pleine avec 20 lignes. C'est pour ça que l'énoncé écarte ce cas.
Exercice 3.2.6 — Le prix TTC ★★★Sur machine
Un article coûte 19,99 € hors taxes. Le prix TTC, toutes taxes comprises, est le prix hors taxes multiplié par 1,2.
Calculez à la main 19,99 × 1,2. Puis exécutez print(19.99 * 1.2) en Python et notez ce qui s'affiche. Pourquoi est-ce différent ?
Quel prix TTC affiche-t-on, au centime le plus proche ?
Un élève coupe après 2 décimales avec math.floor(prix * 100) / 100. Quel prix obtient-il ? Est-ce un arrondi au plus près ?
Python
import math
prix = 19.99 * 1.2print(prix)
Corrigé
La méthode. Le calcul sur les réels laisse une petite erreur. On arrondit à l'affichage.
Python
import math
prix = 19.99 * 1.2print(prix)
print(round(prix, 2))
print(math.floor(prix * 100) / 100)
Ce qui s'affiche
23.987999999999996
23.99
23.98
On attend 23,988. Python affiche 23.987999999999996 : c'est la petite erreur des réels.
Au plus près : 23,99 €.
23,98 € : c'est un arrondi par défaut, pas au plus près. On a coupé au lieu d'arrondir.
★★★ Niveau 3 — Aller plus loin
Exercice 3.2.7 — Simuler le hasard ★★★Sur machine
Un port est le numéro qui désigne un service sur un ordinateur, entre 0 et 65 535 : 443 pour le web sécurisé, par exemple.
Quelle instruction tire 0 ou 1, comme pile ou face ?
Un serveur choisit un port au hasard entre 1024 et 65535. Quelle instruction ?
On simule le temps de réponse d'un serveur : un réel au hasard entre 0,5 et 2 secondes. Quelle instruction ?
Exécutez le programme ci-dessous trois fois. Les résultats sont-ils les mêmes ?
Un élève simule un dé avec round(random.uniform(1, 6)). Le réel tiré va de 1 à 6. Quels réels donnent 1 une fois arrondis ? Quels réels donnent 3 ? Le tirage du dé est-il encore uniforme ?
Python
import random
print(random.randint(0, 1), random.randint(1024, 65535))
print(random.uniform(0.5, 2))
Corrigé
La méthode.random.randint(a, b) tire un entier entre a et b, les deux bornes comprises. random.uniform(a, b) tire un réel entre a et b.
random.randint(0, 1).
random.randint(1024, 65535).
random.uniform(0.5, 2).
Non : chaque exécution tire de nouveaux nombres. Ce hasard vient d'un calcul, il est pseudo-aléatoire, mais on ne peut pas le prévoir.
Arrondis au plus près, les réels de 1 à 1,5 donnent 1 : un intervalle de longueur 0,5. Les réels de 2,5 à 3,5 donnent 3 : un intervalle de longueur 1. Le 3 sort donc deux fois plus souvent que le 1. Le tirage n'est plus uniforme : pour un dé, on garde random.randint(1, 6).
Attention
Un tirage uniforme donne la même chance à chaque valeur. Arrondir un réel tiré au hasard casse cette égalité aux deux bouts de l'intervalle.
Exercice 3.2.8 — La distance entre deux points ★★★
Sur un plan, la distance entre le point A de coordonnées et le point B de coordonnées est :
Écrivez cette formule en ligne, en Python.
Calculez la distance entre A(1 ; 2) et B(4 ; 6).
Un élève écrit math.sqrt(x2 - x1 ** 2 + y2 - y1 ** 2). Quelle erreur fait-il ?
Corrigé
La méthode. La racine porte sur toute la somme. Chaque différence est élevée au carré : il faut des parenthèses autour.
Donnez la valeur de chaque comparaison, en Python.
7 > 3
10 != 10
"abc" < "abd"
4 <= 4
Corrigé
La méthode. Une comparaison vaut toujours True ou False.
True. 2. False : 10 est égal à 10. 3. True : les deux premiers caractères sont égaux, puis c vient avant d. 4. True : « plus petit ou égal » accepte l'égalité.
Python
print(7 > 3, 10 != 10, "abc" < "abd", 4 <= 4)
Ce qui s'affiche
True False True True
Exercice 3.3.2 — Les quatre opérateurs ★★★
On a a ← Vrai et b ← Faux. Donnez la valeur de :
NON a
a ET b
a OU b
a OUX b
Corrigé
La méthode. On applique la table de vérité du cours, ligne a = Vrai, b = Faux.
Faux. 2. Faux : il faut les deux vrais. 3. Vrai : un seul suffit. 4. Vrai : exactement un des deux est vrai.
Python
a = True
b = Falseprint(not a, a and b, a or b, a != b)
Ce qui s'affiche
False False True True
Exercice 3.3.3 — Majeur ? ★★★
On a majeur ← age ≥ 18.
Que vaut majeur pour age = 17 ? Pour age = 18 ?
Écrivez cette ligne en Python.
Corrigé
La méthode. La comparaison donne un booléen, qu'on range dans la variable.
Pour 17 : Faux. Pour 18 : Vrai, car ≥ accepte l'égalité.
majeur = age >= 18
Python
age = 18
majeur = age >= 18print(majeur)
Ce qui s'affiche
True
★★★ Niveau 2 — S'entraîner
Exercice 3.3.4 — Traduire une condition ★★★
Traduisez chaque règle en expression booléenne, en pseudo-code puis en Python. Puis donnez sa valeur pour les données indiquées.
« L'âge est entre 18 et 25 ans inclus. » Avec age = 30.
« Le jour est samedi ou dimanche. » Avec jour = "dimanche".
« Le stock n'est pas vide et le produit est encore vendu. » Avec stock = 0 et vendu = True.
Corrigé
La méthode. On découpe la règle en petites comparaisons, puis on les relie avec ET, OU ou NON.
Règle
Pseudo-code
Python
Valeur
1
age ≥ 18 ET age ≤ 25
age >= 18 and age <= 25
Faux
2
jour = "samedi" OU jour = "dimanche"
jour == "samedi" or jour == "dimanche"
Vrai
3
stock ≠ 0 ET vendu
stock != 0 and vendu
Faux
Règle 1 : 30 ≥ 18 est vrai, mais 30 ≤ 25 est faux. Avec ET, tout est faux.
Règle 3 : le stock vaut 0, donc stock ≠ 0 est faux. Avec ET, tout est faux.
Python
age = 30
jour = "dimanche"
stock = 0
vendu = Trueprint(age >= 18and age <= 25)
print(jour == "samedi"or jour == "dimanche")
print(stock != 0and vendu)
Ce qui s'affiche
False
True
False
Attention
jour == "samedi" or "dimanche" est une erreur : la seconde partie n'est pas une comparaison, et la condition devient vraie même un lundi. Écrivez jour == des deux côtés.
Exercice 3.3.5 — Le mot de passe accepté ★★★Sur machine
Un site accepte un mot de passe si ces trois règles sont vraies :
il fait au moins 8 caractères ;
il est différent de l'identifiant ;
il est différent du mot de passe interdit motdepasse.
Écrivez la condition accepte en pseudo-code, avec mdp, login et longueur.
Complétez le programme Python et testez-le avec l'identifiant ines et le mot de passe Sio2026!.
Sans ordinateur, que vaut accepte pour les mots de passe ines et motdepasse ?
Python
login = "ines"
mdp = input("Mot de passe ? ")
accepte = False# à compléterprint(accepte)
Corrigé
La méthode. Une règle donne une comparaison. Les trois doivent être vraies : on les relie avec ET.
En pseudo-code :
Pseudo-code
accepte ← longueur(mdp) ≥ 8 ET mdp ≠ login ET mdp ≠ "motdepasse"
En Python :
Python
login = "ines"
mdp = input("Mot de passe ? ")
accepte = len(mdp) >= 8and mdp != login and mdp != "motdepasse"print(accepte)
Ce qui s'affiche
Mot de passe ? Sio2026!
True
ines : Faux, il est trop court et égal à l'identifiant. motdepasse : Faux. Il fait bien 10 caractères, mais c'est le mot de passe interdit.
Exercice 3.3.6 — L'année bissextile ★★★
Une année est bissextile, avec un 29 février, si elle est divisible par 4 mais pas par 100, ou si elle est divisible par 400.
Traduisez cette règle en expression booléenne, en pseudo-code, avec la variable an. Mettez des parenthèses autour de chaque morceau.
Donnez sa valeur pour 2024, 1900, 2000 et 2026.
Corrigé
La méthode. « Divisible par 4 » s'écrit an mod 4 = 0. On met des parenthèses autour de la partie avec ET.
(an mod 4 = 0 ET an mod 100 ≠ 0) OU an mod 400 = 0
2024 : divisible par 4, pas par 100 : Vrai. 1900 : divisible par 100, pas par 400 : Faux. 2000 : divisible par 400 : Vrai. 2026 : pas divisible par 4 : Faux.
Python
an = 1900print((an % 4 == 0and an % 100 != 0) or an % 400 == 0)
an = 2000print((an % 4 == 0and an % 100 != 0) or an % 400 == 0)
Ce qui s'affiche
False
True
★★★ Niveau 3 — Aller plus loin
Exercice 3.3.7 — L'ordre des tests compte ★★★
On a mot ← "BTSSIO" et k ← 6.
Que vaut k < longueur(mot) ?
Que fait Python avec k < len(mot) and mot[k] == "S" ? Avec quel résultat ?
Que fait Python avec mot[k] == "S" and k < len(mot) ?
Quelle règle en tirez-vous ?
Corrigé
La méthode. Un ET s'arrête dès que le premier test est faux. La suite n'est pas lue.
6 < 6 est faux.
Le premier test est faux : Python s'arrête et donne False. Il ne lit jamais mot[6].
Python
mot = "BTSSIO"
k = 6print(k < len(mot) and mot[k] == "S")
Ce qui s'affiche
False
Python lit d'abord mot[6]. Cet indice n'existe pas : le programme s'arrête sur une erreur IndexError.
Python
mot = "BTSSIO"
k = 6print(mot[k] == "S"and k < len(mot))
On met d'abord le test qui protège, k < longueur(mot), puis celui qui lit la case.
Exercice 3.3.8 — Le contraire d'une condition ★★★
Un club donne accès à la salle si age ≥ 18 ET inscrit.
Une règle vous aide : le contraire de A ET B s'écrit NON A OU NON B. L'accès est refusé dès qu'une des deux conditions manque.
Écrivez la condition « accès refusé » avec NON devant toute la condition.
Écrivez-la avec la règle, sans NON devant la parenthèse. Le contraire de age ≥ 18 est age < 18.
Vérifiez vos deux écritures pour age = 16 et inscrit = Vrai, puis pour age = 20 et inscrit = Faux.
Corrigé
La méthode. L'accès est refusé dès qu'une des deux conditions manque. Le contraire d'un ET devient un OU, et chaque morceau est inversé.
NON (age ≥ 18 ET inscrit)
age < 18 OU NON inscrit
Pour 16 ans et inscrit : refusé, Vrai pour les deux écritures. Pour 20 ans, pas inscrit : refusé aussi, Vrai pour les deux.
Python
age = 16
inscrit = Trueprint(not (age >= 18and inscrit), age < 18ornot inscrit)
age = 20
inscrit = Falseprint(not (age >= 18and inscrit), age < 18ornot inscrit)
Ce qui s'affiche
True True
True True
Attention
Le contraire de age ≥ 18 est age < 18, et non age ≤ 18. 18 ans donne l'accès.
Exercice 3.3.9 — Le magasin est-il ouvert ? ★★★Sur machine
Un magasin est ouvert de 9 h à 12 h et de 14 h à 18 h, sauf le dimanche.
À 9 h, il est ouvert. À 12 h, il est fermé. De même, à 14 h il est ouvert, et à 18 h il est fermé.
Écrivez la condition ouvert avec les variables h, une heure entière, et jour. Mettez des parenthèses autour de chaque morceau.
Complétez le programme et testez-le avec 15 h un mardi.
Sans ordinateur : que vaut ouvert à 12 h un lundi ? À 10 h un dimanche ?
Python
h = int(input("Heure ? "))
jour = input("Jour ? ")
ouvert = False# à compléterprint(ouvert)
Corrigé
La méthode. On écrit chaque créneau avec ET, on relie les deux créneaux avec OU, puis on ajoute la règle du dimanche avec ET. Les parenthèses gardent cet ordre.
((h ≥ 9 ET h < 12) OU (h ≥ 14 ET h < 18)) ET jour ≠ "dimanche"
Python
h = int(input("Heure ? "))
jour = input("Jour ? ")
ouvert = ((h >= 9and h < 12) or (h >= 14and h < 18)) and jour != "dimanche"print(ouvert)
Ce qui s'affiche
Heure ? 15
Jour ? mardi
True
À 12 h, le magasin ferme : h < 12 est faux, Faux. Le dimanche : Faux, quelle que soit l'heure.
Python n'écrit pas le 0 de tête : 0b110 est bien 0110.
Exercice 3.4.2 — Repérer les bits ★★★
On a le nombre binaire 10110.
Que vaut le bit 0 ? Le bit 1 ? Le bit 4 ?
Quel masque désigne le bit 3, sur 5 bits ?
Corrigé
La méthode. On numérote les bits de droite à gauche, en partant de 0.
10110 se lit, de droite à gauche : bit 0 = 0, bit 1 = 1, bit 2 = 1, bit 3 = 0, bit 4 = 1.
01000 : un seul 1, au rang 3.
Exercice 3.4.3 — Tester un bit ★★★
On a x = 0b1011.
Quel masque teste le bit 2 ?
Que vaut x & masque ? Le bit 2 vaut-il 1 ?
Corrigé
La méthode. On fait un ET avec un masque qui a un seul 1, au rang testé. Si le résultat vaut 0, le bit vaut 0.
0b0100.
1011 ET 0100 donne 0000. Le résultat vaut 0 : le bit 2 vaut 0.
Python
x = 0b1011
print(x & 0b0100)
Ce qui s'affiche
0
★★★ Niveau 2 — S'entraîner
Exercice 3.4.4 — Les droits d'un fichier ★★★
Les droits d'un fichier tiennent sur 3 bits : le bit 2 pour lire, le bit 1 pour écrire, le bit 0 pour exécuter. Un fichier a les droits droits = 0b110.
Quels droits a-t-il ?
Avec quel masque et quel opérateur teste-t-on le droit d'exécuter ? Quel est le résultat ?
Comment ajouter le droit d'exécuter ? Quel résultat ?
Comment retirer le droit d'écrire, en partant de 0b110 ? Quel résultat ?
Comment inverser le droit de lire, en partant de 0b110 ? Quel résultat ?
Corrigé
La méthode. On place un 1 dans le masque au rang du bit qu'on veut toucher. Puis on choisit l'opérateur selon l'action.
110 : lire oui, écrire oui, exécuter non.
Masque 0b001, opérateur ET : 110 ET 001 donne 0. Le droit d'exécuter est absent.
OU avec le masque 001 : 110 OU 001 donne 111.
On inverse d'abord le masque 010, bit par bit. Le 0 du bit 2 devient 1, le 1 du bit 1 devient 0, le 0 du bit 0 devient 1. On obtient 101. Puis 110 ET 101 donne 100.
Exercice 3.4.7 — Le réseau d'une adresse ★★★Sur machine
Une adresse IP est l'adresse d'un ordinateur sur un réseau. Elle s'écrit avec 4 nombres de 0 à 255, comme 192.168.1.198.
Un réseau découpe ces nombres avec un masque : les bits à 1 du masque désignent le réseau, les bits à 0 désignent l'ordinateur. Deux ordinateurs sont dans le même réseau si leur nombre ET le masque donne le même résultat.
On regarde seulement le dernier nombre, avec le masque 11000000, soit 192.
L'ordinateur A a le nombre 198, soit 11000110. Calculez 11000110 ET 11000000, rang par rang, puis en décimal.
L'ordinateur B a le nombre 230, soit 11100110. Calculez 230 ET 192.
L'ordinateur C a le nombre 70, soit 01000110. Calculez 70 ET 192.
Quels ordinateurs sont dans le même réseau que A ? Vérifiez vos calculs en Python.
Python
print(198 & 192, 230 & 192, 70 & 192)
Corrigé
La méthode. Le ET avec le masque garde les bits où le masque vaut 1, et met les autres à 0. On compare ensuite les résultats.
11000110 ET 11000000 donne 11000000, soit 128 + 64 = 192.
11100110 ET 11000000 donne 11000000, soit 192.
01000110 ET 11000000 donne 01000000, soit 64.
A et B donnent 192 : ils sont dans le même réseau. C donne 64 : il est dans un autre réseau.
Python
print(198 & 192, 230 & 192, 70 & 192)
Ce qui s'affiche
192 192 64
Le masque garde les 2 bits de gauche, qui désignent le réseau. Il efface les 6 bits de droite, qui changent d'un ordinateur à l'autre.
Exercice 3.4.8 — Tester deux bits à la fois ★★★
Un registre d'alarmes tient sur 8 bits. Le bit 1 signale « porte ouverte », le bit 2 signale « mouvement ».
Quel masque désigne les bits 1 et 2 ensemble ?
Pour x = 0b10110110, que vaut x ET masque ? Et pour x = 0b10110010 ?
Écrivez l'expression booléenne « les deux alarmes sont allumées », avec x et le masque.
Écrivez l'expression « au moins une des deux alarmes est allumée ».
Donnez la valeur des deux expressions pour les deux valeurs de x.
Corrigé
La méthode. Le ET avec le masque garde seulement les bits 1 et 2. Les deux sont à 1 si le résultat est égal au masque. Au moins un est à 1 si le résultat n'est pas nul.
00000110, soit 0b110 : un 1 au bit 1 et au bit 2.
10110110 ET 00000110 donne 00000110. 10110010 ET 00000110 donne 00000010.
(x ET 0b110) = 0b110
(x ET 0b110) ≠ 0
Pour 10110110 : les deux sont vraies. Pour 10110010 : « les deux » est faux, car seul le bit 1 est à 1. « Au moins une » est vrai.
En Python, les parenthèses autour de x & 0b110 sont obligatoires. Sans elles, Python compare d'abord 0b110 == 0b110, puis fait le ET : le résultat est faux.
Exercice 3.4.9 — Les options d'un objet connecté ★★★Sur machine
Une montre range ses options sur 4 bits : bit 0 = wifi, bit 1 = bluetooth, bit 2 = GPS, bit 3 = NFC. NFC veut dire Near Field Communication : c'est le paiement sans contact. Au départ, options = 0.
Répondez d'abord sur papier.
On allume le wifi et le GPS d'un seul coup. Quel masque, quel opérateur ?
On teste le GPS. Quel calcul ?
On éteint le wifi. Quel calcul ?
On inverse le NFC. Quel calcul ?
Faites la trace de options en binaire.
Complétez le programme : remplacez chaque 0 marqué « à compléter » par le bon masque. Exécutez-le et comparez avec votre trace.
Python
options = 0
options = options | 0# masque à compléterprint(bin(options))
print(options & 0) # masque à compléter
options = options & ~0# masque à compléterprint(bin(options))
options = options ^ 0# masque à compléterprint(bin(options))
Corrigé
La méthode. Un masque peut avoir plusieurs 1 : il touche alors plusieurs bits à la fois.
OU avec 0101, qui a un 1 au bit 0 et au bit 2.
options ET 0100. Le résultat n'est pas nul : le GPS est allumé.
mail[:p] prend les indices 0 à 10 : le @, à l'indice 11, est exclu.
mail[p + 1:] commence juste après le @ et va jusqu'à la fin.
Attention
mail[p:] donnerait @lycee-sio.fr, avec le @. Il faut partir de p + 1.
Exercice 3.5.5 — Le nom et l'extension d'un fichier ★★★Sur machine
On lit un nom de fichier, comme rapport.pdf. Il contient un seul point.
Comment trouver la position p du point ?
Comment extraire le nom, avant le point ? L'extension, après ?
Complétez le programme et testez-le avec rapport.pdf.
Python
fichier = input("Nom du fichier ? ")
p = 0# à compléter : la position du point
nom = ""# à compléter
extension = ""# à compléterprint(nom, extension)
Corrigé
La méthode. Même idée que pour une adresse mail : le point sépare deux morceaux.
p = fichier.find(".").
Le nom : fichier[:p]. L'extension : fichier[p + 1:].
Python
fichier = input("Nom du fichier ? ")
p = fichier.find(".")
nom = fichier[:p]
extension = fichier[p + 1:]
print(nom, extension)
Ce qui s'affiche
Nom du fichier ? rapport.pdf
rapport pdf
Exercice 3.5.6 — Construire un message ★★★
On a prenom = "Tom" et total = 42.456.
Construisez par concaténation le message Tom doit 42.46 €.
Pourquoi faut-il str ?
Pourquoi faut-il round ?
Corrigé
La méthode. On ne colle que des chaînes. On arrondit le nombre, puis on le change en chaîne.
Python
prenom = "Tom"
total = 42.456print(prenom + " doit " + str(round(total, 2)) + " €")
Ce qui s'affiche
Tom doit 42.46 €
+ refuse de coller une chaîne et un nombre : str change le nombre en texte.
Sans round, on afficherait toutes les décimales : 42.456.
★★★ Niveau 3 — Aller plus loin
Exercice 3.5.7 — Retourner une date ★★★Sur machine
Une date arrive au format 18/10/2026, toujours avec 2 chiffres pour le jour et le mois. Un logiciel attend le format 2026-10-18.
Quels indices donnent le jour ? Le mois ? L'année ?
Construisez la date au nouveau format par concaténation.
Le mois doit aussi servir à un calcul. Comment obtenir le mois sous forme d'entier ?
Complétez le programme et testez-le avec 18/10/2026.
Python
date = input("Date (jj/mm/aaaa) ? ")
nouvelle = ""# à compléter
mois = 0# à compléterprint(nouvelle)
print("Mois suivant :", mois + 1)
Corrigé
La méthode. Le format est fixe : chaque morceau est toujours au même endroit. On extrait avec des tranches.
Jour : indices 0 et 1, date[:2]. Mois : indices 3 et 4, date[3:5]. Année : indices 6 à 9, date[6:].
date[6:] + "-" + date[3:5] + "-" + date[:2]
int(date[3:5]) : on change le texte "10" en entier 10.
Python
date = input("Date (jj/mm/aaaa) ? ")
nouvelle = date[6:] + "-" + date[3:5] + "-" + date[:2]
mois = int(date[3:5])
print(nouvelle)
print("Mois suivant :", mois + 1)
Ce qui s'affiche
Date (jj/mm/aaaa) ? 18/10/2026
2026-10-18
Mois suivant : 11
Exercice 3.5.8 — Une adresse du réseau local ? ★★★
Une adresse IP commence par 192.168. quand elle appartient à un réseau local. On a ip = "192.168.1.25".
Écrivez un test avec une tranche de ip.
Un élève écrit ip.find("192.168.") != -1. Que vaut ce test pour "10.192.168.5" ? Est-ce juste ?
Écrivez un test avec find qui vérifie que l'adresse commence par 192.168..
Corrigé
La méthode. « Commence par » veut dire : le motif est à l'indice 0. Être présent ailleurs ne suffit pas.
ip[:8] == "192.168." : 192.168. fait 8 caractères.
Le motif est présent, à l'indice 3 : le test vaut Vrai. C'est faux : cette adresse ne commence pas par 192.168..
ip.find("192.168.") == 0.
Python
ip = "192.168.1.25"
autre = "10.192.168.5"print(ip[:8] == "192.168.", ip.find("192.168.") == 0)
print(autre.find("192.168.") != -1, autre.find("192.168.") == 0)
Ce qui s'affiche
True True
True False
Exercice 3.5.9 — Fabriquer un identifiant ★★★Sur machine
Un lycée fabrique l'identifiant d'un élève ainsi : la première lettre du prénom, puis les 7 premières lettres du nom, au plus. Il ajoute @lycee.fr pour l'adresse mail.
Quelle instruction donne la première lettre du prénom ?
Que donne nom[:7] pour martin ? Pour fontaine-dupont ?
Écrivez le programme qui lit le prénom et le nom, puis affiche l'adresse mail. Testez avec ines et fontaine-dupont.
Ajoutez la variable court, qui vaut Vrai si l'identifiant fait au plus 6 caractères.
Python
prenom = input("Prénom ? ")
nom = input("Nom ? ")
identifiant = ""# à compléterprint(identifiant + "@lycee.fr")
Corrigé
La méthode. On extrait les morceaux avec des tranches, puis on les colle. Une tranche qui dépasse la fin s'arrête simplement au dernier caractère.
prenom[0].
martin a 6 lettres : nom[:7] donne martin en entier. fontaine-dupont donne fontain.
On veut afficher la mention d'un étudiant selon sa moyenne :
16 ou plus : « Très bien » ;
14 ou plus : « Bien » ;
12 ou plus : « Assez bien » ;
10 ou plus : « Passable » ;
sinon : « Non admis ».
Écrivez l'algorithme en pseudo-code avec Si … Sinon si … Sinon.
Qu'affiche-t-il pour une moyenne de 13,5 ? Et de 16 ?
Un collègue a écrit les tests dans l'ordre inverse, en commençant par moyenne ≥ 10. Qu'affiche sa version pour 16 ? Pourquoi ?
Corrigé
La méthode. On teste le seuil le plus haut d'abord. Le premier test vrai gagne.
L'algorithme :
Pseudo-code
Lire moyenne
Si moyenne ≥ 16 AlorsÉcrire"Très bien"Sinon si moyenne ≥ 14 AlorsÉcrire"Bien"Sinon si moyenne ≥ 12 AlorsÉcrire"Assez bien"Sinon si moyenne ≥ 10 AlorsÉcrire"Passable"SinonÉcrire"Non admis"Fin de Si
Pour 13,5 : les deux premiers tests sont faux, le troisième est vrai. On affiche « Assez bien ». Pour 16 : « Très bien ».
Sa version affiche « Passable » pour 16. Le test 16 ≥ 10 est vrai, et c'est le premier : les autres ne sont jamais lus.
Pour un client normal, on tape n : le programme affiche Frais : 2.5 €. Python n'écrit pas le zéro de fin : 2,50 € s'affiche 2.5, et 4,90 € s'affiche 4.9.
Exercice 4.1.9 — Le type de triangle ★★★
Un programme lit les trois côtés a, b, c d'un triangle. Il affiche :
« équilatéral » si les trois côtés sont égaux ;
« isocèle » si exactement deux côtés sont égaux ;
« quelconque » sinon.
Voici la version d'un stagiaire :
Pseudo-code
Si a = b OU b = c OU a = c AlorsÉcrire"isocèle"Sinon si a = b ET b = c AlorsÉcrire"équilatéral"SinonÉcrire"quelconque"Fin de Si
Qu'affiche ce programme pour a = 5, b = 5, c = 5 ? Est-ce juste ?
Expliquez l'erreur.
Corrigez l'algorithme.
Corrigé
La méthode. On teste chaque cas à la main. Le premier test vrai gagne : l'ordre des tests compte.
Pour 5, 5, 5 : a = b est vrai, donc le premier test est vrai. Le programme affiche « isocèle ». C'est faux : le triangle est équilatéral.
Un triangle équilatéral a aussi deux côtés égaux : il passe le premier test. Le cas « équilatéral » n'est jamais atteint.
On met le cas le plus précis en premier :
Pseudo-code
Si a = b ET b = c AlorsÉcrire"équilatéral"Sinon si a = b OU b = c OU a = c AlorsÉcrire"isocèle"SinonÉcrire"quelconque"Fin de Si
Python
a = 5
b = 5
c = 5if a == b and b == c:
print("équilatéral")
elif a == b or b == c or a == c:
print("isocèle")
else:
print("quelconque")
Ce qui s'affiche
équilatéral
4.2 — Répéter un nombre connu de fois : la boucle Pour
Exercice 4.2.1 — La table de multiplication ★★★Sur machine
On veut afficher la table de 7, de 7 × 1 à 7 × 10, une ligne par calcul : 7 x 1 = 7.
Complétez l'algorithme.
Pseudo-code
Pour i allant de . . . à . . . FaireÉcrire 7, "x", i, "=", . . .
Fin de Pour
Corrigez le programme Python, puis exécutez-le.
Python
for i inrange(1, 2): # à corrigerprint(7, "x", i, "=", 0) # à compléter
Corrigé
La méthode. On connaît le nombre de tours, 10 : c'est une boucle Pour.
Pour i allant de 1 à 10 Faire, et on affiche 7 * i.
En Python, la borne de droite est exclue : on écrit range(1, 11).
Python
for i inrange(1, 11):
print(7, "x", i, "=", 7 * i)
Ce qui s'affiche
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70
Attention
Avec range(1, 10), la ligne 7 x 10 manque : la borne 10 est exclue.
Exercice 4.2.2 — Trace d'une boucle Pour ★★★
Pseudo-code
s ← 0
Pour i allant de 1 à 4 Faire
s ← s + 2 * i
Fin de PourÉcrire s
Faites la trace : une ligne par tour, avec i et s.
Qu'affiche l'algorithme ?
Corrigé
La méthode. Une ligne de départ, puis une ligne par tour. À chaque tour, on lit s dans la ligne du dessus.
La trace :
Étape
i
s
départ
–
0
tour 1
1
2
tour 2
2
6
tour 3
3
12
tour 4
4
20
L'algorithme affiche 20.
Python
s = 0for i inrange(1, 5):
s = s + 2 * i
print("i =", i, "s =", s)
Ce qui s'affiche
i = 1 s = 2
i = 2 s = 6
i = 3 s = 12
i = 4 s = 20
Exercice 4.2.3 — Combien de tours ? ★★★
Pour chaque boucle, donnez le nombre de tours et les valeurs prises par le compteur.
Pour i allant de 3 à 8 Faire
for i in range(2, 10):
for i in range(5):
Pour k allant de 0 à longueur("BTSSIO") - 1 Faire
Corrigé
La méthode. En pseudo-code, les deux bornes sont prises. En Python, range exclut la borne de droite, et part de 0 si on ne donne qu'un nombre.
6 tours : 3, 4, 5, 6, 7, 8.
8 tours : 2, 3, 4, 5, 6, 7, 8, 9.
5 tours : 0, 1, 2, 3, 4.
6 tours : 0, 1, 2, 3, 4, 5. Ce sont les indices de la chaîne.
Python
for i inrange(5):
print(i)
Ce qui s'affiche
0
1
2
3
4
★★★ Niveau 2 — S'entraîner
Exercice 4.2.4 — Compter une lettre ★★★
On veut compter combien de fois la lettre e apparaît dans le mot "developpement".
Complétez l'algorithme.
Pseudo-code
mot ←"developpement"
compt ← . . .
Pour i allant de 0 à . . . FaireSi mot[i] = "e"Alors
. . .
Fin de SiFin de PourÉcrire compt
Que vaut compt à la fin ? Donnez les indices des e.
Corrigé
La méthode. C'est un compteur : il part de 0 avant la boucle, et on ajoute 1 à chaque e trouvé. On lit tous les indices du mot.
L'algorithme complet :
Pseudo-code
mot ←"developpement"
compt ← 0
Pour i allant de 0 à longueur(mot) - 1 FaireSi mot[i] = "e"Alors
compt ← compt + 1
Fin de SiFin de PourÉcrire compt
Les e sont aux indices 1, 3, 8 et 10 : compt vaut 4.
Python
mot = "developpement"
compt = 0for i inrange(len(mot)):
if mot[i] == "e":
compt = compt + 1print(compt)
Ce qui s'affiche
4
Exercice 4.2.5 — Compter les voyelles ★★★Sur machine
On veut compter les voyelles d'un mot lu au clavier. Les voyelles sont a, e, i, o, u, y, en minuscules ou en majuscules.
L'idée : on range toutes les voyelles dans une chaîne voyelles. Pour chaque caractère du mot, on le cherche dans cette chaîne. position(voyelles, mot[i]) renvoie -1 si le caractère n'est pas dans voyelles : ce n'est pas une voyelle.
Complétez les pointillés.
Pseudo-code
Lire mot
voyelles ←"aeiouyAEIOUY"
cpt ← . . .
Pour i allant de 0 à . . . FaireSi position(voyelles, mot[i]) ≠ -1 Alors
. . .
Fin de SiFin de PourÉcrire cpt
Que donne l'algorithme pour Algorithmique ? Listez les voyelles trouvées.
Écrivez le programme en Python. Testez-le avec Algorithmique, Python, SIO et Crypt.
Corrigé
La méthode.position(voyelles, mot[i]) ≠ -1 veut dire : le caractère est dans la liste des voyelles. On compte ces caractères.
L'algorithme complet :
Pseudo-code
Lire mot
voyelles ←"aeiouyAEIOUY"
cpt ← 0
Pour i allant de 0 à longueur(mot) - 1 FaireSi position(voyelles, mot[i]) ≠ -1 Alors
cpt ← cpt + 1
Fin de SiFin de PourÉcrire cpt
Dans Algorithmique, on trouve A, o, i, i, u, e : 6 voyelles.
En Python :
Python
mot = input("Mot ? ")
voyelles = "aeiouyAEIOUY"
cpt = 0for i inrange(len(mot)):
if voyelles.find(mot[i]) != -1:
cpt = cpt + 1print(cpt)
Ce qui s'affiche
Mot ? Algorithmique
6
Mot
Voyelles
Résultat
Algorithmique
A, o, i, i, u, e
6
Python
y, o
2
SIO
I, O
2
Crypt
y
1
Exercice 4.2.6 — Le mot à l'envers ★★★
On veut écrire un mot à l'envers : "SIO" devient "OIS".
Idée : on part d'une chaîne vide. À chaque tour, on colle la lettre lue devant ce qu'on a déjà.
Complétez l'algorithme.
Pseudo-code
mot ←"SIO"
envers ←""Pour i allant de 0 à longueur(mot) - 1 Faire
envers ← . . .
Fin de PourÉcrire envers
Faites la trace pour "SIO".
Que donne l'algorithme pour "radar" ? Qu'a ce mot de particulier ?
Corrigé
La méthode.mot[i] + envers colle la nouvelle lettre devant. La dernière lettre lue se retrouve donc en premier.
envers ← mot[i] + envers
La trace :
Étape
i
mot[i]
envers
départ
–
–
""
tour 1
0
S
"S"
tour 2
1
I
"IS"
tour 3
2
O
"OIS"
"radar" donne "radar" : ce mot se lit pareil dans les deux sens.
Python
mot = "SIO"
envers = ""for i inrange(len(mot)):
envers = mot[i] + envers
print(envers)
Ce qui s'affiche
OIS
Attention
envers ← envers + mot[i] colle la lettre derrière : on retrouve le mot dans le même ordre.
★★★ Niveau 3 — Aller plus loin
Exercice 4.2.7 — Le bit de parité ★★★Sur machine
Pour détecter une erreur de transmission, on ajoute un bit à la fin d'un code binaire :
si le code contient un nombre pair de « 1 », on ajoute "0" ;
sinon, on ajoute "1".
Écrivez l'algorithme qui part de code ← "1011001" et affiche le code complété.
Quel est le code complété pour "1011001" ? Pour "1100000" ?
Écrivez-le en Python et testez-le.
À l'arrivée, le récepteur vérifie le code de 8 bits : il doit contenir un nombre pair de « 1 ». Il reçoit "10110011". Le code est-il arrivé intact ? Avec quel calcul de votre algorithme le savez-vous ?
Corrigé
La méthode. Deux temps. D'abord, une boucle compte les « 1 ».
Ensuite, le reste de la division du compteur par 2 dit s'il est pair. On colle le bon bit au bout.
L'algorithme :
Pseudo-code
code ←"1011001"
compt ← 0
Pour i allant de 0 à longueur(code) - 1 FaireSi code[i] = "1"Alors
compt ← compt + 1
Fin de SiFin de PourSi compt mod 2 = 0 Alors
code ← code + "0"Sinon
code ← code + "1"Fin de SiÉcrire code
"1011001" contient quatre « 1 », un nombre pair : on obtient "10110010". "1100000" contient deux « 1 » : "11000000".
On compte les « 1 » de "10110011" : 1, 0, 1, 1, 0, 0, 1, 1, soit cinq « 1 ». Cinq est impair : un bit a changé pendant le transport. On réutilise la boucle de comptage et le test compt mod 2 = 0, sans ajouter de bit.
Le sujet du BTS 2024 pose exactement cette question : voyez l'onglet Annales.
Exercice 4.2.8 — Le mot de passe sécurisé ★★★Sur machine
Un mot de passe est valide s'il a au moins 8 caractères, au moins une majuscule et au moins un chiffre.
Pour « au moins une majuscule », on utilise un drapeau : un booléen qui vaut Faux au départ. Dès qu'on trouve une majuscule, il passe à Vrai, et il le reste.
Les caractères se comparent par leur code : les chiffres d'abord, puis les majuscules, puis les minuscules. Les majuscules de "A" à "Z" se suivent.
Donc un caractère ch est une majuscule si ch ≥ "A" ET ch ≤ "Z". C'est un chiffre si ch ≥ "0" ET ch ≤ "9".
Complétez l'algorithme.
Pseudo-code
Lire m
maj ← Faux
chiffre ← Faux
Pour i allant de 0 à longueur(m) - 1 Faire
ch ← m[i]
Si ch ≥ "A"ET ch ≤ "Z"Alors
. . .
Fin de SiSi . . . Alors
chiffre ← Vrai
Fin de SiFin de Pour
valide ← longueur(m) ≥ 8 ET . . .
Écrire valide
Que donne l'algorithme pour Sio2026!, motdepasse1 et ABCD12 ? Présentez les résultats dans un tableau.
Écrivez le programme en Python et testez-le.
Corrigé
La méthode. Un drapeau par règle « au moins un ». La boucle peut les faire passer à Vrai. À la fin, on relie toutes les règles avec ET.
L'algorithme complet :
Pseudo-code
Lire m
maj ← Faux
chiffre ← Faux
Pour i allant de 0 à longueur(m) - 1 Faire
ch ← m[i]
Si ch ≥ "A"ET ch ≤ "Z"Alors
maj ← Vrai
Fin de SiSi ch ≥ "0"ET ch ≤ "9"Alors
chiffre ← Vrai
Fin de SiFin de Pour
valide ← longueur(m) ≥ 8 ET maj ET chiffre
Écrire valide
Les trois mots de passe :
Mot de passe
8 caractères
Majuscule
Chiffre
Valide
Sio2026!
oui
oui
oui
Vrai
motdepasse1
oui
non
oui
Faux
ABCD12
non
oui
oui
Faux
En Python :
Python
m = input("Mot de passe ? ")
maj = False
chiffre = Falsefor i inrange(len(m)):
ch = m[i]
if ch >= "A"and ch <= "Z":
maj = Trueif ch >= "0"and ch <= "9":
chiffre = True
valide = len(m) >= 8and maj and chiffre
print(valide)
Ce qui s'affiche
Mot de passe ? Sio2026!
True
Attention
N'écrivez pas Sinon maj ← Faux dans la boucle : une seule lettre minuscule effacerait la majuscule trouvée avant.
Exercice 4.2.9 — Compter les diviseurs ★★★
Un diviseur de n est un entier i tel que n mod i = 0. Un nombre premier est un entier qui a exactement deux diviseurs : 1 et lui-même.
Écrivez un algorithme qui lit n, compte ses diviseurs entre 1 et n, puis affiche ce nombre.
Faites la trace pour n = 6. Que vaut le compteur à la fin ?
Ajoutez à la fin un test qui affiche « premier » ou « pas premier ».
Que donne l'algorithme pour 13 ?
Corrigé
La méthode. On essaie chaque i de 1 à n. Si n mod i = 0, c'est un diviseur : on compte. Le test « premier » se fait après la boucle, une seule fois.
et 3. L'algorithme :
Pseudo-code
Lire n
compt ← 0
Pour i allant de 1 à n FaireSi n mod i = 0 Alors
compt ← compt + 1
Fin de SiFin de PourÉcrire compt
Si compt = 2 AlorsÉcrire"premier"SinonÉcrire"pas premier"Fin de Si
La trace pour 6 :
i
6 mod i
compt
1
0
1
2
0
2
3
0
3
4
2
3
5
1
3
6
0
4
Le compteur vaut 4 : 6 a quatre diviseurs, 1, 2, 3 et 6. Il n'est pas premier.
13 a deux diviseurs, 1 et 13 : l'algorithme affiche 2, puis « premier ».
Python
n = int(input("n ? "))
compt = 0for i inrange(1, n + 1):
if n % i == 0:
compt = compt + 1print(compt)
if compt == 2:
print("premier")
else:
print("pas premier")
Ce qui s'affiche
n ? 13
2
premier
Le sujet du BTS 2022 pose cette question avec la fonction Div : voyez l'onglet Annales.
4.3 — Répéter tant que : les boucles Tant que et Répéter
n ← 100
tours ← 0
Tant que n > 1 Faire
n ← n div 3
tours ← tours + 1
Fin de Tant queÉcrire n, tours
Faites la trace : une ligne par test de la condition.
Qu'affiche l'algorithme ?
Corrigé
La méthode. On teste la condition avant chaque tour. On s'arrête dès qu'elle est fausse.
La trace :
Étape
n
tours
n > 1 ?
départ
100
0
Vrai
tour 1
33
1
Vrai
tour 2
11
2
Vrai
tour 3
3
3
Vrai
tour 4
1
4
Faux : on sort
L'algorithme affiche 1 4.
Python
n = 100
tours = 0while n > 1:
n = n // 3
tours = tours + 1print(n, tours)
Ce qui s'affiche
1 4
Exercice 4.3.2 — Un Pour écrit avec Tant que ★★★
Pseudo-code
Pour i allant de 1 à 3 FaireÉcrire i * 10
Fin de Pour
Réécrivez cette boucle avec un Tant que. N'oubliez ni la valeur de départ de i, ni la ligne qui le fait avancer.
Faites la trace des deux versions. Affichent-elles la même chose ?
Corrigé
La méthode. On suit l'encadré du cours : i part de 1 avant la boucle, la condition est i ≤ 3, et i ← i + 1 termine chaque tour.
La version Tant que :
Pseudo-code
i ← 1
Tant que i ≤ 3 FaireÉcrire i * 10
i ← i + 1
Fin de Tant que
La trace de la version Tant que :
Étape
i
i ≤ 3 ?
Affiché
départ
1
Vrai
tour 1
2
Vrai
10
tour 2
3
Vrai
20
tour 3
4
Faux : on sort
30
La boucle Pour affiche aussi 10, 20, 30 : les deux versions font la même chose. Seule différence : après le Tant que, i vaut 4.
Python
i = 1while i <= 3:
print(i * 10)
i = i + 1
Ce qui s'affiche
10
20
30
Attention
Sans i ← i + 1, i reste à 1 : la condition est toujours vraie, c'est une boucle infinie.
Exercice 4.3.3 — Une note contrôlée ★★★Sur machine
On veut lire une note. Tant qu'elle n'est pas entre 0 et 20, on la redemande.
Complétez l'algorithme.
Pseudo-code
RépéterÉcrire"Note sur 20 ?"Lire note
Jusqu'à note ≥ 0 ET . . .
Écrire"Note enregistrée :", note
Complétez la condition du programme Python, puis testez-le en tapant 25, puis -3, puis 14.
Python
whileTrue:
note = float(input("Note sur 20 ? "))
if note >= 0: # à compléterbreakprint("Note enregistrée :", note)
Corrigé
La méthode. Répéter s'arrête quand la condition est vraie : on écrit la condition d'une bonne note.
Jusqu'à note ≥ 0 ET note ≤ 20
En Python :
Python
whileTrue:
note = float(input("Note sur 20 ? "))
if note >= 0and note <= 20:
breakprint("Note enregistrée :", note)
Ce qui s'affiche
Note sur 20 ? 25
Note sur 20 ? -3
Note sur 20 ? 14
Note enregistrée : 14.0
Attention
Avec seulement note >= 0, la note 25 serait acceptée. Les deux bornes doivent être testées.
★★★ Niveau 2 — S'entraîner
Exercice 4.3.4 — Chercher une lettre ★★★
Cette fonction cherche la première position d'une lettre dans une chaîne. Si la lettre est absente, elle renvoie la longueur de la chaîne.
Pseudo-code
Fonction chercher(lettre, chaine)
k ← 0
Tant que k < longueur(chaine) ET chaine[k] ≠ lettre Faire
k ← k + 1
Fin de Tant queRenvoyer k
Fin de Fonction
Faites la trace de chercher("I", "BTSSIO"). Que renvoie-t-elle ?
Que renvoie chercher("A", "BTSSIO") ? Pourquoi la boucle s'arrête-t-elle ?
Que se passerait-il sans la condition k < longueur(chaine) ?
Corrigé
La méthode. On fait une ligne de trace par test de la condition.
La trace :
k
chaine[k]
chaine[k] ≠ "I"
On continue ?
0
B
Vrai
oui
1
T
Vrai
oui
2
S
Vrai
oui
3
S
Vrai
oui
4
I
Faux
non
La fonction renvoie 4.
A n'est jamais trouvé. k monte jusqu'à 6. Alors k < 6 est faux, la boucle s'arrête : la fonction renvoie 6, la longueur.
Sans ce test, on lirait chaine[6], qui n'existe pas : erreur IndexError.
On vérifie avec le même calcul, sans fonction :
Python
lettre = "A"
chaine = "BTSSIO"
k = 0while k < len(chaine) and chaine[k] != lettre:
k = k + 1print(k)
Ce qui s'affiche
6
Attention
L'ordre des deux tests compte. Le ET s'arrête dès que k < len(chaine) est faux : chaine[k] n'est jamais lu hors de la chaîne.
Exercice 4.3.5 — Quotient et reste par soustractions ★★★Sur machine
On veut le quotient et le reste de la division de a par b sans utiliser div ni mod. Idée : on enlève b à a tant que c'est possible, et on compte les soustractions.
Complétez l'algorithme.
Pseudo-code
Lire a
Lire b
q ← 0
Tant que a ≥ . . . Faire
a ← . . .
q ← . . .
Fin de Tant queÉcrire"quotient :", q, "reste :", a
Faites la trace pour a = 47 et b = 15.
Écrivez le programme en Python. Vérifiez avec 47 // 15 et 47 % 15.
Corrigé
La méthode. Chaque tour enlève une fois b : le nombre de tours est le quotient. Ce qui reste à la fin est le reste.
L'algorithme complet :
Pseudo-code
Lire a
Lire b
q ← 0
Tant que a ≥ b Faire
a ← a - b
q ← q + 1
Fin de Tant queÉcrire"quotient :", q, "reste :", a
La trace :
Étape
a
q
a ≥ 15 ?
départ
47
0
Vrai
tour 1
32
1
Vrai
tour 2
17
2
Vrai
tour 3
2
3
Faux : on sort
Quotient 3, reste 2 : .
En Python :
Python
a = int(input("a ? "))
b = int(input("b ? "))
print(a // b, a % b)
q = 0while a >= b:
a = a - b
q = q + 1print("quotient :", q, "reste :", a)
Ce qui s'affiche
a ? 47
b ? 15
3 2
quotient : 3 reste : 2
Exercice 4.3.6 — Le disque qui se remplit ★★★
Un serveur stocke 1 Go de journaux le premier jour. Chaque jour, la taille des journaux double : c'est la suite , avec . Le disque fait 1 000 Go.
Complétez l'algorithme qui cherche le premier jour où la taille dépasse 1 000 Go.
Pseudo-code
taille ← 1
jours ← 1
Tant que taille ≤ . . . Faire
taille ← . . .
jours ← jours + 1
Fin de Tant queÉcrire jours, taille
Qu'affiche-t-il ?
Pourquoi une boucle Pour ne convient-elle pas ici ?
Corrigé
La méthode. On double la taille à chaque tour, et on compte les jours, tant qu'on ne dépasse pas 1 000.
Tant que taille ≤ 1000 Faire et taille ← taille * 2. Cette ligne calcule le terme suivant de la suite.
Les tailles sont 1, 2, 4, 8, … 512, puis 1 024. Il affiche 11 1024 : le 11ᵉ jour est le premier où la taille dépasse 1 000 Go.
On ne sait pas d'avance combien de jours il faudra : c'est le résultat qu'on cherche.
Python
taille = 1
jours = 1while taille <= 1000:
taille = taille * 2
jours = jours + 1print(jours, taille)
Ce qui s'affiche
11 1024
★★★ Niveau 3 — Aller plus loin
Exercice 4.3.7 — La boucle qui ne s'arrête pas ★★★
Un stagiaire veut afficher les nombres de 10 à 1, en descendant. Il a écrit :
Pseudo-code
n ← 10
Tant que n ≥ 0 FaireÉcrire n
n ← n + 1
Fin de Tant que
Que se passe-t-il quand on lance cet algorithme ?
Cet algorithme contient deux erreurs. Trouvez-les et corrigez-les.
Avec la version corrigée, combien de fois la condition est-elle testée ? Quelle est la valeur de n après la boucle ?
Quelle valeur limite faut-il vérifier pour repérer la deuxième erreur ?
Corrigé
La méthode. On regarde si le bloc rapproche la condition de Faux. Puis on vérifie la dernière valeur affichée : c'est là que se cachent les erreurs de borne.
C'est une boucle infinie : n grandit, donc n ≥ 0 reste vrai. L'algorithme affiche 10, 11, 12… sans jamais s'arrêter.
Première erreur : n ← n + 1 fait monter n. Il faut n ← n - 1. Deuxième erreur : avec n ≥ 0, la boucle afficherait aussi 0. Il faut n > 0.
La condition est testée 11 fois : 10 fois vraie, pour n = 10 à 1, puis une fois fausse, pour n = 0. Après la boucle, n vaut 0.
On regarde la valeur limite : le dernier nombre affiché doit être 1. Une trace des derniers tours, avec n = 2, 1, 0, montre que la version avec ≥ affiche 0.
Python
n = 10while n > 0:
print(n)
n = n - 1print("après la boucle :", n)
Ce qui s'affiche
10
9
8
7
6
5
4
3
2
1
après la boucle : 0
Exercice 4.3.8 — Le nombre mystère ★★★Sur machine
Le programme cache le nombre 42. L'utilisateur propose des nombres.
Le programme répond « Plus grand », « Plus petit », ou « Bravo ». Il compte les essais.
Quelle boucle choisir ? Pourquoi ?
Écrivez l'algorithme en pseudo-code. Ajoutez un en-tête : nom, rôle, entrées, sortie. Ajoutez un commentaire pour chaque variable. Le programme demande un en-tête et des commentaires : ils rendent la copie lisible pour le correcteur.
Écrivez le programme en Python, avec les mêmes commentaires, et testez-le avec 50, puis 30, puis 42.
Python
secret = 42
essais = 0# à compléter
Corrigé
La méthode. On ne sait pas combien d'essais il faudra, mais il en faut au moins un : Répéter … Jusqu'à. Dans la boucle, un Si choisit le message.
Répéter … Jusqu'à, car on propose au moins un nombre, sans savoir combien.
L'algorithme :
Pseudo-code
// Nom : nombre_mystere// Rôle : faire deviner un nombre caché, en guidant le joueur// Entrées : les nombres proposés au clavier// Sortie : un message par essai, puis le nombre d'essais
secret ← 42 // le nombre à deviner
essais ← 0 // compteur des propositionsRépéterLire n // n : la proposition du joueur
essais ← essais + 1
Si n < secret AlorsÉcrire"Plus grand"Sinon si n > secret AlorsÉcrire"Plus petit"Fin de SiJusqu'à n = secret
Écrire"Bravo, trouvé en", essais, "essais"
En Python :
Python
# Nom : nombre_mystere# Rôle : faire deviner un nombre caché, en guidant le joueur# Entrées : les nombres proposés au clavier# Sortie : un message par essai, puis le nombre d'essais
secret = 42# le nombre à deviner
essais = 0# compteur des propositionswhileTrue:
n = int(input("Votre nombre ? ")) # la proposition du joueur
essais = essais + 1if n < secret:
print("Plus grand")
elif n > secret:
print("Plus petit")
if n == secret:
breakprint("Bravo, trouvé en", essais, "essais")
Ce qui s'affiche
Votre nombre ? 50
Plus petit
Votre nombre ? 30
Plus grand
Votre nombre ? 42
Bravo, trouvé en 3 essais
Pour un vrai jeu, on tire le secret au hasard : secret = random.randint(1, 100).
Exercice 4.3.9 — Le PGCD par soustractions ★★★
Le PGCD de deux entiers, pour « plus grand commun diviseur », est le plus grand entier qui divise les deux. Une méthode ancienne le calcule par soustractions : tant que les deux nombres sont différents, on enlève le plus petit au plus grand. Quand ils sont égaux, ils valent le PGCD.
Écrivez l'algorithme en pseudo-code. Il faut un Si dans la boucle.
Faites la trace pour a = 84 et b = 36. Quel est le PGCD ?
Pourquoi la boucle s'arrête-t-elle toujours, avec deux entiers positifs ?
Corrigé
La méthode. La condition de la boucle est a ≠ b. Dans la boucle, un Si choisit le nombre qui diminue.
L'algorithme :
Pseudo-code
Lire a
Lire b
Tant que a ≠ b FaireSi a > b Alors
a ← a - b
Sinon
b ← b - a
Fin de SiFin de Tant queÉcrire"PGCD :", a
La trace :
Étape
a
b
a ≠ b ?
départ
84
36
Vrai
tour 1
48
36
Vrai
tour 2
12
36
Vrai
tour 3
12
24
Vrai
tour 4
12
12
Faux : on sort
Le PGCD de 84 et 36 est 12.
À chaque tour, un des deux nombres diminue, et il reste positif. Ils ne peuvent pas diminuer pour toujours : ils finissent par devenir égaux.
Python
a = 84
b = 36while a != b:
if a > b:
a = a - b
else:
b = b - a
print("PGCD :", a)
Ce qui s'affiche
PGCD : 12
Le sujet du BTS 2026 utilise une fonction pgcd toute faite : voyez l'onglet Annales.
Voici un algorithme qui calcule la moyenne de 4 notes lues au clavier.
Pseudo-code
total ← 0
Pour i allant de 1 à 4 FaireLire note
total ← total + note
Fin de Pour
moyenne ← total / 4
Écrire"Moyenne :", arrondi(moyenne, 2)
Quelle ligne est la préparation ?
Quelles lignes forment l'itération ?
Quelles lignes forment la mise en forme finale ?
Quel est l'accumulateur ? Pourquoi part-il de 0 ?
Corrigé
La méthode. La préparation est avant la boucle, l'itération dedans, la mise en forme après.
Préparation : total ← 0.
Itération : la boucle Pour, avec Lire note et total ← total + note.
Mise en forme finale : moyenne ← total / 4 et l'affichage arrondi.
L'accumulateur est total. Il part de 0 car 0 ne change pas une somme.
Exercice 4.4.2 — La somme des entiers ★★★
On veut calculer , la somme des entiers de 1 à 10.
Complétez l'algorithme.
Pseudo-code
s ← . . .
Pour i allant de 1 à . . . Faire
s ← . . .
Fin de PourÉcrire s
Quel résultat obtenez-vous ?
Corrigé
La méthode. Un Σ devient une boucle Pour avec un accumulateur qui part de 0.
L'algorithme complet :
Pseudo-code
s ← 0
Pour i allant de 1 à 10 Faire
s ← s + i
Fin de PourÉcrire s
On obtient 55.
Python
s = 0for i inrange(1, 11):
s = s + i
print(s)
Ce qui s'affiche
55
Exercice 4.4.3 — La factorielle ★★★
Le produit s'appelle la factorielle de 6.
Complétez l'algorithme.
Pseudo-code
p ← . . .
Pour i allant de 1 à 6 Faire
p ← . . .
Fin de PourÉcrire p
Quel résultat obtenez-vous ?
Que se passerait-il avec p ← 0 au départ ?
Corrigé
La méthode. Un Π devient une boucle Pour avec un accumulateur qui part de 1.
p ← 1 et p ← p * i.
On obtient 720.
Le produit resterait 0 à chaque tour : 0 multiplié par n'importe quoi donne 0.
Python
p = 1for i inrange(1, 7):
p = p * i
print(p)
Ce qui s'affiche
720
★★★ Niveau 2 — S'entraîner
Exercice 4.4.4 — La moyenne de n notes ★★★Sur machine
Le programme lit d'abord le nombre de notes n, puis les n notes. Il affiche la moyenne arrondie à 2 décimales.
Écrivez l'algorithme en pseudo-code. Repérez les trois temps.
Complétez le programme Python et testez-le avec 3 notes : 12, 15 et 10.
Python
n = int(input("Nombre de notes ? "))
total = 0# à compléter
Corrigé
La méthode. On connaît le nombre de tours une fois n lu : c'est une boucle Pour de 1 à n. La division se fait après la boucle.
L'algorithme :
Pseudo-code
Lire n
total ← 0
Pour i allant de 1 à n FaireLire note
total ← total + note
Fin de PourÉcrire"Moyenne :", arrondi(total / n, 2)
Préparation : Lire n et total ← 0. Itération : la boucle. Mise en forme finale : la division, l'arrondi, l'affichage.
En Python :
Python
n = int(input("Nombre de notes ? "))
total = 0for i inrange(1, n + 1):
note = float(input("Note ? "))
total = total + note
print("Moyenne :", round(total / n, 2))
Ce qui s'affiche
Nombre de notes ? 3
Note ? 12
Note ? 15
Note ? 10
Moyenne : 12.33
Exercice 4.4.5 — La somme des impairs ★★★
On veut calculer . On lit : somme des , pour i allant de 1 à n.
Écrivez l'algorithme en pseudo-code.
Calculez S pour n = 5 : écrivez la valeur de S à la fin de chaque tour.
Quelle propriété de S est vraie à la fin de chaque tour ? Pensez à l'encadré « Construire la boucle avec une propriété ».
Calculez S pour n = 10.
Corrigé
La méthode. On traduit le Σ en boucle Pour, et le terme en 2 * i - 1.
L'algorithme :
Pseudo-code
Lire n
S ← 0
Pour i allant de 1 à n Faire
S ← S + (2 * i - 1)
Fin de PourÉcrire S
Pour n = 5 :
Tour i
Terme ajouté
S à la fin du tour
1
1
1
2
3
4
3
5
9
4
7
16
5
9
25
À la fin du tour i, S vaut : 1, 4, 9, 16, 25. C'est vrai au départ, avec S = 0 = . On le vérifie sur la trace : 0 + 1 = 1, 1 + 3 = 4, 4 + 5 = 9. Chaque tour garde la propriété vraie.
Pour n = 10 : 100, soit . La somme des n premiers nombres impairs vaut .
Python
n = 10
S = 0for i inrange(1, n + 1):
S = S + (2 * i - 1)
print(S, n ** 2)
Ce qui s'affiche
100 100
Exercice 4.4.6 — Simuler 600 lancers de dé ★★★Sur machine
Un dé bien équilibré donne chaque face avec la même chance : une fois sur six, soit environ 0,167. On veut le vérifier en simulant 600 lancers.
random.randint(1, 6) tire un entier au hasard entre 1 et 6. random.seed(1) fixe le point de départ du hasard : chacun obtient alors les mêmes tirages, et on peut comparer les résultats.
Repérez les trois temps : quelle préparation, quelle mise à jour dans la boucle, quelle mise en forme finale ?
Complétez le programme, puis exécutez-le. Combien de 6 sortent ? Quelle est leur fréquence, arrondie au millième ?
Remplacez random.seed(1) par random.seed(2) : le résultat change-t-il ? Reste-t-il proche de 0,167 ?
Python
import random
random.seed(1)
nb6 = 0for i inrange(1, 601):
de = random.randint(1, 6)
# à compléter : compter les 6print(nb6, round(nb6 / 600, 3))
Corrigé
La méthode. C'est un compteur dans une boucle Pour de 600 tours. La fréquence se calcule après la boucle : c'est la mise en forme finale.
Préparation : nb6 ← 0. Itération : à chaque tour, on tire le dé et on ajoute 1 à nb6 si le dé vaut 6. Mise en forme finale : la fréquence nb6 / 600, arrondie.
Le programme complet :
Python
import random
random.seed(1)
nb6 = 0for i inrange(1, 601):
de = random.randint(1, 6)
if de == 6:
nb6 = nb6 + 1print(nb6, round(nb6 / 600, 3))
Ce qui s'affiche
84 0.14
Avec random.seed(1), on obtient 84 six, soit une fréquence de 0,14.
Avec une autre graine, les tirages changent, et le nombre de 6 aussi. Il reste autour de 100, soit une fréquence proche de 0,167. Plus on fait de lancers, plus la fréquence s'approche de 1/6.
★★★ Niveau 3 — Aller plus loin
Exercice 4.4.7 — La puissance sans le signe ^ ★★★
On veut calculer en multipliant a par lui-même, sans utiliser ^.
Complétez l'écriture de la puissance sous la forme d'un Π : Chaque facteur du produit est le même nombre.
Écrivez l'algorithme qui lit a et n, puis affiche .
Faites la trace pour a = 3 et n = 4.
Que donne votre algorithme pour n = 0 ? Est-ce juste ?
Corrigé
La méthode. est un produit de n facteurs tous égaux à a. Un produit part de 1.
.
L'algorithme :
Pseudo-code
Lire a
Lire n
p ← 1
Pour i allant de 1 à n Faire
p ← p * a
Fin de PourÉcrire p
La trace :
Étape
i
p
départ
–
1
tour 1
1
3
tour 2
2
9
tour 3
3
27
tour 4
4
81
Pour n = 0, la boucle ne fait aucun tour : on affiche 1. C'est juste, car .
Python
a = 3
n = 4
p = 1for i inrange(1, n + 1):
p = p * a
print(p, a ** n)
Ce qui s'affiche
81 81
Exercice 4.4.8 — Une somme qui approche π ★★★Sur machine
La somme s'approche de quand n grandit.
Écrivez la somme en boucle, en Python.
Calculez-la pour n = 10, n = 100 et n = 1000. Arrondissez à 4 décimales.
Pourquoi faut-il écrire 1 / k ** 2 et pas 1 / k * 2 ?
Python
n = 10
s = 0# à compléterprint(round(s, 4))
Corrigé
La méthode. Un Σ devient une boucle Pour qui part de 1, avec un accumulateur à 0. Le terme s'écrit 1 / k ** 2.
et 2. En Python :
Python
n = 10
s = 0for k inrange(1, n + 1):
s = s + 1 / k ** 2print(round(s, 4))
Ce qui s'affiche
1.5498
On obtient 1,5498 pour n = 10, 1,635 pour n = 100, et 1,6439 pour n = 1 000. On se rapproche de 1,6449.
La puissance passe avant la division : 1 / k ** 2 calcule bien . Avec 1 / k * 2, on calcule .
Exercice 4.4.9 — La température la plus haute ★★★
Une sonde relève 5 températures, une par jour, du jour 1 au jour 5. Le programme les lit une par une. Il affiche la plus haute, et le jour où elle a été relevée.
Un collègue propose de partir de maxi ← 0. Pourquoi est-ce une erreur ? Donnez un jeu de températures qui le montre.
Écrivez l'algorithme. Quelles sont les deux variables à mettre à jour quand on trouve une température plus haute ?
Faites la trace avec -3, 5, 2, 8, -1.
Si deux jours ont la même température la plus haute, quel jour votre algorithme affiche-t-il ? Que faudrait-il changer pour afficher l'autre ?
Corrigé
La méthode. L'accumulateur garde la plus grande valeur vue. Il part d'une vraie valeur : la première lue. Quand on trouve plus haut, on garde aussi le numéro du jour.
Si toutes les températures sont négatives, par exemple -5, -2, -8, -4, -6, le maximum trouvé serait 0. Or 0 n'est pas une des valeurs.
Les deux variables sont maxi et jour_maxi. L'algorithme :
Pseudo-code
Lire t
maxi ← t
jour_maxi ← 1
Pour i allant de 2 à 5 FaireLire t
Si t > maxi Alors
maxi ← t
jour_maxi ← i
Fin de SiFin de PourÉcrire"Maximum :", maxi, "le jour", jour_maxi
La trace :
Étape
t
maxi
jour_maxi
départ
-3
-3
1
i = 2
5
5
2
i = 3
2
5
2
i = 4
8
8
4
i = 5
-1
8
4
Avec t > maxi, une égalité ne change rien : on garde le premier jour. Avec t ≥ maxi, on garde le dernier.
Python
t = float(input("Température ? "))
maxi = t
jour_maxi = 1for i inrange(2, 6):
t = float(input("Température ? "))
if t > maxi:
maxi = t
jour_maxi = i
print("Maximum :", maxi, "le jour", jour_maxi)
Ce qui s'affiche
Température ? -3
Température ? 5
Température ? 2
Température ? 8
Température ? -1
Maximum : 8.0 le jour 4
compt = 0for i inrange(1, 7):
for j inrange(1, 7):
if i + j == 7:
compt = compt + 1print(compt)
Ce qui s'affiche
6
Attention
compt ← 0 va avant les deux boucles. Placé dans une boucle, il remettrait le compte à zéro en cours de route.
Exercice 4.5.5 — La grille de multiplication ★★★Sur machine
On veut afficher la grille des produits de 1 à 4, une ligne par valeur de i :
Ce qui s'affiche
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
Écrivez l'algorithme avec deux boucles imbriquées. Chaque ligne est une chaîne qu'on construit par concaténation.
Écrivez le programme Python. Il faut str(...) pour coller un nombre à une chaîne.
Python
for i inrange(1, 5):
ligne = ""# à compléterprint(ligne)
Corrigé
La méthode. La boucle extérieure choisit la ligne i. La boucle intérieure ajoute les produits i × j à la chaîne de la ligne.
L'algorithme :
Pseudo-code
Pour i allant de 1 à 4 Faire
ligne ←""Pour j allant de 1 à 4 Faire
ligne ← ligne + chaîne(i * j) + " "Fin de PourÉcrire ligne
Fin de Pour
En Python :
Python
for i inrange(1, 5):
ligne = ""for j inrange(1, 5):
ligne = ligne + str(i * j) + " "print(ligne)
Ce qui s'affiche
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
Chaque ligne se termine par un espace en trop. Il ne se voit pas à l'écran.
Exercice 4.5.6 — Le triangle de nombres ★★★
Pseudo-code
total ← 0
Pour i allant de 1 à 4 Faire
ligne ←""Pour j allant de 1 à i Faire
ligne ← ligne + chaîne(j) + " "
total ← total + 1
Fin de PourÉcrire ligne
Fin de PourÉcrire total
Qu'affiche cet algorithme ? Écrivez les lignes.
Combien de fois la boucle intérieure tourne-t-elle quand i vaut 3 ?
Que vaut total à la fin ?
Corrigé
La méthode. La boucle intérieure dépend de la boucle extérieure : elle va jusqu'à i. Elle fait donc 1 tour, puis 2, puis 3, puis 4.
Les lignes affichées :
Ce qui s'affiche
1
1 2
1 2 3
1 2 3 4
10
Quand i vaut 3, la boucle intérieure fait 3 tours.
total vaut 1 + 2 + 3 + 4 = 10.
Python
total = 0for i inrange(1, 5):
ligne = ""for j inrange(1, i + 1):
ligne = ligne + str(j) + " "
total = total + 1print(ligne)
print(total)
Ce qui s'affiche
1
1 2
1 2 3
1 2 3 4
10
★★★ Niveau 3 — Aller plus loin
Exercice 4.5.7 — Encore des dés ★★★
On reprend les deux dés à 6 faces de l'exercice 4.5.4.
Écrivez un seul algorithme, avec une seule double boucle et deux compteurs. Le premier compte les tirages où le premier dé est plus grand que le second. Le second compte les tirages dont la somme est au moins 10.
Donnez les deux résultats.
Sans ordinateur, expliquez pourquoi le premier compteur vaut 15. Indice : il y a 36 tirages, dont 6 doubles.
Combien de tirages vérifient les deux conditions à la fois ? Quelle ligne ajouteriez-vous pour les compter ?
Corrigé
La méthode. On garde les deux boucles. On change le test, ou on ajoute un deuxième compteur avec son propre Si.
L'algorithme :
Pseudo-code
plus_grand ← 0
grande_somme ← 0
Pour i allant de 1 à 6 FairePour j allant de 1 à 6 FaireSi i > j Alors
plus_grand ← plus_grand + 1
Fin de SiSi i + j ≥ 10 Alors
grande_somme ← grande_somme + 1
Fin de SiFin de PourFin de PourÉcrire plus_grand, grande_somme
15 tirages où le premier dé est plus grand. 6 tirages avec une somme d'au moins 10 : (4, 6), (5, 5), (5, 6), (6, 4), (6, 5), (6, 6).
Sur 36 tirages, 6 sont des doubles, où les deux dés sont égaux. Les 30 autres se partagent en deux moitiés égales : premier dé plus grand, ou second dé plus grand. 30 ÷ 2 = 15.
Deux tirages : (6, 4) et (6, 5). On ajouterait Si i > j ET i + j ≥ 10 Alors les_deux ← les_deux + 1 Fin de Si, avec les_deux ← 0 avant les boucles.
Python
plus_grand = 0
grande_somme = 0for i inrange(1, 7):
for j inrange(1, 7):
if i > j:
plus_grand = plus_grand + 1if i + j >= 10:
grande_somme = grande_somme + 1print(plus_grand, grande_somme)
Ce qui s'affiche
15 6
Attention
Ce sont deux Si séparés, pas un Sinon si : un même tirage, comme (6, 4), compte dans les deux.
Exercice 4.5.8 — Le produit de deux matrices ★★★Sur machine
On veut calculer avec
La formule, donnée comme à l'examen : .
Une matrice s'écrit en Python comme une liste de lignes : A = [[2, 1], [0, 3]]. A[i][k] est le nombre de la ligne i, colonne k, et les indices partent de 0. La ligne qui applique la formule vous est donnée : s = s + A[i][k] * B[k][j].
Calculez à la main , le nombre en haut à gauche de C.
Exécutez le programme ci-dessous : le résultat est faux. Corrigez la borne de la boucle sur k.
Le résultat est encore faux : la ligne s = 0 est mal placée. Déplacez-la au bon endroit, et expliquez pourquoi.
Python
A = [[2, 1], [0, 3]]
B = [[1, 4], [2, 5]]
C = [[0, 0], [0, 0]]
s = 0# à déplacer au bon endroitfor i inrange(2):
for j inrange(2):
for k inrange(1): # à corriger : la borne
s = s + A[i][k] * B[k][j]
C[i][j] = s
print(C)
Corrigé
La méthode. Trois boucles : i pour la ligne de C, j pour la colonne, k pour la somme de la formule.
.
La somme a deux termes, k vaut 0 puis 1 : il faut range(2).
Le programme complet :
Python
A = [[2, 1], [0, 3]]
B = [[1, 4], [2, 5]]
C = [[0, 0], [0, 0]]
for i inrange(2):
for j inrange(2):
s = 0for k inrange(2):
s = s + A[i][k] * B[k][j]
C[i][j] = s
print(C)
Ce qui s'affiche
[[4, 13], [6, 15]]
Donc .
s = 0 se place juste avant la boucle sur k, dans la boucle sur j. Chaque case de C a sa propre somme. Placé avant toutes les boucles, s additionne les sommes de toutes les cases : seule la première case est juste.
Attention
Dans la formule, les indices vont de 1 à 2. En Python, ils vont de 0 à 1 : est C[0][0].
Exercice 4.5.9 — Les nombres premiers jusqu'à 30 ★★★
On veut afficher tous les nombres premiers de 2 à 30. Un nombre est premier s'il a exactement deux diviseurs : 1 et lui-même.
Écrivez l'algorithme avec deux boucles imbriquées : la boucle extérieure choisit n, la boucle intérieure compte ses diviseurs.
La boucle intérieure dépend-elle de la boucle extérieure ? Expliquez.
Quels nombres sont affichés ?
Combien de tests de reste votre algorithme fait-il pour le seul n = 30 ? Comment en faire beaucoup moins ? Relisez l'encadré « Combien de tours ? ».
Corrigé
La méthode. Pour chaque n, on recompte ses diviseurs à partir de 0. Le test « premier » se fait après la boucle intérieure, dans la boucle extérieure.
L'algorithme :
Pseudo-code
Pour n allant de 2 à 30 Faire
compt ← 0
Pour i allant de 1 à n FaireSi n mod i = 0 Alors
compt ← compt + 1
Fin de SiFin de PourSi compt = 2 AlorsÉcrire n
Fin de SiFin de Pour
Oui : la boucle intérieure va jusqu'à n, la valeur de la boucle extérieure. Elle fait 2 tours pour n = 2, 30 tours pour n = 30.
On affiche 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, un par ligne.
Pour n = 30, la boucle intérieure fait 30 tests de reste. Pour en faire moins, on cherche un diviseur entre 2 et n - 1, et on s'arrête au premier trouvé. Pour 30, le premier test, avec 2, suffit. C'est la version B de l'encadré « Combien de tours ? ».
Python
for n inrange(2, 31):
compt = 0for i inrange(1, n + 1):
if n % i == 0:
compt = compt + 1if compt == 2:
print(n)
Ce qui s'affiche
2
3
5
7
11
13
17
19
23
29
Attention
compt ← 0 va dans la boucle extérieure, avant la boucle intérieure. Sinon, les diviseurs de tous les nombres s'additionnent.
Le tableau stock donne le nombre de câbles dans chacun des 4 tiroirs d'une armoire.
Pseudo-code
stock ← [12, 0, 7, 3]
total ← 0
Pour i allant de 0 à longueur(stock) - 1 Faire
total ← total + stock[i]
Fin de PourÉcrire total
Combien de tours fait la boucle ?
Faites la trace avec les colonnes i, stock[i] et total.
Qu'affiche l'algorithme ?
Corrigé
La méthode. On lit chaque case dans l'ordre des indices, et on l'ajoute à l'accumulateur.
4 tours : i va de 0 à 3.
La trace :
Étape
i
stock[i]
total
départ
–
–
0
tour 1
0
12
12
tour 2
1
0
12
tour 3
2
7
19
tour 4
3
3
22
L'algorithme affiche 22.
Python
stock = [12, 0, 7, 3]
total = 0for i inrange(len(stock)):
total = total + stock[i]
print(total)
Ce qui s'affiche
22
Exercice 5.1.3 — Copie ou deuxième nom ? ★★★
Lisez ce programme sans l'exécuter.
Python
a = [5, 6, 7]
b = a
c = a.copy()
b[1] = 0print(a, b, c)
Après b = a, combien de tableaux existent en mémoire ?
Que contient a à la fin ?
Que contient c à la fin ?
Écrivez en pseudo-code une copie de a élément par élément, sans .copy().
Corrigé
La méthode.b = a donne un deuxième nom au même tableau. .copy() fabrique un nouveau tableau.
Un seul tableau, avec deux noms : a et b. Puis c en crée un deuxième.
a contient [5, 0, 7] : modifier b a modifié a.
c contient [5, 6, 7] : c'est une vraie copie, faite avant la modification.
On part d'un tableau vide, et on ajoute chaque valeur :
Pseudo-code
copie ← []
Pour chaque x dans a Faire
ajouter(copie, x)
Fin de Pour
Python
a = [5, 6, 7]
b = a
c = a.copy()
b[1] = 0print(a, b, c)
Ce qui s'affiche
[5, 0, 7] [5, 0, 7] [5, 6, 7]
★★★ Niveau 2 — S'entraîner
Exercice 5.1.4 — Compter les notes suffisantes ★★★Sur machine
Un professeur veut savoir combien d'élèves ont au moins 10.
Écrivez l'algorithme en pseudo-code, avec un compteur nb.
Complétez le programme Python et exécutez-le.
Modifiez-le pour afficher aussi le nombre de notes en dessous de 10, sans écrire une deuxième boucle.
Python
notes = [12, 8, 15, 9, 10, 17, 6]
nb = 0# à compléter : la boucleprint("Au moins 10 :", nb)
Corrigé
La méthode. Un compteur qui part de 0. Dans la boucle, un Si ajoute 1 quand la note convient.
Pseudo-code
nb ← 0
Pour i allant de 0 à longueur(notes) - 1 FaireSi notes[i] ≥ 10 Alors
nb ← nb + 1
Fin de SiFin de PourÉcrire"Au moins 10 :", nb
Pour la question 3, on n'a pas besoin d'une autre boucle. Les autres notes sont toutes celles qui restent : longueur(notes) - nb.
Python
notes = [12, 8, 15, 9, 10, 17, 6]
nb = 0for i inrange(len(notes)):
if notes[i] >= 10:
nb = nb + 1print("Au moins 10 :", nb)
print("En dessous :", len(notes) - nb)
Ce qui s'affiche
Au moins 10 : 4
En dessous : 3
Attention
Avec notes[i] > 10, la note 10 ne serait pas comptée. « Au moins 10 » veut dire ≥ 10.
Exercice 5.1.5 — La température la plus basse ★★★
Un capteur relève la température d'une salle serveur pendant 5 nuits : temp ← [-2, 3, -5, 1, -4].
On veut la plus petite valeur. Quelle valeur de départ donner à mini ?
Écrivez l'algorithme en pseudo-code.
Faites la trace. Que vaut mini à la fin ?
Un camarade part de mini ← 0. Quel résultat obtient-il avec le tableau [4, 7, 2] ? Pourquoi est-ce faux ?
Corrigé
La méthode. C'est la méthode du maximum, retournée : on part du premier élément, et on garde une valeur seulement si elle est plus petite.
mini ← temp[0], soit -2.
L'algorithme :
Pseudo-code
temp ← [-2, 3, -5, 1, -4]
mini ← temp[0]
Pour i allant de 1 à longueur(temp) - 1 FaireSi temp[i] < mini Alors
mini ← temp[i]
Fin de SiFin de PourÉcrire mini
La trace :
i
temp[i]
temp[i] < mini ?
mini
départ
–
–
-2
1
3
Faux
-2
2
-5
Vrai
-5
3
1
Faux
-5
4
-4
Faux
-5
mini vaut -5.
Il obtient 0 : aucune valeur de [4, 7, 2] n'est plus petite que 0, donc mini reste à 0. Or 0 n'est même pas dans le tableau : la bonne réponse est 2. On part toujours d'un vrai élément du tableau.
Python
temp = [-2, 3, -5, 1, -4]
mini = temp[0]
for i inrange(1, len(temp)):
if temp[i] < mini:
mini = temp[i]
print(mini)
Ce qui s'affiche
-5
Exercice 5.1.6 — Construire un tableau ★★★Sur machine
On veut le tableau des carrés des entiers de 1 à 6 : [1, 4, 9, 16, 25, 36].
On part d'un tableau vide carres ← []. Quelle instruction ajoute une valeur à la fin ?
Écrivez l'algorithme avec une boucle Pour.
Complétez le programme Python. Affichez ensuite la longueur du tableau.
Python
carres = []
# à compléterprint(carres)
Corrigé
La méthode. On part d'un tableau vide. À chaque tour, on calcule une valeur et on l'ajoute à la fin.
ajouter(carres, valeur). En Python : carres.append(valeur).
L'algorithme :
Pseudo-code
carres ← []
Pour i allant de 1 à 6 Faire
ajouter(carres, i * i)
Fin de PourÉcrire carres
Python
carres = []
for i inrange(1, 7):
carres.append(i * i)
print(carres)
print(len(carres))
Ce qui s'affiche
[1, 4, 9, 16, 25, 36]
6
Attention
carres[i] = i * i ne marche pas sur un tableau vide : la case d'indice i n'existe pas encore. Pour un tableau qui grandit, on ajoute à la fin.
★★★ Niveau 3 — Aller plus loin
Exercice 5.1.7 — Trier un tableau ★★★
On veut ranger le tableau T ← [5, 2, 8, 1, 4] dans l'ordre croissant. On utilise le tri par sélection :
au tour 0, on cherche l'indice du plus petit élément de tout le tableau, et on l'échange avec la case 0 ;
au tour 1, on cherche le plus petit parmi les cases 1 à 4, et on l'échange avec la case 1 ;
et ainsi de suite, jusqu'à l'avant-dernière case.
Combien de tours faut-il pour un tableau de 5 éléments ?
Pour échanger T[i] et T[imin], pourquoi faut-il une variable temp ?
Complétez l'algorithme.
Écrivez le tableau à la fin de chaque tour.
Pseudo-code
Pour i allant de 0 à longueur(T) - 2 Faire
imin ← i
Pour j allant de i + 1 à longueur(T) - 1 FaireSi T[j] < T[imin] Alors
imin ← . . .
Fin de SiFin de Pour
temp ← T[i]
T[i] ← . . .
T[imin] ← . . .
Fin de Pour
Corrigé
La méthode. Deux boucles imbriquées. La boucle intérieure cherche l'indice du minimum, comme la méthode du maximum, retournée. Puis on échange deux cases, avec une variable de secours.
4 tours : i va de 0 à 3. Quand les 4 premières cases sont rangées, la dernière l'est forcément.
Sans temp, la ligne T[i] ← T[imin] effacerait l'ancienne valeur de T[i]. On la garde d'abord dans temp, comme pour échanger deux variables.
L'algorithme complet :
Pseudo-code
Pour i allant de 0 à longueur(T) - 2 Faire
imin ← i
Pour j allant de i + 1 à longueur(T) - 1 FaireSi T[j] < T[imin] Alors
imin ← j
Fin de SiFin de Pour
temp ← T[i]
T[i] ← T[imin]
T[imin] ← temp
Fin de Pour
Le tableau à la fin de chaque tour :
Tour i
Plus petit, à partir de la case i
imin
T à la fin du tour
départ
–
–
[5, 2, 8, 1, 4]
0
1
3
[1, 2, 8, 5, 4]
1
2
1
[1, 2, 8, 5, 4]
2
4
4
[1, 2, 4, 5, 8]
3
5
3
[1, 2, 4, 5, 8]
Au tour 1 et au tour 3, le plus petit est déjà à sa place : on l'échange avec lui-même, rien ne change.
Python
T = [5, 2, 8, 1, 4]
for i inrange(len(T) - 1):
imin = i
for j inrange(i + 1, len(T)):
if T[j] < T[imin]:
imin = j
temp = T[i]
T[i] = T[imin]
T[imin] = temp
print("Tour", i, ":", T)
Ce qui s'affiche
Tour 0 : [1, 2, 8, 5, 4]
Tour 1 : [1, 2, 8, 5, 4]
Tour 2 : [1, 2, 4, 5, 8]
Tour 3 : [1, 2, 4, 5, 8]
Exercice 5.1.8 — La moyenne sans les valeurs aberrantes ★★★Sur machine
Un test en ligne enregistre des notes sur 20. Certaines sont des erreurs de saisie : 25, -5, 100.
Ce sont des valeurs aberrantes : des valeurs impossibles, qu'on ne doit pas compter. On ne garde que les notes entre 0 et 20 inclus.
Le programme doit :
calculer la moyenne des notes gardées, arrondie à 2 décimales ;
afficher -1 si aucune note n'est gardée. Une moyenne ne vaut jamais -1 : on comprend qu'il y a un problème.
Écrivez l'algorithme en pseudo-code.
Remplissez le tableau des tests, avec le résultat attendu.
Complétez le programme Python et vérifiez vos résultats.
Modifiez-le pour afficher aussi le nombre de notes gardées.
Tableau
Notes gardées
Somme
Nombre
Résultat attendu
[10, 12, 18]
[25, -5, 15]
[30, -2, 100]
[8, 9, 12, 21]
Python
arr = [10, 12, 18]
s = 0
k = 0# à compléter
Corrigé
La méthode. Une somme et un compteur, avec un Si dans la boucle pour filtrer. La division se fait après la boucle, et seulement si le compteur n'est pas nul.
Pseudo-code
s ← 0
k ← 0
Pour i allant de 0 à longueur(arr) - 1 FaireSi arr[i] ≥ 0 ET arr[i] ≤ 20 Alors
s ← s + arr[i]
k ← k + 1
Fin de SiFin de PourSi k = 0 AlorsÉcrire -1
SinonÉcrire arrondi(s / k, 2)
Fin de Si
Tableau
Notes gardées
Somme
Nombre
Résultat attendu
[10, 12, 18]
10, 12, 18
40
3
13,33
[25, -5, 15]
15
15
1
15
[30, -2, 100]
aucune
0
0
-1
[8, 9, 12, 21]
8, 9, 12
29
3
9,67
Pour la question 4, on affiche aussi k : dans le pseudo-code, la dernière ligne devient Écrire arrondi(s / k, 2), k.
Le programme Python, avec la question 4 :
Python
arr = [10, 12, 18]
s = 0
k = 0for i inrange(len(arr)):
if arr[i] >= 0and arr[i] <= 20:
s = s + arr[i]
k = k + 1if k == 0:
print(-1)
else:
print(round(s / k, 2), k)
Ce qui s'affiche
13.33 3
Pour tester les autres lignes du tableau des tests, changez la première ligne, puis relancez.
Avec [25, -5, 15], Python écrit 15.0 1 : une division donne toujours un réel. Avec [30, -2, 100], il écrit -1. Avec [8, 9, 12, 21], il écrit 9.67 3.
Attention
Sans le test k = 0, le tableau [30, -2, 100] provoque une division par zéro : Python s'arrête sur une erreur ZeroDivisionError.
Exercice 5.1.9 — Le tableau est-il rangé ? ★★★
Un tableau est trié dans l'ordre croissant si chaque élément est plus petit ou égal au suivant. Exemple : [2, 5, 5, 9] est trié, [2, 7, 4] ne l'est pas.
Pour un tableau de 5 éléments, combien de paires de voisins faut-il comparer ?
Écrivez un algorithme qui range Vrai ou Faux dans le booléen trie. Idée : on part de trie ← Vrai, et on passe à Faux dès qu'une paire est mal rangée.
Améliorez-le avec une boucle Tant que, qui s'arrête dès qu'une paire est mal rangée.
Que donnent vos deux versions sur [2, 5, 5, 9], [2, 7, 4] et [8] ?
Pour [9, 1, 2, 3, 4], combien de comparaisons fait la version Pour ? Et la version Tant que ? Quelle version est la plus efficace ?
Corrigé
La méthode. On compare chaque élément T[i] à son voisin de droite T[i + 1]. Le dernier élément n'a pas de voisin de droite : i s'arrête à longueur(T) - 2.
4 paires : (0, 1), (1, 2), (2, 3), (3, 4).
Avec une boucle Pour :
Pseudo-code
trie ← Vrai
Pour i allant de 0 à longueur(T) - 2 FaireSi T[i] > T[i + 1] Alors
trie ← Faux
Fin de SiFin de Pour
Avec Tant que, on s'arrête au premier défaut. La garde i < longueur(T) - 1 vient en premier : avec ET, si elle est fausse, on ne lit pas T[i + 1].
Pseudo-code
i ← 0
Tant que i < longueur(T) - 1 ET T[i] ≤ T[i + 1] Faire
i ← i + 1
Fin de Tant que
trie ← (i = longueur(T) - 1)
On sort de la boucle pour deux raisons. Soit on est arrivé au bout : tout est rangé. Soit une paire est mal rangée : i n'est pas au bout.
Python
T = [2, 7, 4]
i = 0while i < len(T) - 1and T[i] <= T[i + 1]:
i = i + 1
trie = (i == len(T) - 1)
print(trie)
Ce qui s'affiche
False
Les deux versions donnent les mêmes résultats :
[2, 5, 5, 9] : Vrai. Chaque élément est plus petit ou égal au suivant.
[2, 7, 4] : Faux. La paire 7 et 4 est mal rangée.
[8] : Vrai. La boucle Pour va de 0 à -1 : elle ne fait aucun tour, et trie reste Vrai. La boucle Tant que s'arrête tout de suite, avec i = 0 = longueur(T) - 1.
Pour tester un autre tableau en Python, changez la première ligne et relancez.
Pour [9, 1, 2, 3, 4], la version Pour compare toujours les 4 paires. La version Tant que s'arrête dès la première paire, 9 et 1 : une seule comparaison. Elle est plus efficace : se demander combien de tours fait un algorithme, c'est s'interroger sur son efficacité.
Écrivez, en pseudo-code, une boucle qui calcule le total du magasin d'indice 0, le premier, sur l'année. Quel indice varie ?
Écrivez, en pseudo-code, une boucle qui calcule le total du trimestre d'indice 2, le troisième, tous magasins. Quel indice varie ?
Écrivez, en pseudo-code, deux boucles imbriquées qui calculent le total général.
Corrigé
La méthode. Une ligne : on fixe la ligne et on fait varier la colonne. Une colonne : l'inverse. Tout le tableau : deux boucles.
ventes[1][2] vaut 90 : les ventes du magasin d'indice 1 au trimestre d'indice 2.
On fait varier j, la colonne, de 0 à 3 : s ← s + ventes[0][j]. Le total vaut 455.
On fait varier i, la ligne, de 0 à 2 : s ← s + ventes[i][2]. Le total vaut 380.
Le total général :
Pseudo-code
total ← 0
Pour i allant de 0 à 2 FairePour j allant de 0 à 3 Faire
total ← total + ventes[i][j]
Fin de PourFin de Pour
Python
ventes = [[120, 95, 130, 110],
[80, 105, 90, 100],
[150, 140, 160, 155]]
print(ventes[1][2])
s0 = 0for j inrange(4):
s0 = s0 + ventes[0][j]
t2 = 0for i inrange(3):
t2 = t2 + ventes[i][2]
total = 0for i inrange(3):
for j inrange(4):
total = total + ventes[i][j]
print(s0, t2, total)
Ce qui s'affiche
90
455 380 1435
Exercice 5.2.5 — La moyenne de chaque stagiaire ★★★Sur machine
Le tableau notes a une ligne par stagiaire et une colonne par module.
Python
notes = [[12, 15, 9, 18],
[8, 11, 14, 10],
[16, 13, 17, 15]]
for i inrange(3):
s = 0# à compléter : additionner la ligne iprint("Stagiaire", i, ":", s / 4)
Pour la moyenne du stagiaire i, quel indice varie dans la boucle intérieure ?
Complétez le programme et exécutez-le.
Que se passe-t-il si on déplace s = 0 avant la boucle sur i ?
Corrigé
La méthode. Deux boucles. La boucle extérieure choisit le stagiaire, la boucle intérieure additionne sa ligne.
La somme repart de 0 pour chaque stagiaire.
L'indice de colonne j, de 0 à 3. La ligne i reste fixe.
Le programme complet :
Python
notes = [[12, 15, 9, 18],
[8, 11, 14, 10],
[16, 13, 17, 15]]
for i inrange(3):
s = 0for j inrange(4):
s = s + notes[i][j]
print("Stagiaire", i, ":", s / 4)
La somme ne repart plus de 0. Le stagiaire 1 reçoit aussi les notes du stagiaire 0 : seule la première moyenne est juste.
Exercice 5.2.6 — Qui est présent ? ★★★Sur machine
On reprend le tableau des stagiaires : nom, âge, présent.
Python
stagiaires = [["Sarah", 22, True],
["Tom", 19, False],
["Inès", 20, True],
["Yanis", 21, True]]
nb = 0for ligne in stagiaires:
# à compléter : remplacez la ligne suivante par votre code
nb = nb + 0print("Présents :", nb)
Dans la boucle, quelle case dit si le stagiaire est présent ?
Complétez la boucle : affichez le nom de chaque présent, et comptez-les dans nb.
Modifiez le programme pour afficher aussi l'âge moyen des présents.
Corrigé
La méthode.for ligne in stagiaires donne chaque ligne à son tour. ligne[2] est le booléen « présent ». On garde un compteur, et une somme des âges pour la question 3.
ligne[2].
et 3. Le programme :
Python
stagiaires = [["Sarah", 22, True],
["Tom", 19, False],
["Inès", 20, True],
["Yanis", 21, True]]
nb = 0
somme_ages = 0for ligne in stagiaires:
if ligne[2]:
print(ligne[0])
nb = nb + 1
somme_ages = somme_ages + ligne[1]
print("Présents :", nb)
print("Âge moyen :", somme_ages / nb)
Ce qui s'affiche
Sarah
Inès
Yanis
Présents : 3
Âge moyen : 21.0
if ligne[2]: suffit : ligne[2] est déjà un booléen. if ligne[2] == True: marche aussi.
★★★ Niveau 3 — Aller plus loin
Exercice 5.2.7 — Le serveur le plus relié ★★★
Trois serveurs sont numérotés 0, 1 et 2. Dans la grille L, L[i][j] vaut 1 si le serveur i envoie des données au serveur j, et 0 sinon.
Python
L = [[0, 1, 1],
[0, 0, 1],
[1, 0, 0]]
Le degré sortant d'un serveur est le nombre de serveurs qui reçoivent ses données.
Lisez la grille : à quels serveurs le serveur 0 envoie-t-il des données ? Quel est son degré sortant ?
Écrivez un algorithme qui calcule le degré sortant du serveur s. Quel indice varie ?
Écrivez un algorithme qui trouve le serveur qui a le plus grand degré sortant.
Corrigé
La méthode. Le degré sortant du serveur s est la somme de sa ligne. Pour trouver le plus grand, on calcule le degré de chaque ligne, et on applique la méthode du maximum.
La ligne 0 est [0, 1, 1] : le serveur 0 envoie aux serveurs 1 et 2. Son degré sortant vaut 2.
On fixe la ligne s et on fait varier la colonne j :
Pseudo-code
deg ← 0
Pour j allant de 0 à 2 FaireSi L[s][j] = 1 Alors
deg ← deg + 1
Fin de SiFin de Pour
Deux boucles imbriquées, et un maximum :
Pseudo-code
meilleur ← 0
deg_max ← -1
Pour i allant de 0 à 2 Faire
deg ← 0
Pour j allant de 0 à 2 Faire
deg ← deg + L[i][j]
Fin de PourSi deg > deg_max Alors
deg_max ← deg
meilleur ← i
Fin de SiFin de PourÉcrire meilleur, deg_max
Python
L = [[0, 1, 1],
[0, 0, 1],
[1, 0, 0]]
meilleur = 0
deg_max = -1for i inrange(3):
deg = 0for j inrange(3):
deg = deg + L[i][j]
print("Serveur", i, ": degré", deg)
if deg > deg_max:
deg_max = deg
meilleur = i
print("Le plus relié :", meilleur)
Ce qui s'affiche
Serveur 0 : degré 2
Serveur 1 : degré 1
Serveur 2 : degré 1
Le plus relié : 0
Le sujet du BTS 2023 pose la même question, avec des sommets numérotés de 1 à 3. Voyez l'onglet Annales.
Exercice 5.2.8 — Les places libres ★★★Sur machine
Le plan d'une salle de formation a 3 rangs de 4 places. Une place vaut 1 si elle est prise, 0 si elle est libre.
Écrivez un programme qui affiche chaque place libre sous la forme rang 1 place 3, en indices.
Ajoutez le nombre total de places libres.
Ajoutez, pour chaque rang, le nombre de places libres. Où remettre le compteur du rang à 0 ?
Corrigé
La méthode. Deux boucles imbriquées parcourent tout le plan. Un Si repère les 0. Le compteur du rang repart de 0 à chaque nouveau rang, donc juste avant la boucle sur les places.
Pseudo-code
total ← 0
Pour i allant de 0 à 2 Faire
libres_rang ← 0
Pour j allant de 0 à 3 FaireSi salle[i][j] = 0 AlorsÉcrire"rang", i, "place", j
libres_rang ← libres_rang + 1
total ← total + 1
Fin de SiFin de PourÉcrire"Rang", i, ":", libres_rang, "libre(s)"Fin de PourÉcrire"Total :", total
Python
salle = [[1, 0, 1, 1],
[0, 0, 1, 0],
[1, 1, 1, 1]]
total = 0for i inrange(3):
libres_rang = 0for j inrange(4):
if salle[i][j] == 0:
print("rang", i, "place", j)
libres_rang = libres_rang + 1
total = total + 1print("Rang", i, ":", libres_rang, "libre(s)")
print("Total :", total)
Ce qui s'affiche
rang 0 place 1
Rang 0 : 1 libre(s)
rang 1 place 0
rang 1 place 1
rang 1 place 3
Rang 1 : 3 libre(s)
Rang 2 : 0 libre(s)
Total : 4
print met un espace entre chaque morceau : on obtient rang 0 place 1.
Exercice 5.2.9 — Qui peut joindre qui ? ★★★Sur machine
Quatre serveurs sont numérotés de 0 à 3. Certains envoient des données à d'autres. On dessine chaque envoi par une flèche, appelée un arc : un arc de i vers j veut dire « le serveur i envoie au serveur j ».
On range ces arcs dans une grille L, appelée matrice d'adjacence. L[i][j] vaut 1 s'il y a un arc de i vers j, et 0 sinon.
Les voisins d'un serveur sont les serveurs qui reçoivent directement ses données.
Quels sont les voisins du serveur 1 ? Lisez sa ligne.
Écrivez un algorithme qui affiche les voisins du serveur s.
Une donnée part du serveur 0 et fait exactement deux arcs. Sur quels serveurs peut-elle arriver ? Trouvez-les à la main.
Écrivez un algorithme qui affiche les serveurs atteints en deux arcs depuis s. Idée : pour chaque voisin v de s, on affiche les voisins de v.
Programmez-le en Python, et testez-le pour s = 0 et s = 1.
Corrigé
La méthode. Les voisins de s se lisent sur la ligne s : ce sont les colonnes j où L[s][j] vaut 1. Pour deux arcs, on fait la même chose depuis chaque voisin : deux boucles imbriquées.
La ligne 1 est [0, 0, 1, 1] : les voisins du serveur 1 sont les serveurs 2 et 3.
On fixe la ligne s et on fait varier la colonne j :
Pseudo-code
Pour j allant de 0 à 3 FaireSi L[s][j] = 1 AlorsÉcrire j
Fin de SiFin de Pour
Le serveur 0 envoie au serveur 1. Le serveur 1 envoie aux serveurs 2 et 3. En deux arcs, on arrive sur 2 ou sur 3.
Pour chaque voisin v de s, on parcourt la ligne v :
Pseudo-code
Pour v allant de 0 à 3 FaireSi L[s][v] = 1 AlorsPour j allant de 0 à 3 FaireSi L[v][j] = 1 AlorsÉcrire j
Fin de SiFin de PourFin de SiFin de Pour
Le programme :
Python
L = [[0, 1, 0, 0],
[0, 0, 1, 1],
[1, 0, 0, 0],
[0, 0, 1, 0]]
for s inrange(2):
print("Depuis", s, ":")
for v inrange(4):
if L[s][v] == 1:
for j inrange(4):
if L[v][j] == 1:
print(" serveur", j, "par le serveur", v)
Ce qui s'affiche
Depuis 0 :
serveur 2 par le serveur 1
serveur 3 par le serveur 1
Depuis 1 :
serveur 0 par le serveur 2
serveur 2 par le serveur 3
Depuis le serveur 1, on atteint le serveur 0 en passant par 2, et le serveur 2 en passant par 3. Cet algorithme est un premier parcours de graphe.
La méthode. On remplace le paramètre par la valeur donnée à l'appel, puis on calcule ce qui suit Renvoyer.
Le paramètre est n.
16.
9 + 16 = 25.
On calcule d'abord l'appel intérieur : carre(2) vaut 4. Puis carre(4) vaut 16.
Python
def carre(n):
return n * n
print(carre(4), carre(3) + carre(4), carre(carre(2)))
Ce qui s'affiche
16 25 16
Exercice 5.3.2 — Fonction ou procédure ? ★★★
Pour chaque besoin, dites s'il faut une fonction ou une procédure. Justifiez en une phrase.
Calculer la TVA d'un prix, pour l'utiliser ensuite dans un total.
Afficher un menu de 4 choix à l'écran.
Dire si un mot de passe est assez long, Vrai ou Faux.
Afficher le bulletin d'un stagiaire, ligne par ligne.
Corrigé
La méthode. On se demande : est-ce qu'on a besoin d'un résultat pour la suite ? Si oui, c'est une fonction, qui renvoie. Si on fait seulement une action, c'est une procédure.
Fonction : on renvoie la TVA pour la réutiliser dans un calcul.
Procédure : on affiche, on ne renvoie rien.
Fonction : elle renvoie un booléen.
Procédure : elle affiche le bulletin.
Exercice 5.3.3 — Le plus grand de deux nombres ★★★
Complétez la fonction plus_grand(a, b). Elle renvoie le plus grand des deux nombres.
Pseudo-code
Fonction plus_grand(a, b)
Si a > b AlorsRenvoyer . . .
SinonRenvoyer . . .
Fin de SiFin de Fonction
Que renvoient plus_grand(3, 8) et plus_grand(5, 5) ?
Corrigé
La méthode. Deux cas, deux Renvoyer. Un seul est exécuté : Renvoyer termine la fonction.
Pseudo-code
Fonction plus_grand(a, b)
Si a > b AlorsRenvoyer a
SinonRenvoyer b
Fin de SiFin de Fonction
plus_grand(3, 8) renvoie 8. plus_grand(5, 5) renvoie 5 : 5 > 5 est faux, on renvoie b, qui vaut aussi 5.
Python
def plus_grand(a, b):
if a > b:
return a
else:
return b
print(plus_grand(3, 8), plus_grand(5, 5))
Ce qui s'affiche
8 5
★★★ Niveau 2 — S'entraîner
Exercice 5.3.4 — Le plus petit et le plus grand ★★★Sur machine
Une application de suivi relève les temps de réponse d'un serveur, en millisecondes.
Écrivez la fonction mini_maxi(T) en pseudo-code. Elle renvoie deux résultats : la plus petite et la plus grande valeur du tableau.
Écrivez l'appel qui récupère les deux résultats dans a et b, en pseudo-code.
Complétez la version Python et testez-la sur [48, 120, 35, 90].
Python
def mini_maxi(T):
mini = T[0]
maxi = T[0]
# à compléterreturn mini, maxi
a, b = mini_maxi([48, 120, 35, 90])
print("Plus petit :", a, "Plus grand :", b)
Corrigé
La méthode. La méthode du maximum et celle du minimum, dans la même boucle. On part du premier élément pour les deux.
Pseudo-code
Fonction mini_maxi(T)
mini ← T[0]
maxi ← T[0]
Pour i allant de 1 à longueur(T) - 1 FaireSi T[i] < mini Alors
mini ← T[i]
Fin de SiSi T[i] > maxi Alors
maxi ← T[i]
Fin de SiFin de PourRenvoyer (mini, maxi)
Fin de Fonction
Deux variables à gauche, dans l'ordre du Renvoyer : (a, b) ← mini_maxi([48, 120, 35, 90]).
Python
def mini_maxi(T):
mini = T[0]
maxi = T[0]
for i inrange(1, len(T)):
if T[i] < mini:
mini = T[i]
if T[i] > maxi:
maxi = T[i]
return mini, maxi
a, b = mini_maxi([48, 120, 35, 90])
print("Plus petit :", a, "Plus grand :", b)
print(mini_maxi([48, 120, 35, 90]))
Ce qui s'affiche
Plus petit : 35 Plus grand : 120
(35, 120)
La dernière ligne montre ce qui se passe sans les deux variables : Python affiche les deux valeurs entre parenthèses.
Attention
Les deux tests sont deux Si séparés, pas un Si … Sinon. Une même valeur peut changer mini, puis une autre changer maxi, dans des tours différents.
Exercice 5.3.5 — Combien de fois ? ★★★
Un journal de connexion liste les codes d'erreur d'une journée : codes ← [404, 200, 404, 500, 404, 200].
Écrivez la fonction compter(T, x). Elle renvoie le nombre de fois où la valeur x apparaît dans le tableau T.
Que renvoient compter(codes, 404) et compter(codes, 301) ?
Écrivez la ligne qui affiche « Erreurs 404 : » suivi du résultat.
Corrigé
La méthode. Un compteur qui part de 0, et un Si dans la boucle. Les deux paramètres entrent, le compteur sort par Renvoyer.
Pseudo-code
Fonction compter(T, x)
nb ← 0
Pour i allant de 0 à longueur(T) - 1 FaireSi T[i] = x Alors
nb ← nb + 1
Fin de SiFin de PourRenvoyer nb
Fin de Fonction
def compter(T, x):
nb = 0for i inrange(len(T)):
if T[i] == x:
nb = nb + 1return nb
codes = [404, 200, 404, 500, 404, 200]
print("Erreurs 404 :", compter(codes, 404))
print(compter(codes, 301))
Ce qui s'affiche
Erreurs 404 : 3
0
Exercice 5.3.6 — La table de multiplication ★★★Sur machine
Écrivez la procédure afficher_table(n). Elle affiche la table de n, de 1 à 10, sous la forme 7 x 3 = 21.
Appelez-la pour 7, puis pour 9.
Un camarade écrit une fonction qui renvoie une seule ligne de la table. Pourquoi une procédure convient-elle mieux ici ?
Python
def afficher_table(n):
# à compléter : remplacez la ligne suivante par votre boucleprint("table de", n)
afficher_table(7)
Corrigé
La méthode. Une boucle Pour de 1 à 10 dans la procédure. Le paramètre n change d'un appel à l'autre.
Pseudo-code
Procédure afficher_table(n)
Pour i allant de 1 à 10 FaireÉcrire n, "x", i, "=", n * i
Fin de PourFin de Procédure
Python
def afficher_table(n):
for i inrange(1, 11):
print(n, "x", i, "=", n * i)
afficher_table(7)
Ce qui s'affiche
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70
Pour la table de 9, on écrit seulement afficher_table(9).
Ce qu'on demande est une action : afficher. On ne réutilise aucun résultat dans un calcul. Une procédure fait exactement ça. Une fonction servirait si on voulait garder la table pour la réutiliser ensuite.
★★★ Niveau 3 — Aller plus loin
Exercice 5.3.7 — Le bulletin ★★★
On veut afficher la mention de chaque stagiaire.
La fonction mention(moy) renvoie une mention selon la moyenne :
"Très bien" à partir de 16 ;
"Bien" à partir de 14 ;
"Assez bien" à partir de 12 ;
"Passable" à partir de 10 ;
"Insuffisant" en dessous.
La procédure bulletin(noms, moyennes) affiche, pour chaque stagiaire, son nom, sa moyenne et sa mention. Elle appelle mention.
Écrivez la fonction mention. Dans quel ordre faut-il tester les seuils ?
Écrivez la procédure bulletin. Les deux tableaux ont la même longueur : la case i de noms va avec la case i de moyennes.
Que s'affiche-t-il pour noms ← ["Léa", "Hugo", "Sarah"] et moyennes ← [14.5, 9, 16] ?
Écrivez la version Python avec un en-tête et des commentaires : pour chaque sous-programme, son nom, son rôle, ses entrées et sa sortie.
Corrigé
La méthode. La fonction fait un seul calcul et renvoie un texte. La procédure parcourt les tableaux et appelle la fonction à chaque tour. On teste le seuil le plus haut d'abord.
Du plus haut au plus bas, sinon 17 donnerait « Passable » :
Pseudo-code
Fonction mention(moy)
Si moy ≥ 16 AlorsRenvoyer"Très bien"Sinon si moy ≥ 14 AlorsRenvoyer"Bien"Sinon si moy ≥ 12 AlorsRenvoyer"Assez bien"Sinon si moy ≥ 10 AlorsRenvoyer"Passable"SinonRenvoyer"Insuffisant"Fin de SiFin de Fonction
La procédure :
Pseudo-code
Procédure bulletin(noms, moyennes)
Pour i allant de 0 à longueur(noms) - 1 FaireÉcrire noms[i], moyennes[i], mention(moyennes[i])
Fin de PourFin de Procédure
La version Python, avec en-tête et commentaires :
Python
# Nom : mention# Rôle : donner la mention qui correspond à une moyenne# Entrée : moy, un réel entre 0 et 20# Sortie : la mention, une chaînedef mention(moy):
# du seuil le plus haut au plus basif moy >= 16:
return"Très bien"elif moy >= 14:
return"Bien"elif moy >= 12:
return"Assez bien"elif moy >= 10:
return"Passable"else:
return"Insuffisant"# Nom : bulletin# Rôle : afficher le nom, la moyenne et la mention de chaque stagiaire# Entrées : noms et moyennes, deux tableaux de même longueur# Sortie : rien, la procédure affichedef bulletin(noms, moyennes):
# la case i de noms va avec la case i de moyennesfor i inrange(len(noms)):
print(noms[i], moyennes[i], mention(moyennes[i]))
bulletin(["Léa", "Hugo", "Sarah"], [14.5, 9, 16])
Ce qui s'affiche
Léa 14.5 Bien
Hugo 9 Insuffisant
Sarah 16 Très bien
Exercice 5.3.8 — Trouvé, et où ? ★★★
On veut la fonction chercher(T, x). Elle renvoie deux valeurs : un booléen qui dit si x est dans le tableau T, et l'indice de la première case qui contient x. Si x est absent, l'indice renvoyé vaut longueur(T).
Pourquoi une boucle Tant que convient-elle mieux qu'une boucle Pour ?
Complétez la fonction.
Dans le programme principal, comment récupérer les deux résultats ? Écrivez l'appel pour T ← [7, 3, 9, 3] et x ← 3.
Que renvoie chercher([7, 3, 9, 3], 5) ?
Pseudo-code
Fonction chercher(T, x)
k ← 0
Tant que k < longueur(T) ET . . . Faire
k ← k + 1
Fin de Tant que
trouve ← . . .
Renvoyer (trouve, k)
Fin de Fonction
Corrigé
La méthode. On avance tant qu'on n'est pas au bout et qu'on n'a pas trouvé. À la sortie, on a trouvé si on n'est pas arrivé au bout.
On veut s'arrêter dès qu'on trouve x. On ne sait pas d'avance combien de tours il faut.
La fonction complète :
Pseudo-code
Fonction chercher(T, x)
k ← 0
Tant que k < longueur(T) ET T[k] ≠ x Faire
k ← k + 1
Fin de Tant que
trouve ← (k < longueur(T))
Renvoyer (trouve, k)
Fin de Fonction
La garde k < longueur(T) est écrite en premier. Quand elle est fausse, le ET s'arrête : on ne lit pas T[k], qui n'existe pas.
Deux variables à gauche, dans l'ordre du Renvoyer : (trouve, k) ← chercher(T, 3). En Python : trouve, k = chercher(T, 3). On obtient Vrai et 1 : le premier 3 est à l'indice 1.
(Faux, 4) : 5 est absent, et k est arrivé à la longueur du tableau.
Python
def chercher(T, x):
k = 0while k < len(T) and T[k] != x:
k = k + 1
trouve = k < len(T)
return trouve, k
T = [7, 3, 9, 3]
trouve, k = chercher(T, 3)
print(trouve, k)
print(chercher(T, 5))
Ce qui s'affiche
True 1
(False, 4)
Exercice 5.3.9 — Convertir des durées ★★★Sur machine
Un serveur note la durée de chaque sauvegarde en secondes : [7384, 59, 3600].
Écrivez la fonction hms(duree). Elle renvoie trois valeurs : les heures, les minutes et les secondes.
Écrivez un programme qui affiche chaque durée sous la forme 2 h 3 min 4 s.
Ajoutez le total de toutes les sauvegardes, converti lui aussi.
Écrivez la fonction secondes(h, m, s), qui fait le calcul inverse : elle renvoie la durée en secondes. Vérifiez qu'elle redonne 7384 pour 2 h 3 min 4 s.
Python
def hms(duree):
# à compléterreturn0, 0, 0for d in [7384, 59, 3600]:
h, m, s = hms(d)
print(h, "h", m, "min", s, "s")
Corrigé
La méthode. Dans la fonction : quotient et reste, deux fois. Dans le programme : on récupère les trois valeurs dans trois variables. Le total se calcule en secondes, puis on le convertit avec la même fonction.
Pseudo-code
Fonction hms(duree)
h ← duree div 3600
reste ← duree mod 3600
m ← reste div 60
s ← reste mod 60
Renvoyer (h, m, s)
Fin de Fonction
Python
def hms(duree):
h = duree // 3600
reste = duree % 3600
m = reste // 60
s = reste % 60return h, m, s
durees = [7384, 59, 3600]
total = 0for d in durees:
h, m, s = hms(d)
print(h, "h", m, "min", s, "s")
total = total + d
h, m, s = hms(total)
print("Total :", h, "h", m, "min", s, "s")
def secondes(h, m, s):
return h * 3600 + m * 60 + s
print(secondes(2, 3, 4))
Ce qui s'affiche
2 h 3 min 4 s
0 h 0 min 59 s
1 h 0 min 0 s
Total : 3 h 4 min 3 s
7384
La fonction hms est écrite une seule fois et sert quatre fois. C'est tout l'intérêt d'une fonction. La fonction secondes fait le chemin inverse : 2 × 3600 + 3 × 60 + 4 = 7384.
Exercice 5.4.2 — Dans quel sens passent les données ? ★★★
Pour chaque fonction ou procédure, dites si le paramètre est en entrée seule, en sortie seule ou en entrée et sortie.
longueur_mot(mot) : elle renvoie le nombre de caractères du mot.
augmenter(T) : elle ajoute 1 à chaque case du tableau T.
moyenne(T) : elle renvoie la moyenne des valeurs de T.
remplir(T, n) : elle reçoit un tableau vide T et y met n zéros, sans lire ce qu'il contenait. Donnez le sens de T et celui de n.
ajouter_note(T, n) : elle ajoute la note n à la fin du tableau T. Donnez le sens de T et celui de n.
Corrigé
La méthode. On se pose deux questions. La procédure lit-elle ce qu'elle reçoit ? Le modifie-t-elle ?
Lu seulement : entrée seule.
Rempli sans être lu : sortie seule.
Lu et modifié : entrée et sortie.
mot : entrée seule. Le résultat sort par Renvoyer.
T : entrée et sortie. On lit chaque case pour lui ajouter 1.
T : entrée seule. On lit les valeurs, sans les changer.
T : sortie seule. La procédure ne lit pas T, elle le remplit. n : entrée seule.
T : entrée et sortie, car il grandit à partir de ce qu'il contient déjà. n : entrée seule.
Exercice 5.4.3 — Deux variables, un seul nom ★★★
Lisez ce programme sans l'exécuter.
Python
x = 10def f():
x = 5return x * 2
y = f()
print(x, y)
Combien de variables s'appellent x ?
Que vaut y ?
Qu'affiche le programme ?
Corrigé
La méthode. Le x créé dans la fonction est local. Il n'a rien à voir avec le x global, même s'il porte le même nom.
Deux : le x global, qui vaut 10, et le x local à f, qui vaut 5.
y vaut 5 × 2 = 10.
Le programme affiche 10 10. Le x global n'a pas changé.
Python
x = 10def f():
x = 5return x * 2
y = f()
print(x, y)
Ce qui s'affiche
10 10
★★★ Niveau 2 — S'entraîner
Exercice 5.4.4 — Qui modifie quoi ? ★★★
Lisez ce programme sans l'exécuter.
Python
total = 0def ajouter(T, x):
T.append(x)
total = len(T)
return total
notes = [12, 15]
n = ajouter(notes, 9)
copie = notes.copy()
copie.append(20)
print(notes, n, total, copie)
Pour le paramètre T, le transfert est-il en entrée seule ou en entrée et sortie ? Et pour x ?
Que vaut n ?
Pourquoi la variable total affichée vaut-elle encore 0 ?
Ajouter 20 à copie change-t-il notes ?
Écrivez ce qu'affiche la dernière ligne, puis vérifiez.
Corrigé
La méthode. On sépare ce qui est créé dans la fonction, local, de ce qui est créé dans le programme principal, global.
T : entrée et sortie. La fonction reçoit le tableau et le modifie avec append. x : entrée seule, il est lu, pas modifié.
Après l'ajout, le tableau a 3 éléments : n vaut 3.
Le total de la fonction est une variable locale, créée pendant l'appel. Le total global n'a jamais été touché : il vaut 0.
Non. copie est une vraie copie, faite avec .copy().
La sortie :
Python
total = 0def ajouter(T, x):
T.append(x)
total = len(T)
return total
notes = [12, 15]
n = ajouter(notes, 9)
copie = notes.copy()
copie.append(20)
print(notes, n, total, copie)
Ce qui s'affiche
[12, 15, 9] 3 0 [12, 15, 9, 20]
Attention
Avec copie = notes, sans .copy(), ajouter 20 à copie l'aurait aussi ajouté à notes.
Exercice 5.4.5 — Modifier ou rendre une copie ? ★★★Sur machine
On veut ajouter 2 points de bonus à chaque note, sans dépasser 20.
Version A : la procédure bonus_sur_place(T) modifie le tableau qu'on lui donne.
Version B : la fonction avec_bonus(T) renvoie un nouveau tableau, et laisse T intact.
Pour chaque version, le paramètre T est-il en entrée seule ou en entrée et sortie ?
Complétez les deux versions.
Testez avec [12, 19, 8]. Affichez le tableau de départ après chaque appel.
Python
def bonus_sur_place(T):
# à compléter : remplacez la ligne suivante par votre boucle
T[0] = T[0]
def avec_bonus(T):
R = T.copy()
# à compléterreturn R
notes = [12, 19, 8]
nouvelles = avec_bonus(notes)
print(notes, nouvelles)
bonus_sur_place(notes)
print(notes)
Corrigé
La méthode. Dans la version A, on écrit dans T. Dans la version B, on écrit dans une copie R, qu'on renvoie. Pour ne pas dépasser 20, un Si : si note + 2 dépasse 20, on met 20, sinon on met note + 2.
Version A : entrée et sortie. Version B : entrée seule, le résultat sort par Renvoyer.
Les deux versions :
Python
def bonus_sur_place(T):
for i inrange(len(T)):
if T[i] + 2 > 20:
T[i] = 20else:
T[i] = T[i] + 2def avec_bonus(T):
R = T.copy()
for i inrange(len(R)):
if R[i] + 2 > 20:
R[i] = 20else:
R[i] = R[i] + 2return R
notes = [12, 19, 8]
nouvelles = avec_bonus(notes)
print(notes, nouvelles)
bonus_sur_place(notes)
print(notes)
Ce qui s'affiche
[12, 19, 8] [14, 20, 10]
[14, 20, 10]
En pseudo-code, la ligne de la boucle devient : Si T[i] + 2 > 20 Alors T[i] ← 20 Sinon T[i] ← T[i] + 2 Fin de Si.
Attention
Sans .copy() dans la version B, R serait le même tableau que T, et notes serait modifié aussi.
Exercice 5.4.6 — Une fonction qui dépend d'une globale ★★★
Un collègue a écrit ce programme.
Python
remise = 10def prix_final(prix):
return prix - prix * remise / 100print(prix_final(80))
remise = 30print(prix_final(80))
Qu'affichent les deux lignes print ?
Pourquoi le même appel prix_final(80) donne-t-il deux résultats différents ?
Réécrivez la fonction pour que la remise soit un paramètre. Écrivez les deux appels.
Corrigé
La méthode. La fonction lit une variable globale. Si la globale change, le résultat change, sans que l'appel le montre. On fait entrer la remise par un paramètre.
72.0, puis 56.0.
La fonction lit remise, une variable globale. Entre les deux appels, le programme l'a changée.
La remise devient un paramètre : tout ce dont la fonction a besoin entre par ses paramètres.
Python
def prix_final(prix, remise):
return prix - prix * remise / 100print(prix_final(80, 10))
print(prix_final(80, 30))
Ce qui s'affiche
72.0
56.0
Maintenant, chaque appel dit lui-même la remise utilisée. On peut tester la fonction seule.
★★★ Niveau 3 — Aller plus loin
Exercice 5.4.7 — La trace des appels ★★★
Lisez ce programme sans l'exécuter.
Python
def double(n):
r = n * 2return r
def calcul(a, b):
r = double(a) + b
return r
r = 1
x = calcul(3, r)
y = calcul(x, 4)
print(r, x, y)
Combien de variables r différentes existent dans ce programme ?
Faites la trace de l'appel calcul(3, r) : que valent a, b, puis le r de calcul ?
Que valent x et y ?
Qu'affiche le programme ?
Corrigé
La méthode. Chaque appel a ses propres variables locales. On suit un appel à la fois, et on remplace chaque paramètre par la valeur reçue.
Trois : le r global, le r de double et le r de calcul.
calcul(3, r) : a vaut 3 et b vaut 1, la valeur du r global. double(3) renvoie 6. Le r de calcul vaut 6 + 1 = 7.
x vaut 7. Puis calcul(7, 4) : double(7) vaut 14, et 14 + 4 = 18. y vaut 18.
Le r global n'a jamais changé : le programme affiche 1 7 18.
Python
def double(n):
r = n * 2return r
def calcul(a, b):
r = double(a) + b
return r
r = 1
x = calcul(3, r)
y = calcul(x, 4)
print(r, x, y)
Ce qui s'affiche
1 7 18
Exercice 5.4.8 — Ramener les notes entre 0 et 20 ★★★Sur machine
Un tableur a exporté des notes avec des erreurs : [12, -3, 25, 18]. On veut la fonction bornees(T).
Elle renvoie un nouveau tableau où chaque note négative devient 0 et chaque note au-dessus de 20 devient 20. Le tableau de départ ne doit pas changer.
Le paramètre T doit-il être en entrée seule ou en entrée et sortie ?
Écrivez la fonction en pseudo-code, puis en Python.
Affichez notes après l'appel. Comment voit-on que le tableau de départ n'a pas changé ?
Python
def bornees(T):
# à compléterreturn T
notes = [12, -3, 25, 18]
propres = bornees(notes)
print(notes, propres)
Corrigé
La méthode. On fabrique un nouveau tableau, case par case, avec ajouter. On ne touche pas à T : il est en entrée seule.
En entrée seule : la fonction lit T et renvoie un autre tableau.
La fonction :
Pseudo-code
Fonction bornees(T)
R ← []
Pour i allant de 0 à longueur(T) - 1 FaireSi T[i] < 0 Alors
ajouter(R, 0)
Sinon si T[i] > 20 Alors
ajouter(R, 20)
Sinon
ajouter(R, T[i])
Fin de SiFin de PourRenvoyer R
Fin de Fonction
Python
def bornees(T):
R = []
for i inrange(len(T)):
if T[i] < 0:
R.append(0)
elif T[i] > 20:
R.append(20)
else:
R.append(T[i])
return R
notes = [12, -3, 25, 18]
propres = bornees(notes)
print(notes, propres)
Ce qui s'affiche
[12, -3, 25, 18] [12, 0, 20, 18]
La sortie affiche notes après l'appel : il vaut toujours [12, -3, 25, 18]. Les notes -3 et 25 sont encore là : le tableau de départ n'a pas changé.
Exercice 5.4.9 — Découper un programme en fonctions ★★★
Une petite école veut un programme pour ses notes. Il doit :
calculer la moyenne d'un tableau de notes ;
compter les notes au moins égales à 10 ;
afficher un bilan : la moyenne et le nombre de notes suffisantes.
Proposez trois sous-programmes. Pour chacun, donnez son nom, s'il s'agit d'une fonction ou d'une procédure, ses paramètres et ce qu'il renvoie.
Pour chaque paramètre, dites s'il est en entrée seule ou en entrée et sortie.
Écrivez les trois en Python, puis appelez le bilan pour [12, 8, 15, 9].
Corrigé
La méthode. Une tâche par sous-programme. Les deux calculs renvoient un résultat : ce sont des fonctions. L'affichage est une action : c'est une procédure, qui appelle les deux fonctions.
et 2. Une proposition :
Nom
Sorte
Paramètre
Sens
Renvoie
moyenne(T)
fonction
T
entrée seule
la moyenne
nb_suffisantes(T)
fonction
T
entrée seule
un entier
bilan(T)
procédure
T
entrée seule
rien : elle affiche
Le programme :
Python
def moyenne(T):
s = 0for x in T:
s = s + x
return s / len(T)
def nb_suffisantes(T):
nb = 0for x in T:
if x >= 10:
nb = nb + 1return nb
def bilan(T):
print("Moyenne :", moyenne(T))
print("Notes suffisantes :", nb_suffisantes(T))
bilan([12, 8, 15, 9])
Ce qui s'affiche
Moyenne : 11.0
Notes suffisantes : 2
Aucune variable globale n'est utilisée dans les fonctions : chacune peut se tester seule.
Attention
Pour un tableau vide, moyenne([]) diviserait par zéro : Python s'arrêterait sur une erreur ZeroDivisionError. Le bilan suppose un tableau non vide. Sinon, on teste len(T) == 0 avant de diviser.
Entraînement à l'épreuve
Vous passez l'épreuve E3 sous sa forme écrite : 2 heures, deux ou trois exercices, sur papier, sans ordinateur. La calculatrice est autorisée. L'un des exercices évalue la capacité « programmer ».
Cet exercice vaut souvent 5 points : comptez 25 à 35 minutes. Vous écrivez vos algorithmes en pseudo-code ou dans un langage, au choix. Python vous sert à vous entraîner, puis à vérifier vos réponses après coup.
Les deux sujets ci-dessous ont la forme des annales. Faites-les sur une feuille, chronomètre en main, avant de lire le corrigé.
Sujet type — Les codes de réduction Type examen
Exercice : 5 points
Une boutique en ligne distribue des codes de réduction. Un code est une chaîne de 8 caractères : 3 lettres majuscules, puis 5 chiffres. Par exemple : "SIO25401".
Un code est valide s'il a exactement 8 caractères et si la somme de ses 5 chiffres est un multiple de 7. Un nombre est un multiple de 7 quand le reste de sa division par 7 vaut 0.
On dispose de la fonction chiffre(c), déjà écrite :
elle reçoit un caractère c, qui est un chiffre ;
elle renvoie l'entier correspondant. Par exemple, chiffre("7") renvoie 7.
Les caractères d'un code sont repérés par leur indice, à partir de 0 : dans "SIO25401", le caractère d'indice 3 est "2".
1. On considère la fonction suivante.
Pseudo-code
1 Fonction somme_chiffres(code)
2 s ← 0
3 Pour i allant de 3 à 7 Faire
4 s ← s + chiffre(code[i])
5 Fin de Pour
6 Renvoyer s
7 Fin de Fonction
Que renvoie somme_chiffres("SIO25401") ? Justifier. (0,75 point)
Expliquer en une phrase le rôle de cette fonction. (0,25 point)
2. Recopier et compléter les lignes 2, 5 et 6 de la fonction est_valide, qui renvoie Vrai si le code est valide et Faux sinon. (1,5 point)
Pseudo-code
1 Fonction est_valide(code)
2 Si longueur(code) ≠ . . . Alors
3 Renvoyer Faux
4 Fin de Si
5 Si le reste de la division de . . . par 7 est 0 Alors
6 Renvoyer . . .
7 Sinon
8 Renvoyer Faux
9 Fin de Si
10 Fin de Fonction
3. Écrire une fonction nb_valides(T) qui reçoit un tableau T de codes et renvoie le nombre de codes valides. On pourra utiliser la fonction est_valide. (1,5 point)
4. a. Que renvoie est_valide("SIO00000") ? Justifier. (0,5 point)
La boutique refuse les codes dont la somme des chiffres vaut 0. Réécrire la ligne 5 de est_valide en conséquence (0,5 point).
Corrigé
1. a. On suit la boucle : i prend les valeurs 3, 4, 5, 6 et 7. Ce sont les indices des 5 chiffres.
Étape
i
code[i]
s
départ
–
–
0
tour 1
3
"2"
2
tour 2
4
"5"
7
tour 3
5
"4"
11
tour 4
6
"0"
11
tour 5
7
"1"
12
La fonction renvoie 12.
Ce qui rapporte les points : la trace, ou au moins la valeur de s à chaque tour, et la valeur finale 12. Une réponse sans justification ne rapporte pas tous les points.
1. b. La fonction renvoie la somme des 5 chiffres du code.
Ce qui rapporte les points : une phrase qui dit « somme des chiffres », et pas une paraphrase ligne par ligne.
2. L'algorithme complet :
Pseudo-code
1 Fonction est_valide(code)
2 Si longueur(code) ≠ 8 Alors
3 Renvoyer Faux
4 Fin de Si
5 Si le reste de la division de somme_chiffres(code) par 7 est 0 Alors
6 Renvoyer Vrai
7 Sinon
8 Renvoyer Faux
9 Fin de Si
10 Fin de Fonction
Ce qui rapporte les points : les trois trous, 0,5 point chacun. À la ligne 5, il faut la somme des chiffres, donc l'appel somme_chiffres(code), et non code lui-même.
3. C'est un compteur : il part de 0, et on ajoute 1 à chaque code valide.
Pseudo-code
Fonction nb_valides(T)
nb ← 0
Pour chaque code dans T FaireSi est_valide(code) Alors
nb ← nb + 1
Fin de SiFin de PourRenvoyer nb
Fin de Fonction
On peut aussi parcourir les indices : Pour i allant de 0 à longueur(T) - 1 Faire, puis est_valide(T[i]).
Ce qui rapporte les points :
l'initialisation nb ← 0 avant la boucle ;
une boucle qui passe par tous les codes ;
le test avec est_valide et la mise à jour du compteur ;
Renvoyer nb après la boucle.
4. a. La longueur vaut 8. La somme des chiffres vaut 0 + 0 + 0 + 0 + 0 = 0.
Le reste de la division de 0 par 7 est 0 : la fonction renvoie Vrai.
Ce qui rapporte les points : le calcul de la somme, et la remarque que 0 est un multiple de 7.
4. b. On ajoute une seconde condition, avec ET :
Pseudo-code
5 Si le reste de la division de somme_chiffres(code) par 7 est 0 ET somme_chiffres(code) ≠ 0 Alors
Ce qui rapporte les points : les deux conditions reliées par ET. Avec OU, un code de somme 12 serait accepté à tort.
Vérifier sur machine après l'épreuve. En Python, chiffre(c) s'écrit avec int(c). On teste plusieurs codes, dont les cas limites : un code trop court, un code de somme 0.
Python
def chiffre(c):
returnint(c)
def somme_chiffres(code):
s = 0for i inrange(3, 8):
s = s + chiffre(code[i])
return s
def est_valide(code):
iflen(code) != 8:
returnFalseif somme_chiffres(code) % 7 == 0:
returnTrueelse:
returnFalsedef nb_valides(T):
nb = 0for code in T:
if est_valide(code):
nb = nb + 1return nb
print(somme_chiffres("SIO25401"))
codes = ["SIO25401", "BTS00007", "WEB34000", "ABC1234", "NET12346"]
for c in codes:
print(c, est_valide(c))
print("Codes valides :", nb_valides(codes))
print(est_valide("SIO00000"))
La dernière ligne confirme la question 4 a : sans la modification, le code "SIO00000" est accepté.
Sujet type — Le serveur qui se remplit Type examen
Exercice court : 3 points
Le disque d'un serveur a déjà 100 Go occupés. Chaque jour, les sauvegardes ajoutent 50 Go. On veut savoir combien de jours il faut pour que l'espace occupé atteigne ou dépasse la capacité du disque.
Pseudo-code
1 Fonction jours(capacite)
2 occupe ← 100
3 j ← 0
4 Tant que occupe . . . capacite Faire
5 occupe ← occupe + 50
6 j ← . . .
7 Fin de Tant que
8 Renvoyer j
9 Fin de Fonction
1. Recopier et compléter les lignes 4 et 6. (1 point)
2. Que renvoie jours(300) ? Justifier. (1,5 point)
3. Que renvoie jours(80) ? Expliquer pourquoi. (0,5 point)
Corrigé
1. On continue tant que le disque n'est pas plein, et on compte un jour par tour :
Pseudo-code
4 Tant que occupe < capacite Faire
6 j ← j + 1
Ce qui rapporte les points : 0,5 point par ligne. Avec ≤, la boucle ferait un tour de trop quand l'espace occupé tombe pile sur la capacité.
2. La trace de jours(300) :
Étape
occupe
j
occupe < 300 ?
départ
100
0
Vrai
tour 1
150
1
Vrai
tour 2
200
2
Vrai
tour 3
250
3
Vrai
tour 4
300
4
Faux : on sort
La fonction renvoie 4.
Ce qui rapporte les points : la trace avec le test de la condition à chaque tour, et la valeur 4.
3. Au départ, occupe vaut 100, et 100 < 80 est Faux. La boucle ne fait aucun tour : la fonction renvoie 0. Le disque est déjà plein au départ.
Ce qui rapporte les points : dire que la condition est fausse dès le départ, donc 0 tour.
Le sujet officiel, page 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Un système de codage affine est un système de chiffrement basé sur la correspondance entre les lettres de l'alphabet et les entiers compris entre 0 et 25.
La table de correspondance est donnée ci-dessous.
A
B
C
D
E
F
G
H
I
J
K
L
M
0
1
2
3
4
5
6
7
8
9
10
11
12
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
13
14
15
16
17
18
19
20
21
22
23
24
25
Le codage consiste tout d'abord à choisir une clé qui est un couple d'entiers avec et .
Pour coder une lettre :
on détermine l'entier qui lui correspond dans la table de correspondance ;
on calcule puis on détermine l'entier compris entre 0 et 25 tel que ;
on détermine la lettre associée à dans la table de correspondance.
Exemple : Codons la lettre H avec la clé .
H correspond à ;
et donc ;
correspond à la lettre Q donc H est codée en Q.
Toutes les clés de codage ne permettent pas de crypter un message convenablement. On admet qu'une clé de codage est acceptable si et seulement si l'entier est premier avec 26. Il n'y a pas de condition sur (donc 26 choix possibles pour ).
Recopier et compléter les lignes numérotées 3, 4 et 5 de l'algorithme définissant la fonction nbCles() qui renvoie le nombre de clés acceptables et dans laquelle la fonction renvoie le plus grand commun diviseur des entiers et .
Pseudo-code
1 Fonction nbCles()
2 nb ← 0
3 Pour a allant de 1 à . . . . Faire
4 Si pgcd(a, 26) = . . . . Alors
5 nb ← . . . .
6 Fin de Si
7 Fin de Pour
8 Renvoyer nb × 26
Corrigé
La méthode. La boucle passe en revue toutes les valeurs possibles de a. Le Si garde celles qui sont premières avec 26, c'est-à-dire dont le PGCD avec 26 vaut 1.
nb les compte. À la fin, chaque a acceptable va avec 26 valeurs de b : on multiplie par 26.
Pseudo-code
1 Fonction nbCles()
2 nb ← 0
3 Pour a allant de 1 à 25 Faire
4 Si pgcd(a, 26) = 1 Alors
5 nb ← nb + 1
6 Fin de Si
7 Fin de Pour
8 Renvoyer nb × 26
Ligne 3 : 25, car .
Ligne 4 : 1. Deux entiers sont premiers entre eux quand leur PGCD vaut 1.
Ligne 5 : nb + 1. C'est un compteur.
La vérification. Les valeurs de a premières avec 26 sont les nombres impairs, sauf 13 : il y en a 12. La fonction renvoie 12 × 26 = 312.
Python
import math
def nbCles():
nb = 0for a inrange(1, 26):
if math.gcd(a, 26) == 1:
nb = nb + 1return nb * 26print(nbCles())
Ce qui s'affiche
312
En Python, la fonction PGCD s'appelle math.gcd.
Ce qui rapporte les points : les trois lignes complètes, et nb ← nb + 1 écrit en entier. nb + 1 seul, sans affectation, ne compte pas.
Le sujet officiel, pages 3 à 4 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Le contexte est celui de la question précédente : le codage affine, avec la clé .
Pour déterminer la clé de décodage associée à la clé de codage , il est nécessaire de déterminer un entier compris entre 0 et 25 tel que .
La fonction inverse de paramètre donnée ci-dessous renvoie le plus petit entier compris entre 0 et 25 tel que .
La fonction « reste(u, n) » qui est utilisée ci-dessous renvoie le reste de la division euclidienne d'un entier naturel par un entier naturel non nul .
Pseudo-code
1 Fonction inverse(a)
2 c ← 1
3 Tant que reste(a × c, 26) . . . . Faire
4 c ← c + 1
5 Renvoyer . . . .
Recopier et compléter les lignes numérotées 3 et 5 de l'algorithme définissant la fonction inverse de paramètre .
Déterminer l'entier renvoyé par inverse(9).
Corrigé
La méthode. On essaie c = 1, puis 2, puis 3… On continue tant que le reste n'est pas 1. Dès qu'il vaut 1, on sort et on renvoie c.
a.
Pseudo-code
1 Fonction inverse(a)
2 c ← 1
3 Tant que reste(a × c, 26) ≠ 1 Faire
4 c ← c + 1
5 Renvoyer c
b. La trace de inverse(9) :
c
9 × c
reste de la division par 26
≠ 1 ?
1
9
9
Vrai : on continue
2
18
18
Vrai : on continue
3
27
1
Faux : on sort
La fonction renvoie 3. On vérifie : , donc .
Python
def inverse(a):
c = 1while (a * c) % 26 != 1:
c = c + 1return c
print(inverse(9))
Ce qui s'affiche
3
Attention
Si a n'est pas premier avec 26, par exemple a = 2, aucun c ne convient. La boucle Tant que ne s'arrête jamais. C'est pour ça que seules les clés de la question 2 sont acceptables.
Ce qui rapporte les points : la condition ≠ 1 à la ligne 3, Renvoyer c à la ligne 5, et pour b. le résultat 3 justifié par les essais successifs.
BTS SIO 2025 — Le reste par soustractions Type examen
Le sujet officiel, page 2 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Un codage affine est une méthode de chiffrement utilisée en cryptographie, qui consiste à remplacer chaque lettre du message en clair par une autre lettre de l'alphabet en utilisant une fonction affine. On associe à chaque lettre de l'alphabet une valeur numérique.
Pour calculer le reste de la division euclidienne d'un entier N par 26, il suffit de soustraire 26 à N autant de fois que possible, c'est-à-dire tant que la différence demeure supérieure ou égale à 26.
Exemple : Le reste de la division euclidienne de 80 par 26 s'obtient ainsi :
80 − 26 = 54. Comme 54 ⩾ 26, on soustrait alors 26 à 54.
54 − 26 = 28. Comme 28 ⩾ 26, on soustrait alors 26 à 28.
28 − 26 = 2. Comme 2 < 26, on arrête.
Le reste de la division euclidienne de 80 par 26 est 2.
La fonction « reste_division_par_26 » de paramètre N, ci-après, est écrite en langage naturel et emploie cette méthode pour renvoyer le reste de la division euclidienne de N par 26.
Exemple : reste_division_par_26(80) renvoie la valeur entière 2.
Pseudo-code
Fonction reste_division_par_26(N)
Tant que N . . . Faire
N ← . . .
Fin de Tant queRenvoyer (N)
Fin de la fonction
Recopier et compléter les deux lignes contenant des pointillés de cette fonction.
Corrigé
La méthode. L'énoncé dit tout : on soustrait 26 tant que N reste supérieur ou égal à 26.
Pseudo-code
Fonction reste_division_par_26(N)
Tant que N ≥ 26 Faire
N ← N - 26
Fin de Tant queRenvoyer (N)
Fin de la fonction
La vérification. Avec N = 80, on passe par 54, puis 28, puis 2. On compare avec l'opérateur % de Python :
Python
def reste_division_par_26(N):
while N >= 26:
N = N - 26return N
print(reste_division_par_26(80), 80 % 26)
print(reste_division_par_26(138), 138 % 26)
Ce qui s'affiche
2 2
8 8
Attention
Tant que N > 26 est faux pour N = 26 : la fonction renverrait 26 au lieu de 0. Il faut ≥.
Ce qui rapporte les points : la condition N ≥ 26, et la mise à jour N ← N - 26 écrite avec la flèche.
Le sujet officiel, pages 2 à 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
La fonction indice (lettre, chaine) ci-dessous, renvoie le plus petit indice du caractère « lettre » dans la chaîne de caractères « chaine », lorsqu'il est présent dans « chaine », et elle renvoie le nombre de caractères de « chaine » sinon.
La documentation de cette fonction précise que :
k est un entier.
lettre est une chaîne de caractères constituée d'un seul caractère.
chaine est une chaîne de caractères.
longueur(chaine) renvoie le nombre de caractères de chaine.
Exemple : indice("S","BTSSIO") renvoie la valeur 2, le plus petit indice de "S" dans "BTSSIO".
Pseudo-code
Fonction indice(lettre, chaine)
k ← 0
Tant que . . . longueur(chaine) et lettre . . . Faire
k ← k + 1
Fin de Tant queRenvoyer (k)
Fin de Fonction
Quelle est la valeur renvoyée par indice("A","BTSSIO") ?
Recopier et compléter la ligne contenant les pointillés de la fonction indice.
Corrigé
La méthode. On avance k tant qu'on n'est pas au bout de la chaîne et qu'on n'a pas trouvé la lettre.
a. La lettre A n'est pas dans "BTSSIO". La boucle avance jusqu'au bout de la chaîne : la fonction renvoie le nombre de caractères, 6.
b.
Pseudo-code
Fonction indice(lettre, chaine)
k ← 0
Tant que k < longueur(chaine) et lettre ≠ chaine[k] Faire
k ← k + 1
Fin de Tant queRenvoyer (k)
Fin de Fonction
La vérification :
Python
def indice(lettre, chaine):
k = 0while k < len(chaine) and lettre != chaine[k]:
k = k + 1return k
print(indice("S", "BTSSIO"), indice("A", "BTSSIO"))
Ce qui s'affiche
2 6
Attention
Le test k < longueur(chaine) doit venir avantlettre ≠ chaine[k]. Quand k vaut 6, le premier test est faux, et on ne lit pas chaine[6], qui n'existe pas.
Ce qui rapporte les points : pour a., la valeur 6 justifiée par l'absence de A. Pour b., les deux morceaux : k < et ≠ chaine[k].
Le sujet officiel, pages 2 à 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
La norme de codage ASCII (American Standard Code for Information Interchange), défini aux États-Unis en 1963, associe aux caractères les plus utilisés dans les documents en langue anglaise un entier représentable en binaire sur 7 bits.
Lors de la transmission des données, pour éviter les erreurs, une méthode consiste à ajouter pour chaque caractère, un bit de parité à la fin du codage en binaire.
Pour cela, on compte le nombre de 1 apparaissant dans le codage sur 7 bits d'un caractère :
si le nombre obtenu est pair, on rajoute 0 à la fin du codage ;
sinon on rajoute 1.
Chaque caractère est alors codé par un groupe de 8 bits appelé octet.
Par exemple :
la lettre "A" est codée par 1000001 en binaire. Ce codage contient un nombre pair de 1, donc on ajoute 0 à la fin, et la lettre "A" sera codée sur 8 bits par 10000010 ;
la lettre "C" est codée par 1000011 en binaire. Ce codage contient un nombre impair de 1, donc on ajoute 1 à la fin, et la lettre "C" sera codée sur 8 bits par 10000111.
On considère l'algorithme ci-dessous écrit en langage naturel où ajoute_bit_parite est la fonction prenant en paramètre une chaine de caractères code de longueur 7 représentant un codage binaire et qui renvoie le codage obtenu en lui ajoutant le bit de parité à la fin.
Ainsi ajoute_bit_parite("1101100") renvoie "11011000" et ajoute_bit_parite("1100001") renvoie "11000011".
Pseudo-code
Fonction ajoute_bit_parite(code)
compt ← 0
Pour i allant de 0 à 6 FaireSi code[i] est égal à "1"AlorsFin de SiFin de PourSi le reste de la division de . . . par 2 est 0
Alors
code ← code + "0"Sinon
. . . . . .
Fin de SiRenvoyer code
Recopier et compléter cet algorithme pour qu'il renvoie le code binaire sous forme de chaine de caractères, complété par le bit de parité.
Corrigé
La méthode. Deux temps.
D'abord, une boucle compte les « 1 » avec le compteur compt. Ensuite, le reste de compt par 2 dit si ce nombre est pair. On colle le bon bit au bout de la chaîne.
Pseudo-code
Fonction ajoute_bit_parite(code)
compt ← 0
Pour i allant de 0 à 6 FaireSi code[i] est égal à "1"Alors
compt ← compt + 1
Fin de SiFin de PourSi le reste de la division de compt par 2 est 0
Alors
code ← code + "0"Sinon
code ← code + "1"Fin de SiRenvoyer code
Il y avait trois trous : la ligne vide après Alors, le mot compt, et la ligne du Sinon.
La vérification. Les indices vont de 0 à 6 : ce sont les 7 bits.
Le + colle deux chaînes : code + "0" ajoute le caractère 0 à la fin. Avec code + 0, sans guillemets, on mélangerait une chaîne et un nombre.
Ce qui rapporte les points : la ligne compt ← compt + 1 dans le Si, compt dans le test de parité, et code ← code + "1" avec les guillemets.
BTS SIO 2023 — Le degré sortant d'un sommet Type examen
Source : BTS SIO, Métropole, mai 2023, épreuve obligatoire, exercice 2, partie B, question 2.
Le sujet officiel, pages 2 à 3 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
Partie A. On considère le graphe orienté G comportant 3 sommets notés A, B et C dont la matrice d'adjacence est , où
Partie B. Dans un graphe orienté, on définit :
le degré entrant d'un sommet comme étant le nombre d'arcs menant à ce sommet.
le degré sortant d'un sommet comme étant le nombre d'arcs issus de ce sommet.
On étudie dans cette question les graphes orientés à trois sommets numérotés de 1 à 3.
On considère l'algorithme ci-dessous écrit en langage naturel où Degré_sortant désigne une fonction de paramètres M et s, M étant une matrice à 3 lignes et 3 colonnes et s un entier compris entre 1 et 3.
Le coefficient de la matrice M situé ligne i colonne j est noté .
Pseudo-code
Fonction Degré_sortant(M, s)
deg ← 0
Pour j allant de 1 à 3 FaireSi m_sj . . . . . . Faire
. . . . . .
Fin de SiFin de PourRenvoyer deg
Compléter cet algorithme pour que la fonction renvoie le degré sortant du sommet numéroté s dans un graphe dont la matrice d'adjacence est M.
Corrigé
La méthode. Dans une matrice d'adjacence, la ligne s décrit les arcs qui partent du sommet s. Un 1 en colonne j veut dire : il y a un arc de s vers j.
Le degré sortant est donc le nombre de 1 de la ligne s. On fixe la ligne s et on fait varier la colonne j.
Pseudo-code
Fonction Degré_sortant(M, s)
deg ← 0
Pour j allant de 1 à 3 FaireSi m_sj > 0 Faire
deg ← deg + 1
Fin de SiFin de PourRenvoyer deg
On peut aussi écrire Si m_sj = 1. Dans une matrice d'adjacence, les coefficients valent 0 ou 1.
La vérification. Le sujet numérote les sommets et les colonnes de 1 à 3. Python numérote à partir de 0 : on lit donc M[s - 1][j - 1].
Le sujet officiel, page 2 du PDF : l'image exacte, et le PDF à voir ou à télécharger.
On considère l'algorithme ci-dessous écrit en langage naturel où Div désigne une fonction de paramètre Nbre, Nbre étant un nombre entier supérieur ou égal à 2.
Algorithme en langage naturel :
Pseudo-code
Fonction Div(Nbre)
Test ← 0
Pour i allant de 1 à Nbre FaireSi le reste de la division de Nbre par i est égal à 0 Faire
Test ← Test + 1
Fin de SiFin de PourRetourner Test
Que renvoie Div(6) ? Justifier en expliquant le rôle de cette fonction.
Écrire une fonction Prem de paramètre Nbre, où Nbre est un nombre entier supérieur ou égal à 2, qui renvoie Vrai (ou True) si Nbre est premier, Faux (ou False) si Nbre n'est pas premier. On pourra utiliser la fonction Div.
Corrigé
La méthode. Pour a., on fait la trace : i parcourt les entiers de 1 à 6, et Test compte ceux qui divisent 6. Pour b., on se sert du résultat : un nombre premier a exactement deux diviseurs, 1 et lui-même.
a. La trace de Div(6) :
i
reste de 6 par i
Test
départ
–
0
1
0
1
2
0
2
3
0
3
4
2
3
5
1
3
6
0
4
Div(6) renvoie 4. La fonction compte le nombre de diviseurs de Nbre. Les diviseurs de 6 sont 1, 2, 3 et 6.
b. Un entier supérieur ou égal à 2 est premier si et seulement s'il a exactement 2 diviseurs.
Pseudo-code
Fonction Prem(Nbre)
Si Div(Nbre) = 2 AlorsRenvoyer Vrai
SinonRenvoyer Faux
Fin de SiFin de Fonction
On peut l'écrire en une ligne : Renvoyer Div(Nbre) = 2.
La vérification. On teste un nombre premier, 7, et deux nombres qui ne le sont pas, 9 et 623 = 7 × 89.
Python
def Div(Nbre):
Test = 0for i inrange(1, Nbre + 1):
if Nbre % i == 0:
Test = Test + 1return Test
def Prem(Nbre):
return Div(Nbre) == 2print(Div(6))
print(Prem(7), Prem(9), Prem(623))
Ce qui s'affiche
4
True False False
Attention
Le corrigé officiel de ce sujet écrit Afficher Vrai et Afficher Faux. C'est une erreur de forme : l'énoncé demande une fonction qui renvoie Vrai ou Faux.
Une fonction qui affiche ne rend rien qu'on puisse réutiliser. Écrivez Renvoyer.
Ce qui rapporte les points : pour a., la valeur 4 et le rôle de la fonction, justifiés par les restes nuls. Pour b., l'appel à Div et le test = 2, avec un résultat renvoyé.
Rappel : chaque réponse suit le formalisme Kerlouan (K1 Cadrage, K2 Vérification, K3 Justification).
Fiche
Tout le cours en résumé
Chapitre 1 — Écrire un algorithme
Algorithme : une suite d'instructions qui résout un problème, en un nombre fini d'étapes.
Exécution séquentielle : les instructions s'exécutent dans l'ordre, de haut en bas.
Variable : une case de la mémoire, avec un nom et une valeur.
Affectationx ← 5 : on calcule la droite, puis on range le résultat dans x. L'ancienne valeur est perdue.
Mise à jourx ← x + 1 : la nouvelle valeur dépend de l'ancienne.
Lire : demander une valeur au clavier. Écrire : afficher à l'écran.
Trace : un tableau avec une colonne par variable et une ligne par étape.
Écrire le pseudo-code : un bloc décalé de 4 espaces, chaque structure fermée par son « Fin de ».
En-tête : nom, rôle, entrées, sortie. Un commentaire // dit le rôle d'une variable.
Action
Pseudo-code
Python
Affecter
x ← 5
x = 5
Mettre à jour
n ← n + 1, n ← n - 1
n += 1, n -= 1
Lire un entier
Lire n
n = int(input("n ? "))
Écrire
Écrire "Total :", t
print("Total :", t)
Commentaire
// …
# …
Un exemple résolu : la trace de a ← 3, b ← a + 4, a ← a * b.
Étape
a
b
1
3
–
2
3
7
3
21
7
Les pièges :
✘ Utiliser une variable avant de la calculer → écrivez les lignes dans l'ordre où on en a besoin.
✘ Échanger deux valeurs avec a ← b puis b ← a → passez par une variable temp.
✘ Donner le résultat sans trace → à l'examen, la trace est la justification.
Chapitre 2 — Les types de données
Entier naturel : entier positif ou nul. Entier relatif : entier positif ou négatif. En Python : int.
Réel : nombre à virgule, écrit avec un point en Python. En Python : float. La division / donne toujours un réel : 8 / 2 vaut 4.0.
Booléen : Vrai ou Faux. En Python : bool, avec True et False.
Chaîne de caractères : un texte entre guillemets, d'un seul bloc. En Python : str. chaine[i] extrait le caractère d'indice i. On ne modifie pas un caractère : mot[0] ← "X" est une erreur.
Domaine de valeurs : sur n bits, on écrit valeurs. Un entier naturel va de 0 à .
Dépassement de capacité : le calcul sort du domaine, le résultat devient faux.
Les entiers sont exacts. Les réels sont approchés : 0.1 + 0.2 affiche 0.30000000000000004.
Indice : la position d'un caractère, à partir de 0. Le dernier est à longueur(s) - 1.
Transtypage : changer le type d'une valeur.
Bits
Entier naturel
Entier relatif
8
0 à 255
-128 à 127
16
0 à 65 535
-32 768 à 32 767
Conversion
Python
Résultat
texte → entier
int("42")
42
texte → réel
float("3.5")
3.5
nombre → texte
str(42)
"42"
réel → entier
int(3.9)
3
Un exemple résolu : l'âge tapé au clavier.
Python
age = "25"print(age + "1")
print(int(age) + 1)
Ce qui s'affiche
251
26
Les pièges :
✘ Tester x == 0.3 avec des réels → arrondissez avec round, ne testez pas l'égalité exacte.
✘ Calculer avec ce que renvoie input → convertissez d'abord avec int ou float.
✘ Prendre mot[1] pour le premier caractère → le premier est mot[0].
Chapitre 3 — Les opérateurs
div et mod : quotient et reste de la division euclidienne. 17 = 5 × 3 + 2.
n mod 2 = 0 : n est pair.
Une formule en ligne garde l'ordre des calculs avec des parenthèses : (a + b) / 2.
Fonctions usuelles : abs, round, math.floor, math.ceil, math.sqrt. Hasard uniforme : random.randint(a, b) pour un entier, random.uniform(a, b) pour un réel.
Comparaison : donne un booléen. « Différent » s'écrit ≠, <> ou !=. Les caractères se comparent par leur code : chiffres, puis majuscules, puis minuscules.
ET : les deux vrais. OU : au moins un vrai. OUX : exactement un vrai. NON : inverse. ET passe avant OU : mettez des parenthèses.
Masque : un nombre dont les 1 désignent les bits à toucher. Le bit 0 est le plus à droite.
Concaténation : coller deux chaînes avec +. Motif : un texte qu'on cherche.
Ce qu'on veut
Pseudo-code
Python
Quotient, reste
a div b, a mod b
a // b, a % b
Puissance
a ^ b
a ** b
Égal, différent
=, ≠
==, !=
Logique
ET, OU, NON
and, or, not
Tester, allumer, inverser un bit
ET, OU, OUX avec un masque
x & m, x | m, x ^ m
Éteindre un bit
ET avec l'inverse du masque
x & ~m
Morceau de chaîne
sous_chaine(s, i, j)
s[i:j], j exclu
Chercher un motif
position(s, motif)
s.find(motif), -1 si absent
Un exemple résolu : convertir 7 384 secondes.
Python
duree = 7384
heures = duree // 3600
reste = duree % 3600print(heures, "h", reste // 60, "min", reste % 60, "s")
Ce qui s'affiche
2 h 3 min 4 s
Les pièges :
✘ a + b / 2 pour une moyenne → écrivez (a + b) / 2.
✘ jour == "samedi" or "dimanche" → écrivez chaque comparaison en entier.
✘ = pour tester en Python → = range, == teste.
✘ s[4:6] pour trois caractères → la borne de droite est exclue, écrivez s[4:7].
Chapitre 4 — Les structures de contrôle
Si… Alors… Sinon : un seul bloc s'exécute, celui de la première condition vraie.
Pour : on connaît le nombre de tours. range(1, n + 1) va de 1 à n. Si la fin est plus petite que le début : 0 tour.
Pour et Répéter s'écrivent avec Tant que : i ← 1, Tant que i ≤ n Faire … i ← i + 1.
Tant que : on teste avant chaque tour. Le bloc doit faire avancer la condition, sinon c'est une boucle infinie.
Répéter… Jusqu'à : au moins un tour, on s'arrête quand la condition devient vraie.
Boucle de calcul : préparation, itération, mise en forme finale. On la construit avec une propriété vraie à la fin de chaque tour (raisonnement par récurrence) : « après le tour i, s contient 1 + … + i ».
Accumulateur : part de 0 pour une somme, de 1 pour un produit.
Σ devient une boucle Pour qui additionne. Π devient une boucle Pour qui multiplie.
Structures imbriquées : la boucle intérieure fait tous ses tours à chaque tour de la boucle extérieure.
Jeu d'essai : une valeur par branche, les valeurs limites, un cas d'erreur, et le résultat attendu pour chacune.
Combien de tours ? : pour comparer deux algorithmes, on compte les tests de la boucle. S'arrêter dès qu'on a trouvé fait souvent beaucoup moins de tours.
Structure
Pseudo-code
Python
Si
Si … Alors / Sinon si / Sinon / Fin de Si
if …: / elif …: / else:
Pour
Pour i allant de 1 à n Faire / Fin de Pour
for i in range(1, n + 1):
Tant que
Tant que … Faire / Fin de Tant que
while …:
Répéter
Répéter / Jusqu'à …
while True: puis if …: break
Un exemple résolu : et .
Python
s = 0
p = 1for i inrange(1, 5):
s = s + i ** 2
p = p * i
print(s, p)
Ce qui s'affiche
30 24
Les pièges :
✘ range(1, 10) pour aller de 1 à 10 → écrivez range(1, 11).
✘ Initialiser l'accumulateur dans la boucle → mettez s ← 0 avant la boucle.
✘ Diviser pour la moyenne dans la boucle → la mise en forme se fait après la boucle.
✘ Tester le cas faible avant le cas fort → dans un Sinon si, le premier cas vrai gagne.
Chapitre 5 — Les tableaux et les fonctions
Tableau : plusieurs valeurs sous un seul nom, repérées par un indice à partir de 0.
Construire : T ← [] crée un tableau vide, ajouter(T, v) ajoute à la fin. Une grille se construit avec deux boucles.
Parcourir : une boucle sur les indices, de 0 à longueur(T) - 1, ou directement les valeurs : Pour chaque x dans T, for x in T.
Maximum : on part de T[0], puis on compare avec chacun des suivants.
Copier : élément par élément, en partant de c ← [] et en ajoutant chaque x. En Python : b = a.copy(). Avec b = a, les deux noms désignent le même tableau.
Tableau à deux dimensions : M[ligne][colonne]. Une ligne : i fixe, j varie. Une colonne : j fixe, i varie.
Fonction : reçoit des paramètres et renvoie un résultat avec Renvoyer. Procédure : agit, ne renvoie rien. Plusieurs résultats : (total, produit) ← f(T), en Python total, produit = f(T).
Variable locale : n'existe que dans la fonction. Variable globale : visible partout. La modifier dans une fonction (global en Python) est à éviter.
Entrée seule : le paramètre est lu, pas modifié. Sortie seule : il est rempli sans être lu, comme dans remplir(T, n). Entrée et sortie : il est lu puis modifié.
Action
Pseudo-code
Python
Créer
T ← [12, 15, 9]
T = [12, 15, 9]
Lire, écrire une case
T[1], T[1] ← 14
T[1], T[1] = 14
Ajouter à la fin
ajouter(T, 8)
T.append(8)
Fonction
Fonction f(x) / Renvoyer … / Fin de Fonction
def f(x): / return …
Un exemple résolu : la moyenne d'un tableau, dans une fonction.
Python
def moyenne(T):
s = 0for i inrange(len(T)):
s = s + T[i]
return s / len(T)
print(moyenne([12, 15, 9, 18]))
Ce qui s'affiche
13.5
Les pièges :
✘ range(len(T) + 1) → le dernier indice est len(T) - 1.
✘ Partir de 0 pour un maximum → partez de T[0].
✘ Écrire à la place de Renvoyer dans une fonction → la fonction doit rendre son résultat.
✘ Utiliser hors de la fonction une variable créée dedans → elle est locale, elle n'existe plus.
Rappel : chaque réponse suit le formalisme Kerlouan (K1 Cadrage, K2 Vérification, K3 Justification).
QCM
Réviser vite, en boucle
156 questions, tirées au hasard. La correction s'affiche dès que vous cliquez. À la fin, on mélange et on recommence.