Aller au contenu

TP Python – Auto-évaluation et exercices de programmation

BTS SIO SISR 1re année – Mathématiques pour l'informatique – S19

Note

Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.

Ces trois exercices reprennent le type de programmation de l'épreuve : une fonction à écrire à partir d'un énoncé, avec des tests.

Exercice A – Première série en alerte

Écris premiere_serie(releves, seuil, k) : l'indice du premier relevé de la première série d'au moins k relevés consécutifs strictement supérieurs au seuil (avec k >= 1), ou -1.

J'anticipe. Pour [30, 10, 30, 31, 32, 10], le seuil 25 et k = 3, quel résultat attends-tu ?

###
t = [21, 25, 27, 26, 31, 32, 33, 24, 29, 30]bksl-nlassert premierepy-undserie(t, 25, 1) == 2 and premierepy-undserie(t, 25, 2) == 2bksl-nlassert premierepy-undserie(t, 25, 3) == 2 and premierepy-undserie(t, 25, 5) == 2bksl-nlassert premierepy-undserie(t, 25, 6) == -1 and premierepy-undserie([], 25, 1) == -1bksl-nlu = [30, 10, 30, 31, 32, 10]bksl-nlassert premierepy-undserie(u, 25, 1) == 0 and premierepy-undserie(u, 25, 2) == 2bksl-nlassert premierepy-undserie(u, 25, 3) == 2 and premierepy-undserie(u, 25, 4) == -1bksl-nlassert premierepy-undserie([10, 11, 30, 31], 25, 2) == 2bksl-nlassert premierepy-undserie([25, 25, 25], 25, 1) == -1bksl-nlbksl-nl ∞/∞

def premierepy-undserie(releves, seuil, k):bksl-nl """Indice du premier relevé de la première série d'au moins k relevés consécutifsbksl-nl strictement supérieurs à seuil (k >= 1), ou -1 s'il n'y en a pas."""bksl-nl courante = 0bksl-nl for i in range(len(releves)):bksl-nl # À compléter : mettre à jour courante (+1 si en alerte, sinon retour à 0)bksl-nl # puis, si courante vaut k, renvoyer l'indice du début de la sériebksl-nl passbksl-nl return -1bksl-nlbksl-nl



Exercice B – Journal

Écris compte_erreurs(lignes) : un dictionnaire adresse → nombre de lignes de niveau ERROR. Puis adresse_la_plus_active(lignes) : l'adresse qui a le plus d'erreurs (la plus petite dans l'ordre alphabétique en cas d'égalité), ou None s'il n'y a pas d'erreur.

###
log = ["2026-03-14 08:12:45 10.0.0.5 INFO login alice", "2026-03-14 08:13:02 10.0.0.9 ERROR timeout db", "2026-03-14 08:13:09 10.0.0.9 ERROR timeout db", "2026-03-14 08:14:20 10.0.0.5 ERROR disque plein", "2026-03-14 08:15:01 10.0.0.7 INFO login bob"]bksl-nlassert comptepy-underreurs(log) == {"10.0.0.9": 2, "10.0.0.5": 1}bksl-nlassert comptepy-underreurs([]) == {}bksl-nlassert adressepy-undlapy-undpluspy-undactive(log) == "10.0.0.9"bksl-nlassert adressepy-undlapy-undpluspy-undactive([]) is Nonebksl-nlassert adressepy-undlapy-undpluspy-undactive(["d h 10.0.0.2 ERROR x", "d h 10.0.0.1 ERROR y"]) == "10.0.0.1"bksl-nlassert comptepy-underreurs(["d h 10.0.0.2 INFO x"]) == {}bksl-nlbksl-nl ∞/∞

def comptepy-underreurs(lignes):bksl-nl d = {}bksl-nl for ligne in lignes:bksl-nl c = ligne.split()bksl-nl # À compléter : si c[3] vaut "ERROR", incrémenter d[c[2]]bksl-nl # (la créer à 1 si l'adresse n'est pas encore dans d)bksl-nl return dbksl-nlbksl-nldef adressepy-undlapy-undpluspy-undactive(lignes):bksl-nl d = comptepy-underreurs(lignes)bksl-nl meilleure = Nonebksl-nl for adresse in sorted(d):bksl-nl # À compléter : garder l'adresse si elle a strictement plus d'erreurs que meilleurebksl-nl passbksl-nl return meilleurebksl-nlbksl-nl



Exercice C – Bilan de relevés

Écris bilan_releves(releves, seuil) qui renvoie un quadruplet (minimum, maximum, nombre de relevés en alerte, pourcentage de relevés en alerte) pour une liste non vide.

Je comprends. Pourquoi faut-il écrire n * 100 / len(releves) et non n // len(releves) * 100 ?

###
t = [21, 25, 27, 26, 31, 32, 33, 24, 29, 30]bksl-nlassert bilanpy-undreleves(t, 25) == (21, 33, 7, 70.0)bksl-nlassert bilanpy-undreleves([25], 25) == (25, 25, 0, 0.0)bksl-nlassert bilanpy-undreleves([30], 25) == (30, 30, 1, 100.0)bksl-nlassert bilanpy-undreleves([-5, -2, -9], -6) == (-9, -2, 2, 200 / 3)bksl-nlassert bilanpy-undreleves([1, 2, 3, 4], 0) == (1, 4, 4, 100.0)bksl-nlassert bilanpy-undreleves([1, 2, 3, 4], 3) == (1, 4, 1, 25.0)bksl-nlassert t == [21, 25, 27, 26, 31, 32, 33, 24, 29, 30]bksl-nlbksl-nl ∞/∞

def bilanpy-undreleves(releves, seuil):bksl-nl """Pour une liste non vide : (minimum, maximum, nombre de relevés en alerte,bksl-nl pourcentage de relevés en alerte). Un relevé est en alerte s'il est > seuil."""bksl-nl mini = releves[0]bksl-nl maxi = releves[0]bksl-nl n = 0bksl-nl for r in releves:bksl-nl # À compléter : mettre à jour mini, maxi et nbksl-nl passbksl-nl pourcentage = 0bksl-nl # À compléter : n py-str 100 / len(releves) (multiplier avant de diviser)bksl-nl return (mini, maxi, n, pourcentage)bksl-nlbksl-nl