23-NSIJ1PO1 : Corrigé⚓︎
Année : 2023
Centre : Polynésie **
Jour : J1**
Enoncé :
Exercice 1 (4 points)⚓︎
SQL
-
a. La table contient déjà une entrée dont l'attribut id_equipe vaut 11. Comme il s'agit de la clé primaire cela provoque une erreur. C’est la contrainte d’unicité
b. L'attribut telephone est une chaine de caractère limité à 20. On ne pouvait pas choisir des entiers car les numeros de téléphone commençant par 0 il disparaitrait ainsi les espaces entre chaque paire de chiffres.
c. |Lyon | 451 cours d'Emile Zola,69100 Villeurbanne |04 05 06 07 08|
d. La requête le nombre d'entrée dans la table
equipe
Cette requête renvoie 12. Elle renvoie le nombre d’entités dans la relation Equipe.e.
🗂️ Requête SQLSELECT nom FROM Equipe ORDER BY noms;
f.
🗂️ Requête SQLUPDATE Equipe SET nom='Tarbes' WHERE id_equipe=4;
-
a. L'attribut
id_equipe
a été déclaré clé étrangère de la relationJoueuse
pour référence à la clé primaireid_equipe
de la tableEquipe
.b. On ne peut pas supprimer directement l’équipe dans la relation Equipe car certaines entités de la relation Joueuse font référence à cette équipe : c’est la contrainte de référence.
c.
🗂️ Requête SQLSELECT Joueuse.nom, Joueuse.prenom FROM Joueuse JOIN Equipe ON Equipe.id_equipe=Joueuse.id_equipe WHERE Equipe.nom='Angers' ORDER BY Joueuse.nom;
-
a. On peut proposer le schéma relationnel suivant :
Match (id_match : INT, date : DATE, #id_equipe_domicile : INT, #id_equipe_deplacement : INT, score_domicile : INT, score_deplacement : INT)
#id_equipe_domicile et #id_equipe_deplacement sont des clés étrangères qui font référence à la relation Equipe.
b.
🗂️ Requête SQLINSERT INTO Match VALUES (10, "23/10/2021", 3, 6, 73, 78) ;
-
a. On peut proposer le schéma relationnel suivant :
Statistiques (id_stats : INT, #id_joueuse : INT, #id_match : INT, points : INT, passes_decisives : INT)
b.
🗂️ Requête SQLSELECT Equipe.nom, Joueuse.nom, Joueuse.prenom, Statistiques.points, Statistiques.rebonds, Statistiques.passes_decisives FROM Statistiques JOIN Joueuse ON Joueuse.id_joueuse = Statistiques.id_joueuse JOIN Equipe ON Joueuse.id_equipe = Equipe.id_equipe WHERE Statistiques.id_match = 53 ;
Exercice 2 (4 points)⚓︎
Processus et POO
-
a. 11 - 20 - 32 - 11 - 20 - 32 - 11 - 32 - 11
b. 11 - 11 - 20 - 20 - 32 - 32 - 11 - 11 - 32
-
a.
🐍 Script Pythonliste_attente=[Processus(11,4),Processus(20,2),Processus(32,3)]
b.
🐍 Script Pythondef execute_un_cycle(self): self.reste_a_faire-=1 def change_etat(self,nouvel_etat): self.etat=nouvel_etat def est_termine(self): if self.reste_a_faire<=0: return True else: return False
c.
🐍 Script Pythondef tourniquet(liste_attente, quantum): ordre_execution = [] while liste_attente != []: # On extrait le premier processus processus = liste_attente.pop(0) processus.change_etat("En cours d'exécution") compteur_tourniquet = 0 while processus.reste_a_faire > 0 and compteur_tourniquet < quantum : ordre_execution.append(processus.pid) processus.execute_un_cycle() compteur_tourniquet = compteur_tourniquet + 1 if processus.reste_a_faire != 0: processus.change_etat("Suspendu") liste_attente.append(processus) else: processus.change_etat("Terminé") return ordre_execution
Exercice 3 (4 points)⚓︎
POO et diviser pour régner
-
a.
from math import sqrt
permet d'import la fonction racine carrée de la bibliothèque math
b. Cette instruction renvoie une False à cause des erreurs d’arrondis sur les nombres à virgule flottante. En effet, les nombres à virgule flottante sont représentés par une somme de puissance de 2. Comme 0,1, 0,2 et 0,3 ne peuvent pas s’exprimer comme une somme finie de puissance de 2, l’opération booléenne précédente renvoie False
c.point_A
est un tuple qui n'est pas mutable d'où l'erreur. -
a.
🐍 Script Python 1 2 3 4 5 6
from math import sqrt class Segment: def __init__(self,point1,point2): self.p1=point1 self.p2=point2 self.longueur= sqrt((point1[0]-point2[0])**2+(point1[1]-point2[1])**2)
b.
🐍 Script Pythondef liste_segments(liste_points): n = len(liste_points) segments = [] for i in range(n-1): for j in range(i+1, n): # On construit le segment à partir des points i et j. seq = Segment(liste_points[i],liste_points[j]) segments.append(seg) # On l'ajoute à la liste return segments
c. Pour liste de points de longueur n, on aura \((n-1) + (n-2) + ... + 1=(n-1) \times \dfrac{n-1+1}{2}= \dfrac{n \times (n-1)}{2}\) segments
d. La complexité est donc de l'ordre de \(O(n^2)\).
-
a.
🐍 Script Pythondef plus_court_segment(liste_segments): if len(liste_segments)==1: return liste_segments[0] else: seg_gauche=plus_court_segment(moitie_gauche(liste_segments)) seg_droite=plus_court_segment(moitie_droite(liste_segments)) if seg_gauche.longueur>seg_droite.longueur: return seg_droite else: return seg_gauche
-
a.
🐍 Script Pythonpoint_A=(3,4) point_B=(2,3) point_C=(-3,-1) nuage_points=[point_A,point_B,point_C]
b.
🐍 Script Pythonsegment=plus_court_segment(liste_segments(nuage_points)) print((segment.p1[0],segment.p1[1]),(segment.p2[0],segment.p2[1]))