TD 4 : Informatique

publicité
BCPST 1B
TD 4 : Informatique
Entraînement au devoir du jeudi 4 décembre 2013
Pour cet entraînement vous pouvez évidemment utiliser les ordinateurs.
(1 h 30 minutes) (Il est un peu long pour cette durée ! )
Au cours de cette interrogation vous avez droit à vos notes de cours, correction de TD ... Vous n'avez, en revanche,
pas le droit à votre téléphone.
Si au cours de l'épreuve un candidat repère ce qui lui semble être une erreur d'énoncé, il le signalera sur sa copie et
poursuivra sa composition en expliquant les raisons des initiatives qu'il sera amené à prendre.
La version de Python de référence pour cette interrogation est la version 3.4.1.
Ce sujet comporte cinq pages.
Vous ne devez pas rendre ce sujet.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Exercice 1
1) On considère le programme suivant
u,v=1,1
while u<10:
u,v=v,u+v
print(v)
2) Combien y a-t-il de variables dans ce programme et quel est leur type ?
3) Donner l'évolution de ces variables tout au long du programme.
4) Quelle est la valeur achée à la n du programme ?
5) (Dans cette question on n'utilise pas le programme ci-dessus).
Soit (un ) dénie par :
u0 = −1,
u1 = 2
et ∀n ∈ N,
un+2 = 2un+1 + 3un + 4
Ecrire un programme répondant à la question suivante :
"Déterminer quel est le premier entier n pour lequel un > 500 000."
justier votre programme par une simulation de boucle.
1
Exercice 2 (Suite de Syracuse )
1) On considère le programme suivant :
u=2014
n,m=0,0
while u!=1:
if u%2==0:
u=u//2
n=n+1
else:
u=3*u+1
m=m+1
print(n,m)
Voilà ce qu'ache Python à son exécution :
Kernel process terminated for restart. (0)
Python 3.4.1 |Continuum Analytics, Inc.| (default, May 19 2014, 13:02:30) on Windows (64 bits).
This is the IEP interpreter with integrated event loop for PYSIDE.
Type 'help' for help, type '?' for a list of *magic* commands.
Running script: "D:\Python\2014-2015\Cours fonctions\test2.py"
62 32
>>>
2)
3)
4)
5)
Quel est le type des variables u, n et m ?
Traduire la condition u%2==0.
Combien de "tours de boucle" fait la boucle while ?
Simuler les six premiers tours de cette boucle while ?
tours de boucle
entrée
1er tour
2e tour
3e tour
4e tour
5e tour
6e tour
variable u
variable n
variable m
Remarque :
On appelle suite de Syracuse une suite d'entiers dénie par :
u0 un entier naturel non nul et la relation de récurrence :
si un est pair, un+1 = 0,5 un
si un est impair, un+1 = 3un + 1
:
Une telle suite va nécessairement prendre la valeur 1 quelle que soit la valeur de u0 .
Conjecture de Syracuse
Vous pouvez essayer de le démontrer, mais ne perdez pas trop de temps, aucun mathématicien n'est venu à bout
de ce problème !
2
Exercice 3
Des boucles dans des boucles.
1) Une boucle for dans une boucle for.
S=0
for i in range(5):
for j in range(6):
S=i+2*j
print(S)
S=0
for i in range(1,6):
for j in range(1,i+1):
print(i,j)
S=S+1
print(S)
Programme1.py
S=0
for i in range(5):
for j in range(i,5):
print(i,j)
S=S+1
print(S)
Programme2.py
Programme3.py
Ê Décrire les achages de ces trois programmes.
Ë Que fait la fonction "mystère" suivante ?
def f(n):
S=0
for i in range(n+1):
for j in range(n+1):
for k in range(n+1):
if i+j+k==n:
S=S+1
return S
2) Une boucle for dans une boucle while.
A quel problème répond le programme suivant ?
n=2
S=1
while S%11!=0:
n=n+1
S=0
for j in range(2,n):
S=S+int(n/j)**3
#
print(S,n)
3) Une boucle while dans une boucle for.
Suite de Syracuse.
On considère le programme suivant :
for u in range(2,2101):
v=u
n=0
while u!=1:
if u%2==0:
u=u//2
else:
u=3*u+1
n=n+1
if n==94:
print(v,end=' ')
qui donne :
>>>
364 365 366 1986 1987 2014 2015 2075
3
int(n/j) = n//j
Ê A quelle question sur les suites de syracuse répond ce programme ?
Ce programme serait plus simple avec la création d'une fonction :
def longueur(u):
n=0
while u<>1:
n=n+1
if u%2==0:
u=u//2
else:
u=3*u+1
return n
Ë Ecrire la spécication de la fonction longueur.
Ì Réécrire le programme précédent en utilisant cette fonction longueur(u).
4) Une boucle while dans une boucle while.
Ê On considère la suite (un ) dénie par :
u0 = 2,
u1 = 5
et ∀n ∈ N,
un+2 = 5un+1 − 6un
Ecrire un programme Python qui ache les 20 premiers n pour lesquels un est divisible par 11.
On rappelle que la condition : x%11==0 signie : "x est divisible par 11"
Ë Que fait la fonction "mystère" suivante ?
def f(T):
"""str->list[int]
T ne contient que les caractères 'a' et 'b'.
mystère"""
S=[]
n=len(T)
k=0
while k<n:
x=T[k]
j=0
while k+j<n and T[k+j]==x:
j=j+1
S+=[j]
k=k+j
return S
Exercice 4 Compression et décompression.
Dans cet exercice, nous illustrons un problème de compression de chaînes de caractères selon l'approche run-length
encoding (RLE).
Le principe de la compression est simple : si la chaîne contient (strictement) plus d'une occurrence successive du même
caractère, comme par exemple le caractère 'c' dans 'abcccd', alors on remplace les n occurrences par le nombre n
suivi du caractère répété, par exemple 'ab3cd' (car c est répété 3 fois).
On supposera bien sûr que les chaînes à compresser ne contiennent pas déjà des chires.
Par exemple :
>>> compression('abcccd')
'ab3cd'
>>> compression('abcdefg')
'abcdefg'
>>> compression('abcccddeeeefgh')
'ab3c2d4efgh'
4
La fonction suivante retourne la version compressée de la chaine T.
def compression(T):
"""str->str
T contient une chaine de caractères sans chiffre
retourne T sous forme compressée suivant la méthode RLE"""
n=len(T)
k=0
S=''
while k<n:
x=T[k]
j=1
while k+j<n and T[k+j]==x:
j=j+1
if j>1:
S=S+str(j)
S=S+x
k=k+j
return S
Ê Quel est le type des variables T , j , S , k ?
Ë Eectuer la simulation de boucle correspondant à l'évaluation : compression('aabbbbccaa')
On prendra pour modèle le tableau suivant :
tours de boucle
entrée
1er tour
2e tour
variable j
variable S
variable k
Fonction de décompression.
On s'intéresse ici à la fonction qui à partir d'un texte compressé par compression, permet de retrouver le texte original.
On cherche donc la fonction réciproque de compression.
>>> decompression('ab3cd')
'abcccd'
>>> decompression('ab3c2d4efgh')
'abcccddeeeefgh'
>>> decompression('abcdefg')
'abcdefg'
Une fonction utile ici : est_chiffre permettant de reconnaître un caractère représentant un chire.
def est_chiffre(c):
"""str -> bool
Hypothèse : len(c) == 1
retourne True si, et seulement si, c est un chiffre."""
return ('0'<=c) and (c<='9')
Par exemple :
est_chiffre('4') renvoie True
est_chiffre('a') renvoie False
Ì Donner une dénition de la fonction decompression.
(Autrement dit : Ecrire une fonction Python qui réalise la décompression)
On pourra commencer par considérer que les nombres de répétitions ne dépassent pas 9.
5
Téléchargement