Exercice 3 - Programmation orientée objet · Bac Numérique et Sciences Informatiques Antilles-Guyane 2026 (jour 1)

Thème : Programmation orientée objet : classes, attributs, méthodes · Tiré du sujet Jour 1 (2026)

Énoncé

Exercice 3 (8 points)

Cet exercice porte sur les protocoles de routage, la sécurisation des communications et la programmation orientée objet.

Bob, un particulier, souhaite communiquer de façon sécurisée avec un serveur web qui héberge un site dont le nom de domaine est alice.fr.

Dans tout l'exercice, pour plus de simplicité d'écriture, on appelle Bob le navigateur et Alice le serveur web.

Partie A

On donne ci-après le réseau entre Alice et Bob. Le coût d'une liaison est marqué à côté de chaque arête.

La première fois que l'URL http://alice.fr est saisie dans la barre d'adresse de Bob, ce dernier envoie tout d'abord une première requête au serveur DNS afin d'obtenir l'adresse IP d'Alice avant de pouvoir envoyer une requête à Alice.

Le protocole RIP est un protocole de routage qui minimise le nombre de routeurs par lesquels les paquets transitent.

Partie B

Dans cette partie, on se propose de coder, dans un module que l'on nommera outils, quelques fonctions qui serviront pour la suite de l'exercice.

9.

Écrire le code d'une fonction somme qui prend en paramètre un tableau (type list en Python) d'entiers et renvoie la somme des éléments de ce tableau.

Exemple: >>> somme([1, 3, 5, 7, 9]) donne 25.

10.

Écrire le code d'une fonction permuter qui prend en paramètres un tableau tab (type list en Python) et deux entiers i et j, et modifie le tableau tab en permutant ses éléments d'indices i et j.

11.

Recopier et compléter la ligne 3 du code ci-après de la fonction inverser qui modifie le tableau passé en paramètre en inversant l'ordre de ses éléments.

def inverser(tab):

for i in range(len(tab) // 2):

permuter(...)

Construction d'un sac

On appelle sac un tableau (type list en Python) de 8 éléments entiers construit de la manière suivante:

Le premier élément du sac est un entier choisi au hasard entre 1 et 5 tous deux inclus.

Pour ajouter un nouvel entier au sac:

on calcule la somme S de tous les éléments du sac;

on choisit au hasard un entier entre S+1 et 2*S tous deux inclus;

on ajoute cet entier dans le sac à la suite des précédents.

Une fois que le sac contient ses huit entiers, on inverse l'ordre de ses éléments afin que le premier élément du sac soit le plus grand.

On rappelle que la fonction randint(a, b) du module random renvoie un nombre entier choisi aléatoirement entre a et b tous deux inclus.

12.

Recopier et compléter les lignes 7 à 13 du code ci-après de la fonction generer_sac.

from random import randint

def generer_sac():

'''

renvoie un sac (8 entiers)

: return (list) un sac

'''

sac =...

for i in range(7):

S =...

nouvel_entier =...

sac.append(nouvel_entier)

...

return sac

Partie C

Dans cette partie, on code une classe Cle_symetrique qui permet d'instancier une clé ( sac) qui permet de chiffrer un octet en calculant un nombre entier et qui permet de déchiffrer un nombre entier en retrouvant l'octet d'origine.

Un octet est représenté par un tableau (type list en Python) dont les éléments sont les huit bits de l'octet. Par exemple, le tableau [1, 0, 1, 1, 1, 1, 0, 1] représente l'octet 10111101.

Cette classe est initialisée avec un unique attribut sac qui est un tableau renvoyé par la fonction generer_sac du module outils.

Afin de chiffrer un octet, on multiplie chaque bit d'indice i dans le tableau qui le représente par l'entier d'indice i du sac de l'instance de Cle_symetrique puis on renvoie la somme de tous les produits obtenus. Le chiffrement d'un octet est donc un entier.

Par exemple, si la clé est [568, 205, 71, 32, 10, 6, 2, 1], on peut chiffrer [1, 0, 1, 1, 1, 1, 0, 1] par:

568×1+205×0+71×1+32×1+10×1+6×1+2×0+1×1=688568 \times 1 + 205 \times 0 + 71 \times 1 + 32 \times 1 + 10 \times 1 + 6 \times 1 + 2 \times 0 + 1 \times 1 = 688.

13.

Recopier et compléter la ligne 4 du code de la classe Cle_symetrique ci-après.

import outils

class Cle_symetrique():

def __init__(self):

... =...

14.

Recopier et compléter les lignes 8 à 11 du code de la méthode chiffrer ci-après.

def chiffrer(self, octet):

'''

renvoie le chiffrement de octet

: paramètre octet (list) un tableau de huit 0 ou 1

: return (int)

'''

tab_produits = []

for i in range(...):

produit =... *...

tab_produits.append(produit)

s =...

return s

Méthode de déchiffrement

Afin de déchiffrer un entier et de retrouver l'octet auquel il correspond, on utilise la méthode dechiffrer ci-après.

Pour chaque indice i allant de 0 à 7 tous deux inclus:

si l'entier à déchiffrer est supérieur ou égal à l'entier d'indice i du sac de l'instance de Cle_symetrique alors:

le bit d'indice i vaut 1;

on soustrait à l'entier à déchiffrer l'entier d'indice i du sac.

sinon le bit d'indice i vaut 0.

15.

Justifier qu'avec la méthode dechiffrer, le déchiffrement du nombre 688 est [1, 0, 1, 1, 1, 1, 0, 1].

16.

Écrire le code de la méthode dechiffrer de la classe Cle_symetrique qui prend en paramètre un entier à déchiffrer et renvoie un tableau représentant l'octet correspondant à cet entier.

Énoncé: Exercice 3 - Programmation orientée objet · Bac Numérique et Sciences Informatiques Antilles-Guyane 2026 (jour 1)

Corrigé

Corrigé proposé par AprenAI (non officiel)

9. Écrire le code d'une fonction somme qui prend en paramètre un tableau (type list en Python) d'entiers et renvoie la somme des éléments de ce tableau.

Réponse : ```python def somme(tab): s = 0 for x in tab: s += x return s ```

10. Écrire le code d'une fonction permuter qui prend en paramètres un tableau tab et deux entiers i et j, et modifie le tableau tab en permutant ses éléments d'indices i et j.

Réponse : ```python def permuter(tab, i, j): tab[i], tab[j] = tab[j], tab[i] ``` ```python def permuter(tab, i, j): tmp = tab[i] tab[i] = tab[j] tab[j] = tmp ```

11. Recopier et compléter la ligne 3 du code ci-après de la fonction inverser qui modifie le tableau passé en paramètre en inversant l'ordre de ses éléments.

Réponse : ```python permuter(tab, i, len(tab) - 1 - i) ```

12. Recopier et compléter les lignes 7 à 13 du code ci-après de la fonction generer_sac.

Réponse : ```python sac = [randint(1, 5)] for i in range(7): S = somme(sac) nouvel_entier = randint(S + 1, 2 * S) sac.append(nouvel_entier) inverser(sac) return sac ```

Les réponses des 4 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium

Résous-le ici : correction automatique, indices et corrigé détaillé.

Exercice 1 - Partie B · Antilles-Guyane 2026 (jour 2) ›

Plus d’exercices de Programmation orientée objet : classes, attributs, méthodes