Cours – Fonctions, tableaux et chaînes de caractères
BTS SIO SISR 1re année – Mathématiques pour l'informatique – S12 – à lire avant les exercices
Ce que tu dois savoir déjà
- Prérequis : S03, S04 (instructions, boucles) ; S07 (modulo).
- Outils : Papier, calculatrice, éditeur Python intégré au site
À la fin de ce cours tu sauras
- Écrire une fonction avec paramètres et valeur retournée, et distinguer variable locale et globale ;
- Manipuler un tableau à une ou deux dimensions (parcours, indices, recherche, minimum) ;
- Éviter les erreurs d'indice hors domaine ;
- Manipuler des chaînes de caractères (parcours, extraction, concaténation) ;
- Programmer un tri simple et une recherche.
I. Découper en fonctions
Une fonction est un bloc de code nommé, qui reçoit des paramètres, effectue un traitement et retourne un résultat. Elle sert à :
- ne pas répéter le même code ;
- tester une partie du programme séparément ;
- nommer une idée (
est_privee(ip)se lit mieux que cinq lignes de conditions).
FONCTION moyenne(t, n)
RÔLE : moyenne des n valeurs du tableau t
ENTRÉES : t (tableau de nombres), n (entier, n ≥ 1)
SORTIE : m (nombre)
VARIABLES : i (entier), s (nombre)
DÉBUT
s ← 0
POUR i DE 0 À n - 1 FAIRE
s ← s + t[i]
FIN POUR
RETOURNER s / n
FIN
def moyenne(t):
s = 0
for x in t:
s = s + x
return s / len(t)
print(moyenne([12, 8, 15])) # 11.666666666666666
Une fonction qui n'affiche que (sans return) renvoie None : on ne peut pas réutiliser son résultat. Retourner et afficher sont deux actions différentes.
Variables locales et globales
Une variable créée dans une fonction est locale : elle n'existe que pendant l'exécution de la fonction. Une variable créée hors de toute fonction est globale.
total = 100 # globale
def ajoute(x):
total = x + 1 # nouvelle variable LOCALE, la globale n'est pas modifiée
return total
print(ajoute(5), total)
Ce programme affiche 6 100. Pour modifier la variable globale il faudrait écrire global total, ce qu'on évite : il vaut mieux passer les valeurs en paramètres et récupérer le résultat avec return.
Warning
Les listes sont modifiables. Quand on passe une liste à une fonction, la fonction reçoit la liste elle-même (pas une copie) : si elle la modifie (t[0] = 0, t.append(...)), l'appelant voit le changement. Pour travailler sur une copie : t2 = list(t).
II. Les tableaux
Un tableau est une suite d'éléments repérés par leur indice. Convention de ce cours : les indices vont de 0 à n − 1 (comme en Python, où le tableau est une list).
| Opération | Pseudo-code | Python |
|---|---|---|
| Lire un élément | t[i] |
t[i] |
| Modifier un élément | t[i] ← v |
t[i] = v |
| Nombre d'éléments | \(n\) | len(t) |
| Dernier élément | t[n - 1] |
t[-1] ou t[len(t) - 1] |
Warning
Indice hors domaine. Si le tableau a \(n\) éléments, les indices valides sont \(0, \dots, n - 1\). Accéder à t[n] provoque l'erreur IndexError. Une boucle POUR i DE 0 À n (au lieu de n - 1) est l'erreur classique.
Parcours et recherche d'un maximum
ALGORITHME maximum
RÔLE : plus grande valeur d'un tableau non vide
ENTRÉES : t (tableau), n (nombre d'éléments, n ≥ 1)
SORTIE : m (valeur maximale)
VARIABLES : i (entier), m (nombre)
DÉBUT
m ← t[0]
POUR i DE 1 À n - 1 FAIRE
SI t[i] > m ALORS
m ← t[i]
FIN SI
FIN POUR
RETOURNER m
FIN
Sur t = [14, 3, 27, 9, 27, 5] (\(n = 6\)), m vaut 14 au départ, puis 14, 27, 27, 27, 27 après chacun des cinq tours : le maximum est 27. Pour obtenir sa position, on mémorise l'indice. Le premier indice du maximum est 2 (la valeur 27 apparaît aussi à l'indice 4 : avec > strict, la première occurrence est conservée).
Recherche séquentielle
On parcourt le tableau jusqu'à trouver la valeur.
def position(t, x):
for i in range(len(t)):
if t[i] == x:
return i
return -1 # convention : -1 signifie « absent »
Dans le pire cas (valeur absente), on compare \(n\) fois. Sur un tableau trié, on peut faire mieux (partie V).
Tableaux à deux dimensions
Un tableau à deux dimensions est un tableau de tableaux : g[i][j] est l'élément de la ligne i et de la colonne j.
| C0 | C1 | C2 | C3 | |
|---|---|---|---|---|
| L0 | 12 | 8 | 15 | 10 |
| L1 | 9 | 14 | 11 | 7 |
| L2 | 16 | 13 | 6 | 18 |
g[1][2] vaut 11 ; la ligne g[2] est [16, 13, 6, 18]. Pour parcourir toute la grille, on utilise deux boucles imbriquées :
Sommes par ligne : [45, 41, 53] ; par colonne : [37, 35, 32, 35]. Les deux totaux sont égaux : 139 = 139.
III. Les chaînes de caractères
Une chaîne est une suite de caractères indexée comme un tableau (de 0 à \(n - 1\)), mais non modifiable : s[0] = "x" est interdit.
| Opération | Exemple avec s = "srv-web-01" |
Résultat |
|---|---|---|
| Longueur | len(s) |
10 |
| Caractère | s[0], s[-1] |
s, 1 |
Tranche s[a:b] (de a à b - 1) |
s[4:7] |
web |
| Concaténation | s + "-b" |
srv-web-01-b |
| Découpage | s.split("-") |
['srv', 'web', '01'] |
| Majuscules | s.upper() |
SRV-WEB-01 |
| Appartenance | "web" in s |
True |
Note
Dans une tranche, la borne de droite est exclue (comme range). s[a:b] contient \(b - a\) caractères.
Exploiter un journal
Une ligne de journal est une chaîne dont les champs sont séparés par des espaces :
ligne.split() renvoie la liste ['2026-03-14', '08:13:02', '192.168.1.77', 'LOGIN_FAILED', 'admin'] : date en [0], heure en [1], adresse en [2], événement en [3], compte en [4]. Pour compter les échecs de connexion par adresse, on utilise un dictionnaire :
def echecs(lignes):
d = {}
for ligne in lignes:
c = ligne.split()
if c[3] == "LOGIN_FAILED":
d[c[2]] = d.get(c[2], 0) + 1
return d
Sur les 6 lignes de l'exercice, le résultat est {'192.168.1.77': 3, '192.168.1.23': 1} : l'adresse 192.168.1.77 cumule 3 échecs, ce qui ressemble à une tentative de devinette de mot de passe.
IV. Le tri par sélection
Pour trier un tableau par ordre croissant : à chaque passe \(i\), on cherche le minimum des éléments d'indices \(i\) à \(n - 1\) et on l'échange avec l'élément d'indice \(i\).
ALGORITHME tri_selection
RÔLE : trier t (n éléments) par ordre croissant
ENTRÉES : t (tableau), n (entier)
SORTIE : t trié
VARIABLES : i, j, m (entiers), tmp (même type que t)
DÉBUT
POUR i DE 0 À n - 2 FAIRE
m ← i
POUR j DE i + 1 À n - 1 FAIRE
SI t[j] < t[m] ALORS
m ← j
FIN SI
FIN POUR
tmp ← t[i] ; t[i] ← t[m] ; t[m] ← tmp
FIN POUR
FIN
Trace sur [7, 3, 5, 1] :
| Passe \(i\) | Minimum cherché dans | Position du min | Échange | Tableau après |
|---|---|---|---|---|
| 0 | indices 0 à 3 | 3 | oui | [1, 3, 5, 7] |
| 1 | indices 1 à 3 | 1 | non | [1, 3, 5, 7] |
| 2 | indices 2 à 3 | 2 | non | [1, 3, 5, 7] |
Résultat : [1, 3, 5, 7]. Le nombre de comparaisons est 6 \(= \dfrac{n(n-1)}{2}\) avec \(n = 4\) : \(\dfrac{4 \times 3}{2} = 6\). C'est vrai quelle que soit la disposition initiale (la boucle intérieure ne dépend pas des valeurs) : n = 10 : 45 ; n = 100 : 4950 ; n = 1000 : 499500 comparaisons.
Remarque : dans cette séance on étudie un tri écrit à la main ; Python propose sorted(t) et t.sort(), qu'on utilise en pratique.
V. Recherche dichotomique
Dans un tableau trié, on compare la valeur cherchée à l'élément du milieu, ce qui élimine la moitié du tableau à chaque étape.
début ← 0 ; fin ← n - 1
TANT QUE début ≤ fin FAIRE
milieu ← (début + fin) DIV 2
SI t[milieu] = x ALORS RETOURNER milieu
SINON SI t[milieu] < x ALORS début ← milieu + 1
SINON fin ← milieu - 1
FIN TANT QUE
RETOURNER -1
Recherche de 38 dans [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44] (15 éléments) :
| Étape | début | fin | milieu | t[milieu] |
Décision |
|---|---|---|---|---|---|
| 1 | 0 | 14 | 7 | 23 | 38 > 23 : on cherche à droite |
| 2 | 8 | 14 | 11 | 35 | 38 > 35 : on cherche à droite |
| 3 | 12 | 14 | 13 | 41 | 38 < 41 : on cherche à gauche |
| 4 | 12 | 12 | 12 | 38 | trouvé |
Trouvé à l'indice 12 en 4 étapes (au lieu de 13 comparaisons en séquentiel). Au pire, la taille de la zone est divisée par 2 à chaque étape : il faut au plus \(\lfloor \log_2 n \rfloor + 1\) étapes. Mesuré sur toutes les positions possibles : 4 étapes au plus pour 15 éléments, 10 pour 1 000 éléments, 11 pour 1 024. Le tableau doit être trié : sinon le résultat est faux.
À retenir
- Une fonction retourne une valeur (
return) ; les variables créées dedans sont locales. - Tableau de \(n\) éléments : indices de 0 à n − 1 ; hors de ces bornes,
IndexError. - Tableau 2D :
g[ligne][colonne]; deux boucles imbriquées. - Chaîne : indices de 0 à \(n - 1\), tranche
s[a:b](borne droite exclue),split, non modifiable. - Tri par sélection : \(\dfrac{n(n-1)}{2}\) comparaisons. Dichotomie (tableau trié) : au plus \(\lfloor \log_2 n \rfloor + 1\) étapes.