Vous êtes sur la page 1sur 10

Examen 2016 – 2017

Programmation en python
Durée : 2h
Documents autorisés : Tout document autorisé - sauf annales corrigées - Accès au réseau
non autorisé.
Le barème indiqué pour chaque question n’est donné qu’à titre indicatif. Le barème total est
lui aussi donné à titre indicatif : 60 points.
La clarté des réponses et la présentation des programmes seront appréciées. Les exercices
peuvent être résolus dans un ordre quelconque. Il est possible (et souvent utile), pour répondre
à une question, d’utiliser les fonctions qui sont l’objet des questions précédentes.
L’examen est composé de 3 exercices indépendants et vous répondrez aux questions dans les
3 fichiers fournis :
— Suite aliquote − > aliquote.py
— En famille − > f amilles.py
— Agenda − > agenda.py
Les signatures et hypothèses des fonctions demandées vous sont fournies dans ces fichiers.
Vous ajouterez votre numéro d’anonymat à la fin du nom de chaque fichier.
Pour éviter que vous soyez bloqué à une question une version (non lisible) des fonctions
vous est fournies dans le fichiers "XXX_corr.pyc", XXX étant le même nom que celui de
votre fichier. Pour une utiliser une fonction de ce fichier, il vous suffit d’importer le module
(par exemple import aliquote_corr) puis d’appeler la fonction que vous n’avez pas réussi
à faire (par exemple aliquote_corr.est_div_propre(5,6)). N’importez pas le module avec la
commande from aliquote_corr import * car il y aurait alors des conflits avec vos fonctions.

Exercice 1 : Suite aliquote

On s’intéresse aux diviseurs propres des entiers naturels, plus particulièrement à la somme de
leurs diviseurs propres.
Un entier naturel non nul d est un diviseur propre d’un entier naturel non nul n quand d
est un diviseur de n et quand d 6= n. Par exemple, 1, 2, 3, 4 et 6 sont les diviseurs propres de
12.

Question 1.1 : [2/60]

Donner une définition de la fonction est_div_propre qui, étant donné un entier naturel
non nul d et un entier naturel non nul n, retourne True si d est un diviseur propre de n et
False sinon.

UPMC
c - ISUP - page 1 -
Par exemple :
>>> est_div_propre(6, 12)
True
>>> est_div_propre(7, 12)
False
>>> est_div_propre(12, 12)
False

Question 1.2 : [3/60]

Donner une définition de la fonction liste_div_propres qui, étant donné un entier naturel
non nul n, retourne la liste des diviseurs propres de n.
Par exemple :
>>> liste_div_propres(12)
[1, 2, 3, 4, 6]
>>> liste_div_propres(6)
[1, 2, 3]
>>> liste_div_propres(7)
[1]

Question 1.3 : [3/60]

Donner une définition de la fonction s_div_propres qui, étant donné un entier naturel non
nul n, retourne la somme de ses diviseurs propres.
Par exemple :
>>> s_div_propres(6)
6
>>> s_div_propres(12)
16
>>> s_div_propres(220)
284

Dans la suite, on note σ(n) la somme des diviseurs propres de n.


Un entier naturel non nul est parfait quand il est égal à la somme de ses diviseurs propres,
c’est à dire quand n = σ(n). Par exemple, 6 est parfait car les diviseurs propres de 6 sont 1,
2 et 3 et leur somme vaut 6. Par contre, 12 n’est pas parfait car σ(12) vaut 16.

UPMC
c - ISUP - page 2 -
Question 1.4 : [3/60]

Donner une définition de la fonction parfaits qui, étant donné un entier naturel non nul
n, retourne la liste des nombres parfaits compris entre 1 et n (inclus), sans utiliser de
compréhension.
Par exemple :
>>> parfaits(6)
[6]
>>> parfaits(1000)
[6, 28, 496]

Question 1.5 : [2/60]

Donner une définition de la fonction parfaits_comp qui, en utilisant une compréhen-


sion de liste, implémente la même fonction que parfaits.

Question 1.6 : [4/60]

Étant donné un entier naturel non nul n, on définit la suite aliquote (ak )k∈N de n :
— a0 = n (
1 si ak = 1
— ∀k ∈ N, ak+1 =
σ(ak ) sinon.
Par exemple, les 5 premiers termes de la suite aliquote de 9 sont 9, 4, 3, 1, 1 et les 5 premiers
termes de la suite aliquote de 30 sont 30, 42, 54, 66, 78 .
Donner une définition de la fonction terme_aliquote qui, étant donné un entier naturel
non nul n et un entier naturel k, renvoie la valeur du terme d’indice k de la suite aliquote de
n.
Par exemple :
>>> terme_aliquote(9, 0)
9
>>> terme_aliquote(9, 1)
4
>>> terme_aliquote(30, 3)
66

UPMC
c - ISUP - page 3 -
Exercice 2 : En famille

Dans cet exercice, une famille est représentée par un dictionnaire dont les éléments sont des
associations entre une clé qui est le prénom d’une personne et une valeur qui est l’ensemble
des prénoms des enfants de cette personne.
Si une personne n’a pas d’enfants alors elle n’apparaît pas comme clé du dictionnaire.
On peut définir le type ainsi :
# type Famille = dict[str: set[str]]

Dans tout l’exercice on fait l’hypothèse que les personnes ont toutes des prénoms différents.
On utilise comme exemple :
# F_ex : Famille
F_ex = {’eve’: {’tom’, ’lea’, ’luc’, ’kim’},
’tom’: {’isa’, ’bob’},
’lea’: {’ali’},
’bob’: {’bea’, ’tim’},
’luc’: {’sam’, ’jon’, ’lou’},
’sam’: {’ana’, ’guy’},
’guy’: {’ben’}}

Dans cet exemple :


— tom, lea, luc et kim sont les enfants d’eve
— isa et bob sont les enfants de tom (et donc les petits-enfants d’eve)
— lou n’est pas une clé du dictionnaire : lou n’a pas d’enfants
— etc.

Question 2.1 : [6/60]

Donner une définition de la fonction lecture_Simple de signature


lecture_Simple: str -> Famille qui, étant données un nom de fichier nomF ichier
ouvre le fichier et le lit puis retourne la F amille lue. Cette fonction sortira du programme
(exit) si le fichier ne peut être ouvert en lecture.
Le fichier aura ce format :
eve tom
eve lea
lea

Chaque ligne contient donc le nom du parent puis éventuellement le nom de l’enfant.

Question 2.2 : [2/60]

Donner une définition de la fonction enfants de signature enfants: Famille * str -> set[str]
qui, étant données une famille F et une chaîne de caractères x, retourne l’ensemble des pré-

UPMC
c - ISUP - page 4 -
noms des enfants de x dans F . Cette fonction retourne l’ensemble vide si x n’est pas une clé
de F .
Par exemple :
>>> enfants(F_ex, ’eve’)
{’kim’, ’lea’, ’tom’, ’luc’}
>>> enfants(F_ex, ’luc’)
{’lou’, ’jon’, ’sam’}
>>> enfants(F_ex, ’lou’)
set()
>>> enfants(F_ex, ’germaine’)
set()

Question 2.3 : [4/60]

Donner une définition de la fonction enfants_ens qui, étant donnés une famille F et un en-
semble X de chaînes de caractères, retourne l’ensemble des prénoms des enfants des personnes
de l’ensemble X dans F . Par exemple :
>>> enfants_ens(F_ex, {’tom’, ’lea’})
{’isa’, ’bob’, ’ali’}
>>> enfants_ens(F_ex, {’tom’, ’lou’})
{’isa’, ’bob’}
>>> enfants_ens(F_ex, set())
set()

Question 2.4 : [2/60]

Donner une définition de la fonction petits_enfants qui, étant données une famille F et
une chaîne de caractères x, retourne l’ensemble des prénoms des petits-enfants de x dans F .
Remarque : les petits-enfants de x sont les enfants des enfants de x.
Par exemple :
>>> petits_enfants(F_ex, ’eve’)
{’lou’, ’isa’, ’bob’, ’ali’, ’jon’, ’sam’}
>>> petits_enfants(F_ex, ’tom’)
{’tim’, ’bea’}
>>> petits_enfants(F_ex, ’germaine’)
set()
>>> petits_enfants(F_ex, ’lea’)
set()
>>> petits_enfants(F_ex, ’lou’)
set()

UPMC
c - ISUP - page 5 -
Question 2.5 : [3/60]

Donner une définition de la fonction :


parents:Famille * str -> set[str]
qui, étant données une famille F et une chaîne de caractères x, retourne l’ensemble des
prénoms des parents de x dans F (y est un parent de x si x est un enfant de y). Cette
fonction retourne l’ensemble vide si x n’a pas de parent dans F .
Par exemple :
>>> parents(F_ex, ’tom’)
{’eve’}
>>> parents(F_ex, ’sam’)
{’luc’}
>>> parents(F_ex, ’eve’)
set()
>>> parents(F_ex, ’germaine’)
set()

Question 2.6 : [3/60]

Donner une définition de la fonction :


freres_soeurs:Famille * str -> set[str]
qui, étant données une famille F et une chaîne de caractères x, retourne l’ensemble des
prénoms des frères et sœurs de x dans F .
Remarque : les frères et sœurs de x sont les enfants des parents de x, mais sont différents
de x.
Indication : on pourra utiliser des fonctions définies dans les questions précédentes.
>>> freres_soeurs(F_ex, ’lea’)
{’tom’, ’kim’, ’luc’}
>>> freres_soeurs(F_ex, ’lou’)
{’jon’, ’sam’}
>>> freres_soeurs(F_ex, ’germaine’)
set()
>>> freres_soeurs(F_ex, ’eve’)
set()
>>> freres_soeurs(F_ex, ’ben’)
set()

UPMC
c - ISUP - page 6 -
Question 2.7 : [2/60]

Donner une définition de la fonction :


neveux_nieces:Famille * str -> set[str]
qui, étant données une famille F et une chaîne de caractères x, retourne l’ensemble des
prénoms des neveux et nièces de x dans F .
Remarque : les neveux et nièces de x sont les enfants des frères et sœurs de x.
Indication : on pourra utiliser des fonctions définies dans les questions précédentes.
>>> neveux_nieces(F_ex, ’lea’)
{’bob’, ’lou’, ’sam’, ’jon’, ’isa’}
>>> neveux_nieces(F_ex, ’lou’)
{’ana’, ’guy’}
>>> neveux_nieces(F_ex, ’guy’)
set()
>>> neveux_nieces(F_ex, ’germaine’)
set()

Exercice 3 : Agenda

Dans cet exercice on va stocker des ensembles de rendez-vous, qui forment l’agenda d’une
personne.
Un rendez-vous est représenté par une classe contenant :
— la date date, représentée par une chaîne de caractères (sous la forme ’jj/mm/aaaa’)
— l’heure, heure, représentée par un entier (on suppose que tous les rendez-vous ont lieu
à une heure pile, par exemple 10h sera représenté par l’entier 10)
— le nom, nom de la personne avec qui on a rendez-vous, représenté par une chaîne de
caractères.
On utilise comme exemple :
# A_ex : set[RDV]
A_ex = { RDV(’17/11/2015’, 10, ’Elie’),
RDV(’17/11/2015’, 11, ’Nour’),
RDV(’18/11/2015’, 10, ’Paul’),
RDV(’19/11/2015’, 10, ’Sacha’),
RDV(’19/11/2015’, 14, ’Paul’) }

Question 3.1 : [2/60]

Donner une définition de la classe RDV et de sa fonction __init__ qui initialise chacun de
ses champs avec des valeurs données en argument à la fonction init.

UPMC
c - ISUP - page 7 -
Question 3.2 : [2/60]

Donner une définition de la fonction __str__ qui retourne une chaine de caractère contenant
les différents champs. Par exemple, RDV(’17/11/2015’, 10, ’Elie’) devient "17/11/2015 10h
Elie".

Question 3.3 : [2/60]

Donner une définition de la fonction rdv_personne qui, étant donnés un ensemble de rendez-
vous E et une chaîne p représentant le nom d’une personne, renvoie l’ensemble des rendez-vous
avec cette personne.
Par exemple,
>>> rdv_personne(A_ex, ’Laeticia’)
set()
>>> rdv_personne(A_ex, ’Paul’)
{RDV(’18/11/2015’, 10, ’Paul’), RDV(’19/11/2015’, 14, ’Paul’)}

Note : cette question est notée sur 4 points (au lieu de 2) si la définition utilise
une compréhension

Question 3.4 : [3/60]

Donner une définition de la fonction rdv_restants qui, étant donné un ensemble de rendez-
vous E, une date d et une heure h, renvoie l’ensemble des rendez-vous de E qui ont lieu à la
date d et après l’heure h.
Par exemple,

Question 3.5 : [3/60]

Donner une définition de la fonction nb_rdv qui, étant donné un ensemble de rendez-vous
E, renvoie un dictionnaire associant à chaque date de E le nombre de rendez-vous ayant lieu
à cette date.
Par exemple,
>>> nb_rdv( set() )
{}
>>> nb_rdv(A_ex)
{’18/11/2015’: 1, ’19/11/2015’: 2, ’17/11/2015’: 2}

UPMC
c - ISUP - page 8 -
Question 3.6 : [4/60]

Donner une définition de la fonction dict_date qui, étant donné un ensemble de rendez-
vous E, renvoie un dictionnaire dont les clés sont les dates des rendez-vous de E. La valeur
correspondant à une date d est l’ensemble de couples (h, p) pour chaque rendez-vous (d, h,
p) de E.
Par exemple,
>>> dict_date( set() )
{}
>>> dict_date(A_ex)
{’17/11/2015’: {(10, ’Elie’), (11, ’Nour’)},\
’19/11/2015’: {(14, ’Paul’), (10, ’Sacha’)},\
’18/11/2015’: {(10, ’Paul’)}}

Question 3.7 : [2/60]

Donner une définition de la fonction conflit_rdv qui, étant donnés deux rendez-vous r et
s, renvoie True si les deux rendez-vous ont lieu à la même date et à la même heure, et False
sinon.
Par exemple,
>>> conflit_rdv( RDV(’18/12/2015’, 10, ’Sacha’),
RDV(’18/12/2015’, 10, ’Pierre’) )
True
>>> conflit_rdv( RDV(’18/12/2015’, 10, ’Sacha’),
RDV(’18/12/2015’, 11, ’Pierre’) )
False

Question 3.8 : [3/60]

Donner une définition de la fonction conflit_agenda qui, étant donné un ensemble de


rendez-vous E, renvoie True si E contient deux rendez-vous qui sont en conflit, et False
sinon.
Par exemple,
>>> conflit_agenda(A_ex)
False
>>> conflit_agenda({RDV(’18/12/2015’, 10, ’Sacha’),
RDV(’18/12/2015’, 10, ’Pierre’)})
True
>>> conflit_agenda({ RDV(’19/01/2015’, 10, ’Paul Personne’) })
False

UPMC
c - ISUP - page 9 -
UPMC
c - ISUP - page 10 -

Vous aimerez peut-être aussi