Aller au contenu

Sujet2 - Correction⚓︎

Exercice 1

Partie 1 Q1. nom, tab_voisines, tab_couleurs_disponibles et couleur_attribuee sont des attributs de la classe Region.

Q2. nom_region est de type string

Q3. ge = Region("Grand Est")

Q4.

def renvoie_premiere_couleur_disponible(self):
    return self.tab_couleurs_disponibles[0]

Q5.

def renvoie_nb_voisines(self) :
    return len(self.tab_voisines)

Q6.

def est_coloriee(self):
    return self.couleur_attribuee != None

Q7.

def retire_couleur(self, couleur):
    if couleur in self.tab_couleurs_disponibles:
        self.tab_couleurs_disponibles.remove(couleur)

Q8.

def est_voisine(self, region):
    for r in self.tab_voisines:
        if r == region:
            return True
    return False

Partie 2

Q9.

def renvoie_tab_regions_non_coloriees(self):
    tab_r =[]
    for r in self.tab_regions:
        if not r.est_coloriee():
            tab_r.append(r)
    return tab_r

Q10.a. La méthode renvoie None dans le cas où toutes les régions sont coloriées

Q10.b. La région renvoyée est non coloriée et possède le plus grand nombre de voisins

Q11.

def colorie(self):
    r_max = self.renvoie_max()
    while r_max != None:
        couleur = r_max.renvoie_premiere_couleur_disponible()
        r_max.couleur_attribuee = couleur
        for r in r_max.tab_voisines :
            r.retire_couleur(couleur)
        r_max = self.renvoie_max()

Exercice 2

Q1.

def corrige(cop, corr):
    corrTM = []
    for i in range(len(cop)):
        corrTM.append(cop[i] == corr[i])
    return corrTM

Q2.

def note(corr, cop):
    la_note = 0
    for i in range(len(cop)):
        if cop[i] == corr[i]:
            la_note += 1
    return la_note

Q3.

def notes_paquet(p, corr):
    d = {}
    for nom in p.items():
        d[nom] = note(p[nom], corr)
    return d

Q4. On ne peut pas utiliser de liste car une liste ne peut être hachée; c'est une structure mutable.

Q5. Rajouter un champ date de naissance sur un entier de 8 digits dans le tuple (diminue le risque de collision).

Q6. `((('Tom', 'Matt'), 6), (('Lambert', 'Ginne'), 4), (('Kurt', 'Jett'), 4), {('Carl', 'Roth'): 2, ('Ayet', 'Finzerb'): 3})

Q7. Ce programme retourne un tuple contenant trois tuples et un dictionnaire. Ces trois tuples représentent les trois plus grandes valeurs du dictionnaire, tandis que le dictionnaire contient les valeurs restantes dans l'ordre où elles apparaissent.

Q8. None pour les valeurs du tuple pour le(s) nom(s) absent(s) et dictionnaire vide.

Q9.

def classement(notes):
    candidats = []
    suite = None
    while suite != {}:
        nom1, nom2, nom3, suite = enigme(notes)
        for nom in nom1, nom2, nom3:
            if nom is not None:
                candidats += [nom]
        notes = suite
    return candidats

OU (en récursif)

def classement(notes):
    if len(notes) == 0:
        return ()
    else:
        candidats = ()
        nom1, nom2, nom3, suite = enigme(notes)
        for nom in nom1, nom2, nom3:
            if nom is not None:
                candidats += (nom)
        return candidats + classement(suite)

OU (en récursif avec compréhension)

def classement(notes):
    if len(notes) == 0:
        return ()
    else:
        nom1, nom2, nom3, suite = enigme(notes)
        candidats = tuple([nom for nom in (nom1, nom2, nom3) if nom is not None])
        return candidats + classement(suite)

Q10.

def renote_express2(copcorr) :
    gauche = 0
    droite = len(copcorr)
    while droite - gauche > 1 :
        milieu = (gauche + droite) // 2
        if copcorr[milieu] :
            gauche = milieu + 1
        else :
            droite = milieu - 1
    if copcorr[gauche] :
        return gauche + 1
    else :
        return gauche

Q11.

  • renote_express : \(O(n)\)
  • renote_express2 : \(O(log(n))\)

Q12. Remplacer copcorr[...] par cop[...] == corr[...]

Exercice 3

Partie A

Q1.

  • a : [1949 , 1965 , 1951 , 1953 ,1968 , 1950 , 1943 , 1950 , 2003 , 1953]
  • b : Blade Runner

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 : liste_livre
  • Méthode : ajout_livre

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.

Fondation
Les robots

Q12.

SELECT titre
FROM livres
WHERE auteur = "Bradbury"
AND ann_pub < 1951 ;

Q13.

UPDATE livres
SET note = 9
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 < 1950 ;

Q17. Sélectionne les titres des livres dont leurs auteurs avaient moins de 40 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.