Professional Documents
Culture Documents
DS Informatique Scientifique
10 décembre 2012
0. Directives
Durée : 2h
Tout système électronique interdit (calculatrice, téléphone, etc). Téléphone portable éteint et
rangé dans votre sac à l'avant de la salle.
Documents autorisés : Mémento Bases Python 3 et Abrégé Dense Python 3.2 (tous deux donnés en
cours), une feuille A4 avec vos propres notes (recto/verso autorisé).
Faites d'abord les exercices que vous savez faire rapidement ! revenez sur les autres après.
Numéroter très clairement les questions sur votre copie – toute réponse sans indication de numéro
de l'exercice et de la question ne sera pas corrigée.
Dans les réponses, bien délimiter les blocs d'instructions.
Les réponses aux questions d'algorithmique pourront être rédigées soit en langage Python, soit en
langage algorithmique français (si, tant que…).
1. Cours (4 points)
1.a Algorithme
Donner la définition de ce qu'est un algorithme.
Séquences d'instructions permettant de résoudre un problème via l'exécution d'un nombre fini
d'instructions en un temps fini.
1.b Effet mémoire
Dans un programme, quel moyen a-t-on de revenir en arrière dans l'exécution ?
Pas de moyen de revenir en arrière. On peut ré-exécuter. On peut mémoriser des valeurs pour ne
pas les perdre.
1.c Variables
Quel est l'intérêt d'utiliser des variables dans les programmes ?
Représenter des valeurs qui pourront changer au cours de l'exécution, ou d'une exécution à
l'autre. Identifier ces valeurs.
Comment bien choisir les noms des variables ?
Donner un sens à l'identificateur (nom) utilisé pour la variable par rapport à ce qu'il contient. Évi-
ter les noms trop courts passe partout - éviter les accents.
Comment s'appelle l'instruction qui associe une valeur à une variable ?
L'affectation (opérateur = en Python).
1.d Instructions composées / blocs d'instructions
Qu'est-ce qu'une instruction composée, quand l'utilise-t-on ?
C'est une instruction qui entraîne d'autre instructions - et très généralement un bloc d'autres ins-
tructions. Typiquement if, for, while.
Comment la distingue-t-on en Python ?
Elle se termine par un : et l'indentation relative du bloc qui suit définit le bloc d'instructions lié à
cette instruction composée.
Citer un autres moyens de distinction des blocs d'instructions (d'un autres langage) ?
page 1 / 8
Utiliser des marqueurs, { et }, mots réservés begin et end.
1.e Liste ou ensemble
Quel est l'intérêt d'utiliser le type ensemble ( set en Python) à la place du type liste ( list en
Python) ?
La vitesse : la recherche de la présence ou de l'absence d'un élément est immédiate, alors qu'avec
une liste elle est fonction du nombre d'éléments. Les set fournissent en plus des opérateurs
ensemblistes (union, intersection, etc).
1.f Encodage des fichiers
Pourquoi est-il important de spécifier l'encodage des fichiers textes ?
Car c'est ce qui paramètre dans quel format seront écrits/lus les caractères - typiquement problé-
matique pour les accents. L'expliciter oblige à se poser la question.
Quel peut-être le résultat si l'encodage est mal (ou pas) spécifié ?
On peut lire des caractères invalides, ou carrément ne pas pouvoir lire le contenu.
1.g Programmation objet
Quel est l'intérêt de la programmation orientée objet (POO) ?
Regrouper des données et les méthodes qui permettent de les manipuler (encapsulation), étendre
des données existantes et pouvoir bénéficier des méthodes associées tout en les enrichissant (héri-
tage).
Facilité de conception, de modélisation ("modèle" objet).
Avez-vous déjà utilisé des objets en Python ? Si oui, dans quel cas ?
En Python tout est objet , donc oui. On a utilisé des méthodes sur les chaînes de caractères, sur les
listes : s.upper() lst.sort()
page 2 / 8
2.c Remontée d'erreur
Quels sont les moyens dont on dispose pour faire remonter les erreurs détectées dans une fonction
vers le code qui a appelé cette fonction ?
"à la C" avec des codes d'erreur en retour des appels de fonction. Et plus moderne en utilisant des
exceptions (raise + try/except en Python).
3.b Types
Soit la série d'affectations suivantes :
v0 =
3.141592654
v1 =
"Coucou"
v2 =
len(v1)
v3 =
(v1 == "Bof")
v4 =
v0 / 2
v5 =
["quatre", 4, "cinq", 5, "six", 6]
v6 =
v5[1:4]
v7 =
v5[2]
v8 =
int("42")
v9 =
271325121873226712
Pour chacune des variables v0 à v9, indiquer son type Python.
v0→float, v1→str, v2→int, v3→bool, v4→float,
v5→list, v6→list, v7→str, v8→int, v9→int.
page 3 / 8
Pour chacune des variables v1 à v5, indiquer sa valeur.
v1→"x", v2→[42, "x", False], v3→False, v4→[False, 10],
v5→[1, 42, "x", False, 10]
4. Débogage (3 points)
4.a Erreur de syntaxe
Quelle est la cause de l'erreur de syntaxe dans ce programme ?
export = 70.0
import = 87.7
print("Balance commerciale 2011 avec l'Allemagne:",export-import)
En Python import est un mot clé réservé. On ne peut pas l'utiliser comme identificateur de
variable.
4.b Définition de fonction
On a créé un module distance.py avec une définition de fonction :
import math
def dist(p_x, p_y):
"""Distance de (0,0) à (x,y)"""
return math.sqrt(p_x ** 2 + p_y ** 2)
Or, lorsqu'on exécute ce module, il ne se passe rien. Pourquoi ?
Parce que ce module se contente de définir une fonction, il n'exécute aucun code d'appel à cette
fonction.
Et pour voir quelque chose, il vaudrait mieux faire un affichage du résultat retourné par l'appel à
la fonction.
Note : l'import du module math et le passage par math.sqrt() est tout à fait correct !
4.c Boucle
Pour afficher les carrés des nombres de un à cent, en excluant les multiples de 5, on a écrit le pro -
gramme suivant :
maxi = 100
i = 1
while (i <= maxi) and (i%5 != 0):
print(i, i**2)
i = i+1
Or, le programme n'affiche que les quatre premiers carrés. Pourquoi ?
Parce qu'arrivé à i=5, la condition de boucle devient fausse et la boucle s'arrête simplement.
Comment corriger ce programme ?
Changer la boucle :
while (i <= maxi)
page 4 / 8
if (i%5 != 0):
print(i, i**2)
i = i+1
page 5 / 8
5.d Sommation
i=x
1
Soit la définition de la fonction sigma : sigma(x ): ∑
i=0
( )
1+i 2
Écrire une fonction sigma(p_x) qui retourne la valeur calculée de sigma en fonction de p_x.
def sigma(p_x): # On trouve un exemple dans le memento (instruction for)
"Retourne la somme des 1/(1+i²) pour i de 0 à x."
s = 0
for i in range(p_x+1):
s = s + 1 / (1 + i**2)
return s
6. Algorithmique (4 points)
6.a Maximum
Sans utiliser les max() et sort() de Python, définir une fonction maximum(p_lst) qui reçoit en
argument une liste non vide de valeurs numériques et retourne la valeur la plus élevée de cette liste.
maximum([1,9,2,7,-3,0,4,8,7]) retourne donc 9
Écrire un jeu de test pour cette fonction.
def maximum(p_lst):
"Retourne le maximum de la liste."
max = p_lst[0]
for v in p_lst[1:]:
if v > max:
max = v
return max
print(maximum([ 100, 4, 8, 2])) # Maxi au début
print(maximum([ 4, 8, 2, 100])) # Maxi à la fin
print(maximum([ 4, 8, 100, 2])) # Maxi dedans
print(maximum([100])) # Maxi tout seul
page 6 / 8
6.b Droite
Écrire une fonction droite(p_x1, p_y1, p_x2, p_y2) dont les quatre paramètres corres-
pondent aux coordonnées de deux points, et qui retourne une liste contenant deux valeurs : la pente
et l’ordonnée à l’origine de la droite passant par les points (x1,y1) et (x2,y2). Si les abscisses sont
confondues , la fonction retournera une liste vide [].
droite(2,2,6,4) retournera donc [0.5,1.0]
def droite(p_x1, p_y1, p_x2, p_y2):
"Calcul des paramètres de la droite affine."
if p_x1 == p_x2:
return []
else:
a = (p_y2 - p_y1) / (p_x2 - p_x1)
b = p_y1 - a * p_x1
return [a, b]
6.c Bissextile
Les années bissextiles sont les années :
• soit divisibles par 4 mais non divisibles par 100 ;
• soit divisibles par 400.
Écrire une expression logique booléenne qui soit vrai lorsqu'une année an est bissextile, faux sinon.
On rappelle l'existence de l'opérateur modulo (% en python) qui donne le reste de la division
entière. Exemple : bissextile = expression logique en fonction de an
bissextile = (an%4==0 and an%100!=0) or (an%400==0)
page 7 / 8
# an age cond. affichage # an age cond. affichage
5 1989 23 8 1992 21 1992 21
6 1989 23 Vrai 9 1993 21
7 1990 23 2 1993 21 Vrai
8 1990 23 1990 23 3 1993 21 Faux
9 1991 23 5 1993 19
2 1991 23 Vrai 6 1993 19 Vrai
3 1991 23 Faux 7 1994 19
5 1991 21 8 1994 19 1994 19
6 1991 21 Vrai 9 1995 19
7 1992 21 2 1995 19 Faux
page 8 / 8