Aller au contenu

TP Python – Premiers programmes Python

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

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 – Droits d'accès avec des masques

On code lecture = 4, écriture = 2, exécution = 1. Complète les trois fonctions avec des opérateurs bit à bit.

J'anticipe. Que doivent renvoyer ajouter(5, 2), retirer(7, 4) et accorde(6, 1) ? Pose les écritures binaires sur ta feuille.

###
assert ajouter(5, 2) == 7bksl-nlassert ajouter(4, 1) == 5bksl-nlassert ajouter(7, 2) == 7bksl-nlassert retirer(7, 4) == 3bksl-nlassert retirer(6, 2) == 4bksl-nlassert retirer(4, 1) == 4bksl-nlassert accorde(6, 2) is Truebksl-nlassert accorde(6, 1) is Falsebksl-nlassert accorde(7, 5) is Truebksl-nlassert accorde(5, 6) is Falsebksl-nlbksl-nl ∞/∞

LECTURE = 4bksl-nlECRITURE = 2bksl-nlEXECUTION = 1bksl-nlbksl-nldef ajouter(droits, masque):bksl-nl """Ajoute le(s) droit(s) du masque."""bksl-nl return ...bksl-nlbksl-nldef retirer(droits, masque):bksl-nl """Retire le(s) droit(s) du masque."""bksl-nl return ...bksl-nlbksl-nldef accorde(droits, masque):bksl-nl """Renvoie True si tous les bits du masque sont à 1 dans droits."""bksl-nl return ...bksl-nlbksl-nl



Je comprends. Pourquoi retirer utilise-t-il ~masque ? Que se passe-t-il si on retire un droit qui n'était pas accordé ?

Exercice B – Année bissextile

Écris est_bissextile(annee). Les cas limites 1900, 2000 et 2100 sont dans les tests.

###
assert estpy-undbissextile(2024) is Truebksl-nlassert estpy-undbissextile(2023) is Falsebksl-nlassert estpy-undbissextile(1900) is Falsebksl-nlassert estpy-undbissextile(2000) is Truebksl-nlassert estpy-undbissextile(2100) is Falsebksl-nlassert estpy-undbissextile(1600) is Truebksl-nlbksl-nl ∞/∞

def estpy-undbissextile(annee):bksl-nl """Renvoie True si l'année est bissextile."""bksl-nl ...bksl-nlbksl-nl



Exercice C – Adresse privée

Écris adresse_privee(adresse) qui reçoit un texte "a.b.c.d" et renvoie True pour les plages privées de l'exercice 6.

###
assert adressepy-undprivee("10.4.5.6") is Truebksl-nlassert adressepy-undprivee("172.16.0.1") is Truebksl-nlassert adressepy-undprivee("172.31.255.254") is Truebksl-nlassert adressepy-undprivee("172.32.0.1") is Falsebksl-nlassert adressepy-undprivee("172.15.0.1") is Falsebksl-nlassert adressepy-undprivee("192.168.0.1") is Truebksl-nlassert adressepy-undprivee("192.169.0.1") is Falsebksl-nlassert adressepy-undprivee("8.8.8.8") is Falsebksl-nlbksl-nl ∞/∞

def adressepy-undprivee(adresse):bksl-nl """Renvoie True si l'adresse IPv4 (texte) est privée."""bksl-nl octets = adresse.split(".")bksl-nl a = int(octets[0])bksl-nl b = int(octets[1])bksl-nl ...bksl-nlbksl-nl



Exercice D – Adresse de réseau

Écris adresse_reseau(adresse, masque) qui renvoie l'adresse de réseau sous forme de texte, octet par octet, avec &.

###
assert adressepy-undreseau("192.168.1.10", "255.255.255.0") == "192.168.1.0"bksl-nlassert adressepy-undreseau("192.168.5.77", "255.255.255.192") == "192.168.5.64"bksl-nlassert adressepy-undreseau("172.16.37.200", "255.255.240.0") == "172.16.32.0"bksl-nlassert adressepy-undreseau("10.200.3.4", "255.0.0.0") == "10.0.0.0"bksl-nlassert adressepy-undreseau("10.200.3.4", "255.255.255.255") == "10.200.3.4"bksl-nlbksl-nl ∞/∞

def adressepy-undreseau(adresse, masque):bksl-nl """Adresse de réseau (texte) : ET bit à bit, octet par octet."""bksl-nl a = adresse.split(".")bksl-nl m = masque.split(".")bksl-nl resultat = []bksl-nl for i in range(4):bksl-nl resultat.append(str(...)) # à compléter : ET bit à bit des deux octets (entiers)bksl-nl return ".".join(resultat)bksl-nlbksl-nl



Je comprends. Vérifie à la main un des tests, en binaire.

Exercice E – Jours dans un mois

Écris jours_du_mois(mois, annee) (mois de 1 à 12). Tu peux réutiliser est_bissextile.

###
assert jourspy-unddupy-undmois(1, 2024) == 31bksl-nlassert jourspy-unddupy-undmois(2, 2024) == 29bksl-nlassert jourspy-unddupy-undmois(2, 2023) == 28bksl-nlassert jourspy-unddupy-undmois(2, 1900) == 28bksl-nlassert jourspy-unddupy-undmois(4, 2024) == 30bksl-nlassert jourspy-unddupy-undmois(11, 2023) == 30bksl-nlassert jourspy-unddupy-undmois(12, 2023) == 31bksl-nlassert sum(jourspy-unddupy-undmois(m, 2024) for m in range(1, 13)) == 366bksl-nlassert sum(jourspy-unddupy-undmois(m, 2023) for m in range(1, 13)) == 365bksl-nlbksl-nl ∞/∞

def estpy-undbissextile(annee):bksl-nl return (annee % 4 == 0 and annee % 100 != 0) or annee % 400 == 0bksl-nlbksl-nldef jourspy-unddupy-undmois(mois, annee):bksl-nl """Nombre de jours du mois (1 à 12) de l'année donnée."""bksl-nl ...bksl-nlbksl-nl