23-NSIJ1ME1 : Corrigé
Année : 2023
Centre : Métropole
Jour : 1
Enoncé :
Exercice 1 (3 points)
Base de données relationnelles et le langage SQL
-
a. Un attribut doit être unique pour chaque enregistrement afin d'être une clé primaire.
b. Une clé étrangère est la clé primaire d'une autre relation, ici dans la relation commandes la clé étrangère
#idClientpermet de faire référence à un enregistrement de la tableClientset la clé étrangère#idMeublepermet de faire référence à un enregistrement de la tableMeubles. Ces deux clés permettent de mettre en relation les meubles et les clients qui les ont achetés.c. Meubles(id : int, intitule : txt, prix : float, stock : int, description : txt)
-
Cette requête renvoie :
id stock description 62 2 'Armoire blanche 3 portes' 63 3 'Armoire noire 3 portes' -
Pour afficher les noms et prénoms des clients habitant à Paris, on peut utiliser la requête :
SELECT nom, prenom FROM Clients WHERE ville = 'Paris'; -
Pour mettre à jour la base de données :
UPDATE Meubles SET stock=50 WHERE id=98; -
Pour ajouter l'article à la relation
Meubles:INSERT INTO Meubles VALUES (65, "matta", 95.99, 25, "Tapis vert à pois rouge");Note
Dans la requête précédente, comme on insère les valeurs pour toutes les colonnes on a pas précisé les noms des colonnes. On peut aussi utiliser :
INSERT INTO Meubles (id, intitule, prix, stock, description) VALUES (65, "matta", 95.99, 25, "Tapis vert à pois rouge"); -
Les noms et prénoms des clients se trouvent dans la table
Clientset la date de la commande dans la tableCommandes, on fait donc unJOINentre ces deux tablesSELECT Clients.nom, Clients.prenom FROM Clients JOIN Commandes ON Clients.id = Commandes.idClient WHERE Commandes.date = "30/04/2021"Note
Si un client a commandé plusieurs meubles le 30/04/2021 alors il apparaîtra plusieurs fois, on peut éviter ce problème en ajoutant
DISTINCTaprèsSELECT.
Exercice 2 (3 points)
Réseaux
-
Comme il y a toujours plusieurs chemins possibles entre deux routeurs (par exemple entre
R1etR2, on peut passer directement parLiaison1mais aussi parR3avecLiaison4etLiaison3) si une liaison est coupée le réseau reste fonctionnel car un autre chemin existe. -
On consulte les tables de routage :
- Le siteB est relié au routeur
R2qui indiqueR3lorsque la destination est SiteC - Le routeur
R3indiqueR4lorsque la destination est siteC - Le routeur
R4indiqueR5lorsque la destination est siteC - Le routeur
R5indiqueLocallorsque la destination est siteC
Le chemin suivi sera donc : SiteB R2 R3 R4 R5 SiteC
- Puisque le protocole RIP minimise le nombre de routeurs traversés, la table de routage du routeur
R1sera :
| Destination | Suivant | Nombre de sauts |
|---|---|---|
| SiteA | Local | 0 |
| SiteB | R2 |
1 |
| SiteC | R2 |
2 |
| SiteD | R3 |
2 |
-
Le protocole RIP ne tient pas compte du débit des liaisons pour relier
R2aR5laLiaison2sera donc toujours privilégiée car elle minimise le nombre de routeurs traversé or si cette liaison a un débit nettement inférieur aux autres, il est possible que la routeR2R3R4R5soit plus rapide. -
a. Le coût d'une liaison est inversement proportionnel à son débit, c'est à dire que le coût le plus élevé correspond au débit le plus faible. Ici c'est donc la liaison
Liaison2qui a la débit le plus faible.b. Liste des 4 chemins possibles pour aller de SiteA à SiteC avec leurs coûts :
R1R2R5avec un coût de \(1\,100\,000\)R1R3R2R5avec un coût de \(1\,050\,005\)R1R3R4R5avec un coût de \(50\,015\)R1R2R3R4R5avec un coût de \(100\,020\)
c. Table de routage OSPF du routeur
R1:Destination Suivant Coût SiteA Local 0 SiteB R3\(50\,005\) SiteC R3\(50\,015\) SiteD R3\(50\,005\)
Exercice 3 (6 points)
Programmation orientée objet en Python et algorithmique
Partie 1
-
nom,tab_voisines,tab_couleurs_disponiblesetcouleur_attribueesont des attributs (de la classeRegion) -
Le paramètre
nom_regionest de typestr(chaine de caractères) -
ge = Region("Grand Est") -
return self.tab_couleurs_disponibles[0] -
return len(self.tab_voisines) -
return self.couleur_attribuee != NoneNote
On peut aussi écrire :
if self.couleur_attribuee != None: return True else: return False -
if couleur in self.tab_couleurs_disponibles: self.tab_couleurs_disponibles.remove(couleur)Note
Comme rappelé dans l'énoncé
removeprovoque une erreur lorsque l'élément à enlever ne se trouve pas dans la liste. On vérifie donc la présence de la couleur à l'aide deinavant de la supprimer. -
for voisine in self.tab_voisines: if voisine == region: return True return FalsePartie 2
-
non_coloriees = [] for region in self.tab_regions: if not region.est_coloriee(): non_coloriees.append(region) return non_colorieesNote
On peut proposer une version utilisant les listes définies par compréhension :
return [region for region in self.tab_regions if not region.est_coloriee()] -
a. Cette méthode renvoie
Nonelorsqu'il n'y a plus aucune région non coloriée.b. La région renvoyée n'est pas encore coloriée et possède le plus de regions voisines.
-
def colorie(self): while self.renvoie_max() != None: a_colorier = self.renvoie_max() couleur_choisie = a_colorier.renvoie_premiere_couleur_disponible() for voisine in a_colorier.tab_voisines: voisine.retire_couleur(couleur_choisie)