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
#idClient
permet de faire référence à un enregistrement de la tableClients
et la clé étrangère#idMeuble
permet 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
Clients
et la date de la commande dans la tableCommandes
, on fait donc unJOIN
entre 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
DISTINCT
aprèsSELECT
.
Exercice 2 (3 points)
Réseaux
-
Comme il y a toujours plusieurs chemins possibles entre deux routeurs (par exemple entre
R1
etR2
, on peut passer directement parLiaison1
mais aussi parR3
avecLiaison4
etLiaison3
) 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
R2
qui indiqueR3
lorsque la destination est SiteC - Le routeur
R3
indiqueR4
lorsque la destination est siteC - Le routeur
R4
indiqueR5
lorsque la destination est siteC - Le routeur
R5
indiqueLocal
lorsque 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
R1
sera :
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
R2
aR5
laLiaison2
sera 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 routeR2
R3
R4
R5
soit 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
Liaison2
qui a la débit le plus faible.b. Liste des 4 chemins possibles pour aller de SiteA à SiteC avec leurs coûts :
R1
R2
R5
avec un coût de \(1\,100\,000\)R1
R3
R2
R5
avec un coût de \(1\,050\,005\)R1
R3
R4
R5
avec un coût de \(50\,015\)R1
R2
R3
R4
R5
avec 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_disponibles
etcouleur_attribuee
sont des attributs (de la classeRegion
) -
Le paramètre
nom_region
est 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 != None
Note
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é
remove
provoque 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 dein
avant de la supprimer. -
for voisine in self.tab_voisines: if voisine == region: return True return False
Partie 2
-
non_coloriees = [] for region in self.tab_regions: if not region.est_coloriee(): non_coloriees.append(region) return non_coloriees
Note
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
None
lorsqu'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)