Informatique Pour Tous page 1/4 PCSI1 2013-2014
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) 00100010
2
en base 10 34
b) 70
10
en base 2 1000110
c) 41
16
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 2/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
73226712
type(v0): int v5=("quatre",4,
"cinq",5,"six",6)
type(v5): tuple
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
v4 =(v1 == "Bof") type(v4): bool v9 = v0 / 2 type(v9): float
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 =
[42, ‘x’, False]
v5 = lst[2] * 2 v5 = ‘xx’
v3 = lst[-2] v3 = False v6 = lst[1] * 2 v6 = 84
8. Quelles sont les valeurs entières produites par l'instruction range(3,11,2) ?
3, 5, 7, 9 # attention range(11) s’arrète à 11 – 1 et ne signifie pas « ordonner »
9. Quelle est l’affichage produit par le programme suivant :
def f(n) :
s = 0
for k in range(1 , n+1) :
s += 1/k
print(f(5))
None
(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 i exp t i expo
0 2 0 2
1 0 4 1 0 4
2 1 16 2 1 16
3 2 65536 3 2 256
b) Écrire sous forme d’une formule mathématique le résultat obtenu par chaque script.
Informatique Pour Tous page 3/4 PCSI1 2013-2014
Script 1 :
(
)
2
2
2
2
 
 
 
 
(2
16
ici)
Script 2 :
( )
(
)
2
2
2
2 (16
2
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.
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) : # version tuple
table = () #initialisation du tuple table
for i in range(1,11) :
table += (i*base,) #remplissage de la table
return table
table_3 = table_mult(3) # appel de la fonction
print(table_3[4]) # affichage de 3×
××
×5
def table_mult
(base) : # version liste
table = [] #initialisation de la liste table
for i in range(1,11) :
table.append(i*base) #remplissage de la table
return table
table_3 = table_mult(3) # appel de la fonction
print(table_3[4]) # affichage de 3×
××
×5
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 ;
L
P
H
Informatique Pour Tous page 4/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
3
n
+ 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 (r
i
)
i
par :
r
0
= a, r
1
= b. tant que r
i
0, r
i+1
= r
i–1
– r
i
×
××
×
q
i
avec |r
i+1
|
|r
i
|
Si r
n+1
= 0, r
n–1
= r
n
×
××
×
q
n
et l’on constate facilement que r
n
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
t D d r
0 753 246 15
1 246 15 6
2 15 6 3
3630
def pgcd( a , b) :
if a > b :
D , d = a , b
else
D , d = b , a
r = D % d
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
(r
)
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
1 / 4 100%