Adresse IPv4 - Sujet 22 - EP NSI 2025

Moyen Officiel
Python (3.14.0)

Énoncé du problème

Exercice 1

EXERCICE 1 (10 points)

Écrire une fonction recherche qui prend en paramètres elt un nombre entier et tab un tableau de nombres entiers (type list), et qui renvoie l’indice de la dernière occurrence de elt dans tab si elt est dans tab et None sinon.

Exemples :

>>> recherche(1, [2, 3, 4]) # renvoie None
>>> recherche(1, [10, 12, 1, 56])
2
>>> recherche(1, [1, 0, 42, 7])
0
>>> recherche(1, [1, 50, 1])
2
>>> recherche(1, [8, 1, 10, 1, 7, 1, 8])
5

Exercice 2

EXERCICE 2 (10 points)

On définit une classe gérant une adresse IPv4.

On rappelle qu’une adresse IPv4 est une adresse de longueur 4 octets, notée en décimale à point, en séparant chacun des octets par un point. On considère un réseau privé avec une plage d’adresses IP de 192.168.0.0 à 192.168.0.255.

On considère que les adresses IP saisies sont valides.

Les adresses IP 192.168.0.0 et 192.168.0.255 sont des adresses réservées.

Le code ci-dessous implémente la classe AdresseIP.

class AdresseIP:
    def __init__(self, adresse):
        self.adresse =... 

    def liste_octets(self):
        """renvoie une liste de nombres entiers,
        la liste des octets de l'adresse IP"""
        # Note : split découpe la chaine de caractères 
        # en fonction du séparateur
        return [int(i) for i in self.adresse.split(".")]

    def est_reservee(self):
        """renvoie True si l'adresse IP est une adresse
        réservée, False sinon"""
        reservees = [ ... ] 
        return ... 

    def adresse_suivante(self):
        """renvoie un objet de AdresseIP avec l'adresse
        IP qui suit l'adresse self si elle existe et None sinon"""
        octets = ... 
        if ... == 254: 
            return None
        octet_nouveau = ... + ... 
        return AdresseIP('192.168.0.' + ...) 

Compléter le code ci-dessus et instancier trois objets : adresse1, adresse2, adresse3 avec respectivement les arguments suivants :

'192.168.0.1','192.168.0.2','192.168.0.0'

Vérifier que :

>>> adresse1.liste_octets()
[192, 168, 0, 1]
>>> adresse1.est_reservee()
False
>>> adresse3.est_reservee()
True
>>> adresse2.adresse_suivante().adresse # acces valide à adresse
                # ici car on sait que l'adresse suivante existe
'192.168.0.3'

Les contraintes ci-dessous sont ajoutées par la plateforme et ne font pas partie du sujet.

Exercice 1

Contraintes :

  • elt est un nombre entier (int)
  • tab est un tableau (list) de nombres entiers, éventuellement vide
  • 0 <= len(tab) <= 10^4
  • -10^9 <= elt <= 10^9 et -10^9 <= tab[i] <= 10^9
  • tab n’est pas nécessairement trié et peut contenir plusieurs fois la même valeur
  • la fonction renvoie l’indice de la dernière occurrence de elt, et None si elt n’apparaît pas dans tab (en particulier si tab est vide)

Exercice 2

Contraintes :

  • adresse est une chaîne de caractères (str) de la forme '192.168.0.x' avec 0 <= x <= 255, écrite sans zéro initial
  • toutes les adresses fournies sont valides : aucune vérification de validité n’est demandée
  • liste_octets renvoie une liste de 4 nombres entiers compris entre 0 et 255
  • les adresses réservées sont exactement 192.168.0.0 et 192.168.0.255
  • adresse_suivante renvoie None lorsque le dernier octet vaut 254, et sinon un objet AdresseIP dont l’attribut adresse est l’adresse suivante
  • le comportement de adresse_suivante sur 192.168.0.255 n’est pas spécifié par le sujet et n’est pas évalué