Sujet1 - Correction⚓︎
Exercice 1
Q1.a. Cette ligne permet d’importer la fonction sqrt de la bibliothèque math permettant de calculer des racine carrées.
Q1.b. Cette expression renvoie False à cause du problème d’arrondi des flottants (impossible de représenter 0.1 en mémoire avec exactitude)
Q1.c. point_A est un tulpe et la ligne point_A[0] = 2 a pour but de modifier ce tuple, alors qu’un tuple n’est pas modifiable. Il n'est pas mutable.
Q2.a.
from math import sqrt
class Segment:
def __init__(self, point1, point2):
self.p1 = point1
self.p2 = point2
self.longueur = sqrt((self.p1[0]-self.p2[0])**2 + (self.p1[1]-self.p2[1])**2)
Q2.b.
def liste_segments(liste_points):
n = len(liste_points)
segments = []
for i in range(n-1):
for j in range(i+1, n):
seg = Segment(liste_points[i], liste_points[j])
segments.append(seg)
return segments
Q2.c. \((n - 1) + (n - 2) + (n - 3) + … + 1\)
Q2.d. La complexité est en \(O(n^2)\) (boucles imbriquées)
Q3.a.
def plus_court_segment(tab_seg):
if len(tab_seg) == 1 :
return tab_seg[0]
else :
seg_g = plus_court_segment(moitie_gauche(tab_seg))
seg_d = plus_court_segment(moitie_droite(tab_seg))
if seg_g.longueur < seg_d.longueur :
return seg_g
else :
return seg_d
Q4.a. nuage_points = liste_segments([(3, 4), (2, 3), (-3, -1)])
Q4.b.
seg = plus_court_segment(nuage_points)
print("point 1 : ("+str(seg.p1[0])+","+str(seg.p1[1])+")")
print("point 2 : ("+str(seg.p2[0])+","+str(seg.p2[1])+")")
Exercice 2
Q1.
Q2. 4 → 2 → 5 → 6 (17)
Q3.
2 → 5 → 2 (9)
2 → 5 → 3 (10)
2 → 1 → 3 (6)
2 → 1 → 9 (12)
Q4. Du chemin tout à gauche codée 000...00 (ou le nombre de 0 correspond à n) et le chemin tout à droite codée 111...11, toutes les valeurs binaires sont représentées. Or 111...11 correspond à \(2 ^ {n} -1\). Donc tous les nombres de 0 à \(2 ^ {n} -1\) sont représentés. Il y a donc \(2 ^ n\) chemins.
Q5. La complexité est exponentielle en \(O(2^n)\)
Q6.
def score_max(i, j, p):
if i == len(p)-1:
return p[len(p)-1][j]
else:
return p[i][j] + max(score_max(i+1, j, p), score_max(i+1, j+1, p))
Q7.
def pyramide_nulle(n : int) -> list:
return [[0] * (i+1) for i in range(0, n+1)]
Q8.
def prog_dyn(p):
n = len(p)
s = pyramide_nulle(n-1)
# remplissage du dernier niveau
for j in range(len(s[n-1])):
s[n-1][j] = p[n-1][j]
# remplissage des autres niveaux
for i in range(n-2, -1, -1):
for j in range(len(p[i])):
s[i][j] = p[i][j] + max(s[i+1][j], s[i+1][j+1])
# renvoie du score maximal
return s[0][0]
Q9. La boucle imbriquée des lignes 8 et 9 donnent : \(1 + 2 + 3 + … + (n+1)\) itérations soit \(\frac{(n+1)(n+2)}{2}\) itérations. La complexité est donc en \(O(n^2)\).
Exercice 3
Partie A
Q1.
a:[ 1 , 2 , 14 , 4 , 5 , 8 , 7 , 15 , 9 , 10 ]b:Dune
Q2.
def titre_livre(dico, id_livre):
for i in range(len(dico['id'])):
if dico['id'][i] == id_livre :
return dico['titre'][i]
return None
Q3.
def note_maxi(dico):
maxi = dico['note'][0]
for note in dico['note']:
if note > maxi :
maxi = note
return maxi
Q4.
def livres_note(dico, note):
lst = []
for i in range(len(dico['note'])):
if dico['note'][i] == note :
lst.append(dico['titre'][i])
return lst
OU
def livres_note(dico, note):
return [dico['titre'][i] for i in range(len(dico['note'])) if dico['note'][i] == note]
Q5.
def livre_note_maxi(dico):
return livres_note(dico, note_maxi(dico))
Partie B
Q6.
- Attribut :
id - Méthode :
get_id
Q7.
def get_note(self):
return self.note
Q8.
biblio = Bibliotheque()
biblio.ajout_livre( Livre(5, "Blade Runner", "K.Dick", 1968, 8))
Q9.
def titre_livre(self, id_livre):
for livre in self.liste_livre :
if livre.get_id() == id_livre :
return livre.get_titre()
return None
Partie C
Q10. Un auteur peut avoir écrit plusieurs livres. La clef n’est donc pas unique.
Q11.
Chroniques martiennes
Fahrenheit 451
Q12.
SELECT titre
FROM livres
WHERE auteur = "K. Dick"
AND ann_pub > 1960 ;
Q13.
UPDATE livres
SET note = 7
WHERE id = 2 ;
Q14. Évite de dupliquer les données (redondance) et facilite la mise à jour (évite les incohérences).
Q15. Clef étrangère vers la table auteurs pour la mise en relation des tables livres et auteurs.
Q16.
SELECT auteurs.nom, auteurs.prenom FROM auteurs
JOIN livres ON livres.id_auteur = auteurs.id
WHERE livres.ann_pub > 1955 ;
Q17. Sélectionne les titres des livres dont leurs auteurs avaient plus de 50 ans au moment de leur publication.
Q18. La création d’une base de données, contenant des données personnelles, est sujette à déclaration préalable auprès de la CNIL. Il faut protéger les données personnelles.