Numérique et sciences informatiques (spécialité) · TerminaleBac
Paradigmes de programmation : exercices corrigés de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Un paradigme est une façon d'aborder la programmation et de formuler la solution d'un problème 3.
- Impératif, orienté objet, fonctionnel, logique et concurrent sont des paradigmes différents ; un langage en supporte un ou plusieurs 4.
- Python fait partie des langages qui supportent plusieurs paradigmes 3 : au Bac, tu choisis le style adapté à la question.
- Pour chaque exercice : repère le paradigme, puis suis le programme pas à pas, valeur par valeur.
Comment utiliser ces exercices
Ces exercices s'adressent à toi si tu prépares l'épreuve de NSI de Terminale. Ils viennent après la récursivité, la modularité et les API, et avant la mise au point des programmes. Les exercices écrits de l'épreuve demandent du Python et, selon les sujets, de la programmation orientée objet 2. Ici, tu t'entraînes à reconnaître la manière de penser qui se cache derrière un programme.
Ce que la page ne demande pas
Les exercices
Exercice 1 Associer chaque paradigme à sa description
Associe chaque paradigme à la phrase qui lui correspond.
Paradigmes : A. impératif, B. orienté objet, C. fonctionnel, D. logique.
Descriptions :
- Le programme est une collection d'objets qui interagissent.
- Le programmeur écrit des faits et des règles, et le système cherche les réponses.
- Le programme est une suite d'instructions qui modifient l'état des variables.
- Le programme est une suite d'évaluations de fonctions, sans état.
Indice 1
Relis le rappel de cours : chaque paradigme a une « vue » du programme.
Indice 2
Dans le paradigme logique, qui pilote la recherche : le programmeur ou le système ?
Voir la correction pas à pas
Phrase 1 : des objets qui interagissent, c'est la vue du paradigme orienté objet 3. Donc 1 correspond à B.
Phrase 2 : dans le paradigme logique, le programmeur exprime les règles et le système pilote la recherche 4. Donc 2 correspond à D.
Phrase 3 : modifier l'état de variables instruction après instruction caractérise l'impératif, paradigme d'origine 3. Donc 3 correspond à A.
Phrase 4 : des évaluations de fonctions sans état décrivent le paradigme fonctionnel 3. Donc 4 correspond à C.
Association : A-3, B-1, C-4, D-2. Retiens la « vue » propre à chaque paradigme : c'est elle qui permet de le reconnaître vite.
Exercice 2 Un langage, plusieurs paradigmes
Voici deux programmes Python qui calculent la somme des éléments d'une liste L = [4, 7, 1].
# Programme P1
s = 0
for x in L:
s = s + x
# Programme P2
class Somme:
def __init__(self, liste):
self.liste = liste
def calcule(self):
return sum(self.liste)
s = Somme(L).calcule()
- Quel paradigme domine dans P1 ? dans P2 ?
- Les deux programmes peuvent-ils coexister dans un même langage ? Justifie.
Indice 1
Dans P1, regarde la ligne qui modifie s à chaque tour de boucle.
Indice 2
Dans P2, repère le mot-clé qui définit une classe et la méthode qui porte le calcul.
Voir la correction pas à pas
P1 modifie la variable
sà chaque tour de boucle : c'est du style impératif 3.P2 définit une classe avec un attribut et une méthode, puis crée un objet : c'est du style orienté objet 3.
Python fait partie des langages qui supportent plusieurs paradigmes 3, et la plupart des langages contemporains permettent d'en combiner plusieurs s'ils sont compatibles 4. Les deux programmes coexistent donc sans difficulté.
Dans les deux cas, le résultat est le même : .
Le choix du paradigme est une décision de conception, pas une contrainte du langage. Ici, P1 est plus court ; P2 serait préférable si la somme devait s'intégrer à un ensemble d'objets plus riche.
Exercice 3 Style impératif : suivre une boucle
Voici un programme écrit dans le style impératif.
total = 0
for i in range(1, 6):
total = total + i * i
Quelle est la valeur de total à la fin de l'exécution ?
Indice 1
range(1, 6) produit les entiers de 1 à 5 inclus.
Indice 2
Fais un tableau avec les colonnes i, i * i et total.
Voir la correction pas à pas
Avant la boucle :
total = 0.Pour : on ajoute , donc
totalvaut 1.Pour : on ajoute , donc
totalvaut 5.Pour : on ajoute , donc
totalvaut 14.Pour : on ajoute , donc
totalvaut 30.Pour : on ajoute , donc
totalvaut 55.
À la fin, total vaut . Le style impératif se lit comme une succession d'états de la variable : il suffit de noter chaque état.
Exercice 4 Le même calcul en style fonctionnel
On veut doubler chaque élément de L = [1, 2, 3, 4] puis additionner les résultats.
def double(x):
return 2 * x
resultat = sum(map(double, L))
- Quelle est la valeur de
resultat? - Cette écriture modifie-t-elle la liste
L? Explique pourquoi elle se rapproche du paradigme fonctionnel.
Indice 1
map(double, L) applique double à chaque élément, sans toucher à L.
Indice 2
Pense à la définition : une suite d'évaluations de fonctions sans état.
Voir la correction pas à pas
double(1)=2,double(2)=4,double(3)=6,double(4)=8.La somme vaut .
La liste
Ln'est pas modifiée :doublerenvoie une valeur et ne change rien d'autre, etsumrenvoie un nombre.On retrouve l'idée du fonctionnel : un programme vu comme une suite d'évaluations de fonctions sans état 3.
Le résultat est 20. Ce style évite de suivre l'évolution d'une variable : on ne raisonne que sur les valeurs renvoyées. Il ne devient pas « pur » pour autant, car Python autorise aussi d'autres styles 3.
Exercice 5 Repérer un effet de bord
L = [1, 2]
def ajoute(liste, x):
liste.append(x)
return len(liste)
a = ajoute(L, 5)
b = ajoute(L, 5)
- Donne les valeurs de
a, deb, puis le contenu deL. - Pourquoi dit-on que
ajoutea un effet de bord ? - Quelle valeur obtient-on pour
len(L)à la fin ?
Indice 1
append modifie la liste d'origine, elle n'en crée pas une nouvelle.
Indice 2
Compare les deux appels : mêmes arguments, mêmes résultats ?
Voir la correction pas à pas
Premier appel :
Ldevient[1, 2, 5]et la fonction renvoie 3, donca = 3.Second appel avec les mêmes arguments :
Ldevient[1, 2, 5, 5]et la fonction renvoie 4, doncb = 4.Deux appels identiques donnent deux résultats différents, car la fonction modifie une donnée extérieure à elle-même : c'est un effet de bord. La programmation fonctionnelle pure interdit justement ces effets 3.
À la fin,
L = [1, 2, 5, 5], donclen(L) = 4.
a = 3, b = 4, L = [1, 2, 5, 5] et len(L) = 4. Éviter les effets de bord rend un programme plus facile à comprendre et à prouver 3.
Exercice 6 Suivre l'état d'un objet
class Compteur:
def __init__(self, pas):
self.pas = pas
self.valeur = 0
def avance(self):
self.valeur = self.valeur + self.pas
c = Compteur(3)
c.avance()
c.avance()
c.avance()
- Quelle est la valeur de
c.valeurà la fin ? - Quel est l'avantage de ranger la donnée et l'opération dans la même classe ?
Indice 1
__init__ s'exécute à la création de l'objet, une seule fois.
Indice 2
Chaque appel de avance ajoute pas à valeur.
Voir la correction pas à pas
Création :
c.pas = 3etc.valeur = 0.Premier appel :
c.valeur = 0 + 3 = 3.Deuxième appel :
c.valeur = 3 + 3 = 6.Troisième appel :
c.valeur = 6 + 3 = 9.Dans le paradigme objet, le programme est une collection d'objets en interaction 3 : chaque objet porte son état et les méthodes qui le font évoluer, ce qui limite les endroits du programme où cet état peut changer.
c.valeur vaut 9. Les fragments de programme paramétrables et réutilisables s'appellent des méthodes dans ce paradigme, là où d'autres parlent de fonctions ou de procédures 4.
Exercice 7 Raisonner en paradigme logique
Une base de faits décrit des liens de parenté. Chaque fait parent(X, Y) signifie « X est parent de Y ».
parent(a, b)parent(b, c)parent(b, d)parent(c, e)
Une règle indique : X est grand-parent de Z s'il existe Y tel que parent(X, Y) et parent(Y, Z).
- Liste tous les couples (X, Z) tels que X est grand-parent de Z.
- Combien y en a-t-il ?
- Dans cet exercice, qui écrit les règles et qui mène la recherche ?
Indice 1
Pour chaque fait parent(X, Y), cherche les faits qui commencent par Y.
Indice 2
Un même Y peut avoir plusieurs enfants.
Voir la correction pas à pas
Pour
parent(a, b): les faits qui commencent par b sontparent(b, c)etparent(b, d). On obtient (a, c) et (a, d).Pour
parent(b, c): le fait qui commence par c estparent(c, e). On obtient (b, e).Pour
parent(b, d): aucun fait ne commence par d. Pourparent(c, e): aucun fait ne commence par e. Rien de plus.Il y a donc 3 couples : (a, c), (a, d) et (b, e).
Le programmeur exprime les règles ; le système pilote le processus de recherche dans l'ensemble de faits 4.
Il y a 3 couples. L'exécution d'un programme logique est une cascade de recherches de faits en invoquant des règles de déduction 4 : tu viens d'en faire une à la main.
Exercice 8 Choisir le paradigme adapté
Pour chacune des situations suivantes, propose le paradigme qui te semble le plus naturel et justifie en une ou deux phrases.
S1. Un jeu où des personnages, des objets et des décors ont chacun des caractéristiques et des actions. S2. Un serveur qui doit traiter plusieurs demandes d'utilisateurs en même temps. S3. Une transformation de données où l'on applique des fonctions successives à une liste, sans rien modifier. S4. Un petit système expert qui déduit des conclusions à partir de faits et de règles.
Indice 1
Pour S2, cherche le paradigme qui introduit la notion de thread.
Indice 2
Pour S3, pense à l'absence d'effets de bord.
Voir la correction pas à pas
S1 : des entités avec états et comportements, c'est le paradigme orienté objet, où l'on voit le programme comme des objets en interaction 3.
S2 : plusieurs tâches simultanées relèvent du paradigme concurrent, qui introduit la notion de thread 4.
S3 : des fonctions appliquées successivement, sans état ni effet de bord, relèvent du paradigme fonctionnel 3.
S4 : des faits, des règles de déduction et des recherches relèvent du paradigme logique 4.
Un même projet peut mêler plusieurs de ces styles, à condition qu'ils soient compatibles 4. Le bon réflexe est de justifier le choix par la nature du problème, pas par une préférence personnelle.
Exercice 9 Comparer deux écritures d'un même problème
On veut obtenir la liste des carrés des nombres pairs de [1, 2, 3, 4, 5, 6].
# Version A
res = []
for n in [1, 2, 3, 4, 5, 6]:
if n % 2 == 0:
res.append(n * n)
# Version B
res = [n * n for n in [1, 2, 3, 4, 5, 6] if n % 2 == 0]
- Donne la valeur finale de
reset la somme de ses éléments. - Quelle version s'apparente au style impératif ? Laquelle s'approche du style fonctionnel ?
- Les deux sont-elles correctes dans le même langage ?
Indice 1
Les nombres pairs de la liste sont 2, 4 et 6.
Indice 2
Dans la version A, une variable est modifiée à chaque tour de boucle.
Voir la correction pas à pas
Les pairs sont 2, 4 et 6. Leurs carrés sont 4, 16 et 36, donc
res = [4, 16, 36].La somme vaut .
La version A construit
resen la modifiant au fil de la boucle avecappend: c'est du style impératif 3.La version B décrit le résultat comme une transformation de la liste de départ, sans modifier de variable intermédiaire : elle s'approche du style fonctionnel 3.
Python supporte plusieurs paradigmes 3, donc les deux versions sont valides et donnent le même résultat.
La somme vaut 56 dans les deux cas. La version B est plus courte ; la version A est plus facile à suivre pas à pas. Au Bac, choisis celle que tu sais expliquer et justifier sans erreur.
Les questions qu'on se pose
Comment savoir quel paradigme utilise un programme ?
Regarde comment le programme est organisé. S'il enchaîne des instructions qui modifient des variables, il est impératif 3. S'il définit des classes et des objets qui s'envoient des appels de méthodes, il est orienté objet 3. S'il compose des fonctions qui renvoient des valeurs sans rien modifier, il est fonctionnel 3. Un même programme peut mêler plusieurs de ces styles : la réponse attendue est alors « le style dominant » avec une justification.
Python est-il un langage orienté objet ou impératif ?
Python fait partie des langages qui supportent plusieurs paradigmes 3. Tu peux y écrire un programme purement impératif, un programme avec des classes, ou mélanger. La question à se poser est « comment ce programme précis est-il écrit ? », pas « que permet le langage ? ».
Que faut-il retenir pour l'épreuve de NSI ?
Sache définir un paradigme 3, citer les principaux (impératif, objet, fonctionnel, logique, concurrent) avec leur idée centrale 4, et reconnaître le style d'un extrait de code. Les exercices écrits de l'épreuve sont rédigés en Python 2 : entraîne-toi à dérouler du code à la main et à expliquer le choix d'une écriture.
Sources
Programme visé : Programmes et ressources - Numérique et Sciences Informatiques (voie générale) · Ministère de l'Éducation nationale / Éduscol
- Programmes et ressources - Numérique et Sciences Informatiques (voie générale), Ministère de l'Éducation nationale / Éduscol. Consulté le 7 novembre 2026.
- Spécialité NSI - Numérique et Sciences Informatiques, Éduscol STI. Consulté le 7 novembre 2026.
- Paradigme (programmation), Wikipédia. Consulté le 7 novembre 2026.
- Langage de programmation, Wikipédia. Consulté le 7 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.