P.C. Corrig du DEVOIR D’INFORMATIQUE N◦ 1 2017 Exercice 1 : collisions entre avions Les plans de vol gérés par Eurocontrol sont modélisés sous la forme d’une base de données comportant deux tables : ⊲ la table vol qui répertorie les plans de vol déposés par les compagnies aériennes ; elle contient les colonnes • id vol : numéro du vol (chaı̂ne de caractères) ; • depart : code de l’aéroport de départ (chaı̂ne de caractères) ; • arrivee : code de laéroport d’arrivée (chaı̂ne de caractères) ; • jour : jour du vol (de type date, affiché au format aaaa-mm-jj) ; • heure : heure de décollage souhaitée (de type time, affiché au format hh :mi) ; • niveau : niveau de vol souhaité (entier). vol id vol AF1204 AF1205 AF1504 AF1505 depart CDG FCO CDG FCO arrivee FCO CDG FCO CDG jour 2016-05-02 2016-05-02 2016-05-02 2016-05-02 heure 07 :35 10 :25 10 :05 13 :00 niveau 300 300 310 310 ⊲ la table aeroport qui répertorie les aéroports européens ; elle contient les colonnes : • id aero : code de l’aéroport (chaı̂ne de caractères) ; • ville : principale ville desservie (chaı̂ne de caractères) ; • pays : pays dans lequel se situe l’aéroport (chaı̂ne de caractères). aeroport id aero CDG ORY MRS FCO ville Paris Paris Marseille Rome pays France France France Italie 1. Écrire une requête SQL qui fournit le nombre de vols qui doivent décoller dans la journée du 2 mai 2016 avant midi : SELECT COUNT * FROM vol WHERE jour = ’2016-05-02’ AND heure <= ’12 :00’ 2. Écrire une requête SQL qui fournit la liste des numéros de vols au départ d’un aéroport desservant Paris le 2 mai 2016 : SELECT id vol FROM vol JOIN aeroport ON depart=id aero WHERE jour = ’2016-05-02’ AND ville=’Paris’ 3. La requête : SELECT id vol FROM vol JOIN aeroport AS d ON d.id aero = depart JOIN aeroport AS a ON a.id aero = arrivee WHERE d.pays = ’France’ AND a.pays = ’France’ AND jour = ’2016-05-02’ donne la liste des numéros des vols intérieurs français opérés le 2 mai 2016. 4. Une clé primaire d’une relation est un attribut (ou un liste d’attributs) qui, s’il est connu, 1 définie un tuple et un seul de l’extension de cette relation. id vol une clé primaire de la table vol, id aero une clé primaire de la table aeroport. Exercice 2 : Écriture d’une fonction Python from fractions import Fraction def suite(N): if N==0: return [Fraction(4,1)] if N==1: return [Fraction(4,1),Fraction(3,1)] else: L=[Fraction(4,1),Fraction(3,1)] for i in range(2,N+1): L.append(L[-2]*Fraction(1,2)+L[-1]*Fraction(1,4)) return L Pour N plus grand que 3, on fait 3 opérations, plus un ajout via append, donc 4 opérations élémentaires. Elles sont effectuées N-1 fois, donc au total 4N-4 fois. Si on ajoute l’affectation initiale, 4N-3 opérations élémentaires : la complexité est en O(N ). Exercice 3 : Représentations graphiques avec matplotlib.pyplot import numpy as np import matplotlib.pyplot as plt def f(n,x): return np.exp(-n*x)/(1+x+n) X=np.linspace(0,5,50) L=[0,1,5,10] C=[’r’,’b’,’y’,’g’] for i in range(4): Y=f(L[i],X) plt.plot(X,Y,C[i]) plt.show() Exercice 4 : Lecture de scripts python 1. On considère le script python suivant : a=5 b=2 c=a a=b b=a a=a+b c=b+a Quelle est la valeur de la variable c après l’exécution ? 2 4 6 ou 8 2. On considère la fonction python suivante : 2 def somme(L) : for i in range(len(L)-1) : S=S+L[i] return S Parmi les affirmations suivantes, indiquez celle ou celles qui sont vraies A) somme([1,2,3,4]) renvoie 10 ; B) somme([1,2,3,4]) renvoie 6 ; C) somme([1,2,3,4]) renvoie un message d’erreur ; D) S est une variable locale. S n’est pas initialisée. 3. On considère la fonction python suivante : def catan(n) : if n%2==0 : return n//2 else : return 2*n+1 Parmi les affirmations suivantes, indiquez celle ou celles qui sont vraies A) si n ∈ N, le résultat renvoyé par catan est toujours un entier ; B) si n ∈ N, le résultat renvoyé par catan est toujours un entier impair ; C) si n ∈ N, le résultat renvoyé par catan est toujours un entier pair ; D) si n ∈ N, le résultat renvoyé par catan n’est jamais nul. 4. On considère la fonction python suivante (N et L sont des chaı̂nes de caractères) : def test(L,N) : if len(L)<=len(N) : bool=True for i in range(len(L)) : if L[i] !=N[i] : bool=False return bool else : return False Parmi les affirmations suivantes, indiquez celle ou celles qui sont vraies A) test(L,N) renvoie True si, et seulement si, les deux chaı̂nes de caractères L et N sont distinctes ; B) test(L,N) renvoie True si, et seulement si, les deux chaı̂nes de caractères L et N sont égales ; C) test(”CONTROLE”,”CONTROLEUR”) renvoie True ; D) test(”RIEN”,”AERIEN”) renvoie un message d’erreur. 5. On considère le script python suivant : L=[] L.append(2) L.append(3) p=L.pop() q=L.pop() L.append(p) L.append(q) print (L) Parmi les affirmations suivantes, indiquez celle ou celles qui sont vraies. 3 A) L’exécution de ce script provoque une erreur ; B) ce script affiche [2,3] ; C) ce script affiche [3,2] ; D) ce script affiche [2,3,2,3]. 6. On considère la fonction python suivante (o P est une liste non vide d’entiers) : def maxi(P): m=P.pop() while len(P)>0: if m<P.pop(): m=P.pop() return m Parmi les affirmations suivantes, indiquez celle ou celles qui sont vraies. A) maxi([3,2,1]) renvoie 3 ; B) maxi([1,3,2]) renvoie 1 ; C) maxi(P) renvoie le maximum des nombres de la liste P ; D) maxi([2,3]) renvoie une erreur. 4