TP Python – Tableaux, chaînes et journaux
BTS SIO SISR 1re année – Mathématiques pour l'informatique – S12
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.
Exercice A – Moyenne et maximum
Écris moyenne(t), maximum(t) et indice_du_max(t) (premier indice du maximum) pour une liste non vide de nombres. N'utilise ni sum, ni max, ni index.
J'anticipe. Pour [14, 3, 27, 9, 27, 5], quels résultats attends-tu pour les trois fonctions ?
def moyenne(t):bksl-nl s = 0bksl-nl for x in t:bksl-nl # À compléter : accumuler dans sbksl-nl passbksl-nl return 0 # À compléter : s divisé par le nombre d'élémentsbksl-nlbksl-nldef maximum(t):bksl-nl m = t[0]bksl-nl for i in range(1, len(t)):bksl-nl # À compléter : mettre à jour m si t[i] est plus grandbksl-nl passbksl-nl return mbksl-nlbksl-nldef indicepy-unddupy-undmax(t):bksl-nl imax = 0bksl-nl for i in range(1, len(t)):bksl-nl # À compléter : mettre à jour imax si t[i] > t[imax]bksl-nl passbksl-nl return imaxbksl-nlbksl-nl
Exercice B – Rechercher
Écris position(t, x) (premier indice de x, ou -1), compte(t, x) (nombre d'occurrences) et dichotomie(t, x) (indice de x dans la liste triée t, ou -1).
Je comprends. Que se passe-t-il si tu appelles dichotomie sur une liste non triée ?
def position(t, x):bksl-nl for i in range(len(t)):bksl-nl # À compléter : renvoyer i si t[i] vaut xbksl-nl passbksl-nl return -1bksl-nlbksl-nldef compte(t, x):bksl-nl n = 0bksl-nl for y in t:bksl-nl # À compléter : compter les occurrences de xbksl-nl passbksl-nl return nbksl-nlbksl-nldef dichotomie(t, x):bksl-nl debut = 0bksl-nl fin = len(t) - 1bksl-nl while debut <= fin:bksl-nl milieu = (debut + fin) // 2bksl-nl # À compléter : comparer t[milieu] à x, renvoyer milieu si égal,bksl-nl # sinon réduire la zone à droite (debut) ou à gauche (fin).bksl-nl # Sans cette mise à jour la boucle ne s'arrête pas : on sort donc ici.bksl-nl breakbksl-nl return -1bksl-nlbksl-nl
Exercice C – Trier
Écris tri_selection(t) qui renvoie une nouvelle liste triée, sans modifier t et sans sorted ni sort.
Je comprends. Pourquoi commence-t-on par r = list(t) ?
def tripy-undselection(t):bksl-nl r = list(t)bksl-nl n = len(r)bksl-nl for i in range(n - 1):bksl-nl m = ibksl-nl for j in range(i + 1, n):bksl-nl # À compléter : mémoriser dans m l'indice du plus petit élémentbksl-nl passbksl-nl # À compléter : échanger r[i] et r[m]bksl-nl return rbksl-nlbksl-nl
Exercice D – Tableaux à deux dimensions
Écris somme_lignes(g), somme_colonnes(g) et transposee(g) pour une grille rectangulaire (liste de listes).
def sommepy-undlignes(g):bksl-nl resultat = []bksl-nl for ligne in g:bksl-nl s = 0bksl-nl for x in ligne:bksl-nl # À compléter : accumuler dans sbksl-nl passbksl-nl resultat.append(s)bksl-nl return resultatbksl-nlbksl-nldef sommepy-undcolonnes(g):bksl-nl resultat = []bksl-nl for j in range(len(g[0])):bksl-nl s = 0bksl-nl for i in range(len(g)):bksl-nl # À compléter : ajouter g[i][j]bksl-nl passbksl-nl resultat.append(s)bksl-nl return resultatbksl-nlbksl-nldef transposee(g):bksl-nl resultat = []bksl-nl for j in range(len(g[0])):bksl-nl ligne = []bksl-nl for i in range(len(g)):bksl-nl # À compléter : ajouter g[i][j] à lignebksl-nl passbksl-nl resultat.append(ligne)bksl-nl return resultatbksl-nlbksl-nl
Exercice E – Chaînes
Écris inverse(s), est_palindrome(s) (sans tenir compte des majuscules) et acronyme(phrase) (les initiales en majuscules : "systèmes et réseaux" donne "SER").
def inverse(s):bksl-nl r = ""bksl-nl for c in s:bksl-nl # À compléter : ajouter c au DÉBUT de rbksl-nl passbksl-nl return rbksl-nlbksl-nldef estpy-undpalindrome(s):bksl-nl s = s.lower()bksl-nl return False # À compléter : comparer s à son inversebksl-nlbksl-nldef acronyme(phrase):bksl-nl r = ""bksl-nl for mot in phrase.split():bksl-nl # À compléter : ajouter l'initiale du mot, en majusculebksl-nl passbksl-nl return rbksl-nlbksl-nl
Exercice F – Exploiter un journal
Chaque ligne d'un journal a la forme date heure adresse événement compte. Écris echecs_par_adresse(lignes) (dictionnaire adresse → nombre de lignes dont l'événement est LOGIN_FAILED) et adresses_suspectes(lignes, seuil) (liste triée des adresses ayant au moins seuil échecs).
def echecspy-undparpy-undadresse(lignes):bksl-nl d = {}bksl-nl for ligne in lignes:bksl-nl c = ligne.split()bksl-nl # À compléter : si c[3] vaut "LOGINpy-undFAILED", 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 adressespy-undsuspectes(lignes, seuil):bksl-nl d = echecspy-undparpy-undadresse(lignes)bksl-nl liste = []bksl-nl for adresse in d:bksl-nl # À compléter : garder l'adresse si son nombre d'échecs est >= seuilbksl-nl passbksl-nl return sorted(liste)bksl-nlbksl-nl