25-NSIJ2JA1-3

  1. SELECT nom_patient, prenom
    FROM Patient
    WHERE age > 60;
    
  2. UPDATE Symptome
    SET toux = 'Non'
    WHERE nom_patient = 'Heartman';
    
  3. SELECT COUNT(*)
    FROM Diagnostic
    JOIN Symptome ON Symptome.nom_patient = Diagnostic.nom_patient
    WHERE nom_maladie = 'Covid-19' AND toux = 'Oui';
    
  4. Cette requête renvoie une erreur car elle tente d'insérer un nouvel enregistrement dont la valeur de la clé primaire ('Douglas') est déjà présente dans la table Patients. Or, une clé primaire doit identifier chaque enregistrement de manière unique : deux enregistrements ne peuvent partager la même valeur de clé primaire.

  5. Puisque le numéro de sécurité sociale est unique pour chaque individu, il est naturel de l'utiliser comme clé primaire. Ainsi le schéma relationnel de Patient devient :

    Patient(numero_secu: INT, nom_patient: TEXT, prenom: TEXT, age: INT)

  6. D'après l'arbre, ce patient est diagnostiqué positif.

  7. L'assertion dans la méthode symptome provoque une erreur si on l'applique à une feuille de l'arbre, car une feuille représente un diagnostic et non un potentiel symptôme. Elle sert à garantir que cette méthode n'est appelée que sur un nœud interne.

  8. Dans la classe Noeud, valeur est un attribut et est_feuille est une méthode.

  9. def applique(arbre, patient):
        if arbre.est_feuille():
            return arbre.diagnostic()
        else:
            if patient[arbre.symptome()]:
                return applique(arbre.droit, patient)
            else:
                return applique(arbre.gauche, patient)
    
  10. La taille de l'arbre de la figure 1 est \(1 + 2 + 4 + 8 + 16 = \boxed{31}\).

  11. def reduire(self):
        if self.est_feuille():
            return
        self.gauche.reduire()
        self.droit.reduire()
        if self.gauche.est_feuille() and self.droit.est_feuille() \ 
           and self.gauche.valeur == self.droit.valeur:
            self.valeur = self.gauche.valeur
            self.gauche = None
            self.droit  = None
    
  12. def verifie(num_secu):
        n = num_secu // 100
        k = num_secu % 100
        return (n + k) % 97 == 0
    
  13. def cle(n):
        for k in range(100):
            if verifie(n * 100 + k):
                return k
    

    Ou plus simplement :

    def cle(n):
        return -n % 97