Numérique et sciences informatiques (spécialité) · Première
Diversité des langages : exercices corrigés de NSI en 1re
Publié le 6 novembre 2026 · Mis à jour le 6 novembre 2026 · Signaler une erreur
L'essentiel
- Un même problème peut s'écrire dans plusieurs langages, et même de plusieurs façons dans un seul langage : l'important est de savoir lire, prévoir le résultat et le vérifier.
- Chaque langage a été pensé pour des usages : R sert aux statistiques et à la science des données, Python apparaît dans les sujets de la spécialité NSI.
- Avant d'écrire du code, écris la spécification (ce que la fonction reçoit et renvoie), puis des tests avec
assert. - Pour prévoir une sortie, construis un tableau de suivi des variables ligne par ligne, sans calculatrice.
Comment utiliser ces exercices
Cette page te propose de t'entraîner sur la diversité des langages : un même problème se résout avec des langages différents, et dans un même langage avec des écritures différentes. Tu as déjà vu les constructions élémentaires (variables, boucles, conditions, fonctions) ainsi que la spécification et les tests. Ici, tu les réinvestis pour lire, comparer et vérifier des programmes. La notion suivante du programme, l'utilisation de bibliothèques, s'appuiera sur ces réflexes.
Quelques repères sur les langages rencontrés
Tous les langages ne servent pas aux mêmes usages. Le langage R est destiné aux statistiques et à la science des données 2. Il est largement utilisé par les statisticiens et les spécialistes de l'analyse de données 2. Il est lui-même écrit en C, en Fortran et en R 2. C'est une implémentation du langage S, auquel s'ajoute la portée lexicale, inspirée de Scheme, et un ramasse-miettes 2. S a été développé par John Chambers et ses collègues dans les laboratoires Bell 2.
Les exercices
Exercice 1 Simuler une boucle en Python
On considère le programme Python suivant.
total = 0
for i in range(1, 6):
total = total + i * i
print(total)
- Construis le tableau de suivi des variables
iettotal. - Quelle valeur ce programme affiche-t-il ?
- Que faudrait-il modifier pour que la boucle prenne aussi en compte la valeur 6 ?
Indice 1
range(1, 6) produit les entiers de 1 à 5 : la borne de droite est exclue.
Indice 2
À chaque tour, on ajoute le carré de i à total.
Voir la correction pas à pas
On initialise
totalà 0 avant la boucle.iprend successivement les valeurs 1, 2, 3, 4, 5 (la valeur 6 est exclue).Tour par tour,
totalvaut : 0 + 1 = 1, puis 1 + 4 = 5, puis 5 + 9 = 14, puis 14 + 16 = 30, puis 30 + 25 = 55.Le programme affiche donc 55.
Pour inclure 6, on écrit
range(1, 7): la borne de droite doit dépasser d'une unité la dernière valeur voulue.
Le programme affiche 55, somme des carrés des entiers de 1 à 5. Le réflexe à retenir : avec range(a, b), la borne b n'est jamais atteinte.
Exercice 2 Lire des repères historiques sur R
Voici trois informations sur le langage R : la première version officielle, 1.0.0, est publiée le 29 février 2000 2 ; la R Foundation for Statistical Computing est créée en 2003 2 ; R est écrit en C, en Fortran et en R 2.
- Combien d'années séparent la publication de la version 1.0.0 de la création de la fondation ?
- Pourquoi une date comme le 29 février 2000 est-elle possible ? Rappelle la règle des années bissextiles et applique-la à 2000.
- Quels langages entrent dans l'écriture même de R ? Que montre ce fait sur la manière dont les langages se construisent les uns sur les autres ?
Indice 1
Pour la question 1, soustrais les deux années.
Indice 2
Une année divisible par 400 est bissextile, même si elle est divisible par 100.
Voir la correction pas à pas
Entre 2000 et 2003, il y a 2003 − 2000 = 3 années d'écart.
Une année est bissextile si elle est divisible par 4, sauf si elle est divisible par 100 sans l'être par 400. L'année 2000 est divisible par 400 : elle est bissextile, donc le 29 février 2000 existe.
R est écrit en C, en Fortran et en R 2.
Un langage peut donc être écrit, en partie, avec d'autres langages, et même avec lui-même : les langages s'appuient les uns sur les autres.
L'écart est de 3 ans. Retiens aussi que la diversité des langages n'est pas un empilement de mondes séparés : ils se construisent les uns avec les autres.
Exercice 3 Associer un langage à un besoin
Pour chaque situation, indique le langage cité dans cette page qui correspond le mieux, et justifie en une phrase.
- Une chercheuse veut analyser des résultats d'enquête et produire des statistiques.
- Un candidat prépare l'exercice de programmation orientée objet de l'épreuve de NSI.
- Un élève veut savoir si R est un langage « généraliste » comme on en trouve en cours de NSI. Que peux-tu répondre d'après ce que dit la page ?
Indice 1
Relis la section « Quelques repères sur les langages rencontrés ».
Indice 2
Le mot « destiné » dans la source indique l'usage principal d'un langage.
Voir la correction pas à pas
Situation 1 : R, car il est destiné aux statistiques et à la science des données 2.
Situation 2 : Python, car l'épreuve comporte un exercice de programmation orientée objet en Python 1.
Situation 3 : R est présenté comme un langage destiné aux statistiques et à la science des données 2. On ne peut donc pas le présenter comme un langage conçu pour tous les usages ; il est plutôt spécialisé.
Dans chaque cas, on choisit le langage d'après le besoin et l'environnement dans lequel on travaille.
Un langage se choisit selon l'usage visé et le contexte. C'est la raison pour laquelle il existe plusieurs langages au lieu d'un seul.
Exercice 4 Spécifier et tester une moyenne
On souhaite écrire une fonction qui renvoie la moyenne d'une liste de nombres.
def moyenne(liste):
"""Renvoie la moyenne des nombres de la liste (liste non vide)."""
s = 0
for x in liste:
s = s + x
return s / len(liste)
- Écris la spécification : que reçoit la fonction, que renvoie-t-elle, quelle précondition est nécessaire ?
- Calcule à la main
moyenne([12, 15, 9, 18]). - Écris deux tests avec
assert, dont un sur une liste à un seul élément. - Que se passe-t-il avec une liste vide ? Que faire pour s'en protéger ?
Indice 1
La précondition concerne la longueur de la liste.
Indice 2
Pour la liste vide, regarde le dénominateur de la division.
Voir la correction pas à pas
Spécification : la fonction reçoit une liste de nombres non vide et renvoie un nombre, la somme des éléments divisée par leur effectif.
Calcul : 12 + 15 + 9 + 18 = 54, et il y a 4 valeurs, donc 54 / 4 = 13,5.
Tests :
assert moyenne([12, 15, 9, 18]) == 13.5etassert moyenne([7]) == 7.Avec une liste vide,
len(liste)vaut 0 et la division provoque une erreur.Protection : ajouter en tête de fonction
assert len(liste) > 0pour rendre la précondition explicite.
La moyenne vaut 13,5. Une bonne fonction s'accompagne de sa spécification et de tests qui couvrent un cas ordinaire et un cas limite.
Exercice 5 Factorielle : vérifier une fonction
Voici une fonction censée calculer la factorielle d'un entier positif n, c'est-à-dire le produit des entiers de 1 à n (avec 0! = 1).
def factorielle(n):
p = 1
for k in range(1, n + 1):
p = p * k
return p
- Simule
factorielle(5)avec un tableau de suivi. - Que renvoie
factorielle(0)? Est-ce cohérent avec la convention donnée ? - Propose trois tests pertinents.
Indice 1
Si n vaut 0, range(1, 1) ne contient aucun entier.
Indice 2
Choisis un cas limite, un cas ordinaire et un cas où tu connais le résultat par cœur.
Voir la correction pas à pas
Pour n = 5, k prend 1, 2, 3, 4, 5. Le produit p vaut successivement 1, 2, 6, 24, 120.
factorielle(5)renvoie 120.Pour n = 0, la boucle ne s'exécute pas, p reste égal à 1 : la fonction renvoie 1, ce qui respecte la convention 0! = 1.
Tests :
assert factorielle(0) == 1,assert factorielle(1) == 1,assert factorielle(5) == 120.
factorielle(5) renvoie 120. Le cas n = 0 est un cas limite à tester systématiquement : c'est là que les erreurs se cachent.
Exercice 6 Trois écritures d'un même calcul
On veut la somme des multiples de 3 strictement inférieurs à 20. Voici trois programmes Python.
# Version A
s = 0
for n in range(20):
if n % 3 == 0:
s = s + n
# Version B
s = sum(range(3, 20, 3))
# Version C
def somme(n):
if n < 3:
return 0
if n % 3 == 0:
return n + somme(n - 1)
return somme(n - 1)
s = somme(19)
- Liste les multiples de 3 concernés et calcule leur somme.
- Explique pourquoi la version A ajoute aussi 0 sans que cela change le résultat.
- Laquelle te semble la plus lisible ? Justifie, sans prétendre qu'il y a une seule bonne réponse.
Indice 1
n % 3 == 0 signifie que le reste de la division de n par 3 est nul.
Indice 2
Dans range(3, 20, 3), le troisième nombre est le pas.
Voir la correction pas à pas
Les multiples de 3 inférieurs à 20 sont 3, 6, 9, 12, 15 et 18.
Leur somme : 3 + 6 = 9, puis 9 + 9 = 18, puis 18 + 12 = 30, puis 30 + 15 = 45, puis 45 + 18 = 63.
Dans la version A, 0 est divisible par 3, donc on ajoute 0 à s : cela ne modifie pas la somme.
La version B est la plus courte ; la version A montre chaque étape ; la version C repose sur un appel de la fonction à elle-même. Le choix dépend du lecteur et du contexte.
Les trois versions donnent 63. Un même problème admet plusieurs écritures correctes : l'important est de savoir les lire et de choisir celle que le lecteur comprendra le mieux.
Exercice 7 Division et types de nombres
On exécute en Python le code suivant.
x = 7
y = 2
print(x // y)
print(x % y)
print(x / y)
- Donne les trois valeurs affichées.
- Vérifie la cohérence entre
//et%: quelle égalité relie x, y, le quotient et le reste ? - Un programmeur déclare : « une même opération s'écrit forcément de la même façon dans tous les langages ». Pourquoi cette affirmation est-elle imprudente ?
Indice 1
// donne le quotient de la division euclidienne, % le reste.
Indice 2
Pour la question 3, pense à la diversité des langages : chacun fait ses propres choix de syntaxe.
Voir la correction pas à pas
7 = 2 × 3 + 1 :
x // yaffiche 3,x % yaffiche 1.x / yaffiche 3.5, car la division « ordinaire » ne se limite pas aux entiers.Relation : x = y × (x // y) + (x % y), soit 7 = 2 × 3 + 1.
Les langages ont chacun leur syntaxe et leurs conventions. Il faut donc lire la définition d'un opérateur dans le langage utilisé avant de supposer son comportement.
Le programme affiche 3, puis 1, puis 3,5. Retiens la relation entre quotient et reste, et le réflexe de vérifier le comportement d'un opérateur dans le langage que tu utilises.
Exercice 8 Convertir des températures et tester
La formule de conversion des degrés Celsius en degrés Fahrenheit est .
def celsius_vers_fahrenheit(c):
"""Renvoie la température en Fahrenheit."""
return 9 / 5 * c + 32
- Calcule à la main la valeur pour .
- Calcule la valeur pour , puis pour .
- Écris trois tests avec
assert. - On propose
assert celsius_vers_fahrenheit(37) == 98.6. Pourquoi un tel test sur des nombres à virgule est-il fragile, et par quoi peut-on le remplacer ?
Indice 1
.
Indice 2
En machine, les nombres à virgule sont représentés de façon approchée : une égalité exacte peut échouer.
Voir la correction pas à pas
Pour : , puis .
Pour : , donc . Pour : on obtient .
Tests :
assert celsius_vers_fahrenheit(0) == 32etassert celsius_vers_fahrenheit(100) == 212, ainsi qu'un test sur 37 avec tolérance.Les nombres à virgule sont stockés de façon approchée, donc une égalité stricte peut échouer pour une infime différence.
On remplace par
assert abs(celsius_vers_fahrenheit(37) - 98.6) < 1e-9, qui accepte une très petite erreur.
La valeur pour 37 °C est 98,6. Teste les cas simples avec une égalité, et les résultats décimaux avec une tolérance.
Exercice 9 Organiser son temps le jour de l'épreuve
Les sujets de l'épreuve de spécialité NSI comportent trois exercices indépendants, pour une durée de 3 h 30 1. On suppose que tu répartis le temps de façon égale entre les exercices.
Indice 1
3 h 30, c'est 3 × 60 minutes plus 30 minutes.
Indice 2
Que se passe-t-il pour les autres exercices si tu es bloqué sur l'un d'eux ?
Voir la correction pas à pas
3 h 30 = 3 × 60 + 30 = 210 minutes.
Répartition égale : 210 / 3 = 70 minutes par exercice.
L'indépendance des exercices permet de les traiter dans l'ordre de ton choix : si l'un bloque, tu passes au suivant sans perdre le reste.
Habitude à prendre : faire les calculs et les simulations de programmes à la main, avec des tableaux de suivi, sans calculatrice.
Une répartition égale donne 70 minutes par exercice. C'est un repère de départ, que tu ajusteras selon la difficulté de chacun.
Les questions qu'on se pose
Dois-je connaître R pour réussir en NSI ?
Non. Dans les sujets de l'épreuve de spécialité, c'est Python que l'on retrouve, notamment dans l'exercice de programmation orientée objet 1. R est cité ici comme exemple de langage spécialisé : il est destiné aux statistiques et à la science des données 2. Il illustre la diversité des langages, mais il n'est pas à savoir écrire.
Pourquoi apprendre qu'il existe plusieurs langages si on n'en pratique qu'un ?
Parce que les idées sont les mêmes d'un langage à l'autre : variables, boucles, tests, fonctions, spécification et tests. Un langage se choisit selon l'usage visé, comme le montre le cas de R, conçu pour les statistiques 2. Si tu maîtrises ces idées, changer de langage devient une question de syntaxe, et tu auras à les mobiliser à nouveau avec les bibliothèques, notion qui suit dans le programme.
Sources
- Spécialité NSI - Numérique et Sciences Informatiques (formations, ressources, textes de référence), Éduscol STI. Consulté le 6 novembre 2026.
- R (langage), Wikipédia. Consulté le 6 novembre 2026.
- Origine du langage, Wikipédia. Consulté le 6 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.