← Retour au sommaire

Chapitre 7 – Algorithmique et programmation

Chapitre 7 | Première technologique (enseignement commun) | Mathématiques

Dernière mise à jour : 21 octobre 2026, 09:36

Objectifs du chapitre

Une partie transversale. L'algorithmique n'est pas isolée : elle accompagne les suites, le second degré et la loi de Bernoulli. On consolide les acquis de seconde (variable, condition, boucle, fonction) et on introduit une seule notion nouvelle : la liste. Le langage utilisé est Python. En langage naturel, l'affectation se note par la flèche « ← » ; en Python elle s'écrit avec le signe =.

I. Variables et affectation

Définition — Variable et affectation

Une variable est un nom qui désigne un emplacement mémoire dans lequel on range une valeur. Affecter une valeur à une variable, c'est y ranger cette valeur. En langage naturel on note \(x \leftarrow 5\) ; en Python on écrit x = 5.

Attention — ce n'est pas une égalité

L'affectation se lit de droite à gauche : on évalue d'abord l'expression à droite, puis on range le résultat dans la variable de gauche. Ainsi x = x + 1 signifie « la nouvelle valeur de \(x\) est l'ancienne, augmentée de 1 ».

# Affectation et types de variables
n = 12            # entier (int)
prix = 3.5        # flottant (float)
nom = "Ada"       # chaîne de caractères (str)
present = True    # booléen (bool)

# L'affectation se lit de droite à gauche
x = 5
x = x + 1         # on lit l'ancien x (5), on ajoute 1, on range 6 dans x
print(x)          # affiche 6

Le type d'une variable dépend de la valeur qu'elle contient ; on peut le vérifier avec la fonction type.

print(type(12))     # <class 'int'>
print(type(3.5))    # <class 'float'>
print(type("Ada"))  # <class 'str'>
Exercice d'application 1. Quelle valeur de \(x\) affiche ce programme ?
x = 4
x = x * 3
x = x - 2
print(x)

\(x=4\), puis \(x=4\times 3=12\), puis \(x=12-2=10\). Le programme affiche 10.

II. Instructions conditionnelles

Définition — Instruction conditionnelle

Une instruction conditionnelle exécute un bloc d'instructions selon qu'une condition est vraie ou fausse. En Python : if (si), elif (sinon si) et else (sinon). Le bloc concerné est indenté (décalé vers la droite).

# Signe d'un nombre
x = -4
if x > 0:
    print("positif")
elif x == 0:
    print("nul")
else:
    print("négatif")   # affiche négatif

Une condition est une expression booléenne (elle vaut True ou False). On la construit avec les comparaisons (==, !=, <, <=, >, >=) et les opérateurs logiques and, or, not.

age = 17
if age >= 15 and age <= 18:
    print("lycéen probable")
Attention — = et ==

= est l'affectation (« ranger dans »), == est le test d'égalité (« est-il égal à ? »). Dans un if, on utilise toujours ==.

Exercice d'application 2. Que fait ce programme lorsque note = 12 ?
note = 12
if note >= 10:
    print("admis")
else:
    print("recalé")

La condition note >= 10 est vraie (\(12 \geq 10\)), donc le programme affiche admis.

III. Boucles bornées et non bornées

Définition — Boucle

Une boucle répète un bloc d'instructions. La boucle for est bornée : on connaît d'avance le nombre de répétitions. La boucle while est non bornée : on répète tant qu'une condition reste vraie.

1. Boucle bornée for avec range

range(n) parcourt les entiers de \(0\) à \(n-1\). range(a, b) parcourt de \(a\) à \(b-1\). range(a, b, pas) avance par pas.

# Afficher les entiers de 0 à 4
for i in range(5):
    print(i)          # affiche 0, 1, 2, 3, 4

# Afficher les entiers de 2 à 10 de 2 en 2
for i in range(2, 11, 2):
    print(i)          # affiche 2, 4, 6, 8, 10

2. Boucle non bornée while

On l'utilise quand on ne sait pas d'avance combien d'itérations seront nécessaires : par exemple pour chercher un seuil.

# Plus petit entier n tel que 2**n dépasse 1000
n = 0
while 2 ** n <= 1000:
    n = n + 1
print(n)              # affiche 10  (car 2**10 = 1024)
Point de vigilance — boucle infinie

Dans une boucle while, il faut s'assurer que la condition finira par devenir fausse (on doit faire évoluer la variable de test), sinon la boucle ne s'arrête jamais.

Exercice d'application 3. Que renvoie ce programme ?
n = 1
while n < 20:
    n = n * 2
print(n)

\(n : 1 \to 2 \to 4 \to 8 \to 16 \to 32\). Dès que \(n=32\), la condition \(n \lt 20\) est fausse. Le programme affiche 32.

IV. Compteur et accumulateur

Définition — Compteur et accumulateur

Un compteur est une variable que l'on augmente de 1 à chaque fois qu'un événement se produit (pour dénombrer). Un accumulateur est une variable dans laquelle on accumule un résultat au fil d'une boucle (pour calculer une somme ou un produit).

Compteur. On l'initialise à \(0\), puis on fait « compteur ← compteur + 1 » à chaque événement.

# Compter les multiples de 3 entre 1 et 30
compteur = 0
for i in range(1, 31):
    if i % 3 == 0:        # i est-il un multiple de 3 ?
        compteur = compteur + 1
print(compteur)           # affiche 10

Accumulateur (somme). On initialise la somme à \(0\) (élément neutre de l'addition).

# Somme des entiers de 1 à 100 : 1 + 2 + ... + 100
somme = 0
for k in range(1, 101):
    somme = somme + k     # accumulation : somme ← somme + k
print(somme)              # affiche 5050

Accumulateur (produit). On initialise le produit à \(1\) (élément neutre de la multiplication).

# Factorielle : 5! = 1 x 2 x 3 x 4 x 5
produit = 1
for k in range(1, 6):
    produit = produit * k # accumulation : produit ← produit x k
print(produit)            # affiche 120
Attention — bien initialiser

Une somme s'initialise à 0, un produit à 1, un compteur à 0. Un produit initialisé à 0 resterait nul !

Exercice d'application 4. Écrire un programme qui calcule la somme des entiers pairs de 0 à 10 (\(0+2+4+6+8+10\)).
somme = 0
for k in range(0, 11, 2):
    somme = somme + k
print(somme)              # affiche 30

V. Fonctions et programmation modulaire

Définition — Fonction

Une fonction est un bloc de code nommé qui reçoit des entrées (les paramètres, entre parenthèses) et renvoie une sortie grâce au mot-clé return. On la définit une fois avec def, puis on peut l'appeler autant de fois qu'on veut.

from math import pi

def aire_disque(r):        # entrée : r (le rayon)
    a = pi * r ** 2
    return a               # sortie : l'aire

# Appels de la fonction
print(aire_disque(1))      # affiche 3.141592653589793
print(aire_disque(2))      # affiche 12.566370614359172
Programmation modulaire

Pour résoudre une tâche complexe, on la découpe en tâches plus simples, chacune réalisée par une fonction. Le programme principal se contente d'assembler ces fonctions : c'est plus clair, plus facile à corriger et à réutiliser.

# Découpage d'une tâche : moyenne d'une liste de notes
def somme_notes(notes):        # tâche 1 : additionner
    s = 0
    for note in notes:
        s = s + note
    return s

def moyenne(notes):            # tâche 2 : réutilise la tâche 1
    return somme_notes(notes) / len(notes)

mes_notes = [12, 15, 9, 18]
print(moyenne(mes_notes))      # affiche 13.5
Attention — print ≠ return

print affiche à l'écran ; return renvoie une valeur réutilisable. Une fonction sans return renvoie None.

Exercice d'application 5. Écrire une fonction double(x) qui renvoie le double de x, puis afficher double(7).
def double(x):
    return 2 * x

print(double(7))          # affiche 14

VI. Listes (notion nouvelle)

Définition — Liste

Une liste est une collection ordonnée d'éléments que l'on peut modifier. Chaque élément est repéré par son indice (sa position). En Python, les indices commencent à \(0\).

1. Créer et parcourir une liste

En extension : on écrit tous les éléments entre crochets. On accède à un élément par L[indice] ; la longueur s'obtient avec len.

L = [10, 20, 30, 40]
print(L[0])       # affiche 10  (premier élément, indice 0)
print(L[-1])      # affiche 40  (indice -1 = dernier élément)
print(len(L))     # affiche 4   (la liste a 4 éléments)

L[1] = 99         # on modifie l'élément d'indice 1
print(L)          # affiche [10, 99, 30, 40]
Attention — indices hors bornes

Une liste de longueur \(n\) a ses indices de \(0\) à \(n-1\). Écrire L[n] provoque une erreur IndexError.

Itérer sur une liste : par éléments (plus lisible) ou par indices (quand on a besoin de la position).

notes = [12, 15, 9, 18]

# Parcours par éléments
for note in notes:
    print(note)

# Parcours par indices
for i in range(len(notes)):
    print("La note d'indice", i, "vaut", notes[i])

2. Ajouts successifs et compréhension

Par ajouts successifs avec append : on part d'une liste vide [] et on ajoute un élément à la fin à chaque tour de boucle.

# Liste des carrés de 0 à 4, par ajouts successifs
carres = []                   # on part d'une liste vide
for x in range(5):
    carres.append(x ** 2)     # on ajoute x**2 à la fin
print(carres)                 # affiche [0, 1, 4, 9, 16]

En compréhension : écriture condensée, proche de la notation des ensembles. En mathématiques \(\{x^2 \mid x \in \{0,1,2,3,4\}\}\) ; en Python :

# Les carrés de 0 à 4, en compréhension
carres = [x ** 2 for x in range(5)]
print(carres)                 # affiche [0, 1, 4, 9, 16]

# Avec une condition (filtre) : les entiers pairs de 0 à 19
pairs = [x for x in range(20) if x % 2 == 0]
print(pairs)                  # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Trois façons de créer une liste

3. Ajouter et supprimer

L = [10, 20, 30]
L.append(40)      # ajoute 40 à la fin        -> [10, 20, 30, 40]
L.insert(1, 15)   # insère 15 à l'indice 1    -> [10, 15, 20, 30, 40]
L.remove(30)      # supprime la valeur 30     -> [10, 15, 20, 40]
dernier = L.pop() # retire et renvoie le dernier -> dernier = 40
del L[0]          # supprime l'élément d'indice 0
print(L)          # affiche [15, 20]
Exercice d'application 6. Que contient la liste L ?
L = [3 * n for n in range(1, 6)]
print(L)

\(n\) parcourt \(1,2,3,4,5\), et on garde \(3n\). La liste vaut [3, 6, 9, 12, 15].

VII. Aléatoire et loi de Bernoulli

Définition — Générateur aléatoire

La fonction random() du module random renvoie un nombre flottant tiré au hasard dans l'intervalle \([0\,;1[\) (chaque tirage a la même probabilité de tomber n'importe où).

Simuler une épreuve de Bernoulli de paramètre \(p\)

Une épreuve de Bernoulli n'a que deux issues : succès (codé \(1\)) avec probabilité \(p\), et échec (codé \(0\)) avec probabilité \(1-p\). Comme random() tombe dans \([0\,;p[\) avec probabilité \(p\), il suffit de tester random() < p.

from random import random

def bernoulli(p):
    # entrée : p (probabilité de succès), sortie : 1 (succès) ou 0 (échec)
    if random() < p:
        return 1          # succès, de probabilité p
    else:
        return 0          # échec, de probabilité 1 - p

# Écriture plus courte, équivalente :
def bernoulli_court(p):
    return 1 if random() < p else 0

print(bernoulli(0.3))     # affiche 0 ou 1

Simuler un échantillon de taille \(n\) : on range \(n\) résultats dans une liste (ici en compréhension). Comme les succès sont des \(1\), le nombre de succès est la somme de la liste.

from random import random

def bernoulli(p):
    return 1 if random() < p else 0

# Échantillon de taille 20, paramètre 0.4
echantillon = [bernoulli(0.4) for _ in range(20)]
print(echantillon)                 # ex. [0, 1, 0, 0, 1, 1, 0, ...]

nb_succes = sum(echantillon)       # compteur / somme
print("Nombre de succès :", nb_succes)
À savoir — un dé équilibré

Le module random propose aussi randint(a, b) qui renvoie un entier au hasard entre a et b inclus.

from random import randint
de = randint(1, 6)        # un entier au hasard entre 1 et 6
print(de)

VIII. Traitement de données et tableau croisé

1. Lire un fichier de données réelles

Fichier de données (CSV)

Les données réelles (relevés, enquêtes, mesures) sont souvent stockées dans un fichier texte au format CSV : une ligne par individu, les valeurs séparées par un point-virgule. Pour les traiter en Python, on lit le fichier ligne à ligne et on range chaque ligne, découpée en champs, dans une liste.

Exemple. Le fichier eleves.csv contient une ligne par élève, du type F;reussi (sexe puis résultat).

# Lecture du fichier eleves.csv, ligne à ligne
donnees = []                       # liste des lignes traitées
fichier = open("eleves.csv")
for ligne in fichier:              # on parcourt le fichier ligne à ligne
    ligne = ligne.strip()          # on retire le saut de ligne final
    champs = ligne.split(";")      # "F;reussi" -> ["F", "reussi"]
    donnees.append(champs)         # on ajoute la liste à donnees
fichier.close()

print(donnees[0])                  # affiche ['F', 'reussi']
print(len(donnees))                # nombre d'élèves du fichier

On obtient une liste de listes : donnees[i] est la ligne d'indice i, donnees[i][0] son premier champ. C'est exactement le format attendu par le tableau croisé ci-dessous : on peut ainsi extraire de l'information d'un fichier de données réelles et l'analyser.

2. Tableau croisé sur deux critères

Tableau croisé

Pour un tableau croisé, on classe des données brutes selon deux critères simultanément et on compte les effectifs de chaque combinaison, à l'aide de compteurs.

Exemple. Des élèves sont décrits par leur sexe ("F"/"G") et leur réussite ("reussi"/"echoue"). Chaque élève est une liste de deux éléments (comme celles lues dans le fichier CSV ci-dessus).

donnees = [
    ["F", "reussi"], ["G", "echoue"], ["F", "reussi"], ["G", "reussi"],
    ["F", "echoue"], ["G", "reussi"], ["F", "reussi"], ["G", "echoue"],
]

F_reussi = 0; F_echoue = 0; G_reussi = 0; G_echoue = 0

for eleve in donnees:
    sexe = eleve[0]        # premier élément de la liste
    resultat = eleve[1]    # second élément
    if sexe == "F" and resultat == "reussi":
        F_reussi = F_reussi + 1
    elif sexe == "F" and resultat == "echoue":
        F_echoue = F_echoue + 1
    elif sexe == "G" and resultat == "reussi":
        G_reussi = G_reussi + 1
    else:
        G_echoue = G_echoue + 1

print("Filles :", F_reussi, "réussis,", F_echoue, "échoués")
print("Garçons:", G_reussi, "réussis,", G_echoue, "échoués")
reussiechoue
Filles31
Garçons22
Lien avec le tableur

Beaucoup d'algorithmes ont un équivalent naturel dans un tableur : somme = somme + k ↔ =SOMME(...), un compteur conditionnel ↔ =NB.SI(...), random() ↔ =ALEA(), un tableau croisé ↔ un tableau croisé dynamique. Comprendre la version Python éclaire ce que fait le tableur « en coulisses ».

Méthodes-types (langage naturel → Python)

Méthode 1 — Terme d'une suite de rang donné

Suite \(u(0)=3\), \(u(n+1)=2\,u(n)-1\). On veut \(u(5)\).

u = 3
for i in range(1, 6):     # i prend 1, 2, 3, 4, 5
    u = 2 * u - 1         # u ← 2u - 1
print(u)                  # affiche 65
Méthode 2 — Déterminer un seuil (while)

Suite \(u(0)=100\), \(u(n+1)=0{,}9\,u(n)\). Plus petit rang \(n\) tel que \(u(n) \lt 50\).

u = 100
n = 0
while u >= 50:            # tant que u n'est pas passé sous 50
    u = 0.9 * u
    n = n + 1
print(n)                 # affiche 7
Méthode 3 — Valeur approchée par balayage

Solution positive de \(x^2-2=0\) (soit \(\sqrt{2}\)) par balayage au pas \(0{,}001\).

x = 0
while x ** 2 < 2:
    x = x + 0.001         # x avance par pas de 0,001
print(round(x, 3))        # affiche 1.415
Méthode 4 — Simuler un échantillon de Bernoulli et compter

\(n=100\) épreuves de paramètre \(p=0{,}3\), on compte les succès.

from random import random

succes = 0
for i in range(100):
    if random() < 0.3:        # succès de probabilité 0,3
        succes = succes + 1   # compteur de succès
print(succes)                 # un nombre proche de 30
Méthode 5 — Simuler \(N\) échantillons, représenter les fréquences et compter dans \([\,p-ks\,;\,p+ks\,]\)

On simule \(N=500\) échantillons de taille \(n=100\) d'une loi de Bernoulli de paramètre \(p=0{,}6\), on représente graphiquement les fréquences observées des \(1\), puis on compte celles situées dans l'intervalle \([\,p-ks\,;\,p+ks\,]\) pour \(k=1,2,3\) (où \(s\) est l'écart-type de la série des fréquences). C'est la traduction en Python de la fluctuation d'échantillonnage étudiée au chapitre 6.

from random import random

def frequence(n, p):
    # fréquence observée des 1 dans un échantillon de taille n
    succes = 0
    for i in range(n):
        if random() < p:
            succes = succes + 1
    return succes / n

# N = 500 échantillons de taille n = 100, paramètre p = 0.6
p = 0.6
frequences = [frequence(100, p) for _ in range(500)]

# Représentation graphique : nuage de points (rang ; fréquence)
import matplotlib.pyplot as plt
plt.plot(frequences, "o")      # ou plt.hist(frequences) : histogramme
plt.show()                     # les fréquences fluctuent autour de p

# Moyenne et écart-type s de la série des fréquences
N = len(frequences)
moyenne = sum(frequences) / N
variance = sum([(f - moyenne) ** 2 for f in frequences]) / N
s = variance ** 0.5

# Compter les fréquences dans [p - k*s ; p + k*s] pour k = 1, 2, 3
for k in [1, 2, 3]:
    compteur = 0
    for f in frequences:
        if p - k * s <= f and f <= p + k * s:
            compteur = compteur + 1
    print(k, ":", compteur, "échantillons sur", N)

On constate que la très grande majorité des échantillons ont une fréquence à distance au plus \(2s\) ou \(3s\) de \(p\) : une fréquence hors de \([\,p-3s\,;\,p+3s\,]\) correspond à une situation rare.

Erreurs fréquentes / points de vigilance

Les pièges du chapitre

❌ Confondre = (affectation) et == (test d'égalité).

✅ Dans un if, on écrit toujours ==.

❌ Oublier d'initialiser un accumulateur ou un compteur.

✅ Somme → 0, produit → 1, compteur → 0, liste (append) → [].

❌ Croire que range(n) atteint \(n\).

✅ range(n) s'arrête à \(n-1\) ; pour aller jusqu'à \(n\) inclus, écrire range(n + 1).

❌ Écrire L[len(L)] pour le dernier élément.

✅ Le dernier est L[len(L) - 1] ou L[-1] ; les indices vont de \(0\) à \(len(L)-1\).

❌ Boucle while infinie (variable de test non modifiée).

✅ Faire évoluer la variable pour que la condition finisse par devenir fausse.

❌ Confondre print et return.

✅ print affiche ; return renvoie une valeur réutilisable.

L'essentiel à retenir

À retenir :