23-NSIJ2PO1 : Corrigé⚓︎
Année : 2023
Centre : Polynésie
Jour : J2
Enoncé :
Exercice 1 (4 points)⚓︎
Arbres binaires, ABR, POO et récursivité
-
a. Cet arbre est un arbre binaire car chaque nœud possède au plus deux fils.
b. L’arbre ci-dessus n’est pas un arbre binaire de recherche car par exemple la valeur du nœud 4 est le fils droit de la racine dont la valeur est 13. Dans un arbre binaire de recherche chaque nœud du sous-arbre gauche a une valeur inférieure ou égale à celle du nœud considéré et chaque nœud du sous-arbre droit à une valeur supérieure ou égale à celle du nœud considéré.
-
a.
🐍 Script Pythonassert isinstance(mini, int) and isinstance(maxi, int) and mini <= maxi
b.
c.graph TD A("construire(0,8)") --> B("construire(0,4)") B --> D("construire(0,2)") B --> E("construire(2,4)") A --> H("construire(4,8)") H --> I("construire(4,6)") H --> J("construire(6,8)")
graph TD A(3) --> B(2) B --> D(1) B --> E(1) A --> C(4) C --> F(3) C --> G(7)
d.
graph TD A(1) --> B(0) A --> D(2)
e. Le parcours infixe de l’arbre binaire obtenu dans la question 2.c est :
1, 2, 3, 4, 5, 6, 7
C’est un arbre binaire de recherche car le parcours infixe parcours les valeurs des nœuds dans l’ordre croissantf.
2. a.🐍 Script Python 1 2 3 4 5 6 7
def maximum(abr): if abr is None: return None elif abr.droit is None: return abr.valeur else: return maximun(abr.droit)
🐍 Script Python>>> mystere(abr_7_noeuds, 5, []) [6, 4, 5] >>> mystere(abr_7_noeuds, 6, []) [6] >>> mystere(abr_7_noeuds, 2, []) []
b. La fonction
mystere
permet de déterminer le chemin vers la valeur x entrée en paramètre en partant de la racine de l’arbre si elle existe. Si la valeur x n’est pas dans l’arbre binaire de recherche, cette fonction renvoie une liste vide.```
Exercice 2 (4 points)⚓︎
SQL
-
a. L’appareil à raclette a pour id 4. Dans la table Possede, les membres d’id 1 et 2, c’est-à-dire Ali Mohamed et Alonso Fernando, proposent à la location un appareil à raclette.
b. Dans la table Possede, le membre d’id 5 n’est pas présent. Cela signifie qu’il ne propose pas d’objet à la location. Ce membre est Kane Harry.
-
a. Cette requête renvoie :
Dupont Antoine
Kane Harryb.
🗂️ Requête SQLSELECT tarif FROM Objet WHERE description = "Scie circulaire" ;
c.
🗂️ Requête SQLUPDATE Objet SET tarif = 15 WHERE description ="Nettoyeur haute pression" ;
d.
🗂️ Requête SQLINSERT INTO Membre VALUES (6, "Renard", "Wendie", "69100");
-
a. Si ce couple était utilisé comme clé primaire, un membre ne pourrait réserver qu’une seul fois un même objet
b. Ce membre est également présent dans les tables Possede et Reservation. Son attribut id_membre est clé étrangère de ces tables. Il faut donc d’abord supprimer ces entités des tables Possede et Reservation avant de pouvoir le supprimer de la table Membre.
c.
🗂️ Requête SQLDELETE FROM Possede WHERE id_membre = 1; DELETE FROM Reservation WHERE id_membre = 1;
-
a.
🗂️ Requête SQLSELECT COUNT(*) FROM Reservation JOIN Membre ON Membre.id_membre = Reservation.id_membre WHERE Membre.nom = "Alfonso" AND Membre.prenom = "Fernando";
b.
🗂️ Requête SQLSELECT nom, prenom FROM Membre JOIN Possede ON Possede.id_membre = Objet.id_membre JOIN Objet ON Objet.id_objet = Possede.id_objet WHERE Objet.description = "Appareil à raclette";
Exercice 3 (4 points)⚓︎
Programmation python
-
a.
b. La commande qui a lancé le premier processus de firefox est bash.graph TD A("9617") --> B("9794") A --> D("9750") A --> E("9697") A --> H("9657") B --> I("9795")
c. La commande permettant de supprimer tous les processus liés à firefox est kill 9617.
-
a.
b. Les temps d’exécution des quatre processus sont :
Processus Instant d’arrivée Instant de terminaison Temps d’exécution 1 0 12 \(12-0=12\) 2 2 18 \(18-2=16\) 3 3 5 \(5-3=2\) 4 7 9 \(9-7=2\) On obtient le temps d’exécution moyen : \(\dfrac{12+16+2+2}{4}=8\)
c. P1-P1-P1-P1-P3-P3-P1-P1-P1-P1-P4-P4-P2-P2-P2-P2-P2-P2
d. Les temps d’exécution des quatre processus sont :
Processus Instant d’arrivée Instant de terminaison Temps d’exécution 1 0 10 \(10-0=10\) 2 2 18 \(18-2=16\) 3 3 6 \(6-3=3\) 4 7 12 \(10-7=5\) On obtient le temps d’exécution moyen : \(\dfrac{10+16+3+5}{4}=8.5\)
Cet ordonnancement est moins performant que le précédent. -
a.
🐍 Script Python 1 2 3 4 5 6 7 8 9 10 11 12 13
def choix_processus(liste_attente): """Renvoie l'indice du processus le plus court parmi ceux présents en liste d'attente liste_attente""" if liste_attente != []: mini = len(liste_attente[0]) indice = 0 # On parcourt les processus dans la liste d'attente for i in range(1, len(liste_attente)): # Si on trouve un processus plus court if len(liste_attente[i]) < mini: indice = i # On retient son indice mini = len(liste_attente[i]) return indice
b.
🐍 Script Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
def ordonnancement(liste_proc): """Exécute l'algorithme d'ordonnancement liste_proc -- liste des processus Renvoie la liste d'exécution des processus""" execution = [] attente = scrutation(liste_proc, []) while attente != []: indice = choix_processus(attente) # Retrait de la liste d'attente du dernier élément du # processus le plus court process_execute = attente[indice].pop() # Le processus est entièrement fini, il est enlevé de la # liste d'attente if attente[indice] == []: attente.pop(indice) # On ajoute l'élément du processus choisi à la liste # d'exécution execution.append(process_execute) attente = scrutation(liste_proc, attente) return execution