Informatique Pour Tous Interrogation n°2 Bases de la

publicité
Nom :
Prénom :
Informatique Pour Tous
Interrogation n°2
Bases de la programmation
1. Dans un programme, quel moyen a-t-on de revenir en arrière dans l'exécution ?
commande break
commande pass
 aucun moyen
boucle for
2. Variables
a) Donner deux justifications de l’utilisation de variables dans les programmes ?
Représenter de manière unique et identifiable des valeurs (objets) qui pourront changer au cours de
l'exécution, ou d'une exécution à l'autre et donner un nom à ces valeurs
b) Donner quatre règles de bon usage pour choisir le nom d’une variable
Donner un sens à l'identificateur (ou nom) utilisé pour la variable par rapport à ce qu'il contient ;
Éviter les noms trop courts passe partout ou trop longs ;
Interdire les accents et caractères spéciaux autres que ‘_’ (mais pas les chiffres) ;
Interdire les noms réservés (utilisés par Python)
c) Comment s'appelle l'instruction qui associe une valeur à une variable ?
affectation
d) Quel est le symbole correspondant à cette instruction en pseudo-langage
←
e) Quel est l’opérateur correspondant à cette instruction en Python
=
3.Contrôle de flux
a) Quel est le rôle des instructions de contrôle de flux dans un programme ?
Modifier l’ordre dans lequel sont exécutées les instructions d’un programme, en fonction de l’état
d’un programme (valeurs des variables).
b) Comment s’appelle(nt) l’(les) instruction(s) de contrôle de flux en pseudo-langage ?
si...alors...sinon
pour.....faire
tant que......faire
c) Comment s’appelle(nt) l’(les) instruction(s) correspondante(s) en Python ?
if else
for
while
Conversions
4. Donner les résultats des conversions suivantes
a) 001000102 en base 10
34
b) 7010 en base 2
1000110
c) 4116 en base 10
65
d) Donner en base 10 la valeur de 11000000 considéré comme
un octet signé en machine
–64
Langage Python
5. 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).
Informatique Pour Tous
page 1/4
PCSI1 2013-2014
print("Vous avez", age, "ans")
print("Vous avez "+str(age)+" ans") # Concaténation, ne pas oublier le str() autour de age !
6. Préciser le type des variables dans la série d’instructions suivantes :
v0 = 2713251218
type(v0): int
v5=("quatre",4,
type(v5): tuple
"cinq",5,"six",6)
v1 = 3.141592654
type(v1): float
v6 = v5[1:4]
type(v6):tuple
v2 = "Coucou"
type(v2): str
v7 = v5[2]
type(v7): str
v3 = len(v1)
type(v3): int
v8 = int("42")
type(v8): int
v9 = v0 / 2
type(v9): float
73226712
v4 =(v1 == "Bof") type(v4): bool
7. Soit une liste lst définie par : lst = [1, 42, "x", False, 9+1]
Indiquez les valeurs des variables suivantes :
v1 = lst[2]
v1 = ‘x’
v4 = lst[3:]
v4 = [False, 10]
v2 = lst[1:4]
v2 =
v5 = lst[2] * 2
v5 = ‘xx’
v3 = lst[-2]
v3 = False
v6 = lst[1] * 2
v6 = 84
[42, ‘x’, False]
8. Quelles sont les valeurs entières produites par l'instruction range(3,11,2) ?
# attention range(11) s’arrète à 11 – 1 et ne signifie pas « ordonner »
3, 5, 7, 9
9. Quelle est l’affichage produit par le programme suivant :
None
def f(n) :
s = 0
for k in range(1 , n+1) :
s += 1/k
print(f(5))
(car la fonction ne contient
pas d’instruction return)
10. On considère les scripts Python suivants :
Script 1 :
exp = 2
for i in range(3):
exp = 2**exp
print(exp)
Script 2 :
expo=2
for i in range(3):
expo=expo**2
print(expo)
a) Compléter les tableaux d’état suivants :
t
0
1
2
3
i
exp
t
0
1
2
2
4
16
65536
0
1
2
3
i
expo
0
1
2
2
4
16
256
b) Écrire sous forme d’une formule mathématique le résultat obtenu par chaque script.
Informatique Pour Tous
page 2/4
PCSI1 2013-2014
Script 1 :
( ) 
2
 22
2




2
2 2
Script 2 :
(( 2 ) )
(216 ici)
11. Écrire en Python une fonction nommée surface
renvoyant la surface d’un parallélépipède de côtés L, H et
P indiqués dans l’appel de la fonction.
(162 ici)
H
P
L
def surface(L,H, P) :
return 2*(L*H + H*P + L*P)
12. Écrire en Python un programme utilisant une fonction nommée table_mult(n) qui reçoit
en argument un entier n et retourne les 10 premiers termes de la table de multiplication de base
n. Le programme affiche le résultat de 3×5.
Par exemple, pour n = 3, la fonction renvoie (1,3,9,12,15,18,21,24,27,30) ou
[1,3,9,12,15,18,21,24,27,30] et le programme affiche la valeur 15.
def table_mult (base) :
table = ()
for i in range(1,11) :
table += (i*base,)
return table
table_3 = table_mult(3)
# version tuple
#initialisation du tuple table
print(table_3[4])
def table_mult (base) :
table = []
for i in range(1,11) :
table.append(i*base)
return table
table_3 = table_mult(3)
# affichage de 3×
×5
# version liste
#initialisation de la liste table
print(table_3[4])
# affichage de 3×
×5
#remplissage de la table
# appel de la fonction
#remplissage de la table
# appel de la fonction
Algorithmique
13. Analyse d’un algorithme
a) Sans utiliser les fonctions max() et sort() de Python, définir une fonction
maximum(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.
Par exemple, maximum([1,9,2,7,-3,0,4,8,7]) retourne 9.
def maximum(lst):
max = lst[0]
for v in lst[1 :len(lst)]:
if v > max:
max = v
return max
def maximum(lst):
max = lst[0]
for i in range(1 , len(lst)):
if lst[i] > max:
max = lst[i]
return max
b) Démontrer la correction de cet algorithme
On propose comme invariant de boucle la propriété
P : {max est la valeur la plus élevée de lst[0 : i+1], i étant l’indice de boucle }
avant la première itération i = 0 donc lst[0 :1] = lst[0]. On a bien max = lst[0] ;
après une itération, max est la valeur la plus élevée des éléments de la liste d’indices compris
entre 0 et i donc de lst[0 : i+1] (car le dernier indice touché par cette syntaxe est i + 1 – 1 = i ;
Informatique Pour Tous
page 3/4
PCSI1 2013-2014
après la dernière itération, max est la valeur la plus élevée de toute la liste soit lst[0 : len(lst)+1].
Les trois conditions nécessaires sont vérifiées donc la correction est démontrée.
c) Évaluer la complexité en temps dans le pire des cas de cet algorithme
Avant la boucle for, il y a une affectation.
À chaque itération (une gestion du compteur), il y a un test et au pire une affectation soit 3
instructions simples au pire.
Il y a len(lst) itération donc, en notant n la longueur de la liste, le nombre d’opération est au pire
3n + 1.
La complexité en temps est donc en O(n).
14. Recherche d’un algorithme
Étant données deux entiers a et b (tels que a > b), on définit la suite (ri)i par :
r0 = a, r1 = b. tant que ri ≠ 0, ri+1 = ri–1 – ri × qi avec |ri+1| ≤ |ri|
Si rn+1 = 0, rn–1 = rn × qn et l’on constate facilement que rn est le PGCD de a et b.
(PGCD signifie Plus Petit Commun Diviseur).
Propriété 1: si a = bq + r alors PGCD(a, b) = PGCD(b , r)
Propriété 2 : PGCD(a, 0) = a
a) Définir une fonction pgcd(a, b) qui reçoit en argument deux entiers a et b puis
retourne le PGCD de a et b. Compléter le tableau d’état ci-dessous pour a = 753 et b = 246
def pgcd( a , b) :
t
D
d
r
if a > b :
0
753
246
15
D , d = a , b
else
1
246
15
6
D , d = b , a
2
15
6
3
r = D % d
3
6
3
0
while ( r != 0 ) :
D = d
d = r
r = D % d
return d
pgcd(753, 246)= 3
b) Démontrer la terminaison de cet algorithme
On prend comme fonction de terminaison T = r. Par définition du reste de la division
euclidienne, c’est un entier positif.
Par construction, la suite (ri)i est décroissante donc T est une fonction positive décroissante qui
finira par devenir nulle ou négatif.
La boucle while se termine alors.
c) Démontrer la correction de cet algorithme à l’aide des propriétés 1 et 2.
On propose comme invariant de boucle la propriété I = {le PGCD de (d ,r) est le PGCD de (D, d)}
avant la première itération D = d×q + r. D’après la propriété 1, on a bien PGCD de (d ,r) est le PGCD de
(D, d)
Si I est vraie avant une itération, le PGCD de (d ,r) est le PGCD de (D, d). Pendant la boucle, D’ devient d
et d’ devient r donc le PGCD de (D’ ,d’) est le PGCD de (d ,r). Comme D’ = d’×q’ + r’, le PGCD de (D’ ,d’)
est aussi le PGCD de (d’, r’). Donc le PGCD de (d’, r’) est le PGCD de (d ,r) qui est le PGCD de (D, d).
après la dernière itération, r = 0 donc le PGCD de (d,0) = d. d’après la propriété 2 C’est le PGCD de (D, d)
d’après l’invariant I et l’algorithme renvoie bien ce PGCD.
Les trois conditions nécessaires sont vérifiées donc la correction est démontrée
Informatique Pour Tous
page 4/4
PCSI1 2013-2014
Téléchargement