Vous êtes sur la page 1sur 12

Informatique du Tronc Commun TP no 1

TP no 1 – Processus itératifs simples


PCSI B, Lycée Chaptal

Année scolaire 2022-2023

Activité 1
• Tester rapidement les commandes ci-dessus en les tapant dans la console (shell), en vérifiant que tout fonc-
tionne comme prévu et que vous comprenez chacune des fonctions de base.

Correction activité 1
• A="Bonjour", RAS ;
• type(A) renvoie str, donc une chaîne de caractères ;
• "Bonjour"+"Au revoir" renvoie "BonjourAu revoir" qui correspond bien à la mise « bout à bout » des 2 chaînes de
caractères ;
• len("Alors ?") renvoie 7, car il y a 7 caractères (l’espace est un caractère !) ;
• A[0] et A[0] renvoie, respectivement le caractère situé en première position et en 7ème position, c’est-à-dire ’B’ et ’r’ ;
• A[0:2] renvoie les caractères situés en la position 0 et 2 exclue, donc, renvoie ’Bo’.

Activité 2
• Tester rapidement les commandes ci-dessus en les tapant dans la console (shell), en vérifiant que tout fonc-
tionne comme prévu et que vous comprenez chacune des fonctions de base.

Correction activité 2
• A=[1, [1,2],"bonjour"], RAS ;
• type(A) renvoie list, donc une liste ;
• [1,2]+[3,4] renvoie [1,2,3,4] qui correspond bien à la mise « bout à bout » des 2 listes ;
• len([1,2]) renvoie 2, car il y a 2 éléments dans A ;
• A[0] A[1], et A[2] renvoie, respectivement l’élément situé en première position, deuxième et troisième ;
• A[0:2] renvoie les éléments situés en la position 0 et 2 exclue, donc, renvoie [1, [1,2]] ;
• 1 in A permet de tester si 1 est présent dans la liste A. Ici, cela renvoie True. "au revoir" not in A permet de tester si
la chaîne de caractères "au revoir" n’est pas présente dans la liste A. Ici, cela renvoie True.

1/12
Informatique du Tronc Commun TP no 1

Activité 3
• Construire la chaîne de caractères contenant les symboles [1,2],toto et demander le type des 5 premiers
caractères. A contrario, construire la liste contenant la liste [1,2] comme première valeur, et la chaîne de
caractère toto comme deuxième valeur. Quel est le type du premier élément de cette liste ?
• Affecter la chaîne de caractère Dalut à une variable A. On réalise qu’on a fait une coquille : en fait on voulait
rentrer la chaîne de caractères Salut. Pour ce faire, on va modifier la première lettre par A[0]="S". Tester. A
contrario, on va saisir les chaînes de caractères D, a, l, u, t dans une liste que l’on va affecter à la variable A.
On réalise qu’on a fait une coquille (mince !) : en fait on voulait rentrer les chaînes de caractères S, a, l,u, t.
Pour ce faire, on va modifier la première lettre par A[0]="S". Tester.

Correction activité 3
• A=’[1,2],toto’
print(type(A[0]),type(A[1]),type(A[2]),type(A[3]),type(A[4])
Python renvoie à chaque fois str.

A=[[1,2],’toto’]
print(A[0])
Python renvoie le premier élément de A, soit la liste [1,2].
• A=’Dalut’
A[0]=’S’
print(A)
On s’attendait à lire ’Salut’, mais on a eu droit seulement à ’Dalut’. Conclusion, une variable de type chaîne de
caractères est immutable, car on ne peut pas modifier des éléments (lettre en l’occurrence) après sa définition.

A=[’D’,’a’,’l’,’u’,’t’]
A[0]=’S’
print(A)
On s’attendait à lire ’Salut’, mais et on a eu droit à ’Salut’. Ouf. Conclusion, une variable de type liste est mutable, car
on peut modifier des éléments après sa définition.

Activité 4
• Affecter la chaîne de caractères "Bonjour" à une variable. À l’aide d’une boucle for, ajouter un espace entre
chaque lettre du mot ;
• Construire une fonction mytype prenant en argument une liste L et renvoyant la liste des types de chacun des
éléments de L. Tester.

2/12
Informatique du Tronc Commun TP no 1

Correction activité 4
• Première solution qui marchouille
1 A = ’ Bonjour ’
2 mot = ’ ’
3 for lettre in A :
4 mot = mot + lettre + ’ ’
5 print ( mot , len ( mot ) )

Seconde solution qui marche


1 A = ’ Bonjour ’
2 mot = A [0]
3 for lettre in A [1: len ( A ) ]:
4 mot = mot + ’ ’+ lettre
5 print ( len ( mot ) ) }
6

• ♯ Définition de la fonction
1 def typevariable ( L ) :
2 listetypes =[]
3 for element in L :
4 listetypes = listetypes +[ type ( element ) ]
5 return listetypes
6

7 # Appel de la fonction pour test


8 maliste =[1 ,[2 ,3] , ’ titi ’]
9 print ( typevariable ( maliste ) )

Activité 5
• Calculer la somme A des 1/k pour les k premiers entiers inférieurs ou égale à 100 ;
• Calculer la somme B des 1/k pour les k premiers entiers pairs inférieurs ou égale à 100 (sans utiliser de test
if) ;
• Calculer la somme C des 1/k pour les k premiers entiers impairs inférieurs ou égale à 100 (sans utiliser de
test if) ;
• Vérifier si A = B + C.

3/12
Informatique du Tronc Commun TP no 1

Correction activité 5
• somme entiers
1 A =0
2 for i in range (1 ,101) :
3 A = A +1/ i
4 print ( A )

• somme entiers pairs


1 B =0
2 for i in range (2 ,101 ,2) :
3 B = B +1/ i
4 print ( B )

• somme entiers impairs


1 C =0
2 for i in range (1 ,101 ,2) :
3 C = C +1/ i
4 print ( C )

• On retrouve bien A = B + C, au erreur d’arrondi près.

Activité 6
• Calculer le produit des 10 premiers entiers strictement positifs.

Correction activité 6

•1 produit =1
2 for i in range (1 ,11) :

3 produit *= i
4 print ( produit )

Activité 7
• Écrire une fonction harmonique prenant un entier strictement positif n en argument et calculant la somme :
n
X 1
k
k=1

En évaluant cette fonction pour de grandes valeurs de n, quelle est votre hypothèse quant à la convergence ou
à la divergence de cette suite ?

4/12
Informatique du Tronc Commun TP no 1

Correction activité 7

•1 def harmonique ( n ) :
2 somme =0
3 for k in range (1 , n +1) :
4 somme +=1/ k
5 return somme

• On teste pour de grandes valeurs de n, par exemple 10 000 et 1 000 000 avec les instructions print(harmonique(10000))
et print(harmonique(1000000)). Pour ces 2 valeurs, on trouve respectivement 9.787606036044348 et
14.392726722864989. Il semble donc que cette suite diverge, mais lentement. . .

Activité 8
• Écrire une fonction mymax prenant une liste en argument et renvoyant le maximum des éléments de cette liste ;
• Tester cette fonction sur des listes comportant des nombres entiers ou flottants ;
• Tester cette fonction sur une liste de chaînes de caractères ;
• Qu’observez-vous ? Que pouvez-vous en conclure ?

Correction activité 8

•1 def mymax ( L ) :
2 maxi = L [0]
3 for i in range (1 , len ( L ) ) :
4 if L [ i ] > maxi :
5 maxi = L [ i ]
6 return maxi

• On teste par exemple avec


1 maliste =[1 , -2.1 ,6 ,3.5 ,8 , -5.7]
2 print ( mymax ( maliste ) )

Cet appel renvoie bien 8, ce qui semble est correct.


• On teste cette fois-ci sur une liste contenant des chaînes de caractères. Par exemple avec
1 malistestr =[ ’a ’ , ’h ’ , ’v ’ , ’b ’ , ’e ’]
2 print ( mymax ( malistestr ) )

Cet appel renvoie ’v’.


• Ce qui semble vouloir dire que la lettre v est la plus grande de toutes, donc qu’il existe une relation d’ordre, au sens
classement, dans les chaînes de caractères. En effet, dans Python, chaque lettre possède un code numérique, appelé code
ASCII. Donc il est possible de classer aussi par ordre croissant des lettres. Remarque, cela ne marche pas que pour une
lettre, car par exemple si vous tester ’ab’>’aa’, Python renvoie True. Nous reviendrons sur cette notion lorsque nous
aborderons les algorithmes de tri.

Activité 9
• Afficher la liste des carrés des entiers pairs entre 1 et 100 inclus, générée par compréhension.

Correction activité 9
• L=[i**2 for i in range(1,101) if i%2==0] ou L=[i**2 for i in range(2,101,2)], suivi de print(L).

5/12
Informatique du Tronc Commun TP no 1

Activité 10
• Écrire une fonction mydiviseur d’argument un entier n et renvoyant une liste contenant tous les diviseurs de
cet entier. Tester.

Correction activité 10

•1 def mydiviseur ( n ) :
2 return [ i for i in range (1 , n +1) if n % i ==0]

• Test pour n=20


1 print ( mydiviseur (20) ) # Renvoie [1 ,2 ,4 ,5 ,10 ,20]

Activité 11
• Visualiser dans une liste les 100 premières valeurs de la série harmonique déjà étudiée précédemment Sn =
n
X 1 exp(Sn )
. Afin de confirmer l’heuristique de l’activité 7, affichez la liste des 1 000 premières valeurs de .
k n
k=1
Qu’observez-vous ?

Correction activité 11

•1 listeharmonique =[[ harmonique ( k ) ] for k in range (1 ,100) ]

1 import math as m
2 listeharmonique =[[ m . exp ( harmonique ( k ) ) / k ] for k in range (1 ,1000) ]

exp(Sn )
• On observe que la suite converge vers 1.7819639199496125, soit le nombre e. La suite diverge donc logarithmi-
n
quement.

Activité 12
Suite de Fibonacci
• Écrire une fonction myfibonacci prenant en argument un entier n et calculant le n-ième terme de la suite de
Fibonacci définie par : 
Fn+2 = Fn+1 + Fn
F1 = 1 et F0 = 0
Afficher les n premières valeurs de la suite dans une liste. Analyser la divergence en considérant cette fois-ci
ln(Fn )
. Quelle est votre heuristique ?
n

6/12
Informatique du Tronc Commun TP no 1

Correction activité 12

•1 def myfibonacci0 ( n ) :
2 Fnp1 =1
3 Fn =0
4 if n <2:
5 return n
6 for i in range (2 , n +1) :
7 Fnp2 = Fnp1 + Fn # On calcule Fn +2 à partir de la d é finition
8 Fn = Fnp1 # On met à jour Fn
9 Fnp1 = Fnp2 # On met à jour Fn +1
10 return Fnp2
11

12 print ( myfibonacci0 (10) )


13 print ([ myfibonacci0 ( n ) for n in range (10) ])

ou
1 def myfibonacci ( n ) :
2 u =1
3 v =0
4 if n <2:
5 return n
6 for i in range (2 , n +1) :
7 u , v = u +v , u
8 return u
9

10 print ([ myfibonacci ( n ) for n in range (10) ])


11 print ([ m . log ( myfibonacci ( n ) ) / n for n in range (1 ,100) ])

• La suite de Fibonacci a une croissance exponentielle.

Activité 13
Calcul de moyenne/écart type d’un échantillon du générateur aléatoire de Python
• Générer, par compréhension, une liste de 1 000 entiers aléatoires compris entre 1 et 100. Pour cela, on chargera
le module random et on utilisera la fonction randint(1,100) ;
• Calculer la moyenne et l’écart type de cette distribution. On rappelle que la moyenne d’une distribution
(xi )i=1,...,n vaut
n
1X
x= xi
n i=1

et l’écart type vaut v


u n
u1 X
σ=t (xi − x)2 .
n i=1

7/12
Informatique du Tronc Commun TP no 1

Correction activité 13

•1 import random as r
2 mylistalea =[ r . randint (1 ,100) for i in range (1000) ]

• Calculs de la moyenne et de l’écart-type


1 moyenne =0
2 for x in mylistalea :
3 moyenne = moyenne + x
4 moyenne = moyenne / len ( mylistalea )
5 variance =0
6 for x in mylistalea :
7 variance = variance +( x - moyenne ) **2
8 ecarttype =( variance /( len ( mylistalea ) ) ) **(1/2)
9 print ( ecarttype )

Activité 14
• On considère la liste liste=[12,8,5,17,14,13] et le code qui suit
1 k = liste [5]
2 j =4
3 while liste [ j ] > k :
4 j =j -1
5 print ( j )
Prévoir ce qui va s’afficher, puis le tester.
• Tester avec liste=[12,8,5,17,14,4].
Que s’affiche-t-il et pourquoi ? Modifier alors le code afin de supprimer le comportement non souhaité.

Correction activité 14
• Il va s’afficher 2, car j commence à 4, et dès que le test rencontre la valeur 5 (en position 2), la condition du while, n’est
plus vérifiée ;
• Je ne comprends pas la fin de la question, donc je ne sais pas quoi répondre :) Je propose de répondre Fleur :)

Activité 15
• Reprendre le calcul de la moyenne et de l’écart type d’un échantillon du générateur aléatoire de Python (der-
nière question de l’activité 13) et écrire les instructions permettant ces calculs à l’aide d’une boucle while.

8/12
Informatique du Tronc Commun TP no 1

Correction activité 15

•1 moyenne =0
2 nbiterations = len ( mylistealea )

3 i =0

4 while i < nbiterations :

5 moyenne = moyenne + mylistealea [ i ]


6 i = i +1
7 moyenne = moyenne / len ( mylistalea )

8 variance =0

9 j =0

10 while j < nbiterations :

11 variance = variance +( mylistalea [ j ] - moyenne ) **2


12 j = j +1
13 ecarttype =( variance /( len ( mylistalea ) ) ) **(1/2)

14 print ( ecarttype )

Activité 16
• Écrire une fonction, qu’on appellera f permettant de déterminer (et renvoyer) le plus petit entier p tel que
Xp
k 2 ≥ n, fonction qui dépend de n ;
k=1
• La tester avec des valeurs faibles de n, puis avec n = 21334.

Correction activité 16

•1 def f ( n ) :
2 somme =0
3 k =0 # ou 1
4 while somme < n :
5 somme = somme + k **2
6 k = k +1
7 return k

• Test pour n=10 :


1 print ( f (10) )

• Test pour n=21 334 :


1 print ( f (21334) )

Activité 17
• Essayer de deviner ce que renvoie le programme suivant. Vérifier ensuite en le tapant sous Python.
1 num =1
2 while num <=12:
3 print ( num )
4 num *=2
5 print ( " Enfin dehors " )
6 print ( num )

9/12
Informatique du Tronc Commun TP no 1

Correction activité 17
• Le code renvoie "Enfin dehors", et 16.
• C’est bien ce que l’on obtient ! ! À vous de deviner pourquoi ! !

Activité 18
• Que se passe-t-il si, dans le programme précédent, on initialise num avec la valeur nulle ?
• Deviner à quoi sert le titre de la question en lançant le programme malgré tout ;
• Que se passe-t-il si, dans le programme précédent avec num=1, la ligne num*=2 est remplacée par num/=2 ?
• Que se passe-t-il si, dans le programme précédent avec num=1, la ligne num*=2 n’est pas indentée ?

Correction activité 18
• Le programme ne s’aarêtera jamais, car la variable num vaudra toujours 0, ainsi la condition du while sera toujours vérifiée.
On vient de faire une boucle infinie, qu’il faut stopper par Ctrl+I ou Ctrl+C ;
• Tiens, tout était dans le titre ! ! !
• Idem, on aura des valeurs de num de plus en plus petite, et la condition du while ne sera jamais vérifiée. Encore une
boucle infinie ! ! !
• Encore une boucle infinie, car la variable num, vaudra toujours 1 ! ! Il faut donc bien faire attention aux indentations !

Activité 19
• Quelle est le risque du code précédent ? Le taper et vérifier. Expliquer le comportement ;
• Modifier légèrement le code afin que celui-ci soit plus lisible. Vérifier qu’il fonctionne exactement comme le
précédent.

Correction activité 19
• On risquait la boucle infinie ! ! Car la variable num n’est pas modifiée dans la boucle while et que la condition d’arrêt est
False ! Mais grâce à la commande break en dehors de la structure conditionnelle if, on sort bien de la boucle.
• Il eut été bien plus propre d’écrire :
1 num =5
2 while num >3 : # ou >=2
3 num -=1
4 print ( num )
5 print ( ’ Enfin dehors ’)

Activité 20
• Écrire la fonction mypgcd prenant 2 entiers en arguments a et b, et renvoyant le pgcd ;
• Combien d’itérations y a-t-il au maximum dans cet algorithme ?
• Modifiez votre fonction mypgcd en une fonction mypgcd2 qui retourne non pas le pgcd mais le nombre d’itéra-
tions nécessaires pour le calculer ;
• Calculer le nombre d’itérations moyen pour a=100 et b variant entre 1 et 99.

10/12
Informatique du Tronc Commun TP no 1

Correction activité 20

•1 def mypgcd (a , b ) :
2 # On commence d é j à par chercher qui est le plus grand que l ’ on met dans u , l ’
autre dans v
3 if a > b :
4 u , v =a , b # u = a et v = b
5 else : # sinon , on permute
6 u , v =b , a # u = b et v = a
7 reste =1 # on initialise reste à une valeur non nulle
8 # On continue tant que reste n ’ est pas nulle
9 while not ( reste ==0) :
10 reste = u % v # on calcule le reste de la division euclidienne
11 u = v # on stocke v reste dans u car il est forc é ment plus petit
12 v = reste # on stocke dans v le reste
13 return u

ou
1 def mypgcd (a , b ) :
2 u , v =a , b
3 while not ( v ==0) :
4 u , v =v , u % v
5 return u

• Le pire cas est obtenu lorsque a et b sont consécutifs (a = b + 1 ou b = a + 1). Le nombre d’itérations est de . . .

•1 def mypgcd2 (a , b ) :
2 u , v =a , b
3 res =0
4 while not ( v ==0) :
5 u , v =v , u % v
6 res +=1
7 return res

1 echantillon =[ mypgcd2 (100 , b ) for b in range (1 ,100) ]


2 moyechantillon =0
3 for x in echantillon :
4 moyechantillon = x + moyechantillon
5 moyechantillon = moyechantillon /99
6 print ( moyechantillon )

Activité 21
• Écrire une fonction mysyracuse qui prend l’entier u0 en paramètre et qui renvoie la liste de toutes les valeurs
de la suite jusqu’à la première valeur où un vaut 1, soit

[u0 , u1 , . . . , un−1 = 2, un = 1]

L’itération while que vous allez utiliser terminera donc de manière... conjecturale !
• La longueur de cette liste s’appelle la « durée de vol » en partant de l’entier u0 et le maximum de cette liste
s’appelle « l’altitude maximale ». Essayez donc de voler sur une durée supérieure à 100 itérations !

11/12
Informatique du Tronc Commun TP no 1

Correction activité 21

•1 def mysyracuse ( start ) :


2 tmp = start
3 res =[ tmp ]
4 while not ( tmp ==1) :
5 if tmp %2==0:
6 tmp = tmp /2
7 else :
8 tmp =3* tmp +1
9 res . append ( tmp )
10 return res

• Par exemple
1 len ( mysyracuse (27) ) # Renvoie 112

12/12

Vous aimerez peut-être aussi