You are on page 1of 8

DUT Mesures Physiques - semestre S'2

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()

2. Tests et débogage (2 points).


2.a Test
On a écrit une fonction maxiliste(p_lst), qui prend une liste non vide d'entiers p_lst en para-
mètre et retourne la valeur entière maximale trouvée dans cette liste.
Quels sont les différents cas de liste valide que l'on doit prendre en compte pour vérifier que l'algo­
rithme fonctionne (expliquer en français pourquoi ces cas doivent être testés) ?
Note : les cas de listes invalides ­ liste vide ou liste contenant autre chose que des entiers ­ ne sont
pas à prendre en compte.
L'algorithme travaille sur une liste, on aura probablement des cas limites lorsque le maximum est
au début de la liste ou à la fin, un cas général lorsqu'il est à une autre position entre ces deux là, et
un cas particulier lorsque la liste ne contient qu'un élément.
Tester par exemple : [ 100, 4, 8, 2] [ 4, 8, 2, 100] [ 4, 8, 100, 2] [100]
A part si dans l'algorithme on a fait un traitement particulier par rapport au zéro, il n'y a pas de
raison de tester plus particulièrement les nombres négatifs.
2.b Traitement d'erreur
On a détecté dans une fonction qu'un paramètre était invalide, que dois-on faire pour traiter correc-
tement et proprement cette erreur ?
1) La signaler quelque part (via un print ou l'appel à une fonction de log).
2) La remonter au code qui a appelé la fonction.

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. Langage Python 3 (3 points)


3.a Utilisation print
Soit une variable age contenant une valeur numérique entière. Donner deux exemples différents
d'utilisation d'un appel à la fonction print() afin d'afficher la valeur de la variable age sous la
forme (exemple avec age=23) :
Vous avez 23 ans.
print("Vous avez", age, "ans")
print("Vous avez "+str(age)+" ans") # Concaténation, ne pas oublier le str() autour de age !

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.

3.c Manipulation de liste


Soit une variable lst contenant une liste. Donnez les expressions Python pour :
1. Connaître le nombre d'éléments dans lst.
2. Ajouter un élément à la fin de lst.
3. Compter le nombre de répétitions d'une même valeur dans lst.
4. Supprimer une valeur de lst.
5. Trier le contenu de lst.
1. len(lst),
2. lst.append(item)
3. lst.count(item)
4. lst.remove(item), del lst[index], lst.pop(index)
5. lst.sort()

3.d Accès à une liste


Soit une liste lst définie de la façon suivante: lst = [1, 42, "x", False, 9+1]
On réalise les affectations suivantes :
v1 = lst[2]
v2 = lst[1:4]
v3 = lst[-2]
v4 = lst[3:]
v5 = lst[:]

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]

3.e Fonction simple


Définir une fonction Python fct(p_x), documentée, qui retourne la valeur du calcul correspondant
à la fonction mathématique suivante :
f(x) = 2x3 + x ­ 5
def fct(p_x):
"Calcul de 2x^3 + x - 5"
return 2 * p_x ** 3 + x - 5

3.f Séquence de valeurs


Quelles sont les valeurs entières produites par l'instruction range(3,11,2) ?
3579 (valeur finale non comprise !)

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

4.d Calculs triangle


On a écrit une fonction qui calcule le périmètre et l'aire d'un triangle et les retourne.
from math import sqrt
def perimairetriangle(c1,c2,c3):
"Calcul de périmètre et aire d'un triangle"
p = c1 + c2 + c3
# Calcul de surface par la formule de Héron
ps2 = p/2
a = sqrt(ps2*(ps2-c1)*(ps2-c2)*(ps2-c3))
print (p,a)
Or la fonction, qui affiche les bonnes valeurs quand on la teste, retourne None quand on l'utilise
dans des programmes. Pourquoi ?
Il n'y a aucune instruction de retour de valeur dans la fonction, donc elle retourne None (même si
elle a affiché les résultats via le print).
Comment corriger cette fonction ?
Remplacer le print par un return (« Vu en TP ! »)

5. Algorithmique simple (4 points)


5.a Racine carrée
Écrire un programme qui permette de saisir un nombre flottant ; s'il est positif ou nul alors afficher
sa racine carrée, sinon afficher un message d'erreur. On considère que l'utilisateur saisit un nombre
flottant.
nbr = float(input("Nombre:"))
if nbr >= 0:
print(nbr ** 0.5) # On peut utiliser math.sqrt()
else:
print("Erreur, pas de racine réelle sur un nombre négatif.")

5.b Échange de variables


Sans utiliser l'affectation de plusieurs variables en même temps, écrire un programme permettant
d'échanger le contenu de deux variables a et b.
tmp = a
a = b
b = tmp

5.c Saisie contrôlée


Écrire un programme de saisie avec input(), permettant d'effectuer une saisie contrôlée d'un
nombre entier entre 2 et 12 inclus, afin de récupérer cette valeur dans une variable n puis de l'affi-
cher. On ne traitera pas le cas où l'utilisateur saisit autre chose qu'un nombre entier, seulement le
problème de respect des limites.
n = int(input("Entrez un nombre de 2 à 12:"))
while not (2 <= n <= 12):
n = int(input("Entrez un nombre de **2 à 12** SVP :"))
print(n)

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

5.e Liste de carrés


Écrire une fonction carres(p_lst) qui reçoit en argument une liste de valeurs numériques, et
retourne une nouvelle liste contenant les carrés de ces valeurs numériques.
carres([1,4,7.3]) retourne donc [1, 16, 53.29]
def carres(p_lst): # On trouve un exemple dans le memento (instruction while)
"Retourne la liste des carrés correspondant à chaque nombre."
lres = []
for v in p_lst:
lres.append(v ** 2)
return lres

5.f Table d'addition


Écrire un programme permettant d'afficher les tables d'addition des nombres de 0 à 10 inclus, à rai-
son d'une addition par ligne, chaque ligne sous la forme a + b = résultat : 3 + 5 = 8
for a in range(11):
for b in range(11):
print(a,"+",b,"=",a+b)

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)

6.d Tableau de suivi


Construire le tableau de suivi des variables an et age, des conditions logiques et des affichage cor-
respondant à l'exécution du programme suivant (comme en cours, on indiquera en première colonne
le n° de la ligne exécutée et dans les colonnes suivantes les modifications qui sont produites) :
an = 0 # ligne n°1
while an < 1995: # ligne n°2
if an == 0: # ligne n°3
an = 1985 # ligne n°4
age = 2012 - an # ligne n°5
if age%2 == 1: # ligne n°6
an = an+1 # ligne n°7
print(an, age) # ligne n°8
an = an+1 # ligne n°9
# an age cond. affichage # an age cond. affichage
1 0 2 1987 27 Vrai
2 0 Vrai 3 1987 27 Faux
3 0 Vrai 5 1987 25
4 1985 6 1987 25 Vrai
5 1985 27 7 1988 25
6 1985 27 Vrai 8 1988 25 1988 25
7 1986 27 9 1989 25
8 1986 27 1986 27 2 1989 25 Vrai
9 1987 27 3 1989 25 Faux

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

You might also like