Loading [MathJax]/jax/output/HTML-CSS/fonts/STIX-Web/fontdata.js

Exercice 1

Écrire une fonction recherche qui prend en paramètres elt un nombre et tab un tableau de nombres, et qui renvoie l’indice de la dernière occurrence de elt dans tab si elt est dans tab et le -1 sinon.

Exemples :

>>> recherche(1,[2,3,4]) 
-1 
>>> recherche(1,[10,12,1,56]) 
2 
>>> recherche(1,[1,50,1]) 
2 
>>> recherche(1,[8,1,10,1,7,1,8]) 
5
Entrée[ ]:

Jeu de tests (pas entièrement fourni par l'énoncé original) :

Entrée[ ]:
Solutions

Alternative 1 :

def recherche(elt, tab):
    ind = -1
    for i in range(len(tab)):
        if elt == tab[i]:
            ind = i
    return ind

Alternative 2 :

def recherche(elt, tab):
    i = len(tab) - 1
    while i >= 0:
        if elt == tab[i]:
            return i
        i = i - 1
    return -1

Exercice 2

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_octet(self): 
        """renvoie une liste de nombres entiers, 
           la liste des octets de l'adresse IP""" 
        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""" 
        return ... or ... 
              
    def adresse_suivante(self): 
        """renvoie un objet de AdresseIP avec l'adresse  
           IP qui suit l’adresse self 
           si elle existe et False sinon""" 
        if ... < 254: 
            octet_nouveau = ... + ... 
            return AdresseIP('192.168.0.' + ...) 
        else: 
            return False 

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.est_reservee() 
False 
>>> adresse3.est_reservee() 
True 
>>> adresse2.adresse_suivante().adresse 
'192.168.0.3'
Entrée[ ]:

Jeu de tests :

Entrée[ ]:
Remarques sur l'énoncé

En production, il est déconseillé d'implémenter des fonctions pouvant selon les cas renvoyer des valeurs de type différents (ici AdresseIP ou bool pour la fonction adresse_suivante).

Solutions

Alternative 1

class AdresseIP:

    def __init__(self, adresse):
        self.adresse = adresse
   
    def liste_octet(self):
        """renvoie une liste de nombres entiers,
           la liste des octets de l'adresse IP"""
        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"""
        return self.adresse == '192.168.0.0' or self.adresse == '192.168.0.255'  #<---- confère alternative 2
             
    def adresse_suivante(self):
        """renvoie un objet de AdresseIP avec l'adresse 
           IP qui suit l’adresse self
           si elle existe et False sinon"""
        if self.liste_octet()[3] < 254:
            octet_nouveau = self.liste_octet()[3] + 1
            return AdresseIP('192.168.0.' + str(octet_nouveau))
        else:
            return False
    
    
#instances demandées par l'énoncé
    
adresse1 = AdresseIP('192.168.0.1')
adresse2 = AdresseIP('192.168.0.2')
adresse3 = AdresseIP('192.168.0.0')

Alternative 2

class AdresseIP:

    def __init__(self, adresse):
        self.adresse = adresse
   
    def liste_octet(self):
        """renvoie une liste de nombres entiers,
           la liste des octets de l'adresse IP"""
        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"""
        return self.liste_octet()[3] == 0 or self.liste_octet()[3] == 255  #<---- confère alternative 1
             
    def adresse_suivante(self):
        """renvoie un objet de AdresseIP avec l'adresse 
           IP qui suit l’adresse self
           si elle existe et False sinon"""
        if self.liste_octet()[3] < 254:
            octet_nouveau = self.liste_octet()[3] + 1
            return AdresseIP('192.168.0.' + str(octet_nouveau))
        else:
            return False
    
#instances demandées par l'énoncé
    
adresse1 = AdresseIP('192.168.0.1')
adresse2 = AdresseIP('192.168.0.2')
adresse3 = AdresseIP('192.168.0.0')