Vous êtes sur la page 1sur 118

1

Bases de la programmation :
Cours
1re anne

IUT de Villetaneuse.
Hanne Azzag,
Frdrique Bassino,
Pierre Grard,
Bouchab Khafif,
Mathieu Lacroix,
Mustapha Lebbah,
Franois Lvy,
Guillaume Santini.
28 fvrier 2012

IUT de Villetaneuse

Bases de la programmation


2 

1re anne

Chapitre 1

Squentialit et variables
1.1

Introduction

Un ordinateur est une machine et en tant que telle, elle ne fait que ce quon lui demande. Les
programmeurs ont pour tche de faire faire ces machines exactement ce quils veulent quelles
fassent et dans le bon ordre ni plus, ni moins, ni autre chose. Donner un ordinateur une squence
dordres effectuer, cest crire un programme quil devra excuter.
Les problmes rsoudre tant parfois complexes, la tche principale est dcompose en plusieurs sous-problmes plus simples rsolus les uns aprs les autres. En dfinitive, pour rsoudre un
problme, le programmeur conoit une srie dinstructions, chacune donnant un ordre lordinateur.
Linstruction print(1), par exemple, correspond lordre donn lordinateur dafficher 1
lcran. Il sagit dun ordre simple, mais qui peut tre combin dautres pour produire des
rsultats (un peu) plus complexes. Par exemple, cette instruction suivie de print(2) forme un
programme avec deux instructions (dans le cercle : les numros de ligne du programme) :


1
2

1
2

1
2

print(1)
print(2)



qui affichera 1 puis affichera 2.
Cet exemple est videmment simplisme et peut paratre trs loign des programmes que lutilisateur contemporain utilise habituellement. Mais mme pour raliser des applications complexes
(animation et rendu 3D, par exemple), ce sont toujours les mmes principes simples qui sont
luvre.
Au lieu dinstructions qui se contentent dafficher un nombre lcran, on utilisera des instructions toujours aussi simples crire, mais dont les effets seront plus spectaculaires. Le travail du
programmeur nest pas plus complexe pour autant. Ainsi, au lieu de


print(1)
print(2)


On aura des instructions comme





pivoter(0.2) # pour faire tourner une scne 3D de 0.2 degrs


afficher(0.1) # pour demander un rendu 3D de la scne en moins de 0.1 seconde

IUT de Villetaneuse

dont limpact visuel sera bien plus important, mais dont la complexit pour le programmeur reste
comparable.
Construire des programmes informatiques, cest toujours se demander quelles instructions excuter, et dans quel ordre.

1.2

Squences dinstructions

Un programme est une srie dinstructions effectues une par une, de la premire la dernire,
en squence. Chaque instruction est un ordre simple donn lordinateur.
Chaque programme commence par excuter sa premire instruction. Ce nest que lorsquelle
est termine quil passe la seconde. Sil y a une troisime instruction, il attend davoir termin
la deuxime pour lexcuter.
I Sur ce thme : Exercice 1, TD1

1.3
1.3.1

Variables
Noms de variables

Les instructions dun programme permettent de traiter des donnes (quantit de vie restante,
age dun client, nombre de munitions, etc.) qui doivent pouvoir tre ajustes au fur et mesure que
le programme se droule. Lodinateur stocke donc chacune de ces informations dans sa mmoire
un endroit bien identifi, grce des variables. On utilise le terme variables parce que ces donnes
sont susceptibles dtre modifies, par opposition des constantes).
Les variables associent un nom une valeur. Une variable nomme x peut par exemple prendre
la valeur 1. Chaque variable mobilise un espace mmoire accessible par un nom, et qui peut contenir
une valeur. La valeur dune variable peut tre change au cours de lexcution dun programme.

Selon la syntaxe utilise dans ce cours, le nom dune variable commence par une lettre minuscule
(a z) ou majuscule (A Z), ou bien par le caractre soulign (_). Pour la suite de son nom,
on peut utiliser des lettres minuscules ou majuscules, des souligns et des chiffres (0 9). Le nom
dune variable ne contient donc pas despace.
I Sur ce thme : Exercice 2, TD1

1.3.2

Affectation

Lopration principale mettant en uvre les variables est laffectation, qui permet de changer
la valeur dune variable en utilisant son nom. Une affectation est note avec le signe = . A
gauche du signe = , on place le nom de la variable dont on veut changer la valeur, et droite on
dfinit la valeur que doit prendre la variable. Ce symbole nest pas du tout lgalit mathmatique.
Par exemple, linstruction


x=2

change la valeur de x. Notez bien que 2=x est incorrect. 2 est un nombre constant et ne change
pas de valeur. Ce nest pas une variable et on ne peut donc pas le mettre gauche de loprateur
daffectation.
Dans cet exemple, la nouvelle valeur est directement spcifie. On aurait galement pu placer
droite du symbole = une expression qui reprsente un calcul, comme par exemple dans


x=1+2

Bases de la programmation



4 

1re anne

Departement informatique

Loprateur daffectation commence toujours par valuer la valeur droite du signe =


(quelle que soit la complexit du calcul) avant de placer le rsultat dans lespace mmoire rserv
la variable.
Ainsi, linstruction


x=(1+2)/3



calcule dabord la valeur de lexpression (1+2)/3 avant daffecter le rsultat du calcul la variable
nomme x, qui prend finalement la valeur 1.

1.3.3

Utilisation des variables

Dans lvaluation dune expression, un nom de variable est remplac par sa valeur. Si x vaut
2, par exemple, alors (x*3) vaut 6. Ainsi, lissue des deux instructions conscutives suivantes :


1
2

x=2
y=x*3


x vaut 2 et y vaut 6.

Cette valuation des variables grce leur valeur vaut galement pour les sorties cran. Linstruction print(1+2) est correcte, mais print(x+y) lest galement, et donnera le mme rsultat
si par exemple x et y valent respectivement 1 et 2 juste avant son excution.
I Sur ce thme : Exercice 3, TD1

Il est important de noter quune variable ne peut tre utilise que si elle a t dfinie plus haut.
Ainsi, le programme suivant est correct :


1
2
3

1
2
3

1
2
3
4

x = 0
y = 2
print((x+y)+2)


alors que le suivant le lest pas





x = 1
z = x+y
print(z)



parce qu la deuxime instruction, la variable y navait pas encore t dfinie. Selon le principe
de squentialit, ajouter une ligne la fin comme dans le le programme suivant :


x = 1
z = x+y
print(z)
y = 3

1re anne



5 

Bases de la programmation

IUT de Villetaneuse

naurait dailleurs pas rsolu le problme.


Pour dfinir une variable, il faut lui affecter une valeur.
Une source derreurs importante en programmation est la non-matrise de la squentialit
des instructions. Les instructions sexcutent dans lordre o elles sont crites, les ventuelles
modifications de variables se font dans le mme ordre.
I Sur ce thme : Exercice 4, TD1
I Sur ce thme : Exercice 5, TD1
I Sur ce thme : Exercice 6, TD1

1.4
1.4.1

Types de donnes, oprations et conversions


Types de nombres et oprations permises

Il existe deux types de nombres :


Les nombres entiers, appels integer, ou en abrg int : ils sont signs (1, 2, -3).
Les nombres virgule flotante, appels floating point numbers, ou en abrg float : ils sont
positifs ou ngatifs et on les note avec un point pour la virgule (1.0, 2.3, -17.32, 3.141516).
Pour dfinir une variable de type int, on lui affecte une valeur entire. Pour dfinir une variable
de type float, on lui affecte un nombre virgule. Par exemple :
a = 0 dfinit la variable a comme un int de valeur nulle,
a = 0.0 dfinit la variable a comme un float de valeur nulle.
Le tableau suivant rcapitule succinctement les principales oprations possibles sur des nombres :
Expression
x + y
x - y
x * y
x / y
x % y
-x
x ** y
abs(x)

Rsultat, x et y tant des nombres (int ou float)


somme de x et de y
diffrence de x et de y
produit de x et de y
division de x par y
reste de la division entire de x par y
ngation de x
x la puissance y
valeur absolue de x

Il faut tre trs vigilant quand au type des nombres quand on applique les oprateurs ci-dessus :
si une opration implique deux nombres de mme type, alors le rsultat reste du mme type. Si
une opration implique la fois une valeur de type int et une autre de type float, alors le rsultat
sera de type float (float absorbe int). Notons en particulier que le rsultat de la division
de deux nombres entiers ne donne pas un float. Typiquement, 3/2 vaut 1 et pas 1.5.

1.4.2

Chaines de caractres et oprations permises

Jusquici, toutes les donnes saisies, calcules et affiches taient numriques. Il existe en fait
dautres types de donnes comme par exemple les chanes de caractres ( string en anglais).
Par exemple, le programme


1

print(hello world)



affiche hello world lcran (sans les guillemets), hello world tant une chane de caractres
alpha-numriques.
Les valeurs des chanes de caractres sont dfinies entre simples quotes (apostrophes).
Attention, chaque caractre compte, ainsi que la casse (majuscules/minuscules). Ainsi, les chanes
de caractres suivantes sont toutes diffrentes les unes des autres :
Bases de la programmation


6 

1re anne

Departement informatique

HelloWorld
Hello World
hello world
helo world
halo world
halo 1 world 2
On peut dfinir des variables de type chanes de caractres de la mme manire que celles de
type numrique. Ainsi, le programme suivant :


1
2

str = Hello world


print(str)

dfinit une variable de nom str de type chane de caractres, pour ensuite lafficher.

La chane de caractres vide (sans un seul caractre dedans) se note par deux simples quotes
accoles . Par exemple, str = dfinit une chane de caractres et lui donne la valeur dune
chane vide. Attention, il sagit bien ici de deux simples quotes (deux apostrophes la suite), et
pas dune double quote (guillemets anglais).
Il est possible dappliquer quelques oprations sur les chanes de caractres. Ces oprations
sont rsumes dans le tableau suivant :
Expression
s + t
len(s)
lower(s)
upper(s)

Rsultat, s et t tant des chanes de caractres


concatnation de s et de t (mises bout bout)
longueur de s
s mis en minuscules
s mis en majuscules

Notez que certaines oprations peuvent tre interprtes diffremment selon le type des donnes auxquelles elles sappliquent. Cest par exemple le cas de loprateur + . Ainsi print(1+2)
affichera 3 (le + tant interprt comme une somme de deux nombres), alors que print(hello
+ world) affichera helloworld (le + tant interprt comme une opration de concatnation
de deux chanes de caractres ).
Si loprateur + peut tre utilis pour des nombres ou des chanes de caractres, il nest par
contre pas possible dutiliser les deux la fois. En effet, on ne peut pas additionner un nombre
avec une chane de caractres.

1.4.3

Conversion de type de donnes

Il est possible de transformer une chane de caractres en un nombre et un nombre en chane


de caractres. De mme, il est possible de transformer un int en float et inversement. Ceci se
fait laide des trois oprations de conversion donnes ci-dessous.
Expression
int(val)
float(val)
str(val)

Rsultat
val est transfome en un nombre de type int
val est transfome en un nombre de type float
val est transfome en une chane de caractres

Le tableau suivant indique alors les rsultats des oprations de conversion int(val), float(val)
et str(val) sur une variable val. La valeur de val avant conversion (et donc son type) est donne
la premire ligne.
1re anne


7 

Bases de la programmation

IUT de Villetaneuse

valeur de val
int(val)
float(val)
str(val)

10
10
10.0
10

2.5
2
2.5
2.5

2
2
2.0
2

2.5
ERREUR
2.5
2.5

12a34
ERREUR
ERREUR

On remarque que lopration int(val) supprime ce qui se trouve aprs la virgule si val est
de type float. Ceci revient alors prendre la partie entire infrieure de la variable val.
On remarque aussi que les oprations int(val) et float(val) gnrent une erreur si val est
une chane de caractres qui ne correspond pas un entier ou un nombre virgule, respectivement.
I Sur ce thme : Exercice 7, TD1
I Sur ce thme : Exercice 8, TD1
I Sur ce thme : Exercice 9, TD1

1.5

Entres / sorties

La fonction print() permet dafficher une valeur connue lcran. Elle permet dafficher
indiffremment des nombres ou des chanes de caractres. Cest une fonction qui ralise une sortie
car elle fait sortir des valeurs de lordinateur vers lutilisateur.

Il existe galement des fonctions dentre qui permettent dentrer des valeurs dans lordinateur.
La plus simple est raw_input() qui sutilise droite dun oprateur daffectation = . Par
exemple, le programme suivant demande une chane de caractres lutilisateur puis laffiche :


1
2

1
2
3
4
5
6

z = raw_input()
print(z)



La premire instruction est une affectation. Le programme va donc en premier lieu chercher
valuer la valeur de ce qui est droite du signe = . Pour ce faire, lordinateur invite lutilisateur
saisir une valeur au clavier. Une pression de la touche Entre validera sa saisie et celle-ci sera
prise en compte par lordinateur.
Notons bien que la fonction raw_input() permet uniquement de saisir des chanes de caractres. Si on veut saisir un nombre, il convient de procder en deux temps : procder dabord
la saisie dune chane de caractre, puis la convertir en un nombre.
I Sur ce thme : Exercice 10, TD1
I Sur ce thme : Exercice 11, TD1
Le programme suivant permet de demander lutilisateur les deux cts dun rectangle, et
den calculer la surface avant de lafficher :


print(Quelle est la longueur du premier ct ?)
cote1 = float(raw_input())
print(Quelle est la longueur du deuxime ct ?)
cote2 = float(raw_input())
surface = cote1 * cote2
print(La surface du rectangle ainsi form est + str(surface))



Lutilisation de variables pour stocker les longueurs des cts saisies permet ici dcrire un programme gnrique permettant de calculer la surface de nimporte quel rectangle.
I Sur ce thme : Exercice 12, TD1
I Sur ce thme : Exercice 13, TD1
I Sur ce thme : Exercice 14, TD1

Bases de la programmation


8 

1re anne

Departement informatique

TD1 : Squentialit et variables

Exercice 1 : Squences dinstructions



1
2
3

1
2
3

Quaffichent les programmes suivants ?

print(1)
print(2)
print(3)

print(2)
print(1)
print(3)

Avec les mmes instructions, ces deux programmes ne font pas la mme chose. Tous les programmes excutent donc en premier les premires instructions : ils se droulent du haut vers
le bas.

Exercice 2 : Noms de variables


Parmi ces exemples, seuls certains sont des noms de variable valides. Lesquels ?
x
x1
X1
toto
ric
_eric
t_42
24_t

Exercice 3 : Squentialit et modifications successives des valeurs des


variables

1
2
3
4
5
6
7
8
9
10

Quaffiche le programme suivant ?

toto = 4
print(toto)
toto = 5 + 5
print(toto)
tata = toto + 4
print(tata)
tata = tata + 5
print(toto)
tata = tata + (toto*2)
print(tata)



Pour rpondre la question, dessiner les cases mmoire chaque tape de lexcution du programme.

Exercice 4 : Squentialit et valeur des variables


Quaffiche le programme suivant ?
1re anne


9 

Bases de la programmation

IUT de Villetaneuse


1
2
3
4
5
6

a=1
b=2
a=b
b=a
print(a)
print(b)

Exercice 5 : Squentialit et valeur des variables


Quaffiche le programme suivant ?


1
2
3
4
5
6

a=1
b=2
b=a
a=b
print(a)
print(b)

Exercice 6 : Echange des valeurs de deux variables


Que manque-t-il aux programmes prcdents pour raliser un change entre les valeurs des
variables a et b ? crire un programme qui ralise un tel change.

Exercice 7 : Types numriques


A chaque ligne du programme suivant, donnez la valeur et le type des variables gauche de
loprateur daffectation


1
2
3
4
5
6
7

a
b
c
d
c
a
a

=
=
=
=
=
=
=

1.0
2
a + 1
b + 3
float(d)
c / b
int(c) / b

Exercice 8 : Types et addition


Donnez la valeur des expressions suivantes :
123 + 123
123 + 123
123 + 123
123 + 123

Exercice 9 : Concatnation de chanes de caractres



1
2
3
4

Considrons le programme suivant :

cp = 93
nom = Seine Saint-Denis
phrase = ?????
print(phrase)



Que mettre la place des ? ? ? ? ? pour que le programme affiche Le code postal de la Seine
Saint-Denis est 93 ?

Exercice 10 : Saisie de chanes de caractres au clavier


Quaffiche le programme suivant, supposer que lutilisateur saisisse 123 puis 456 ?
Bases de la programmation


10 

1re anne

Departement informatique


1
2
3
4

a = raw_input()
b = raw_input()
c = a+b
print(c)


Quels sont les types de a, b et c ?

Exercice 11 : Saisie de nombres au clavier


Comment faudrait-il modifier ce programme pour quil affiche 579, supposer que lutilisateur
saisisse 123 puis 456 ? NB : 579 est la somme de 123 et de 456. Dsormais, quels sont les types des
diffrentes variables ?

Exercice 12 : Adaptation de programmes existants



1
2
3
4
5
6

Que faut-il modifier ce programme pour que ce soit le primtre qui soit calcul ?

print(Quelle est la longueur du premier cote ?)


cote1 = float(raw_input())
print(Quelle est la longueur du deuxieme cote ?)
cote2 = float(raw_input())
surface = cote1 * cote2
print(La surface du rectangle ainsi forme est + str(surface))

Exercice 13 : Calcul de clture


crire un programme qui demande lutilisateur les dimensions en mtres dune zone rectangulaire clturer et qui affiche un message intelligible indiquant le nombre de piquets utiliser,
sachant quil faut au maximum 2 mtres entre chaque piquet. On suppose que les dimensions en
mtres sont des nombres entiers.

Exercice 14 : Echange de nombres sans variable intermdiaire


crire un programme qui demande lutilisateur deux nombres, les affiche, les change, et
les r-affiche aprs change, mais sans utiliser de variable intermdiaire. On pourra utiliser une
addition et une soustraction pour ne rien perdre.
Note : la mthode dchange sans variable parat plus intressante que celle donne en cours
puisquelle nutilise pas dautre variable. (Elle ncessite cependant que lordinateur effectue des
additions/soustractions en plus). On pourrait donc penser quelle est meilleure. Mais elle est aussi
moins gnrale car elle suppose que les variables changer soient de type numrique : elle ne
fonctionnerait pas sur des chanes de caractres par exemple. Dune manire gnrale, il y a
souvent plusieurs manires de rsoudre un problme. Le rle du programmeur consiste identifier
le meilleur algorithme (le meilleur enchanement dinstructions), compte tenu des hypothses quil
lui semble raisonnable de faire.

1re anne


11 

Bases de la programmation

IUT de Villetaneuse

TP1 : Lancement dEric

Exercice 15 : Prsentation dEric


Tous les TP de BdP se feront en utilisant le logiciel Eric, dans sa version 4. Eric est un outil de
dveloppement complet pour le langage de programmation Python. Il dispose dun certain nombre
doptions que nous nutiliserons pas :
Nous nous en tiendrons aux fonctions de base de Eric ;
Nous nexploiterons quune petite partie des possibilits offertes par le langage Python.
La raison de ces simplifications est la mise en avant de ce qui est fondamental et commun
la plupart des langages de programmation. Ce cours nest pas spcifiquement un cours
de Python, mais aborde des notions bien plus gnrales que celles propres un langage de
programmation particulier. Dautres enseignements lIUT vous permettront dacqurir des
comptences spcialises dans telles ou telles techniques.
Question 15.1 : Pour lancer Eric, suivez les instructions de votre enseignant. Vous devriez obtenir
une fentre ressemblant celle ci-dessous.

La fentre principale dEric se dcompose en plusieurs parties :


Le menu (tout en haut)
La barre doutils (juste en dessous)
La fentre ddition qui vous permettra dcrire vos programmes ( gauche)
La fentre de dbogage qui vous permettra de contrler pas pas lexcution de vos programmes ( droite)
La fentre de linterprteur qui vous permettra a) de suivre lexcution de vos programmes
b) dentrer manuellement et une une des instructions excuter.
Il est possible que votre fentre principale comporte beaucoup plus (ou peut-tre moins) de
sous-fentres et de boutons dans la barre doutils. Pour avoir quelque chose au mme niveau de
dtail que ci-dessus, vous pouvez cliquer avec le bouton droit de la souris quelque part sur la barre
dtat. Un menu contextuel vous permet alors de slectionner les lments apparaissant lcran.
Question 15.2 : Pour obtenir la mme chose que ci-dessus, dcochez tout sauf :
Horizontal toolbox
Debug viewer
Bases de la programmation


12 

1re anne

Departement informatique

File
Edit
View
Start
Debug
Help

Exercice 16 : Utilisation de linterprteur


Dans la partie infrieure de la fentre principale, le premier onglet permet dafficher linterprteur Python. Cest longlet affich par dfaut mais sil arrivait que vous en changiez par inadvertance, reslectionnez simplement ce premier onglet.
Linterprteur invite saisir une commande lorsquun triple chevron > > > est affich en dbut
de ligne.
Question 16.1 : Saisissez print(hello world) et terminez par la touche Entre du clavier.
Linstruction sexcute et hello world saffiche la suite. Dans linterprteur, vous devriez
voir :

Aprs avoir interprt et excut linstruction prcdente, le triple chevron est nouveau
prsent pour vous inviter taper une seconde instruction.
Attention : quand vous donnez des instructions lordinateur, il convient de respecter la
syntaxe. Chaque caractre compte :
prunt au lieu de print ne fonctionnera pas
ouvrir une parenthse sans la fermer provoquera une erreur
oublier des simples quotes nest pas correct
...
Question 16.2 : Faites volontairement lerreur doublier la seconde simple quote terminant la
chane de caractres. Vous obtenez un message derreur et linterprteur affichera ce qui suit.

Il y a diffrents types derreur, lerreur de syntaxe (SyntaxError) est la plus courante, et rsulte
de fautes de frappe. Confronts une erreur, lisez toujours le message retourn par linterprteur,
il vous donnera de prcieux indices pour la rsolution du problme.
1re anne


13 

Bases de la programmation

IUT de Villetaneuse

Pour voir rapparatre les trois chevrons > > > appuyez simplement sur la touche Entre et
saisissez une nouvelle instruction, sans erreur cette fois.

Exercice 17 : Squence dinstructions dans linterprteur


Un programme est souvent plus complexe quune seule instruction. Un certain nombre dinstructions effectues lune aprs lautre sont ncessaires la rsolution de problmes plus complexes
que le simple affichage dun message amical.
Par exemple, en utilisant des variables, on pourrait donner plusieurs instructions la suite :
Dabord str1 = hello.
Puis str2 = world
Enfin print(str1 + + str2)
Question 17.1 : Entrez la premire instruction, validez-la en appuyant sur Entre : elle est
excute. Entrez de la mme manire les instructions suivantes.
Linterprteur affiche hello world . Le rsultat final est le suivant :

Notez bien que les deux premires instructions dfinissent des variables, et que linterprteur
conserve leur valeur mesure de lexcution des instructions. Sans cela, la dernire instruction ne
fonctionnerait pas.
Question 17.2 : Entrez dailleurs maintenant la suite dinstructions :
>>> str2 = dolly
>>> print(str1 + + str2)
Vous constaterez que str2 a chang de valeur, si bien que la dernire instruction affiche hello
dolly .

Exercice 18 : Remise zro de linterprteur


Il peut arriver qu force de saisir des instructions, de multiples variables et autres lments
soient dfinis, qui pourraient troubler le bon fonctionnement de nouvelles instructions. Il est toujours possible de remettre linterprteur zro. Pour ce faire, cliquez avec le bouton droit quelque
part sur la zone de linterprteur. Un menu contextuel apparat et vous donne le choix entre
plusieurs options :
Clear efface simplement ce quil y a lcran
Reset remet rellement linterprteur zro
Question 18.1 : Slectionnez Clear puis entrez linstruction print(str1). Vous devez voir
afficher hello , preuve que la variable str1 est toujours dfinie, mme si les lignes prcdentes
ont t effaces. Clear nest quune option daffichage.
Question 18.2 : Slectionnez Reset et entrez linstruction print(str1).
Une erreur NameError : name str1 is not defined indique que str1 nest pas dfinie,
preuve que Reset a bien mis zro lensemble des dfinitions de linterprteur. Aprs un Reset,
vous redmarrez vraiment zro. Pour information, la capture dcran ci aprs montre lapparence
de linterprteur aprs cette squence dactions.
Bases de la programmation


14 

1re anne

Departement informatique

Exercice 19 : Excution dun programme crit dans un fichier externe


Linterprteur est un moyen extrmement pratique de tester rapidement des solutions des
problmes rencontrs. Les programmeurs avertis sen servent souvent abondamment, mme sil est
vident quen fin de compte, on ne peut pas demander lutilisateur dun programme de taper
des instructions une une. Les programmes sont donc crits en entier dans des fichiers texte, et
excuts ensuite sans que lutilisateur ne voit ces suites dinstructions (le code source).
Question 19.1 : Avec un diteur de texte quelconque (gedit par exemple), saisissez le programme
suivant :


# simplissime

print(hello world)

3
4

# avec des variables

str1 = hello
print(str1)
str2 = world
print(str2)
print(str1 + + str2)

6
7
8
9

Les lignes commenant par des # indiquent un commentaire : elles ne sont pas interprtes en
tant quinstructions mais permettent de rendre les programmes plus lisibles.
Question 19.2 : Enregistrez ce programme sous le nom hello.py dans le rpertoire de votre
choix. Par exemple, /bdp/tp1 convient parfaitement et vous permettra de le retrouver facilement.
Si le dossier nexiste pas, crez-le.
Question 19.3 : Aprs avoir enregistr le fichier, fermez lditeur de texte.
Question 19.4 : Revenez Eric 4 (si vous lavez ferm par inadvertance, relancez-le).
Question 19.5 : Soit en utilisant le deuxime bouton de la barre doutils gauche (Open), soit en
utilisant le menu droulant File > Open, soit en utilisant le raccourci clavier Ctrl+O (les touches
Ctr l et O simultanment), ouvrez le fichier hello.py .
Si ncessaire, naviguez vers le bon rpertoire. Si vous avez bien enregistr le fichier, et que
vous tes bien dans le bon rpertoire, mais que le fichier napparat pas, il sagit peut-tre dun
problme de filtre : slectionnez All Files *.* dans la liste droulante en bas droite de la
bote de dialogue de slection de fichiers.
Ceci fait, votre fentre principale devrait avoir lallure suivante :
1re anne


15 

Bases de la programmation

IUT de Villetaneuse

Question 19.6 : Excutez le programme. Vous pouvez soit :


Utiliser le bouton de la barre doutils Run Script (pour le trouver : laisser la souris un
certain temps au dessus des boutons permet dafficher un libell en plus de limage).
Utiliser le raccourci clavier F2 (bien plus pratique)
Utiliser le menu Start > Run Script
Une bote de dialogue apparat pour vous demander quel programme excuter :

Question 19.7 : Renseignez le programme et dans quel rpertoire il se trouve. Au lieu de D:


, mettez le rpertoire dans lequel vous avez sauvegard le fichier.
Question 19.8 : Appuyez sur OK et le programme sexcute dans linterprteur, qui prend lallure
suivante :
Bases de la programmation


16 

1re anne

Departement informatique

Le programme a t interprt en une seule fois, seuls les rsultats des diffrentes utilisations
de la fonction print() saffichant lcran.
Question 19.9 : Dans la fentre ddition, modifiez le programme en remplaant la 7me ligne
str2 = world par str2 = dolly .
Question 19.10 : Sauvegardez le fichier :
Bouton Save de la barre doutils
Raccourci clavier Ctrl+S
Menu File > Save
Question 19.11 : Excutez nouveau le script et constatez que le programme ayant t modifi,
le rsultat change.

1re anne


17 

Bases de la programmation

IUT de Villetaneuse

Exercice 20 : criture dun programme directement laide dEric


Dans la plupart des cas, Eric disposant dun diteur, vous serez amens crire des programmes
sans faire intervenir un autre diteur. Nous allons donc utiliser Eric pour crer un nouveau fichier
contenant un programme.
En premier lieu, fermons ldition de hello.py . La partie diteur de Eric ressemble ceci :

Question 20.1 : Cliquez sur le bouton en croix tout en haut droite. Ceci a pour effet de fermer
ldition de hello.py

Question 20.2 : Crez maintenant un nouveau fichier :


Bouton New de la barre doutils (premier gauche)
Raccourci clavier Ctrl+N
Menu File > New
Question 20.3 : Le fichier et pour linstant nomm Untiled 1 . Donnez lui un nom en le
sauvegardant :
Bouton Save As
Raccourci clavier Ctrl+Shift+S
Menu File > Save As
Appelez le nouveau fichier echange.py et placez-le dans le mme rpertoire que hello.py .
Question 20.4 : Saisissez le programme suivant puis sauvegardez :


1
2
3
4
5
6
7

print(\na? )
# le \n permet de sauter une ligne
a = raw_input()
print(b? )
b = raw_input()
print(a= + a + et b= + b)
print(maintenant, echange !)
c = a
Bases de la programmation


18 

1re anne

Departement informatique

8
9
10

a = b
b= c
print(et apres, a= + a + et b= + b)

Question 20.5 : Excutez le programme. Quand les raw_input sexcutent, tapez quelque chose
dans linterprteur, et appuyez sur Entre pour valider, le programme passera ensuite linstruction suivante.
En fin de compte, vous devriez obtenir une fentre comme :

Exercice 21 : Dbogage : suspension de lexcution dun programme


Il est frquent de commettre des erreurs et davoir des difficults les corriger. Les erreurs
de syntaxe sont les plus simples corriger, les plus difficiles tant souvent celles ayant trait
la structure mme et lordonnancement des instructions dans le programme. Pour corriger plus
facilement ses erreurs, on peut saider dun dbogueur afin de bien contrler lvolution des valeurs
des diffrentes variables au fur et mesure de lexcution du programme.
Pour ce faire, il faut
Signifier au dbogueur o sarrter
Lui demander dafficher ltat des variables souhaites
Pour signifier au dbogueur o suspendre lexcution du programme le temps que le programmeur ait le temps de faire le point avant de poursuivre, on utilise des points darrt
( breakpoints en anglais). Nous allons ici suspendre lexcution du programme la ligne 5 puis
la ligne 10.
1re anne


19 

Bases de la programmation

IUT de Villetaneuse

Question 21.1 : Pour dfinir un breakpoint la ligne 5, mettez le curseur sur la ligne 5, puis
soit :
Dans le menu Debug > Toggle Breakpoint
Utiliser le bouton correspondant dans la barre doutils
Utiliser le raccourci clavier Shift+F11
Un symbole avec une croix saffiche ct du numro 5 de la ligne :

Pour enlever le point darrt, on utilise la mme procdure. Pour le remettre si ncessaire,
idem.
On peut procder encore plus simplement que le raccourci clavier pour activer/dsactiver un
point darrt : il suffit de cliquer l o se trouve le symbole avec la croix.
Question 21.2 : Procdez ainsi pour dfinir le point darrt de la ligne 10.
Question 21.3 : Pour excuter le programme en mode dbogage de manire ce que les points
darrt soient pris en compte, lancez le programme dune manire diffrente :
Par le menu Start > Debug Script
Par le bouton correspondant dans la barre doutils
Par le raccourci clavier F5
Question 21.4 : Entrez des valeurs pour a et b, puis le programme sinterrompt la ligne 5 (avant
de lexcuter). La ligne 5 est surligne de jaune, en attente dun ordre pour poursuivre lexcution.
Bases de la programmation


20 

1re anne

Departement informatique

Exercice 22 : Dbogage : valeurs des variables


Question 22.1 : A ce point, dans la partie dbogage de la fentre principale dEric, slectionnez
le deuxime onglet pour voir apparatre toutes les variables dfinies, avec leur valeur et leur type.

Notez bien qu ce point, c nest pas encore dfinie puisque cette variable ne le sera qu la
ligne 7 du programme.
Question 22.2 : Poursuivez lexcution du programme :
Par le menu Debug > Continue
Par le bouton correspondant dans la barre doutils
Par le raccourci clavier F6
1re anne


21 

Bases de la programmation

IUT de Villetaneuse

De nouvelles choses saffichent dans linterprteur, et le programme sinterrompt la ligne 10,


en surbrillance. La variable c est maintenant dfinie et les valeurs de a et de b ont t changes.
Question 22.3 : Poursuivez lexcution jusqu la fin.

Exercice 23 : Excution pas pas dun programme


Une fois que vous avez dfini un point darrt, vous pouvez lancer lexcution en mode dbogage. Aprs la premire interruption, si vous souhaitez suivre la valeur des variables aprs chaque
instruction dans exception, il nest pas ncessaire de dfinir des points darrt pour chaque ligne
de code.
Question 23.1 : Enlevez les points darrt prcdents et nen placez quun seul, aprs lexcution
de la premire instruction.
Question 23.2 : Lancez lexcution en mode dbogage
Le programme sarrte avant deffecuer la seconde instruction. Dans le deuxime onglet de la
fentre de dbogage, on remarque quaucune variable nest dfinie pour linstant.
Question 23.3 : Poursuivez lexcution instruction par instruction :
Par le menu Debug > Single step
Par le bouton correspondant dans la barre doutils
Par le raccourci clavier F7
La valeur de a vous est demande ; a est dfinie comme une variable de valeur un .
Question 23.4 : Poursuivez lexcution du programme pas pas jusqu son terme par des appuis
rpts sur F7 , en regardant bien lvolution de la valeur des variables, en particulier entre les
lignes 7 et 9, o lchange proprement dit se produit.
Une fois que le programme a t arrt une fois un point darrt, il est possible de poursuivre lexcution de diffrentes manires : instruction par instruction comme ci-dessus, ou encore
jusquau curseur, ou dautres faons encore qui prendront leur sens lors des sances suivantes.

Bases de la programmation


22 

1re anne

Chapitre 2

Alternatives
2.1
2.1.1

Squentialit
Rappels

Les instructions sont excutes les unes la suite des autres. la fin de chaque instruction
excute, on passe la suivante, et ainsi de suite sans possibilit de revenir en arrire (au moins
de prime abord). Considrons, par exemple, les instructions suivantes :


1
2

b=5
a=b


Nous pouvons dessiner le graphe de squence suivant :

Figure 2.1 Rappels sur la squentialit


Dans lexemple de la Figure 2.1, on affecte la valeur 5 la variable b, puis on affecte le contenu
de la variable b la variable a.
Remarque : Laffectation de la ligne 2 crase le contenu de a mais ne modifie pas le contenu de
b.
I Sur ce thme : Exercice 1, TD2

2.1.2

Un peu de rflexion...

Daprs vous est-il possible de quitter une squence pour en emprunter une autre ? Si oui,
comment dcider du chemin suivre ?

2.2
2.2.1

Manipuler les boolens ou comment modliser une affirmation ?


Quest ce quun boolen ?

Un boolen permet de modliser une "affirmation" qui peut tre vraie (cest dire avre) ou
fausse. Pour cela nous disposons de deux valeurs (uniquement) possibles :
23

IUT de Villetaneuse

True est la valeur qui indique une valeur de vrit vraie,


False est la valeur qui indique une valeur de vrit fausse.
Par exemple,
A la proposition, "La terre est plate ?", la valeur boolenne est False,
et la proposition "Une vache est un mammifre ?", la valeur boolenne est True.

2.2.2

1

Expressions boolennes simples

Une expression boolenne simple dtermine la vrit True ou False dune affirmation. Exemple :

print(5>15)



Le code prcdent affiche la valeur False ; car laffirmation : "5 est strictement suprieur 15",
la rponse est False.
Il serait judicieux de pouvoir stocker une valeur boolenne dans un emplacement mmoire afin
de suivre lvolution dune situation. Par exemple un boolen pourrait suivre lvolution dune
temprature et rpondre laffirmation "la temprature est-elle suprieure 100C ?"...

2.2.3

Variables boolennes

Introduction
Une variable boolenne est un emplacement mmoire qui permet de stocker soit la valeur True,
soit la valeur False. Comme vous lavez vu dans le cours sur la squentialit, cet emplacement est
appel variable et dispose dun nom appel nom de variable.
Exemple :


1
2
3
4

a=True # On affecte la variable boolenne a la valeur True


b=False # On affecte la variable boolenne b la valeur False
c= 15>2
# On affecte la variable boolenne c la valeur True
print(c)



Avec le code prcdent, nous pouvons dduire le schma ci-dessous prcisant la dynamique des
variables :

Figure 2.2 Exemple dutilisation de variables boolennes

Oprations boolennes simples


Il est possible dutiliser les oprateurs boolens : <, <=, >, >=, ==, != pour comparer 2
expressions (de mme type ou de types compatibles). Le traitement se fait en deux tapes :
1. Les expressions sont values,
2. les rsultats sont compars.

1
2
3
4

Exemple :

x=20
y=13
z= x+3>y
print(z)

Bases de la programmation



24 

1re anne

Departement informatique

Figure 2.3 Dynamique des variables lors de lvaluation dune opration boolenne simple
Lexcution de linstruction de la ligne 3 du listing prcdent est reprsent par la figure 2.3.
Laffichage sera donc : True
Oprations boolennes composites
Cest une opration boolenne compose de plusieurs oprations boolennes simples. Lvaluation de ce type dexpression boolenne complexe se fait en deux tapes :
1. chaque opration boolenne simple est value,
2. lexpression boolenne composite rsultante est value suivant les tables de vrit suivantes :
exp1
True
True
False
False

exp2
True
False
True
False

not(exp2)
False
True

exp1 and exp2


True
False
False
False

exp1 or exp2
True
True
True
False

Figure 2.4 Principaux oprateurs logiques

2.2.4

Oprations boolennes quivalentes

Ce sont des expressions qui ont toujours la mme valeur de vrit :


Expressions boolennes quelconques :
e1==True
e1==False
not(e1 and e2)
not(e1 or e2)

<->
<->
<->
<->

e1
not(e1)
not(e1) or not(e2)
not(e1) and not(e2)

Relations avec les oprations boolennes :


not(e1<e2)
not(e1<=e2)
not(e1>e2)
not(e1>=e2)
not(e1==e2)
not(e1 !=e2)

<->
<->
<->
<->
<->
<->

e1>=e2
e1>e2
e1<=e2
e1<e2
e1 !=e2
e1==e2

I Sur ce thme : Exercice 2, TD2


I Sur ce thme : Exercice 3, TD2
1re anne


25 

Bases de la programmation

IUT de Villetaneuse

I Sur ce thme : Exercice 4, TD2


I Sur ce thme : Exercice 5, TD2

2.3

Comment faire des choix au sein dun algorithme ?

Lexcution dune squence dinstructions peut tre conditionne par le rsultat de lvaluation
dune expression boolenne.

2.3.1

Structure de contrle conditionnelle if

La structure de contrle conditionnelle if permet que certaines instructions soient excutes


uniquement si une expression boolenne est vraie. Sa syntaxe est la suivante :


1
2
3
4
5
6
7

I1
I2
if condition :
I4
I5
I6
I7

Les instructions des lignes 1 et 2 sont excutes. Puis, si condition est vrifie (valuation
de la condition True), alors les instructions des lignes 4 et 5 sont excutes. Dans tous les
cas, le programme excute ensuite les instructions des lignes 6 et 7. On dit que lexcution de la
squence des lignes 4 et 5 est conditionnelle. Le traitement de la structure if lors de lexcution du
programme est reprsent dans la figure 2.5. Les numros de la figure correspondent aux numros
de lignes du listing de code prcdent.
Remarque importante : Lindentation, cest--dire les espaces insrs avant une instruction, des lignes 4 et 5 est obligatoire. Cela permet linterprteur Python de distinguer le bloc
conditionnel. Ce bloc peut contenir autant dinstructions que ncessaire.

Figure 2.5 Principe de la structure if



1
2

Exemple :

temperature = int(raw_input())
pression=100

3
4
5
6

if temperature > 55 :
print(alerte)
#indentation obligatoire
pression = pression - 5 #indentation obligatoire
Bases de la programmation


26 

1re anne

Departement informatique

print(pression)

# cette instruction ne fait pas partie du "if"

Dans cet exemple, le programme affichera lcran le message alerte et diminuera la pression
de 5 uniquement si la temprature saisie par lutilisateur est strictement suprieure 55.
I Sur ce thme : Exercice 6, TD2

2.3.2

Structure de contrle conditionnelle if, else

Cette structure de contrle permet dexcuter une squence dinstructions si une condition est
remplie. Cependant, si cette condition nest pas remplie, une autre squence dinstructions est
excute.


1
2
3
4
5
6
7
8

if condition :
I1
I2
else:
I3
I4
I5
I6

# not(condition)

Si la condition condition est vrifie (valuation de la condition True), alors les instructions
des lignes 2 et 3 sont excutes, sinon (cest--dire si la condition est value False) la squence
dinstructions des lignes 5 et 6 est excute. Dans tous les cas, le programme excute ensuite
les instructions des lignes 7 et 8. Le traitement de la structure if, else lors de lexcution du
programme est reprsent dans la figure 2.6. Les numros de la figure correspondent aux numros
de lignes du listing de code prcdent.

1
F

2
5

3
6

Figure 2.6 Principe de la structure if, else



1
2

Exemple :

temperature = int(raw_input())
if temperature > 55 :
1re anne


27 

Bases de la programmation

IUT de Villetaneuse

3
4
5

print(alerte)
#indentation obligatoire
else :
print(Tout va bien au niveau de la temprature) #indentation obligatoire

Dans cet exemple, le programme affichera lcran le message alerte si la temprature saisie
par lutilisateur est strictement suprieure 55. Dans le cas contraire, il affichera lcran le
message Tout va bien au niveau de la temprature.

2.3.3

Structure de contrle conditionnelle if, elif, else

Les alternatives peuvent tre imbriques pour exprimer des choix "complexes" et exclusifs les
uns des autres, ce qui permet daffiner le traitement selon un contexte donn.
Linstruction elif, contraction de "else if" (sinon si), permet dexcuter un bloc dinstructions
si la condition associe est value True. Cependant, cette condition ne sera value que si
toutes les conditions du if et des elif prcdents ont t values False. Dans une structure
if, elif, else, on peut avoir autant dinstructions elif que ncessaire. Le traitement de la
structure if, elif, else lors de lexcution du programme est reprsent dans la figure 2.7. Les
numros de la figure correspondent aux numros de lignes du listing de code suivant.


1
2
3
4
5
6
7
8
9
10

I1
if condition1 :
I2
elif condition2 :
I3
elif condition3 :
I4
else :
I5
I6


1

2
F

4
F

6
F

10

Figure 2.7 Principe de la structure if, elif, else


Dans lexemple suivant, un message appropri est affich suivant la valeur de la temprature.
On remarque quil y a trois messages possibles qui peuvent tre affichs (danger dexplosion,
alerte, rgime normal).
Bases de la programmation


28 

1re anne

Departement informatique


1

temperature = int(raw_input())

2
3
4
5
6
7
8

if temperature > 75: # temperature > 75


print(danger d\explosion)
elif temperature > 55: # temperature > 55
print(alerte)
else:
# temperature <= 55
print(rgime normal)

et <= 75

I
I
I
I
I
I

Sur
Sur
Sur
Sur
Sur
Sur

1re anne

ce
ce
ce
ce
ce
ce

thme
thme
thme
thme
thme
thme

:
:
:
:
:
:

Exercice
Exercice
Exercice
Exercice
Exercice
Exercice

7, TD2
8, TD2
9, TD2
10, TD2
11, TD2
12, TD2


29 

Bases de la programmation

IUT de Villetaneuse

TD3 : Alternatives

Exercice 1 : Squences dinstructions



1
2
3
4
5

Que fait la squence suivante ?

x = 1
y = 2
print(x)
z = x+y
print(z)


Important : Vous prendrez soin de suivre pas pas lvolution des variables.

Exercice 2 : Evaluation dexpressions boolennes



1
2
3
4
5
6

Prvoir le rsultat des expressions boolennes (1), (2), (3) et (4) dans lalgorithme suivant :

x = 12
test =
test =
test =
test =
test =

x>12
x<11 or (x>40 and x<100)
x!=9
not(x>10 and x<=12) and x%2==0
x>=10 and test


Important : Vous prendrez soin de suivre pas pas lvolution des variables.

Exercice 3 : Exprimer des formules boolennes


Donner la formule boolenne (partie italique du texte) correspondante la condition de lalternative pour les noncs suivants :
sil fait beau ou que je suis en forme jirai me promener beau et enForme sont des boolens
si la moyenne est comprise entre 12 et 14 alors on dlivre la mention assez bien ;moyenne est
un rel.
sil fait trop chaud et quil ne pleut pas alors ouvrir la fentre ;tropChaud et pleuvoir sont
des boolens.
sil ne fait pas trop chaud ou quil pleut alors fermer la fentre ;tropChaud et pleuvoir sont
des boolens.
si je ne suis pas fatigu et que jai du courage jirai courir ;fatigue, courage sont des boolens
si je ne suis pas fatigu et que jai du courage jirai courir sauf sil pleut ou que la temprature nest pas comprise entre 12 et 25 degrs ;fatigue, courage, pleuvoir sont des boolens,
temprature est un entier.

Exercice 4 : Tic, tac !



1
2
3
4
5
6

Que fait le programme suivant ? Pensez suivre le contenu des variables.

flag
flag
flag
flag
flag
flag

=
=
=
=
=
=

False
not(flag)
not(flag)
not(flag)
not(flag)
not(flag)

Exercice 5 :
Bases de la programmation


30 

1re anne

Departement informatique

1. Saisir une valeur entire. Si cette dernire est paire et positive ou si cette valeur est impaire
et comprise entre 5 (inclus) et 25 (inclus), alors lexpression boolenne vaut True sinon False.
De plus vous afficherez le rsultat. Remarque : Il existe un oprateur appel modulo dont le
symbole est % qui permet de calculer le reste de la division euclidienne. Par exemple, 3%2
vaut 1.
2. Donner un jeu dessai (4 tests significatifs) et prvoir les rsultats.

Exercice 6 : Affichage de la valeur absolue dun nombre


crire un programme qui calcule et affiche la valeur absolue dun nombre.

Exercice 7 : Programme mystre



1
2

Que fait le programme suivant ?


Important : Suivez lvolution du contenu des variables sur papier :

interrupteur=False
intensite=1

3
4
5
6
7
8
9
10
11

interrupteur =False
intensite=0
interrupteur =not(interrupteur)
if interrupteur ==True:
print(lampe allumee)
intensite=intensite+1
else:
print(lampe eteinte)

12
13

interrupteur =not(interrupteur)

14
15
16
17
18
19

if interrupteur ==True:
print(lampe allumee)
intensite=intensite+1
else:
print(lampe eteinte)

20
21

interrupteur =not(interrupteur)

22
23
24
25
26
27

if interrupteur ==True:
print(lampe allumee)
intensite=intensite+1
else:
print(lampe eteinte)

28
29
30

interrupteur =not(interrupteur)

31
32
33
34
35
36

if interrupteur ==True:
print(lampe allumee)
intensite=intensite+1
else:
print(lampe eteinte)

37
38

interrupteur =not(interrupteur)

39
40
41
42
43

if interrupteur ==True:
print(lampe allumee)
intensite=intensite+1
else:
1re anne


31 

Bases de la programmation

IUT de Villetaneuse

44

print(lampe eteinte)

Exercice 8 :
crire un algorithme qui demande deux nombres entiers lutilisateur et qui calcule la diffrence
du plus grand nombre avec le plus petit nombre, quel que soit lordre de saisie.

Exercice 9 : Calcul de gabarit


On dfinit le gabarit dun objet en fonction de sa taille. Le gabarit peut prendre les valeurs
Grand, Moyen ou Petit (qui sont des chanes de caractres) selon que la taille, qui est un
nombre entier, est respectivement suprieure ou gale 10, comprise entre 4 (inclus) et 10 (non
inclus) ou strictement infrieure 4.
crire un programme qui demande lutilisateur la taille dun objet et affiche aprs lavoir
dtermin le garabit correspondant. On sattachera ne pas faire de test inutile.

Exercice 10 :
crire un algorithme qui demande lutilisateur lheure, les minutes et les secondes, et il
affichera lheure quil sera une seconde plus tard.
Par exemple, si lutilisateur tape 21 puis 32 puis 8, lalgorithme doit rpondre : "Dans une seconde,
il sera 21 heure(s) 32 minute(s) et 9 secondes".
NB : on suppose que lutilisateur entre une heure valide. Pas besoin donc de la vrifier.

Exercice 11 :
crire un algorithme qui demande 3 nombres entiers lutilisateur et qui les trie par ordre
croissant. Un affichage devra tre prvu.
Exemple : Si un instant donn trois variables sont initialises telles que :


1
2
3

a=4
b=7
c=1


alors aprs le traitement, les instructions suivantes :


print(a=+str(a)+ b=+str(b)+ c=+str(c))




afficheront :

a=1 b=4 c=7

Exercice 12 :
crire un algorithme qui calcule et affiche les racines relles dun polynme du second degr.
Prenez soin de bien analyser le problme, et posez-vous la question de savoir ce qui est demand
trs prcisment pour rpertorier les donnes du problme.
Rappel : Ce sont les racines relles de lquation a*x*x + b*x + c = 0

Bases de la programmation


32 

1re anne

Departement informatique

TP3 : Les alternatives

Exercice 13 : Eric le retour...


Dans cet exercice nous allons :
suivre lvolution des variables boolennes dun algorithme laide du dbogueur de Eric,
tester la validit des relations boolennes en changeant les donnes en entre.
Pour cela nous allons utiliser les Exercices 2 et 7.
Question 13.1 : Saisir lalgorithme de lExercice 2 et faire une excution pas pas comme vous
lavez appris lors du premier TP. Visualiser le contenu de la variable test. Changer la valeur de x
avec des valeurs significatives et refaire les essais.
Valeurs significatives : Valeurs que le programmeur devra choisir de faon pertinente afin de
valider un algorithme.
Question 13.2 : Saisir lalgorithme de lExercice 7 et faire une excution pas pas comme vous
lavez appris lors du premier TP. Visualiser le contenu des variables et rpondre aux questions
suivantes :
1. A quoi sert la variable interrupteur ?
2. Comment le programme agit-il sur la variable interrupteur ?
3. Quand la variable intensite est-elle modifie ?
4. En conclusion, quoi sert ce programme ?

Exercice 14 : Facture pour la reprographie


Un magasin de reprographie facture 0,10 Euro les dix premires photocopies, 0,09 Euro les
vingt suivantes et 0,08 Euro au-del. Ecrivez un algorithme qui demande lutilisateur le nombre
de photocopies effectues et qui affiche la facture correspondante. Vous veillerez faire le moins
possible de tests.

Exercice 15 : Limpt au pays de Zorglubland


Les habitants de Zorglubland paient limpt selon les rgles suivantes :
Les hommes de plus de 20 ans paient limpt,
les femmes paient limpt si elles ont entre 18 et 35 ans,
les autres ne paient pas dimpt,
le programme demandera donc lge et le sexe du Zorglubien, et se prononcera donc ensuite
sur le fait que lhabitant est imposable ou pas.

1re anne


33 

Bases de la programmation

IUT de Villetaneuse

Bases de la programmation


34 

1re anne

Chapitre 3

Boucles Simples
3.1

Introduction

Les boucles sont un lment central de la programmation. Elles permettent deffectuer un


mme ensemble dinstructions (affichages, affectations, calculs) plusieurs fois de suite. Les boucles
permettent donc dviter le copier/coller dun ensemble dinstructions. Ainsi, si je dois afficher
lcran 100 fois la phrase "hello world", je peux crire une seule fois linstruction print(hello
world) et spcifier que cette instruction doit tre effectue 100 fois par lordinateur. Le code
est ainsi plus concis et beaucoup plus rapide crire. De plus, avec les boucles, le nombre de
fois que ces instructions doivent tre rptes peut ne pas tre connu au moment de lcriture du
code (contrairement au copier/coller). Ainsi, il est possible par exemple de spcifier que certaines
instructions doivent tre rptes autant de fois quindiqu par une valeur saisie par lutilisateur.
Les boucles sont un raisonnement logique indpendant de la programmation et sont utilises
dans la vie quotidienne. En effet, lorsque lon est arrt un feu tricolore en voiture, le code de
la route spcifie "tant que le feu est rouge, je reste larrt". Cette spcification peut tre vue
comme une boucle. Linstruction "je reste larrt" est effectue autant de fois que ncessaire, et
ce, jusqu ce que la condition "le feu est rouge" soit fausse.
Le type de boucles prsent ici reprend le mme schma de raisonnement que lexemple cidessus. Cette boucle while (while signifiant "tant que" en anglais), scrit de la manire suivante :


1
2
3
4
5
6
7

Instruction 0
while(condition):
Instruction 1
Instruction 2
...
Instruction n
Instruction n+1

Remarque importante : Lindentation des instructions 1 n est obligatoire. Cela permet


linterprteur Python de distinguer le bloc dinstructions associ la boucle while.
Ce code indique que les instructions indentes par rapport au mot-cl "while" (i.e., les instructions 1 n) sont rptes tant que la "condition" est vraie. Ces instructions peuvent correspondre
du calcul, des affectations, des alternatives ou dautres boucles. Lordre dans lequel ces instructions sont excutes par lordinateur est reprsent dans la figure 3.1. Lorsque le programme
arrive linstruction while, il value la condition associe. Si cette dernire est vraie, alors les
instructions 1 n sont excutes puis la condition est de nouveau value. Lorsque la condition
est fausse, le programme excute directement linstruction n+1.
Chaque excution des instructions 1 n associes au while est appele itration. La condition
est trs souvent donne par la valeur dune variable dont on modifie la valeur chaque itration.
1. Les numros de la figure correspondent aux numros de lignes du code while prcdent.

35

IUT de Villetaneuse

Figure 3.1 Principe de la boucle while 1


Par exemple, si je souhaite afficher 4 fois la phrase "hello world", je peux donc considrer une
variable, dont la valeur est fixe initialement 0, et incrmenter cette variable de un chaque
itration. Le bloc dinstructions associ au while devra alors tre excut tant que la variable est
infrieure strictement 4. On obtient alors le code suivant :


1
2
3
4
5
6

1
2
3
4
5
6

print (********************)
i = 0
while(i <4 ):
print hello world
i += 1
print (********************)


Lexcution de ce code produit alors laffichage suivant :


********************
hello world
hello world
hello world
hello world
********************

Pour comprendre exactement ce qui se passe durant lexcution, excutons la main lexemple
prcdent. Les instructions sont alors les suivantes :
instruction 1 : affichage de ********************
instruction 2 : dfinition dune variable entire de valeur 0
instruction 3 : test (i < 4) avec i = 0 est vrai => excuter les instructions 4 et 5
instruction 4 : affichage de hello world
instruction 5 : modifie la valeur de la variable i : i vaut 1
boucle instruction 3 : test (i < 4) avec i = 1 est vrai => excuter les instructions 4 et 5
instruction 4 : affichage de hello world
instruction 5 : modifie la valeur de la variable i : i vaut 2
boucle instruction 3 : test (i < 4) avec i = 2 est vrai => excuter les instructions 4 et 5
instruction 4 : affichage de hello world
instruction 5 : modifie la valeur de la variable i : i vaut 3
boucle instruction 3 : test (i < 4) avec i = 3 est vrai => excuter les instructions 4 et 5
instruction 4 : affichage de hello world
instruction 5 : modifie la valeur de la variable i : i vaut 4
boucle instruction 3 : test (i < 4) avec i = 4 est faux => excuter linstruction 6 (et suivantes)
instruction 6 : affichage de ********************
I Sur ce thme : Exercice 1, TD3
Bases de la programmation


36 

1re anne

Departement informatique

I Sur ce thme : Exercice 2, TD3

3.2

Construire une boucle : exemple simple

Dans cette partie, nous montrons le raisonnement relatif llaboration dune boucle simple.
Nous nous concentrons sur lcriture dun programme permettant dafficher tous les nombres pairs
entre 1 et 10 inclus. Le premier code venant lesprit est donc le suivant :


1
2
3
4
5

1
2
3
4
5
6
7
8
9
10

print(2)
print(4)
print(6)
print(8)
print(10)



Cependant, cest loin dtre la meilleure technique ! De plus, si la question consiste afficher tous
les nombres pairs entre 1 et 10000 inclus, cette technique necessitera plusieurs heures pour crire
le programme ! Par ailleurs, comme il est clair que lon rpte plus ou moins la mme instruction,
savoir afficher un nombre, il est possible (en modifiant lgrement le code), dutiliser une boucle
pour afficher ces nombres pairs.
Afin de pouvoir crer une boucle, il faut que les instructions effectues chaque itration soient
identiques. Pour cela, il convient tout dabord de modifier le programme afin de faire en sorte que
les affichages soient strictement identiques. On utilise alors une variable, disons i, pour stocker la
partie qui ne se rpte pas (2, 4,...,10). Ainsi, laffichage devient identique pour tous les nombres,
savoir print(i). Le code est alors le suivant :


i = 2
print(i)
i = 4
print(i)
i = 6
print(i)
i = 8
print(i)
i = 10
print(i)

On rpte bien 5 fois la mme instruction print(i). Par contre, on effectue 5 affectations
diffrentes de la variable i. Mais on se rend finalement compte que laffectation consiste ajouter
deux la valeur de i. On peut donc remplacer les 5 affectations diffrentes par laffectation i+=2.
Pour que cela soit toujours vrai, il faut par contre que i soit initialement gal 0. On obtient alors
le code suivant :


1

i = 0

2
3
4

i += 2
print(i)

5
6
7

i += 2
print(i)

8
9
10

i += 2
print(i)

11
12
13

i += 2
print(i)

14
15

i += 2
1re anne


37 

Bases de la programmation

IUT de Villetaneuse

16

1
2
3
4

1
2
3
4

print(i)



Dans ce code, il y a bien un bloc de deux instructions rpt 5 fois. Avant le dernier bloc dinstructions (ligne 14), la variable i est gale 8. On rpte donc ces instructions tant que la variable
i est infrieure ou gale 8. Nous pouvons donc remplacer ce code par la boucle :


i = 0
while (i <= 8) :
i += 2
print(i)


La difficult de llaboration dune boucle vient du fait quil faut tre capable de modifier
les instructions afin quelles soient identiques. Lexemple prsent ici est simple si lon comprend
que la variable i est incrmente de deux chaque itration. Cette "transformation" du code (en
instructions identiques) peut cependant tre difficile si lon na pas la bonne "intuition".
Dans le code prcdent, chaque itration, on effectue dabord lincrmentation de la variable i
puis laffichage de i. Lordre dans lequel ces deux instructions est fait est compltement arbitraire.
On pourrait, tout aussi bien considrer qu chaque itration, on affiche dabord i avant de lincrmenter. Comme on souhaite dabord afficher 2, il faut par contre affecter la valeur 2 i avant
la boucle while. De plus, comme le dernier entier afficher est 10, il est ncessaire deffectuer le
bloc dinstruction tant que i est infrieur ou gal 10. On obtient alors le code suivant :


i = 2
while (i <= 10) :
print(i)
i += 2

I Sur ce thme : Exercice 3, TD3


I Sur ce thme : Exercice 4, TD3

3.3

Construire une boucle : autre exemple

Jusqu maintenant, dans les diffrents exemples de boucles que nous avons vus, le nombre
ditrations tait connu lavance. Cependant, ceci nest pas toujours vrai. Dans ce cas, il nest
plus possible de choisir une variable et de la modifier jusqu ce quelle atteigne une certaine
valeur. Dautres types de conditions associes au while sont ncessaires. Pour illustrer ceci, nous
nous intressons lcriture dun programme permettant de calculer la moyenne dun tudiant.
Le nombre de notes dun tudiant nest pas connu lavance. Lutilisateur doit saisir au clavier
les diffrentes notes (nombres rels compris entre 0.0 et 20.0). Le programme doit arrter la saisie
lorsque le nombre saisi par lutilisateur ne correspond pas une note. Il doit alors afficher la
moyenne des notes saisies.
Comme lutilisateur peut saisir plusieurs notes (par exemple 10), il y a forcment une rptition
de linstruction de saisie dun nombre, cest--dire, de linstruction nb = float(raw_input()).
De plus, cette saisie doit continuer tant que le nombre saisi correspond une note, cest--dire,
tant que la variable nb est suprieure ou gale 0.0 et infrieure ou gale 20.0. Une bauche de
la boucle est alors la suivante :


1
2

while ((nb >= 0) and (nb <= 20)) :


nb = float(raw_input())

La saisie de nombre ne suffit pas. Afin de calculer la moyenne de plusieurs notes, il faut connatre
le nombre total de notes ainsi que la somme de ces notes. Il faut donc deux nouvelles variables, une
correspondant au nombre de notes que lon appelera compteur, et une correspondant la somme
des notes (variable somme). chaque itration, il faut donc incrmenter la variable compteur,
ajouter somme la variable nb et demander nouveau que lutilisateur saisisse un nombre. La
boucle devient alors
Bases de la programmation


38 

1re anne

Departement informatique


1
2
3
4

1
2
3
4
5
6
7

while ((nb >= 0) and (nb <= 20)) :


compteur += 1
somme += nb
nb = float(raw_input())



Attention, lordre est trs important ! Comme lutilisateur peut saisir un nombre qui ne corresponde
pas une note, il est ncessaire que lon vrifie que nb est une note avant de lajouter somme.
Pour cela, la saisie de nb est la dernire instruction du while. Si ce nombre est une note, autrement
dit, si la condition du while est vraie, alors on incrmente compteur de un et on ajoute la dernire
note saisie somme litration suivante.
Il faut alors maintenant considrer les valeurs initiales des variables. En effet, lors du premier
test du while, la variable nb nest pas dfinie. Elle doit correspondre la premire note saisie par
lutilisateur. Il faut donc ajouter avant la boucle linstruction nb = float(raw_input()). Il faut
galement donner des valeurs initiales pour compteur et somme. Afin que le rsultat soit correct,
il faut les initialiser 0. On a alors


nb = float(raw_input())
compteur = 0
somme = 0
while ((nb >= 0) and (nb <= 20)) :
compteur += 1
somme += nb
nb = float(raw_input())

la fin de cette boucle, les variables somme et compteur correspondent respectivement la


somme des notes saisies et leur nombre. Pour afficher la moyenne, il faut donc afficher print(La
moyenne est + str(somme/compteur)). Cependant, il faut imprativement que le programme
fonctionne quelles que soient les notes saisies par lutilisateur. Il est donc possible que lutilisateur
ne saisisse aucune note. Dans ce cas, compteur est nul et laffichage engendre une division par 0,
gnrant alors une erreur. Un test sur le nombre de notes saisies est alors ncessaire. Le code aprs
la boucle est alors


1
2
3
4

if(compteur==0) :
print(Aucune note n\a ete saisie. On ne peut donc pas calculer la moyenne!!!)
else :
print(La moyenne est + str(somme/compteur))

I Sur ce thme : Exercice 5, TD3


I Sur ce thme : Exercice 6, TD3
I Sur ce thme : Exercice 7, TD3

3.4

Boucles infinies

Les boucles infinies sont des boucles dont les instructions sont excutes une infinit de fois. De
telles boucles interviennent lorsque la condition du while est toujours vraie. Elles correspondent
une erreur de programmation et ne sont pas dtectes par lordinateur. De telles erreurs sont dues
soit une mauvaise initialisation de la ou des variables intervenant dans la condition, soit un
mauvais test. Voici un exemple de boucle infinie :


1
2
3
4

i = 1
while (i != 10) :
i += 2
print(i)



Un peu (ou beaucoup !) de reflexion avant lcriture de la boucle permet dviter de telles boucles
infinies.
1re anne


39 

Bases de la programmation

IUT de Villetaneuse

TD4 : Boucles simples

Exercice 1 :

1
2
3
4
5
6

Effectuer la trace de ce programme :

i = 10
nb = 1
while (i<5) :
i += 1
nb += 2 * i
print (nb = + str(nb))

Mme question lorsque la premire instruction est respectivement remplace par linstruction i =
0 et i = 3.

Exercice 2 :

1
2
3
4
5
6
7

Effectuer la trace de ce programme :

i = 12
j = 43
print (i = + str(i) + , j = + str(j))
while ((i<25) and (j > 3 * i)) :
i += 3
j -= i - 18
print (i = + str(i) + , j = + str(j))

Exercice 3 :
Afficher les entiers de 1 20 dans lordre dcroissant.

Exercice 4 :
Afficher la table de multiplication de 7 jusqu 20 comme suit :
1*7=7
2 * 7 = 14
...
19 * 7 = 133
20 * 7 = 140

Exercice 5 :
crire un programme demandant lutilisateur de saisir un nombre entier positif. La saisie
sera rpte jusqu ce que le nombre soit positif. Mme question pour un nombre entier positif
et multiple de 3.

Exercice 6 :
crire un programme permettant de vrifier si un nombre saisi par lutilisateur est premier.
Rappel : Un nombre est dit premier si ses deux seuls diviseurs entiers positifs sont 1 ou lui-mme.
Le nombre 13 est donc un nombre premier, alors que 6 ne lest pas puisque 6 = 2 3.

Exercice 7 :
(Exercice bas sur un exercice donn en IUT de mesures physiques Orsay.)
Bases de la programmation


40 

1re anne

Departement informatique

crire un programme demandant lutilisateur un nombre compris entre 1 et 50 et affichant


ce nombre en chiffres romains.

1re anne


41 

Bases de la programmation

IUT de Villetaneuse

TP4 : Boucles et dessins

Exercice 8 :
crire un programme simulant le lanc de 5 ds. Afficher le rsultat de chaque d ainsi que la
somme des 5 lancs obtenus. Pour simuler un lancer de d, on gnre un nombre alatoire compris
entre 1 et 6 inclus. Cela seffectue en python laide de linstruction tmp = randint(1,6) qui
affecte la variable tmp un nombre entier alatoire entre 1 et 6 inclus. Afin de pouvoir utiliser
cette instruction, il est ncessaire dajouter en dbut de programme linstruction from random
import *.

Exercice 9 :
crire un programme permettant de calculer la factorielle dun nombre saisi par lutilisateur.
Rappel : si n est un entier positif, alors la factorielle de n, note n!, est gale :
n! = n (n 1) (n 2) 2 1
Par convention, 0! = 1.

Exercice 10 :
crire un programme qui, pour tout entier compris entre 1 et 10, affiche sur une mme ligne,
les valeurs de cet entier, de son carr et de son cube. Laffichage doit donc tre quivalent :
1
1
1
2
4
8
3
9
27
4 16
64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
Afin dobtenir laffichage correct, il est possible de spcifier en python le nombre de caractres
utiliser pour afficher une chane de caractres, cette chane tant alors justifie droite. Pour
cela, il suffit dutiliser linstruction rjust(str,n) o str est une chane de caractres et n est le
nombre de caractres utiliser pour laffichage de str. Afin de pouvoir utiliser cette instruction,
il est ncessaire dajouter en dbut de programme linstruction from string import *. titre
dexemple, les instructions suivantes
from string import *
print (x)
print (rjust(x,2))
print (rjust(x,3))
nb = 1
print (rjust(str(nb),3))
nb = 10
print (rjust(str(nb),3))
nb = 100
print (str(nb))
correspondent laffichage :
Bases de la programmation


42 

1re anne

Departement informatique

x
x
x
1
10
100

Exercice 11 :
En utilisant linstruction rjust(n) explique prcdemment, crire un programme reproduisant
laffichage suivant :
*
*
*
*
*
*
*
*
*
*
*

Exercice 12 : Utilisation de Turtle


Reproduire laide du module turtle les figures ci-dessous. Le module Turtle permet de dessiner

lcran des figures. Afin de pouvoir uiliser ce module, il faut ajouter, en dbut de programme,
linstruction : from turtle import *. On peut alors utiliser les instructions suivantes pour dessiner :
goto(x,y) : aller lendroit de coordonnes x et y,
1re anne


43 

Bases de la programmation

IUT de Villetaneuse

forward(distance) : avancer dune distance donne,


up() : relever le crayon (pour pouvoir avancer sans dessiner),
down() : abaisser le crayon (pour pouvoir recommencer dessiner),
left(angle) : tourner gauche dun angle donn (exprim en degr),
right(angle) : tourner droite.
titre dexemple, regarder ce que donne le code :

1
2
3
4
5

from turtle import *


forward(100)
left(90)
forward(50)
goto(0, 0)

Exercice 13 : Utilisation de Turtle (suite)


crire un programme demandant un nombre compris entre 3 et 10 lutilisateur et affichant,
laide du module turtle, un polygone ayant un nombre de cts gal la valeur saisie par
lutilisateur.

Bases de la programmation


44 

1re anne

Chapitre 4

Tableaux
Les variables que nous avons utilises jusqu maintenant ne permettent de stocker quune
seule donne par variable. Ainsi, si je dois stocker le score de deux joueurs, je dois donc crer deux
variables, par exemple scoreJoueur1 et scoreJoueur2. Si ce moyen est possible pour quelques
donnes, il nest par contre pas possible dutiliser une variable par donne stocker lorsque le
nombre de donnes est trs grand. En effet, si lon doit stocker le score de 1000 joueurs, il est
impossible dcrire un algorithme utilisant 1000 variables, chacune stockant le score dun des
joueurs. Dans ce cas, il est ncessaire dutiliser les tableaux.
Un tableau est un type de donnes contenant plusieurs valeurs. Ces valeurs peuvent tre de
diffrents types (entiers, rels, chanes de caractres). Un tableau est dfini par les symboles [ et ].
Entre ces crochets sont dfinies les valeurs contenues dans le tableau. Ces valeurs sont spares par
une virgule et sont appeles lments du tableau. Le tableau [abc, True, 12.3, 3] contient 4
lments, respectivement de type chane de caractres, boolen, rel et entier.

4.1

Variables de type tableau et accs aux lments

Comme pour les autres types de donnes, les tableaux peuvent tre stocks dans une variable.
Ceci se fait en affectant une variable un tableau. Ainsi, linstruction


1

1
2
3
4
5

1
2
3
4

tab = [bonjour,au revoir,salut]



dfinit un tableau contenant trois chanes de caractres qui est affect la variable de nom tab.
On peut accder aux lments dun tableau affect une variable par leur numro de position
dans celui-ci ; on appelle ce numro indice du tableau. Il suffit pour cela de donner le nom de la variable de type tableau suivi de lindice entre crochets. On obtient alors variableTableau[indice].
Une chose est cependant retenir : lindice dun tableau de n lments commence 0 et se termine n 1. On peut accder un lment dun tableau pour connatre sa valeur ou la modifier.
Lexcution du code (o tab est la variable dfinie prcdemment)


print(le premier lment du tableau tab est : + tab[0])
print(le deuxime lment du tableau tab est : + tab[1])
print(le troisime lment du tableau tab est : + tab[2])
tab[0] = hello
print(le premier lment du tableau tab est maintenant : + tab[0])


produira laffichage suivant

le
le
le
le




premier lment du tableau tab est : bonjour


deuxime lment du tableau tab est : au revoir
troisime lment du tableau tab est : salut
premier lment du tableau tab est maintenant : hello

45

IUT de Villetaneuse

Il est galement possible de dfinir la position de llment par rapport la fin du tableau.
Pour accder au ime lment du tableau partir de la fin, on utilise alors variableTableau[-i].
On parle alors dindice ngatif. Attention :
afin quil ny ait pas dambugut avec les indices, lindice ngatif dun tableau de n lments
commence -1 et se termine n
lexistence dindices ngatifs est une spcificit de Python. La plupart des langages nacceptent quun seul indice par position du tableau.
Lexcution du code (o tab est la variable dfinie prcdemment)

1
2
3

1
2
3

print(le dernier lment du tableau tab est : + tab[-1])


print(l\avant dernier lment du tableau tab est : + tab[-2])
print(le premier lment du tableau tab est : + tab[-3])


produira laffichage suivant





le dernier lment du tableau tab est : salut


lavant dernier lment du tableau tab est : au revoir
le premier lment du tableau tab est : bonjour

I Sur ce thme : Exercice 1, TD4

4.2

Affichage dun tableau

Comme les autres types de donnes, il est possible dafficher un tableau laide de la fonction
print(). Ainsi, lexcution du code


1
2

animaux = [girafe,hippopotame,singe,chat]
print(animaux)


affichera lcran [girafe,hippopotame,singe,chat].

Il est galement possible dutiliser la fonction str() afin de transformer le tableau en une
chane de caractres. Cette chane est alors identique au rsultat de la fonction print(). En effet,
en plus des lments, la chane de caractres contient les crochets et les virgules. De plus, les
lments du tableau correspondant des chanes de caractres sont encadrs par des apostrophes.
Lintrt de la fonction str() est de pouvoir afficher des chanes de caractres contenant la valeur
dun tableau. Ainsi, linstruction print(le tableau vaut : + str(animaux)) affichera le
tableau vaut : [girafe,hippopotame,singe,chat].

4.3

Nombre dlments et parcours dun tableau

La fonction len() permet de donner le nombre dlments dun tableau. Il faut par contre
donner entre les parenthses le nom du tableau dont on veut connatre le nombre dlments.
Lexcution de linstruction print(len(tab)) affichera alors 3 puisque le tableau tab contient 3
lments, savoir bonjour, au revoir, et salut.
Il est trs souvent ncessaire daccder tous les lments dun tableau, que ce soit pour calculer
la somme des lments du tableau (si ces derniers sont des nombres), dterminer le plus grand
lment ou pour savoir si une valeur apparat dans un tableau. Pour accder tous les lments
dun tableau, une faon consiste utiliser une boucle while en faisant varier lindice de 0 la
longueur du tableau - 1. Ainsi, le code suivant permet dafficher tous les lments dun tableau,
les uns en dessous des autres.


1
2
3

animaux = [girafe,hippopotame,singe,chat]
print(Voici les animaux contenus dans le tableau)
indice = 0
Bases de la programmation


46 

1re anne

Departement informatique

4
5
6

while indice < len(animaux) :


print(animaux[indice])
indice = indice + 1

I Sur ce thme : Exercices 2, 3 et 4, TD4

4.4

Oprateurs + et *

Les tableaux, tout comme les chanes, supportent les oprations de concatnation (oprateur +)
et de rptition (oprateur *). Lopration de concatnation t1 + t2, lorsque t1 et t2 sont des
tableaux, cre un nouveau tableau dont les lments correspondent aux lments de t1 suivis des
lments de t2. Lopration de rptition t * n, o t est un tableau et n est un entier positif ou
nul, cre un nouveau tableau de taille n * len(t) dont les lments correspondent aux lments
de t rpts n fois. Ainsi, lexcution du code


1
2

1
2

print([a,1,-3] + [coucou,24,12])
print([0,1] * 6)


produit laffichage





[a, 1, -3, coucou, 24, 12]


[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

Lopration de rptition est notamment utile pour crer un tableau dont tous les lments ont
la mme valeur.
I Sur ce thme : Exercice 5, TD4

4.5

Affectation dune variable de type tableau une autre


variable de type tableau

Le type tableau modifie quelque peu loprateur daffectation lorsque loprande de droite est
une variable de type tableau. En effet, si lon a linstruction t2 = t, o t est une variable de type
tableau, la variable t2 contient alors exactement le mme tableau que la variable t ! Ceci implique
que si lon modifie un lment de t, on modifie en mme temps le tableau t2, et vice versa. Ainsi,
lexcution du code


1
2
3
4
5

1
2

1
2
3
4
5

t = [1,2,3]
t2 = t
t[0] = 18
print(t)
print(t2)


produit laffichage





[18, 2, 3]
[18, 2, 3]


Ceci nest vrai que si lon affecte la variable t2 une variable de type tableau. Si lon affecte
t2 un autre tableau (mme si ce nouveau tableau est identique t), le "problme" napparat
plus. Par exemple, le code


t = [1,2,3]
t2 = [1,2,3] #ou t2 = t * 1 ou t2 = t + []
t[0] = 18
print(t)
print(t2)

1re anne



47 

Bases de la programmation

IUT de Villetaneuse

produira, aprs excution, laffichage



1
2

[18, 2, 3]
[1, 2, 3]

I Sur ce thme : Exercice 6, TD4

4.6

Oprateur in

Loprateur in permet de tester si une valeur apparat dans un tableau. Il sutilise selon le
modle valeur in tableau et renvoie True si la valeur apparat dans le tableau et False sinon.
Par exemple, en excutant le code


1
2
3
4
5
6
7
8
9
10
11
12

1
2
3

liste = [18.4,ab,33,12]
if 19 in liste :
print(19 est une valeur du tableau)
else :
print(19 n\est pas une valeur du tableau)
if 33 in liste :
print(33 est une valeur du tableau)
else :
print(33 n\est pas une valeur du tableau)
nb = 12
if nb in liste :
print(Un lment du tableau a la mme valeur que nb)


On obtient alors





19 nest pas une valeur du tableau


33 est une valeur du tableau
Un lment du tableau a la mme valeur que nb

4.7

Boucle for

Nous avons vu prcdemment comment parcourir un tableau avec une boucle while en faisant
varier lindice. Il existe cependant une autre faon de parcourir le tableau, qui consiste affecter
successivement une variable la valeur de tous les lments du tableau. Ce type de parcours se fait
laide de linstruction for val in tab :, o val est une variable et tab est un tableau. Cette
instruction peut se traduire par "pour la variable val prenant successivement toutes les valeurs
apparaissant dans le tableau tab, faire". Lexemple suivant permet dafficher tous les lments
dun tableau, les uns en dessous des autres. (On remarque que le code donne exactement le mme
rsultat que dans lexemple donn avec la boucle while.)


1
2
3
4

animaux = [girafe,hippopotame,singe,chat]
print(Voici les animaux contenus dans le tableau)
for animal in animaux :
print(animal)

Lutilisation de la boucle for permet dcrire un code plus clair et plus rapide pour le parcours
dun tableau. Attention, il convient de bien comprendre la diffrence entre la boucle while et la
boucle for dcrites ci-dessus. La premire utilise dans le test une variable correspondant lindice
du tableau et accde aux lments grce tableau[indice] alors dans la boucle for, la variable
utilise par la boucle prend "directement" la valeur des lments du tableau.
Attention, dans la boucle for, la variable de boucle prend successivement la valeur de tous les
lments du tableau, mais elle ne reprsente pas llment lui-mme. Ceci implique que mme si
lon modifie la variable lintrieur de la boucle, le tableau nest pas modifi. Par exemple, la
fin de lexcution du code
Bases de la programmation


48 

1re anne

Departement informatique


1
2
3

t = [1,2,3,4]
for nb in t :
nb = nb +10


le tableau affect la variable t na pas t modifi. Il est toujours gal [1,2,3,4].
I Sur ce thme : Exercice 7, TD4

4.8

Fonctions de modifications dun tableau

Il existe diffrentes fonctions permettant de modifier un tableau. (Ces fonctions ne crent pas
un nouveau tableau.) Les noms de ces fonctions respectent le modle list.nomFonction car elles
sappliquent aux tableaux (traduction de list).
list.insert(tab,ind,val) : insre dans le tableau tab un lment de valeur val lindice
ind
list.pop(tab,ind) : supprime dans le tableau llment qui se trouve lindice ind
list.sort(tab) : trie le tableau tab
list.reverse(tab) : inverse lordre des lments du tableau tab
Lexcution du code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

1
2
3
4
5
6
7
8

x = [132,18,24]
print(x)
list.insert(x,0,36)
print(x)
list.insert(x,1,-6)
print(x)
list.insert(x,1,ze)
print(x)
list.pop(x,3)
print(x)
list.pop(x,3)
print(x)
list.sort(x)
print(x)
list.reverse(x)
print(x)


donne laffichage suivant





[132, 18, 24]


[36, 132, 18, 24]
[36, -6, 132, 18, 24]
[36, ze, -6, 132, 18, 24]
[36, ze, -6, 18, 24]
[36, ze, -6, 24]
[-6, 24, 36, ze]
[ze, 36, 24, -6]

I Sur ce thme : Exercice 8, TD4

4.9

Cration automatique de tableaux dentiers

La fonction range() permet de crer des tableaux dentiers (et dentiers uniquement) de manire simple et rapide. Elle fonctionne sur le modle : range([dbut,] fin[, pas]). Elle cre
alors un tableau contenant tous les entiers entre dbut compris et fin non compris, selon le pas
pas. Les arguments entre crochets sont optionnels. Si largument dbut nest pas spcifi, il est
alors considr comme gal 0. Si le pas pas nest pas spcifi, il est alors considr comme gal
1re anne


49 

Bases de la programmation

IUT de Villetaneuse

1. Attention, si seulement deux arguments sont spcifis, ils correspondent alors aux arguments
dbut et fin. En excutant le code


1
2
3
4
5

1
2
3
4
5

1
2

1
2
3
4

print(range(0,10))
print(range(10))
print(range(15,21))
print(range(0,1000,100))
print(range(2,-5,-1))


on obtient laffichage





[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[15, 16, 17, 18, 19, 20]
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
[2, 1, 0, -1, -2, -3, -4]


La fonction range() est aussi utile pour crer une boucle for. Ainsi, pour excuter 10 fois une
instruction, par exemple afficher bonjour, il est possible dutiliser les instructions


for nb in range(10) :
print(bonjour)


En effet, linstruction print(bonjour) sera effectue pour chaque valeur prise par la variable
nb. Or, dans ce cas, nb prend successivement comme valeur tous les lments du tableau range(10),
savoir : 0, 1, ..., 9.
De la mme faon, la fonction range() permet de crer une boucle for qui parcourt les indices
dun tableau. Lexemple suivant permet dafficher tous les lments dun tableau, les uns en dessous
des autres. (On remarque que ce code donne exactement le mme rsultat que dans les deux
exemples donns prcdemment pour la boucle while et la boucle for.)


animaux = [girafe,hippopotame,singe,chat]
print(Voici les animaux contenus dans le tableau)
for indice in range(len(animaux)) :
print(animaux[indice])

En effet, range(len(animaux)) correspond au tableau [0,1,2,3]. Les diffrents lments de ce


tableau correspondent aux diffrents indices des lments de animaux. La variable indice prend
alors successivement les valeurs 0, 1, 2 puis 3. Pour chacune des valeurs de indice, on affiche
llment du tableau animaux qui apparat lindice indice.
I Sur ce thme : Exercices 9 et 10, TD4

4.10

Chanes de caractres

Les chanes de caractres peuvent tre considres comme des tableaux. Il est donc possible
daccder aux caractres grce leurs indices et de crer de nouvelles chanes de caractres
laide des tranches et des oprations de concatnation et de rptition. Cependant, ces tableaux
sont constants, cest--dire quil nest pas possible de modifier les lments (i.e., les caractres).
Linstruction ch[0] = a nest donc par exemple pas permise si ch est une chane de caractres.
Par ailleurs, la fonction print() naffiche pas la chane sous forme de tableau (Laffichage ne
contient donc ni les crochets, ni les apostrophes). Lexcution du code


1
2
3
4

ch = bonjour
print(ch)
print(ch[0])
print(ch[3] + ch[-1])


affiche alors

Bases de la programmation



50 

1re anne

Departement informatique


1
2
3

bonjour
b
jr

Comme les chanes de caractres sont des tableaux constants, si lon souhaite modifier un
caractre, il faut alors construire une nouvelle chane. Par exemple, si lon souhaite afficher la
chane ch en remplaant le caractre la position 3 par la lettre k, on peut alors par exemple
utiliser linstruction print(ch[0] + ch[1] + ch[2] +k + ch[4] + ch[5] + ch[6]).
I Sur ce thme : Exercices 11, 12 et 13, TD4

1re anne


51 

Bases de la programmation

IUT de Villetaneuse

TD5 : Tableaux

Exercice 1 :
Affecter une variable appele semaine un tableau contenant les jours de la semaine. Afficher
le premier lment et le dernier lment de semaine en utilisant successivement les indices et les
indices ngatifs.

Exercice 2 :
Reprendre la variable semaine dfinie dans lexercice 1. Afficher les jours de la semaine en
indiquant devant le numro du jour. Laffichage doit tre quivalent :


1
2
3
4
5
6
7

1
2
3
4
5
6
7

lundi
mardi
mercredi
jeudi
vendredi
samedi
dimanche

Inverser ensuite lordre daffichage (commencer par le dimanche pour finir par le lundi) (deux
parcours dindices diffrents avec une boucle while).

Exercice 3 :
Affecter la variable tab le tableau [5,6,8,14,17]. Calculer ensuite la somme des nombres
de ce tableau et lafficher.

Exercice 4 :
crire un programme qui recherche le plus grand lment prsent dans un tableau donn. Par
exemple, si le tableau est gal [32, 5, 12, 8, 3, 75, 2, 15], ce programme doit afficher :
le plus grand lment du tableau a la valeur 75.

Exercice 5 :
crire un programme qui permet un utilisateur de saisir les notes dun tudiant et de les
stocker dans un tableau. La saisie sarrte lorsque lutilisateur a saisi un nombre strictement
infrieur 0 ou strictement suprieur 20. Afficher alors le tableau si celui-ci nest pas vide.

Exercice 6 :

1
2
3
4
5
6
7
8
9

Donner la valeur des variables t1, t2 et t3 aprs excution du code

t1= [a, b, c, d]
t2 = [34, 31, 957]
t3 = t1
t3[1] = -3
t1 = t2
t2[0] = abc
t3 = t2 + []
t2[0] = bonjour
t3[2] = oui

Exercice 7 :
Bases de la programmation


52 

1re anne

Departement informatique

Modifier le code des exercices 3 et 4 en utilisant la boucle for la place de la boucle while.

Exercice 8 :
Soit la variable de type tableau x = [34,-2,0,39,0,78,0,0,46]. Supprimer toutes les valeurs
nulles de ce tableau puis lafficher dans lordre dcroissant.

Exercice 9 :
Utiliser la fonction range() pour afficher :
les entiers de 0 3
les entiers de 4 7
les entiers de 2 8 par pas de 2

Exercice 10 :
Modifier le code de la premire question de lexercice 2 en utilisant la boucle for la place de
la boucle while.

Exercice 11 :
Considrons la chane s = bonjour. Quel est le nombre dlments de [s] ?
crire un programme qui cre, partir dune chane de caractres, disons s = bonjour,
un tableau tab dont les lments sont les lettres de la chane de caractres s. Crer ensuite une
chane de caractres s2, dont les lettres sont les lments de tab. Les chanes s et s2 doivent tre
quivalentes. Donner le rsultat produit par laffichage de s, tab et s2.

Exercice 12 :
Saisir une chane de caractres et lafficher en remplaant toutes les voyelles par un tiret.
Ainsi, si la chane saisie est Il fait beau aujourdhui, le programme doit afficher -l ft bjrdh

Exercice 13 :
Faire saisir lutilisateur une chane de caractres et tester si cette chane correspond un
entier positif ou ngatif.

1re anne


53 

Bases de la programmation

IUT de Villetaneuse

TP5 : Tableaux

Exercice 14 :
Voici les notes dun tudiant sous forme dun tableau : [8, 4, 12, 11, 9, 14, 19, 11, 19,
4, 18, 12, 19, 3, 5]. crire un programme qui affiche la note maximum, la note minimum et
et la moyenne de cet tudiant. Amliorer le programme ajoutant la mention : redoublement (< 10),
passable (entre 10 et 12), assez-bien (entre 12 et 14), bien (entre 14 et 16) et trs bien (suprieur
ou gal 16).

Exercice 15 :
Considrons les variables suivantes suivantes :
joursMois = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
nomMois = [Janvier, Fvrier, Mars, Avril, Mai, Juin, Juillet,
Aot, Septembre, Octobre, Novembre, Dcembre]
crire un programme qui cre un nouveau tableau. Celui-ci devra contenir tous les lments
des deux tableaux en les alternant, de telle manire que chaque nom de mois soit suivi du nombre
de jours correspondant : [Janvier,31,Fvrier,28,Mars,31, etc...].

Exercice 16 :
Ecrivez un programme qui permet dafficher les tailles des prnoms suivant : Jean-Michel,
Marc, Vanessa, Anne, Maximilien, Alexandre-Benoit, Louise

Exercice 17 :
crire un programme qui cre, partir dun tableau de chanes de caractres, deux nouveaux
tableaux. Lun contiendra les mots comportant moins de 6 caractres, lautre les mots comportant 6 caractres ou davantage. Si le tableau donn est [Jean, Maximilien, Brigitte,
Sonia, Jean-Pierre, Sandra], les deux tableaux crs doivent tre : [Jean, Sonia]
et [Maximilien, Brigitte, Jean-Pierre, Sandra].

Exercice 18 :
crire un programme permettant lutilisateur de saisir un mot et indiquant si ce mot apparat dans le tableau [girafe, chien, hippopotame, singe, chat , chien].
Indiquer galement le nombre doccurences de ce mot dans le tableau.
titre dexemple, si lutilisateur saisit chien, alors le programme doit afficher chien apparat
2 fois. Si lutilisateur saisit lapin, le programme doit afficher lapin napparat pas dans la
liste.

Exercice 19 :
Ecrivez un programme qui permet de tester si un mot est un palindrome, cest--dire si sa
lecture de gauche droite donne le mme rsultat que sa lecture de droite gauche. Par exemple,
radar et rotor sont des palindromes.

Bases de la programmation


54 

1re anne

Chapitre 5

Fonctions
5.1

Introduction

Avec les fonctions nous abordons un autre point essentiel de la conception des programmes.
Nous avons vu dans les cours prcdents :
les squences dinstructions qui sont la base dun programme ; elles indiquent lenchanement des instructions, instruction aprs instruction,
les alternatives qui permettent de choisir dexcuter ou pas une squence dinstruction(s)
suivant le rsultat de lvaluation dune condition (expression boolenne),
les boucles qui permettent de rpter une squence dinstruction(s) tant quune condition
est vrifie (expression boolenne).
Il sagit dans les trois cas de tronons de code qui ne sont utilisables quune fois au sein
du programme ; ds que ces tronons sont excuts le programme se poursuit pour excuter les
instructions suivantes. On dit que ces tronons logiciels ne sont pas rutilisables.
Les fonctions permettent, elles, de raliser plusieurs fois le mme tronon de code au sein dun
programme. Vous connaissez, par exemple, les fonctions raw_input() et print() qui permettent
respectivement de saisir ou dafficher une chane de caractres lcran.


1
2
3

print(indiquer un prenom) # affiche indiquer un prenom lcran


mot=raw_input() #affecte le rsultat de la saisie dans la chaine mot
print(le prenom est + mot) # affiche le prenom est suivi de ce qui a t saisi 1 lcran

Dans ce qui suit, nous allons voir comment :


1. crer une fonction,
2. comment donner corps au traitement que doit excuter la fonction,
3. comment utiliser ces fonctions.
Il ne faudra pas perdre de vue quune fonction permet de remplir une tche bien spcifique
ni plus, ni moins ; et chaque fois que le programmeur aura besoin dxecuter cette tche, il lui
suffira dappeler la fonction par son nom (au lieu de faire un copier coller des lignes dinstructions
correspondantes). Le rsultat est que le programme est plus concis, plus lisible et plus facile
dboguer. De plus, les fonctions dveloppes pourront tre rutilises dans dautres applications
avec des contextes diffrents.

55

IUT de Villetaneuse

5.2
5.2.1

Concevoir une fonction


Dfinition dune fonction

Quand on dfinit une fonction, on dcide :


1. du nom de la fonction qui respecte les mmes rgles que les noms de variable,
2. des arguments (donns sous la forme dune liste ordonne de leurs noms ventuellement vide) que la fonction doit recevoir,
3. du traitement que doit effectuer la fonction, elle utilisera pour cela les arguments
ventuellement reus.
4. du renvoi ou non dun rsultat.
.


def nomDeFonction (param1, param2, ...) :


I1
# ici, on crit du code utilisant les paramtres
I2
....
In
return resultat # si la fonction renvoie un resulat

1
2
3
4
5
6
7

La dfinition ressemblera un peu cela :

# le code de la fonction sarrte la premire ligne non indente

Pour dfinir une fonction en Python, on utilise le mot-cl def. Si lon souhaite que cette fonction
renvoie une valeur, on utilise le mot-cl return Notez que la syntaxe du def utilise les :, comme
dans le cas boucles et des alternatives, un bloc dinstructions est donc attendu. Lindentation de
ce bloc dinstructions, qui forme le corps de la fonction, est obligatoire.
Une fonction est appele avec des arguments ou non : lutilisateur fournit ou non des donnes
la fonction, et le droulement de celle-ci ne sera pas le mme suivant les donnes fournies.
Dans lexemple de la fonction print() vu prcdemment cest le message afficher qui reprsente largument et suivant la valeur de ce dernier la fonction print() naffichera pas la mme
chose. On peut remarquer que la fonction print() nattend quun seul argument.
Les noms de variables placs en argument pourront ainsi dsigner chaque appel des valeurs
diffrentes ; on ne peut donc pas prjuger de leurs valeurs lors de lcriture de la fonction cest
pour cela que ces arguments sappellent des paramtres formels : ils nont pas encore de
contenu.
Lors de lutilisation dune dune fonction, lutilisateur fournit les valeurs des arguments.
Prenons un exemple :


1
2
3

def somme(x,y) :
z = x + y
return z

4
5

### Programme appelant #####

a = 7.3
b = 5.2
print(somme(a,b))

7
8

# Affiche 12.5

Le programme qui utilise la fonction sappelle programme appelant.


Quelques commentaires propos de lexemple :
La fonction ici sappelle somme et possde deux paramtres formels x et y.
Le corps de la fonction contient deux instructions dont le but est de calculer la somme des
deux paramtres formels et de la renvoyer.
Au cours du programme appelant, des arguments ont t fournis la fonction somme() qui
a retourn une valeur, ensuite affiche lcran. La valeur retourne par la fonction peut
galement tre stocke dans une variable.
Bases de la programmation


56 

1re anne

Departement informatique

### Programme appelant #####

resultat=somme(7.3,5.2)
print(resultat) # Affiche 12.5

Notez quune fonction ne prend pas ncessairement dargument et ne renvoie pas forcment une
valeur. Toutefois il faut, lors de sa dfinition, mettre des parenthses aprs le nom de la fonction.
Comme cette fonction nadmet pas darguments, aucun nom de paramtre formel nest donn entre
les parenthses. Par exemple :


1
2

def affiche_bonjour() :
print(Bonjour)

Lors de lappel dune fonction sans argument on doit galement taper les parenthses.
Exemple dutilisation :
affiche_bonjour()
Laffichage produit est le suivant :
Bonjour
Dans cet exemple, la fonction ne prend aucun argument et ne renvoie aucun rsultat, se contentant
dafficher la chane de caractre Bonjour lcran. cela na donc pas de sens de vouloir rcuprer
dans une variable le rsultat renvoy par une telle fonction.
Il est galement possible de renvoyer une liste de rsultats que le programme appelant affectera
autant de variables :


1
2
3
4

def quotientreste (a,b):


q=a/b
r=a%b
return q,r

5
6
7

u,v = quotientreste(1253,87)
print(quotient : + str(u) + reste : +str(v) ) #affiche quotient : 14 reste : 35

I Sur ce thme : Exercices 1 7, TD 5

5.2.2

Porte des variables

Il est trs important lorque lon manipule des fonctions de connatre la porte des variables.
Variables locales
On peut crer des variables au sein dune fonction qui ne seront pas visible lextrieur de
celle-ci ; on les appelle variables locales Par exemple


1
2
3

def affiche_somme(x,y) :
z = x + y
print(la somme vaut + str(z))

4
5

### Programme appelant #####

affiche_(somme(7.3,5.2))
print(str(z))

Laffichage est alors le suivant :


1re anne


57 

Bases de la programmation

IUT de Villetaneuse

la somme vaut 12.5


Traceback (most recent call last):
File "<stdin>", line 7, in ?
Name error: name z is not defined
Lorsque la fonction est excute, le contenu de la variable z est connu. De retour dans le programme
appelant, la variable z nest plus connue do le message derreur.
Deuxime ment lors de lappel de la fonction, les variables passes en argument sont recopies
respectivement dans les paramtres formels et deviennent les paramtres effectifs. Il sont alors
des variables locales. Mais mme si la fonction modifie leurs valeurs, cela ne modifiera pas la
valeur des variables a et b du programme appelant. Voici un autre exemple :


1
2
3
4
5
6
7

def incrementer(x):
x=x+1
# la fonction modifie le contenu du paramtre formel
print(str(x))
#
nbre=4
print(nbre)
# affiche 4
incrementer(nbre) # affiche 5
print(nbre) # # affiche 4
, le paramtre effectif na pas t modifi !

Le cas des tableaux


Il est toutefois possible de modifier directement le contenu des lments dun tableau en utilisant directement le(s) paramtre(s) formel(s) ; cette modification sappliquera au(x) paramtre(s)
effectif(s). Pour cela, il faudra absolument utiliser la syntaxe tab[indice] = expression.


1
2

def changeEnPlace(t, ind):


t[ind]= Jacques # un lment de t est modifi, alors que t ne la pas t

3
4
5
6
7

txt=[bonsoir, Jean]
print(txt)
# affiche [bonsoir, Jean]
changeEnPlace(txt, 1)
print(txt)
# affiche [bonsoir, Jacques]

Le cas des chanes de caractres


Les chanes ressemblent aux tableaux parce quon peut lire les caractres de la mme faon,
avec s[i], mais elles ne sont par dfinition pas modifiables : s[i] = A est rejet car une chane
de caractres est considre comme constante que ce soit dans une fonction ou pas. Si on a besoin
de modifier le contenu dune chane de caractres reue en paramtre, il faudra crer une nouvelle
chane de caractre(s) contenant le rsultat et la renvoyer avec linstruction return.
Voyons un exemple :


1
2
3

def bonjour(nom):
s = bonjour + nom # cration de la nouvelle chane de caractres
return s
# on renvoie la chane rsultante

4
5

message = bonjour(Dupond)

6
7

print(message) # affichage : bonjour Dupond

5.2.3

Exemples de fonctions

Le corps de la fonction est la tche que doit accomplir la fonction. Les paramtres formels
y sont utiliss comme des variables initialises. Les variables introduites dans le corps de la
Bases de la programmation


58 

1re anne

Departement informatique

fonction sont des variables locales, elles ne sont connues et utilisables que dans le corps de la
fonction. Ds que la fonction se termine, les paramtres formels et les variables locales sont
dtruits.
Remarquez que, dans le corps dune fonction, il est possible dappeler dautres fonctions ; dans
ce cas le corps de la fonction jouera le rle de programme appelant.
Pour crire les fonctions, deux rgles essentielles sont respecter :
1. Concevoir la fonction pour quon puisse lutiliser commodment dans un maximum de situations (contextes),
2. Bien expliquer et documenter ce quattend la fonction et ce quelle fait.
1. Nous souhaitons crire une fonction qui trouve le plus grand lment dun tableau de valeurs.
(a) Comment appeler la fonction, quels sont ses paramtres formels, que renvoie la fonction ?
i. le nom de la fonction doit indiquer ce que fait la fonction, choisissons le nom :
chercheMaxTab(),
ii. la fonction a besoin de parcourir un tableau afin de rechercher la plus grande valeur.
A chaque appel de la fonction, le contenu et la taille du tableau peut changer. On
en dduit quil y a un paramtre formel de type tableau. Il ny a pas de
paramtre pour la taille du tableau, parce quen Python, la fonction len() permet
de lobtenir.
iii. aprs avoir trouv la valeur maximale, la fonction doit communiquer cette valeur
au programme appelant, donc la fonction doit se terminer par un return suivi du
nom de la variable locale contenant le maximum.
(b) Que doit faire la fonction ? Cest dans cette tape quon crit le corps de la fonction.
On pourra constater aprs analyse que nous utiliserons :
une variable locale plusGd qui contiendra la valeur la plus grande du tableau ; au
dpart elle sera initialise avec la premire valeur du tableau,
une autre variable locale i qui correspondra lindice courant du tableau, au dpart
elle sera initialise 1, car la case dindice 0 a dj t traite (voir point prcdent),
il faudra utiliser une itrative permettant de comparer chaque case du tableau avec
la variable plusGd pour retenir chaque fois le maximum.
(c) Voici une version qui remplit le cahier des charges :


1

def chercheMaxTab(tab):

###Renvoie le plus grand lment du tableau tab###

plusgd = tab[0]
i = 1
while i < len(tab):
if tab[i] > plusgd :
plusgd = tab[i]
i = i + 1
return plusgd

4
5
6
7
8
9
10
11
12
13

t = [3, 5, 18, 4, 7, -9]


res = chercheMaxTab(t)
print(res)
# affichage de 18

14
15
16
17

t = [34, -5, 3, -41, 47, 46, 9, 38]


res = chercheMaxTab(t)
print(res)
# affichage de 47

2. Voici un autre exemple qui permet de confirmer un choix


Une des interactions les plus courantes avec lutilisateur consiste lui demander confirmation
dun choix (rpondez par oui ou par non) et contrler que sa rponse est bien une des
rponses attendues. Cest si frquent que cela vaut la peine den faire une fonction :
1re anne


59 

Bases de la programmation

IUT de Villetaneuse


1

def ouiNon():

#renvoie une rponse controle, soit o pour oui, soit n pour non

print(Repondez par oui ou par non (o/n) : )


rep = raw_input()
while (rep != o and rep != O and rep !=n and rep != N):
print(Repondez par oui ou par non (o/n) : )
rep = raw_input()
return rep

4
5
6
7
8
9
10

print(Avez-vous rvis votre cours ?)


choix = ouiNon()

11
12
13
14
15
16
17

5.3
5.3.1

if choix==o :
print(C\est la clef de la reussite)
else :
print(il n\est jamais trop tard !)

Encore quelques informations utiles


Fonctions prdfinies

Dans tous les langages, on peut utiliser des fonctions crites par les autres, et qui sont disponibles dans des bibliothques.
Pour chaque langage, il existe une bibliothque standard, qui est accessible sans quil faille
le prciser. En Python, les bibliothques sappellent des modules ; la bibliothque standard est le
noyau. La directive import est ncessaire pour utiliser les fonctions qui sont dans une bibliothque
autre que le noyau. Par exemple, pour avoir accs aux fonction de la librairie mathmatique (math)
, vous devez spcifier que cette librairie doit tre utilise, en crivant linstruction suivante au dbut
de votre programme : from math import *.
Pour le langage C, ce sont des options lors de ldition des liens qui permettent de les utiliser,
associes la directive #include<descripteur de bibliothque> (voir cours sur le C qui sera
abord ultrieurement)).
Le programmeur peut crer ses propres bibliothques pour permettre leur rutilisation par
dautres programmeurs.

5.3.2

Complexit des oprations

Un dernier point auquel il faut faire attention : chaque fois que lon appelle une fonction,
son code sexcute, et cela peut comporter beaucoup doprations. Il vaut mieux en tenir compte
quand on programme. Voici un exemple pour illustrer le problme.
On veut crire une fonction qui normalise le tableau reu en argument - cest dire qui divise
tout par un mme nombre pour que la somme du nouveau tableau soit 1 (cest une fonction trs
banale). La fonction sappelle normalise(t), voici une premire faon de lcrire.


1
2
3
4
5

def somme(t):
s=0
for n in t :
s+=n
return(s)

6
7
8
9
10

def normalise(t):
i=0
while(i<len(t)):
t[i] = t[i] / somme(t)

Bases de la programmation



60 

1re anne

Departement informatique

Cette criture est trs maladroite : dans normalise(), chaque boucle while on calcule somme(t),
et le rsultat est toujours le mme. Il vaudrait mieux le calculer une fois pour toutes. Amliorer
le codage est simple :


1
2
3
4
5

def somme(t):
s=0
for n in t :
s+=n
return(s)

6
7
8
9
10
11

def normalise(t):
s=somme(t)
i=0
while(i<len(t)):
t[i] = t[i] / s



Si vous regardez bien les oprations faites par les deux versions :
le nombre doprations (additions) de somme() est la taille de t
dans la premire version, chaque boucle while fait un nombre doprations gal 1 + le
nombre doprations de somme()
dans la deuxime version, chaque boucle while fait une opration
le nombre de boucles while est le mme dans les deux cas
Quand on travaille sur un tableau de 1000 nombres, ce calcul donne pour la premire version
1001000 oprations, et pour la seconde 2000 oprations ! ! !
I Sur ce thme : Exercices 8 10, TD 5

1re anne


61 

Bases de la programmation

IUT de Villetaneuse

TD6 : Fonctions

Exercice 1 : Test de parit


Question 1.1 : crire la fonction estPair() qui affiche si un nombre reu en paramtre est pair
ou non. Faire des essais en utilisant des entiers, des flottants et avec des chanes de caractres.
Prvoir les rsultats.
Question 1.2 : R-crire la fonction estPair() pour que cette dernire renvoie True si le nombre
reu en paramtre est pair, False sinon. Faire des essais en utilisant des entiers, des flottants et
avec des chanes de caractres. Prvoir les rsultats.

Exercice 2 : Suite de carrs


crire une fonction qui permet dafficher la suite des carrs jusqu n2 o n est un entier choisi
par lutilisateur. Laffichage se fera sous la forme
0 1 4 9 16 25 36 49 64 81 100 . . .
Dans lexemple suivant lentier n est gal 6 : 0 1 4 9 16 25 36.

Exercice 3 : Comparer deux nombres


crire la fonction compare() qui reoit deux nombres en argument a et b et affiche un message
adapt selon que a soit suprieur, infrieur ou gal b. Faire des essais en utilisant des entiers,
des flottants.

Exercice 4 : Moyenne de deux nombres


crire la fonction qui reoit deux nombres en arguments et qui calcule et renvoie leur moyenne.
Quel est le problme si les deux nombres sont entiers ? quelle solution proposez-vous ?

Exercice 5 : Produit dentiers


crire une fonction produit() qui calcule et renvoie le produit n1(n1+1)...n2 (1<=n1<=
n2 ) des entiers compris entre n1 et et n2 inclus.

Exercice 6 : Anne bissextile


crire une fonction qui permet de determiner si une anne est bissextile.
On rappelle quune anne est bissextile si
elle est divisible par 4
mais nest pas divible par 100
sauf si elle est divisible par 400
Ainsi 2008 est bissextile, 1900 ntait pas bissextile et 2000 tait bissextile.

Exercice 7 : change de variables


crire une fonction swap(u,v) qui sert changer les valeurs de 2 variables u et v passes en
arguments. Cette fonction est-elle utile ? quels types sapplique-t-elle ?

Exercice 8 : Comptage des lments dun tableau


crire une fonction nbPairImpair() qui renvoie le nombre dlment(s) pair(s) et le nombre
dlment(s) impair(s) dans le tableau reu en argument.

Exercice 9 : Dcalage des lments dun tableau droite


crire une fonction decaleCircDroite() qui ralise le dcalage circulaire vers la droite dun
Bases de la programmation


62 

1re anne

Departement informatique

tableau dentiers.
Voici un exemple daffichage a obtenir :
Avant decalage circulaire
[12, 21, 10, 11, 0, 1, 6,
Apres decalage circulaire
[8, 12, 21, 10, 11, 0, 1,

a droite
8]
a droite
6]

Exercice 10 : Conversion entre binaire et dcimal


Question 10.1 : Du binaire vers le dcimal.
crire une fonction bin2Dec() qui permet de convertir une chane de caractres contenant la
reprsentation binaire dun nombre (codage entier naturel) en sa reprsentation dcimale.
Exemple dutilisation :

nBin=10000001
nDec = bin2Dec(nBin)
print(Le nombre binaire (code entier naturel) + str(nBin)+ se convertit en base 10 : + str(n
Question 10.2 : Du dcimal vers le binaire.
crire une fonction qui calcule lcriture en base 2 dun nombre entier positif pass en argument
sous sa forme dcimale.
Le rsultat pour 5 sera 101.

1re anne


63 

Bases de la programmation

IUT de Villetaneuse

TP6 : Fonction

Exercice 11 : Foncions et dessins


Le module Turtle permet de dessiner lcran des figures. Afin de pouvoir uiliser ce module,
il faut ajouter, en dbut de programme, linstruction : from turtle import *.
Attention : votre fichier ne doit pas sappeler lui-mme turtle ! ! !
On peut alors utiliser les instructions suivantes pour dessiner :
goto(x,y) : aller lendroit de coordonnes x et y,
forward(distance) : avancer dune distance donne,
up() : relever le crayon (pour pouvoir avancer sans dessiner),
down() : abaisser le crayon (pour pouvoir recommencer dessiner),
left(angle) : tourner gauche dun angle donn (exprim en degr),
right(angle) : tourner droite.
titre dexemple, regarder ce que donne le code :


1
2
3
4
5

from turtle import *


forward(100)
left(90)
forward(50)
goto(0, 0)

Question 11.1 : crire une fonction permettant la tortue de dessiner un carr de cot n.
Question 11.2 : La tortue est positionne au coin infrieur gauche et regarde vers le haut. crire
une fonction qui fera dessiner la tortue la figure suivante. Les paramtres de la fonction sont la

longueur du cot du plus petit carr et la diffrence entre les longueurs des cots des diffrents
carrs.
Question 11.3 : crire une fonction permettant de dessiner un rectangle. Utiliser cette fonction
pour dessiner la figure suivante avec la tortue. Les longueurs des cots des rectangles seront choisies

par lutilisateur.
Bases de la programmation


64 

1re anne

Departement informatique

Question 11.4 : Carrs embots.


Donner un programme qui ralise, grce la tortue, le dessin suivant :

sachant que
la tortue est place dans le coin suprieur gauche du carr interne et quelle regarde vers le
haut.
le nombre de carrs tracer est demand lutilisateur (4 dans lexemple ci-dessus)
la longueur du cot du carr le plus petit ( lintrieur) est demand lutilisateur et la
longueur du cot de chaque autre carr est gale au double de la longueur du cot du carr
juste en dessous. On utilisera pour dessiner les carrs la fonction dfinie lExercice 11.
le segment qui relie chaque carr est de longueur fixe et gale au cot du plus petit carr et
forme un morceau de la diagonale de chaque carr.
Question 11.5 : Carr de carrs.
1. crire un fonction permettant de dessiner p carrs de cot n les uns la suite des autres.
On utilisera pour dessiner chaque petit carr la fonction dfinie dans lExercice 11
2. crire un programme qui permet de dessiner avec la tortue la figure suivante :

Figure 5.1 suite de carrs


La longueur du cot des petits carrs est demande lutilisateur.
Le nombre de petits carrs ncessaires pour former un cot du grand carr est demand
galement lutilisateur (4 dans lexemple ci-dessus).
La tortue est positionne au coin infrieur gauche et regarde vers le haut.
3. crire un programme qui fait dessiner la tortue un damier dont le ct est form de p cases
dont le ct est demnad lutilisateur.

Exercice 12 : Modularit du code : calcul de la moyenne et de la variance


sur un tableau
Question 12.1 : crire une fonction moyenne( tab ) dun argument de type tableau, contenant
des valeurs numriques (int ou float). Cette fonction renvoie une valeur relle (float) corres1re anne


65 

Bases de la programmation

IUT de Villetaneuse

pondant la moyenne des lments du tableau. Vous pourrez vous aider du code vu lors des TD
sur les tableaux.
Question 12.2 : Dfinissez une fonction tabCarre(tab) dun argument de type tableau, contenant des valeurs numriques (int ou float). Le tableau initial ne sera pas modifi par la fonction.
La fonction renverra le tableau des carrs des lments du tableau intial. Vous pourrez initialiser
un tableau vide, puis, au moyen de la concatnation remplir le tableau avec les carrs. Pour lever
un nombre au carr vous utiliserez une fonction carre() que vous dfinirez. Les deux fonctions
carre() et tabCarre() devront donc tre dfinies dans le mme fichier.
Question 12.3 : Dfinissez une fonction variance( tab ) permettant de calculer la variance des
valeurs du tableau. On rappelle que la formule de la variance pour une distribution X = {xi } est :
PN
PN
(xi )2
)2
i=1 (xi x
= i=1
x
2 ,
V =
N
N
o x
est la moyenne de la distribution X = {xi }.
La variance est donc gale la moyenne des carrs moins le carr de la moyenne. Vous utiliserez
les fonctions carre(), moyenne() et tabCarre() dfinies prcdemment. Les 4 fonctions devront
donc tre crites dans le mme fichier.

Exercice 13 : Modularit du code : formatage de chanes de caractres


Dans cet exercice, les chanes de caractres seront manipules comme des tableaux de caractres.
Question 13.1 : Dfinissez la fonction de deux paramtres ajouteEspaces( chaine , n ) qui
renvoie la chane de caractres chaine aprs lui avoir ajout n espace(s) aprs son dernier caractre :
Question 13.2 : Dfinissez la fonction de deux paramtres tronquer( chaine , l ) qui renvoie
le prfice de longueur l (les l premiers caractres) de la chane de caractres chaine :
Question 13.3 : Dfinissez la fonction de deux arguments padRight( chaine , size ) telle
que :
Largument chaine est une chane de caractres,
Largument size est un entier positif,
La fonction renvoie une chane de caractres de longueur size :
Si la longueur de la chane initiale est suprieure size, la chane initiale est tronque.
Si la longueur de la chane initiale est infrieure size, des caractres espace sont rajouts
la fin de la chane en nombre suffisant pour que la chane renvoye soit de longueur size.
Question 13.4 : En utilisant la fonction padRight(...), proposez une fonction dun argument
afficheTableMult( u, max ) permettant dafficher la table de mutliplication de la valeur u
pour un multiplicateur variant de 0 max. Laffichage devra tre "propre", cest dire que les
caractres * et = de la table devront tre aligns sur une mme colonne. Par exemple, lappel
de afficheTableMult( 7 , 100 ) devra prendre la forme suivante :
7
14
...
70
...
700

= 1
= 2

* 7
* 7

= 10

* 7

= 100 * 7

Exercice 14 : Fonctions de plusieurs variables et modification des valeurs


dun tableau
Afin de raliser cet exercice nous aurons besoin de certaines fonctions dfinies dans la librairie
math. Pour avoir accs ces fonctions, vous devez spcifier que cette librairie doit tre utilise, en
crivant linstruction suivante au dbut de votre programme : from math import *.
Bases de la programmation


66 

1re anne

Departement informatique

Cette librairie dfinit entre autres choses les fonctions cosinus et sinus, respectivement nommes : cos() et sin(), et la constante , nomme pi. Les quations paramtriques dfinissant un
cercle de centre (a, b) et de rayon R, sont les suivantes :

x = a + R cos()
y = b + R sin()
Question 14.1 : Dfinissez une fonction de deux paramtres pointCercle(angle,r), renvoyant
les coordonnes dun point du cercle de centre (0, 0) et de rayon r. Les coordonnes seront renvoyes
dans un tableau de 2 lments.

La translation dun point de coordonnes M = (a, b) par un vecteur


v = (x, y) suit les rgles
de calcul suivantes :
 0     

x
a
x
a+x
M0 =
=
+
=
y0
b
y
b+y
Question 14.2 : Dfinissez une fonction de deux paramtres translation( point , vecteur )
permettant dappliquer une translation au point. Les coordonnes du point et du vecteur seront
dfinies comme des tableaux de 2 nombres. La fonction translation( point , vecteur ) ne
reverra aucune valeur. Les coordonnes du point seront modifies directement par la fonction.
Question 14.3 : Proposez une fonction de 3 paramtres pointCercleGeneralise( angle , r ,
c ) permettant de renvoyer les coordonnes dun cercle de rayon (r) et de centre c. Les coordonnes
du centre et du point renvoy seront donnes dans des tableaus de 2 lments.
Pour dfinir cette fonction, vous utiliserez les fonctions prcdemment dfinies : pointCercle()
et translation().

1re anne


67 

Bases de la programmation

IUT de Villetaneuse

Bases de la programmation


68 

1re anne

Chapitre 6

Boucles imbriques
Le but de ce chapitre est dapprendre analyser un problme contenant des rptitions imbriques et utiliser des boucles imbriques pour traiter ces configurations.

6.1

Piqre de rappel sur les boucles simples

Nous avons dj vu que toute squence dinstruction(s) peut tre imbrique dans une autre
instruction structure et nous avons dj rencontr lexemple dun choix imbriqu dans un choix
ou dun choix imbriqu dans une boucle. Nous allons examiner ici des situations dimbrications de
boucles. Pour cela il existe 2 itratives(en ralit 3) :
la boucle while, dite boucle conditionnelle ; elle est utilise lorsque le nombre ditration(s)
nest pas connu lavance et peut tre de 0, Par exemple les instructions :


1
2
3
4
5
6

1
2
3

print(entrez oui ou non)


choix=raw_input()
while choix!=oui or choix!=non :
print(entrez oui ou non)
choix=raw_input()
print(Vous avez choisi + choix)



la boucle for, dite boucle inconditionnelle ; elle est utilise lorsque le nombre ditration(s)
est connu lavance. Par exemple les instructions :


x=2
for i in range(0,2) :
print(x)



Ecrivent deux fois la valeur de x.
Pour allez plus loin, il existe une troisime forme de boucle : La boucle do while, dite boucle
conditionnelle ; elle est utilise lorsque le nombre ditration(s) nest pas connu lavance et
est au moins de 1. Cette boucle nest pas implmente en Python mais existe dans de
nombreux langages.
Voici une version en langage C de cette boucle :


1
2
3
4
5
6
7
8

#include <stdio.h>
#include <string.h>

int main(void){
char choix[20]; /* permet de stocker une suite de caractre(s) */
do {
printf("entrez oui ou non"); /* cest le print du C */
scanf("%s", choix); /* cest le raw_input() du C */
} while (strcmp(choix,"oui")!=0 || strcmp(choix,"oui")!=0);

69

IUT de Villetaneuse

/* ecriture en C de while choix!=oui or choix!=non */

10
11
12
13

printf("Vous avez choisi %s",choix); /* Affiche la valeur contenue da la variable choix */


return 0;
}



Comparez avec la forme while (en faisant abstraction de la synthaxe du C)... Et vous verrez
lintrt de la boucle do while.
Sachez matriser dj les deux premire forme de boucles, ce sera dj trs bien !
Remarque : La boucle for en Python est un peu particulire, car elle utilise loprateur in
qui permet de parcourir un tableau ("pour chaque lment de ce tableau...") et cest la taille de
ce dernier qui fixe le nombre ditration(s) (la taille du tableau). Dans beaucoup dautres langages "historiques" comme le C, loprateur in nexiste pas, et cest lutilisation dun compteur
"classique" qui fixe ce nombre ditration(s). Algorithmiquement, la dfinition dune boucle inconditionnelle se rapproche de la vision historique.

6.2
6.2.1

Les boucles imbriques


Boucles imbriques ? Cest quoi a ?

Pourquoi imbriquer des boucles ? Pour la mme raison quon imbrique des alternatives. Une
alternative permet de traiter une situation, un cas de figure.
Par exemple : "est-ce un homme ou une femme ?" peut trs bien se subdiviser en dautres cas
"a-t-il plus ou moins de 18 ans ?".
De mme, une boucle, cest un traitement systmatique, un examen dune srie dlments un par
un, par exemple, "prenons tous les employs de lentreprise un par un". Eh bien, on peut imaginer
que pour chaque lment ainsi considr, pour chaque employ par exemple, on doive procder
un examen systmatique dautre chose, prenons chacune des commandes que cet employ a trait.
Voil un exemple typique de boucles imbriques : on devra programmer une boucle principale
(celle qui prend les employs un par un) et lintrieur, une boucle secondaire (celle qui prend
les commandes de cet employ une par une). Dans la pratique de la programmation, la matrise
des boucles imbriques est ncessaire, mme si elle nest pas suffisante.
En conclusion, imbriquer des boucles cest crire une boucle lintrieure dune autre boucle.
Dans la suite nous allons tudier quelques exemples de boucles imbriques sachant quil existe une
multitude de combinaisons.

6.2.2

Boucle inconditionnelle dans une autre boucle inconditionnelle

"for lintrieur dun for"


Tout comme les tests, il est tout fait possible dimbriquer les boucles, cest dire de mettre une
boucle dans une autre boucle, sur autant de niveaux que vous le souhaitez. Vous pouvez envisager
1, 2, 3, n niveaux, mais a risque de devenir difficilement lisible. Voici un exemple deux niveaux.
Il sagit tout simplement de calculer et dafficher toutes les tables de multiplication de 1 9.
Chaque table se prsentera comme suit :
TABLE de 4
4x1=4
4x2=8
4x3=12
4x4=16
4x5=20
4x6=24
4x7=28
4x8=32
Bases de la programmation


70 

1re anne

Departement informatique

4x9=36
4x10=40
Ici encore, plutt que dessayer dcrire directement le dtail du programme, il peut tre prfrable de procder par tape. Par exemple, nous pouvons dire que, globalement, notre programme
doit crire les 9 tables de multiplication de 1 9 et quil doit donc se prsenter ainsi :


1
2

1
2
3

for i in range(1,10) : # i va varier de 1 9


# crire la table de i



Attention ! Comme i donne le numro de table, il ne faut pas le modifier lintrieur du corps de
cette boucle. Le contenu de la rptition reste prciser et, pour linstant, nous lavons simplement
mentionn sous la forme dun commentaire. Pour crire la table i, nous pouvons procder ainsi :


print(TABLE de + str(i))
for j in range(1,11) : # j varie de 1 10
// crire la ligne j de la table i




1
2
3

Do une bauche plus labore de notre programme :

for i in range(1,10) : # i va varier de 1 9


print(TABLE de + str(i))
for j in range(1,11) : # j varie de 1 10
// crire la ligne j de la table i


Il ne nous reste plus qu prciser comment crire une ligne dune table, ce qui peut se formuler
ainsi :



print(str(i)+x+str(j)+=+str(i*j))


1
2
3
4

Nous aboutissons lalgorithme complet :

for i in range(1,10) : # i va varier de 1 9


print(TABLE de + str(i))
for j in range(1,11) : # j varie de 1 10
print(str(i)+x+str(j)+=+str(i*j))



La dmarche utilise est dite dmarche descendante : elle consiste dcomposer le problme pos
en sous-problmes plus faciles rsoudre, puis dcomposer son tour chaque sous-problme... et
ceci jusqu ce que lon arrive une solution entirement formule (nous reviendrons sur ce point
la fin de ce cours).

6.2.3

Boucle inconditonnelle dans une boucle conditionnelle

"for lintrieur dun while



1
2
3
4
5
6
7

print(donnez un entier :)
x = int(raw_input())
while x!=0 :
for i in range(0,2) :
print(merci pour + str(x))
print(donnez un entier :)
x = int(raw_input())

Le while permet de rpter la squence qui en dpend et cela autant de fois que ncessaire...
Jusqu ce que lutilisateur entre une valeur pour x gale 0,
le corps de la boucle permet dafficher deux fois la valeur saisie par lutilisation dune boucle
inconditionnelle (boucle for), puis de saisir la prochaine valeur pour x.

1re anne


71 

Bases de la programmation

IUT de Villetaneuse

Si nous excutons ces instructions avec les valeurs 3, 5 et 0, nous obtenons ceci :
donnez un entier : 3
merci pour 3
merci pour 3
donnez un entier : 5
merci pour 5
merci pour 5
donnez un entier : 0

6.2.4

Boucle conditionnelle dans une boucle inconditionnelle

"while lintrieur dun for


On souhaite crire un programme qui calcule les moyennes de 25 lves. Pour chaque lve, le
programme lira ses notes (nombres rels) qui pourront tre en nombre quelconque ; on conviendra
que lutilisateur fournira une valeur ngative pour signaler quil ny a plus de notes pour un lve.
Commenons tout dabord par un exemple dexcution du programme souhait :
donnez les notes de
12
15
9
-1
moyenne des 3 notes
donnez les notes de
.....
donnez les notes de
10
-1
moyenne des 1 notes

llve numro 1 (-1 pour finir)

: 12.00
llve numro 2 (-1 pour finir)
llve numro 25 (-1 pour finir)

: 10.00

Compte tenu de la complexit du programme, nous pouvons chercher, dans un premier temps,
crire les seules instructions de calcul de la moyenne dun lve, en supposant que son numro
figure dans une variable nomme i :


1
2
3
4
5
6
7
8

print(donnez les notes de llve numro +str(i) + (-1 pour finir))


somme = 0
nb = 0
note = float(raw_input())
while note >=0 :
somme = somme + note
nb=nb+1
note = float(raw_input())

9
10
11

1
2
3
4
5
6

if nb > 0 :
print(moyenne des + str(nb)+ notes : + str(somme/nb)


Pour obtenir le programme dsir, il nous suffit maintenant de rpter les instructions prcdentes, en utilisant la variable i comme compteur, variant de 1 25.
Voici le programme complet :


for i in range(1,25): # i varie de 1 25
print(donnez les notes de llve numro +str(i) + (-1 pour finir))
somme = 0
nb = 0
note = float(raw_input())
while note >=0 :
Bases de la programmation


72 

1re anne

Departement informatique

somme = somme + note


nb=nb+1
note = float(raw_input())
if nb > 0 :
print(moyenne des + str(nb)+ notes : + str(somme/nb)

7
8
9
10
11



Remarque : Faites bien attention la place des deux initialisations somme=0.0 et nb=0. Elles
doivent figurer dans la boucle inconditionnelle gouverne par le compteur i et avant la boucle
conditionnelle de prise en compte des diffrentes notes.

6.2.5

Boucle conditionnelle dans une boucle conditionnelle

"while lintrieur dun while


Considrons une fonction verifiePresenceRoi() qui reoit deux paramtres entiers et renvoie
True si la fonction a trouv un roi sur lchiquier et False sinon.
Voici le cartouche de la fonction verifiePresenceRoi() :


1
2
3
4
5
6

########################################################################
# verifiePresenceRoi(i,j)
#i : dsigne lindice de la ligne de lchiquier (indice commence 0)
#j : dsigne lindice de la colonne de lchiquier (indice commence 0)
#valeur retourne : True si un roi a t trouv, False sinon
########################################################################


Remarque : Utilisez des cartouches pour documenter vos fonctions.

Le cahier des charges : Nous souhaitons trouver lindice de la ligne et lindice de la colonne du
premier roi trouv.
1. il est clair quil faut parcourir chaque ligne de lchiquier... et de sarrter ds
quon trouve un roi ! : "tant que je nai pas parcouru toutes les lignes ET que je nai pas
trouv de roi ! ",
2. pour chaque ligne, il faut parcourir les cases... et sarrter ds quon trouve un roi ! :
"tant que je nai pas parcouru tous les lments de la ligne courante ET que je nai pas trouv
de roi !,
On abouti quelque chose comme suit :


1
2

i=0
j=0

#parcours des lignes


# parcours des colonnes

3
4

trouve = False
# tant que je nai pas parcouru toutes les

5
6

les lignes ET que je nai pas trouv de roi !

while i<10 and not(trouve) :

#tant que je nai pas parcouru tous les lments de la ligne courante
# ET que je nai pas trouv de roi !

while j<10 and not(trouve) :

#je cherche
#et javance dune colonne
# et javance dune ligne

10
11
12

le commentaire je cherche doit tre substitu par une instruction qui consulte lespace deux
dimensions et qui indique si linformation cherche est trouve ou pas pour la ligne dindice
i et la colonne dindice j.


1

trouve = verifiePresenceRoi(i,j)

1re anne



73 

Bases de la programmation

IUT de Villetaneuse

pour avancer dune colonne, il suffit dincrmenter j,



1


1
2

j = j +1


pour avancer dune ligne, il suffit dincrmenter i,





i = i +1


Nous obtenons finalement lalgorithme suivant :

i=0
j=0




#parcours des lignes


# parcours des colonnes

3
4

trouve = False

# tant que je nai pas parcouru toutes les

while i<10 and not(trouve) :


#tant que je nai pas parcouru tous les lments de la ligne courante
# ET que je nai pas trouv de roi !

7
8

while j<10 and not(trouve) :


trouve = verifiePresenceRoi(i,j)
j = j +1
i = i +1

9
10
11
12

les lignes ET que je nai pas trouv !

Ds que que la variable trouve devient True, on sort "naturellement" des deux boucles imbriques car la condition boolenne trouve==False devient False.

6.2.6

Un peu plus compliqu... 3 boucles imbriques... le vertige !

Il existe une multitude dautrse exemples de combinaisons dimbrications de boucles (avec les
boucles for et while). Il existe aussi une "infinit" de niveaux dimbrications. Prenons un dernier
exemple pour illustrer notre propos. Le but de cet anodin algorithme est de trouver pour quelles
valeurs de A, B et C, A 100 + B 10 + C = A3 + B 3 + C 3 (ABC reprsentant un nombre dcimal).
La recherche sera limite pour chaque valeur entire comprise entre 1 et 10 (bien entendu, vous
pouvez augmenter lintervalle). Lalgorithme ncessite trois boucles pour chacune des valeurs. Cest
bien entendu au sein de la dernire boucle que les valeurs sont calcules et les rsultats affichs en
cas dgalit.


1
2
3
4
5
6
7

for a in range(1,11):
for b in range(1,11):
for c in range(1,11):
nb1= a*100+b*10+c
nb2 = a*a*a+b*b*b+c*c*c
if nb1==nb2:
print (a=+str(a) + b=+str(b) + c=+str(c))

6.2.7

1
2
3
4

Revenons sur lexemple des tables de multiplication

Nous vous rappelons lalgortihme obtenu :

for i in range(1,10) : # i va varier de 1 9


print(TABLE de + str(i))
for j in range(1,11) : # j varie de 1 10
print(str(i)+x+str(j)+=+str(i*j))

Si nous nous concentrons sur les fonctionnalits des deux deux boucles imbriques on pourrait
crire : "je parcours les tables de 1 9 (compteur i) et pour chaque table i, je laffiche".
On pourrait dfinir une fonction qui permettrait dafficher nimporte quelle table k sans
prjuger de qui lutilisera :
Bases de la programmation


74 

1re anne

Departement informatique


1
2
3
4
5

def afficheTable(k) :
for i in range(1,11) : # i varie de 1 10
print(str(k)+x+str(i)+=+str(k*i))




# k est un paramtre formel qui dsigne la table afficher


# affiche la table de multiplication de k

Finalement, lalgoritme initial devient :

for i in range(1,10) : # i va varier de 1 9


afficheTable(i)



Remarque :
Bienvenue dans le monde de la dcomposition fonctionnelle (dmarche descendante) qui
consiste dcouper un problme en fonction(s) ; la dfinition de la fonction afficheTable()
permet de simplifier lalgorithme initial mais surtout permet la rutilisation de cette fonction
dans dautres contextes,
vous remarquez que la fonction afficheTable() masque limbrication des boucles ayant
pour rsultat une fois de plus de simplifier un algorithme,
souvenez-vous, lors de la sance 1, nous avions affirm quun problme peut tre rsum
par une squence ordonnanant des actions plus ou moins complexe entreprendre (lordre
dappel de fonctions), cest lessence mme de la dcomposition fonctionnelle dun cahier des
charges.
Remarque : Une rgle de "bonne" programmation consiste ne jamais crire un traitement de
plus dune page ; dans ce cas, le dcomposer en appels de fonctions dont on sait ce que chacune
fait.

1re anne


75 

Bases de la programmation

IUT de Villetaneuse

TD7 : Boucles imbriques

Exercice 1 : Puissance dun circuit


crire un algorithme qui permet dafficher la puissance dun circuit en fonction de la tension
u variant par pas de 0.5V et de lintensit i i variant par pas de 0.05A sachant que les valeurs
initiales et finales de u et i seront demandes lutilisateur.
Exemple daffichage : (pour u variant de 0 2V et i variant de 0 0.15A)
u=0
u=0
u=0
u=0

i=0 p=0
i=0.05 p=0
i=0.10 p=0
i=0.15 p=0

u=0.5 i=0
p=0
u=0.5 i=0.05 p=0.025
u=0.5 i=0.10 p=0.050
u=0.5 i=0.15 p=0.075
********************

Exercice 2 : Dessins dtoiles


1. crire une fonction qui affiche un triangle rectangle dont la hauteur et la base dpendent
dun entier n (pass en paramtre).
Exemples :
pour n=1

pour n=2

pour n=3

pour n=4

*
**

*
**
***

*
**
***
****

2. Ecrire une fonction qui prendra comme paramtre la hauteur et qui affiche la figure suivante.
Les symboles utiliss sont des toiles (*) et des traits(-).
Exemple. La hauteur est 5
*---**--***-**********
3. crire une fonction qui affiche un triangle rectangle dont la hauteur et la base dpendent
dun entier n (pass en paramtre).
Exemples :
pour n=1

*
**

*
pour n=2
Bases de la programmation

pour n=3
*


76 

1re anne

Departement informatique

**
***

*
**

pour n=4

***
****

4. crire une fonction qui affiche un triangle isocle dont la hauteur dpend dun entier n (pass
en paramtre).
Exemples :
pour n=1

pour n=2

pour n=3

pour n=4

*
***

*
***
*****

*
***
*****
*******

5. crire une fonction qui affiche un losange dont la longueur des diagonales (nombre impair)
dpend dun entier n (pass en paramtre). Dans le cas o n est pair, la fonction affichera
un message derreur.
Exemples :
pour n=1

pour n=3

pour n=5

*
***
*

*
***
*****
***
*

pour n=7
*
***
*****
*******
*****
***
*

Exercice 3 : Calcul de moyennes


Ecrire un algorithme qui permet de calculer la moyenne de chaque tudiant dune promotion.
On suppose que le nombre dtudiants nest pas connu lavance, cest lutilisateur qui dcide de
mettre fin lexcution du programme lorsquil ny a plus dtudiant dont il souhaite calculer la
moyenne. Le nombre de notes de chaque tudiant est fix 5.

Exercice 4 : Calculer des puissances entires avec des additions


crire un algorithme permettant de calculer xy o x et y sont des entiers en utilisant seulement
laddition.

Exercice 5 : Comptage de diviseurs


Dfinissez une fonction nombreDeDiviseurs( max ) qui renvoie le nombre dentiers compris
entre 0 et et la valeur passe en paramtre max qui ont exactement 7 diviseurs.
On rappelle que n est un diviseur de x, si le reste de la division entire de x par n est nulle : x%n=0.
Par exemple, le nombre dentiers infrieurs ou gaux 30 ayant exactement 7 diviseurs est gal
2. Ce sont les entiers 24 et 30 :
les 7 diviseurs de 24 = { 1, 2, 3, 4, 6, 8, 12 }
les 7 diviseurs de 30 = { 1, 2, 3, 5, 6, 10, 15 }
Pour raliser cette fonction, vous suivrez les spcifications suivantes :
la boucle principale parcourra les entiers tester (entre 0 et max)
une boucle imbrique testera le nombre de diviseurs de lentier test.
1re anne


77 

Bases de la programmation

IUT de Villetaneuse

Exercice 6 : Compression de donnes - RLE


Lalgorithme de compression RLE (Run Length Encoding) est un algorithme utilis dans de
nombreux formats de fichiers (BMP, TIFF,...). Il est bas sur lidentification de la rptition
conscutive de mmes lments.
Le principe consiste parcourir la squence de donnes compresser et de donner squenciellement
le nombre de rptitions conscutives dun lment donn suivie de la description de cet lment.
La squence de donnes AAAAAACCCCAABAAAAAADDDD soumise lalgorithme RLE identifie :
une squence de 6 caractres A 6A,
une squence de 4 caractres C 4C,
une squence de 2 caractres A 2A,
une squence de 1 caractre B 1B,
une squence de 6 caractres A 6A,
une squence de 4 caractres D 4D
et donne la squence compresse suivante : 6A4C2A1B6A4D.
Dfinissez une fonction RLEcompress(tab) admettant pour argument un tableau de caractres, et
retournant la version compresse de ce tableau.
Proposez ensuite la fonction de dcompression RLEuncompress().

Bases de la programmation


78 

1re anne

Chapitre 7

Tableaux deux dimensions


Dans le chapitre sur les tableaux une dimension, nous avons vus comment traiter des tableaux
une dimension (vecteur, liste). Pour la dfinition de matrices ou de tableaux 2 dimension nous
avons besoin de tableaux comme celui-ci :

Ce tableau contient 4 lignes et 4 colonnes, donc cest un tableau 2 dimensions. Pour accder
un lment il faut spcifier un couple dindices (deux dimensions, donc deux indices) :
Le premier indice indique le numro de la ligne

Le deuxime indice indique la colonne


79

IUT de Villetaneuse

Il est important de retenir que pour un tableau de dimension n m, les indices des
lignes et des colonnes varient respectivement de 0 n 1 et de 0 m 1.
Comme les tableaux une dimension, un tableau multidimensionnel est dfini par les symboles
[ et ]. Entre ces crochets figurent les indices qui permettent de parcourir le tableau. Chaque ligne
du tableau peut tre vue comme un tableau une dimension. En reprenant les notations du cours
sur les tableaux une dimension, nous pouvons crire chaque ligne du tableau comme une liste
Python, par exemple :


1
2
3
4
5

Ligne0 = [4, 22, 55, 32]


Ligne1 = [5, 23, 34, 4 ]
Ligne2=[2, 2.4, 2, 12]
Ligne3=[23, 44, 55, 77]
Tableau = [ Ligne0, Ligne1, Ligne2, Ligne3 ]




Puis, il faut crer une nouvelle liste Python contenant les lignes qui ont t dfinies

Evidement, on peut faire la dclaration du tableau en une seule fois :

Tableau = [[4, 22, 55, 32], [5, 23, 34, 4 ], [2, 2.4, 2, 12], [23, 44, 55, 77]]

Ainsi, en Python, un tableau plusieurs dimensions peut tre implant comme une liste de
listes. Un tableau deux dimensions est une liste de lignes. On peut accder chaque ligne
sparment :


1
2

1
2

print(Tableau[0])
print(Tableau[2])

on obtient laffichage


[4, 22, 55, 32]


[2, 2.4, 2, 12]

Chaque ligne est une liste de cellules individuelles. Cela nous permet dutiliser la notation
Tableau [i] [j] qui signifie que nous choisissons la ligne i, et seulement la colonne j de cette ligne.


1
2

print(Tableau[0][0])
print(Tableau[1][2])


1
2

on obtient laffichage

4
34

Bases de la programmation



80 

1re anne

Departement informatique

Il est possible de manipuler des tableaux contenant des chanes de caractres ou mme des
valeurs de diffrents types (string, integer, float).


1
2
3
4
5

s = [david, Mohamed, 32]


s2 = [Williams, Rudy, Omar, 18]
s3 = [s, s2]
print s3[1][2]


on obtient laffichage suivant





Omar

7.1

Parcours et affichage dun tableau

Parcourir un tableau deux dimensions peut tre fait naturellement avec deux boucles imbriques : une sur les lignes et une sur les colonnes. Il est possible dutiliser la commande range()
pour parcourir successivement les indices de chaque cellule du tableau. Lexemple suivant permet
de parcourir les lments du tableau en utilisant deux boucles while :


1
2
3
4
5
6
7

i = 0
while i < len(Tableau):
j = 0
while j < len(Tableau[i]):
print(Tableau[i][j])
j += 1
i += 1




1
2
3

Lexemple suivant permet de parcourir les lments du tableau en les mettant zro :

for r in range(len(Tableau)):
for c in range(len(Tableau[r])):
Tableau[r][c]= 0

4
5

print(Tableau)




1
2

1
2
3
4

On obtient donc laffichage :

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]


Laffichage du tableau sous forme dune liste de listes est un peu difficile lire. La boucle
suivante permet dafficher la table dans une forme plus lisible.


for ligne in Tableau:
print (ligne)


On obtient laffichage suivant :





[4, 22, 55, 32]


[5, 23, 34, 4]
[2, 2.4, 2, 12]
[23, 44, 55, 77]

7.2

Initialisation automatique dun tableau

En reprenant le programme prcdent et en manipulant une nouvelle variable matrice :


1re anne


81 

Bases de la programmation

IUT de Villetaneuse


1
2
3

for r in range(3):
for c in range(3):
matrice[r][c]= r+c

4
5

print (matrice)

Nous obtenons ce message derreur


1
2
3

Traceback (most recent call last):


File "<stdin>", line 3, in <module>
NameError: name matrice is not defined


Comme pour un tableau une dimension, linterprteur ne peut pas crire dans une case qui
na pas t cre linitialisation de matrice. Nous avons plusieurs possibilits pour crire cette
initialisation :
dfinir explicitement la matrice comme une liste de listes dlment.


1

1
2
3

1
2

matrice = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]



En utilisant loprateur de rptition * et la boucle for, nous pouvons construire une liste
de listes.


A = [0]*3 # cre les A[i] initialiss 0
for i in range(3):
A[i] = [0] * 3 # remplace chaque A[i] par un tableau



En Python, nous pouvons construire un tableau en utilisant la fonction range() et la
boucle for lintrieur des crochets (on appelle cela une liste dfinie en comprhension).
Lexemple suivant cre une table comme une liste de listes et en mme temps remplit chaque
cellule de la table.


matrice= [ [ 0 for i in range(3) ] for j in range(3) ]
print (matrice)



Cette instruction doit tre lue partir de lintrieur vers lextrieur, comme une expression
ordinaire. La liste intrieure, [0 for i in range (3)], cre une simple liste de trois zros. La liste extrieure, [[...] for j in range (3)] cre trois exemplaires de ces listes
internes. Dans des cas plus compliqus, au lieu du 0, on peut utiliser une expression qui
dpend de i et j . . .
Il y a bien sr dautres critures possibles en combinant autrement les 3 mthodes ci-dessus.

7.3

Remarques sur les tableaux

Comment dtecter un tableau 2 dimensions dans un nonc ?


Lnonc fait directement rfrence une donne de type grille (lemploi du temps de la
semaine, tableau des ventes des articles par mois, ...)
Les donnes ont deux paramtres : les tempratures moyennes releves dans toutes les
capitales dEurope par mois de lanne. Une temprature est une proprit dune ville
dEurope pour un mois de lanne, ceci implique une relation deux dimensions donc un
tableau deux dimensions.
De faon plus gnrale, un tableau N dimensions est dcrit par N paramtres. Le nombre
total dlments dun tableau N dimensions est le produit des tailles de chaque dimension.

Bases de la programmation


82 

1re anne

Departement informatique

TD8 : Tableaux deux dimensions

Exercice 1 : Manipulations de tableaux


Soit un tableau deux dimensions de 5 par 4 entiers compltement initialis :
6
4
1
1
6

2
6
3
6
0

3
2
6
3
1

5
6
7
6
4

Question 1.1 : Effectuer les actions suivantes :


afficher le tableau
afficher le sous-tableau de la 2e ligne la 3e ligne comprises
afficher le sous-tableau du dbut la 2e ligne comprise
afficher le sous-tableau de la 3e ligne comprise la fin du tableau
afficher le tableau constitu uniquement des lignes dindice pair
afficher le tableau constitu uniquement des lments dindice impair de chaque ligne (ceci
correspond afficher uniquement les colonnes dindice impair de la matrice)
Question 1.2 : crire un algorithme qui permet premirement dafficher la diagonale (de gauche
droite), puis la 2e diagonale
Question 1.3 : Tester si les nombres qui apparaissent dans les deux diagonales sont tous gaux
une seule et mme valeur. Le programme affichera "OUI" ou "Non" en fonction du rsulat.
Question 1.4 : Soit un tableau deux dimensions initialis avec des nombres entiers.
6
4
1
3
6

2
6
3
6
0

3
2
6
3
1

5
6
7
8
4

Donner un algorithme qui permet de calculer la moyenne par colonne. Les valeurs des moyennes
seront sauvegardes dans une liste. Ensuite, indiquer lindice de la colonne correspondant la plus
grande moyenne.

Exercice 2 : change de triangles


crire lalgorithme qui change le triangle infrieur avec le triangle suprieur dans un tableau
deux dimensions. Cest donc le tableau obtenu en faisant une symtrie par rapport la diagonale
principale. Donnez le programme en utilisant la boucle while puis la boucle for.
Exemple :
10
23
56
47

11
44
90
78

45
12
67
55

1re anne

78
56
89
34

---\
---/

10
11
45
78

23
44
12
56

56
90
67
89

47
78
55
34


83 

Bases de la programmation

IUT de Villetaneuse

Exercice 3 : Base de donnes tudiante


Dans la base de donnes des tudiants du dpartement informatique, nous disposons dune
table "tudiant" contenant le numro, le nom et le prnom des tudiants.
Question 3.1 : crire un programme qui permet de saisir toutes ces informations au clavier et
de les stocker dans un tableau.
Question 3.2 : crire le programme qui permet dafficher tous les tudiants dont le nom commence
par une lettre saisie au clavier (en tenant compte de la casse).

Bases de la programmation


84 

1re anne

Departement informatique

TP8 : Tableaux deux dimensions

Exercice 4 : Liste de listes


En Python, un tableau 2 dimensions est dfini comme une liste de listes. crire le programme qui permet de vrifier que les lments dune liste sont des listes de mme longueur. Par
exemple les lments de la liste A = [[1, 2], [2, 4, 3]] nont pas la mme longueur (len([1,
2]) !=len([2, 4, 3]) ).

Exercice 5 : Manipulation des matrices


Question 5.1 : crire un programme qui permet de construire la matrice nulle de taille m n.
Question 5.2 : Modifier le programme pour construire la matrice carre identit I (tous les
lments de la diagonale sont gaux 1, les autres valent 0).
Question 5.3 : crire une fonction qui calcule la trace dune matrice carre, cest--dire la somme
des coefficients diagonaux de cette matrice.
Question 5.4 : crire une fonction qui teste si un lment x appartient une matrice A.
Question 5.5 : crire une fonction qui permute deux lignes dune matrice.
Question 5.6 : crire une fonction qui remplace dans une matrice A toutes les occurrences de x
par y.

Exercice 6 : Addition de matrices


Ecrire aussi une fonction qui permet de faire laddition de deux matrices de mme dimension.

Exercice 7 : Carr magique


Un carr (tableau dentiers de N lignes et N colonnes initialises) est dit magique lorsque
la somme dune ligne, dune colonne ou dune diagonale quelconque est toujours gale au mme
nombre. Voici un exemple de carr magique :
15 8
1 24 17
16 14 7
5 23
22 20 13 6
4
3 21 19 12 10
9
2 25 18 11
Question 7.1 : Concevoir une fonction crant une matrice carre dont les coefficients sont des
entiers positif saisi par lutilisateur.
Question 7.2 : Concevoir une fonction qui vrifie si un carr est magique.

1re anne


85 

Bases de la programmation

IUT de Villetaneuse

Bases de la programmation


86 

1re anne

Chapitre 8

Les chanes de caractres


8.1

Introduction

quoi servent les chanes de caractres ?


On appelle chane de caractres des fragments de texte utiliss par un programme. Il nest pas
ncessaire que le texte ait un sens pour un humain : il suffit quil soit compos dune suite de
caractres (un caractre nest pas obligatoirement une lettre de lalphabet : A, 9, , . sont des
caractres).
La chane de caractres est un type de base pour beaucoup de langages de programmation et
il existe de nombreuses bibliothques de fonctions pour les manipuler.
Comprendre et savoir traiter les chanes de caractres est indispensable pour un informaticien tant
elles sont omniprsentes dans tous les domaines de linformatique :
pour le Web : les pages XHTML, les scripts PHP par exemple,
les bases de donnes : SGBDR,
les rseaux : dans la constitution des trames ethernets,
les systmes dexploitation : criture de scripts sous linux,
programmation : sources de programmes, fichiers textes etc.
Le but de cette sance est de comprendre et concevoir des algorithmes de traitements de chanes.
Ces algorithmes seront de plus en plus labors ; cela vous permettra dentrevoir la puissance des
chanes de caractres au travers des algorithmes qui les traitent.

Rappels...
Une chane de caractres est une suite ordonne de caractres. Cette suite est dlimite par
deux apostrophes . Une chane de caractres nest pas modifiable.
Exemples de chanes littrales :
bonjour est une chanes de caractres contenant 7 caractres.
est la chane de caractres vide contenant 0 caractre.

Initialisation dune variable partir dune chane de caractres littrale. Nous pouvons
initialiser une variable avec une chane de caractres littrale, cette variable sera de type chane
de caractres.
Exemple :


1
2
3

message=L\hiver approche, vite vite, il faut se couvrir des morsures du froid.


print(message)
#affiche : Lhiver approche, vite vite, il faut se couvrir des morsures du froid.

87

IUT de Villetaneuse

Noter le caractre \ avant lapostrophe de Lhiver qui permet dchapper le caractre pour
quil ne soit pas interprt comme un dlimiteur de chanes de caractres. Pour viter lutilisation
de caractres dchappement vous pouvez utiliser les guillemets " pour dlimiter la chane de
caractres.
Exemple :


1
2
3

message="Lhiver approche, vite vite, il faut se couvrir des morsures du froid."


print(message)
#affiche : Lhiver approche, vite vite, il faut se couvrir des morsures du froid.

Initialisation dune variable partir dune autre variable. Nous pouvons affecter une
variable partir dune autre variable de type chane de caractres.


1
2
3
4

message=L\hiver approche, vite vite, il faut se couvrir des morsures du froid.


messagBis=message
print(messageBis)
#affiche : Lhiver approche, vite vite, il faut se couvrir des morsures du froid.

Concatnation de chanes de caractres. Loprateur + permet de concatner des chanes


de caractres.


1
2
3
4
5

message=L\hiver approche, vite vite, il faut se couvrir des morsures du froid.


messageBis= Couvrons nous!
messageTierce= Oui, couvrons nos oreilles!
superMessage = message + messageBis + \n+ messageTierce
print(superMessage)

6
7
8
9

#affiche :
#Lhiver approche, vite vite, il faut se couvrir des morsures du froid. Couvrons nous!
# Oui, couvrons nos oreilles!

Les chanes de caractres vues comme des tableaux. Les chanes de caractres sont analogues aux tableaux de caractres, ceci prs quelles ne sont plus modifiables aprs leur initialisation : seule la lecture des caractres de la chane de caractres est autorise.
Note : Mme si les chanes de caractres peuvent tre soumises une partie des oprations
prvues pour les tableaux, elle ne sont pas de "type" tableau, cest--dire que abc est diffrent
de [a, b, c] : le second est modifiable, pas le premier.


1
2
3
4
5
6
7
8

1
2
3

message=L\hiver approche, vite vite, il faut se couvrir des morsures du froid.


print(message[4])
# affichage : v
print(message[3] + message[6]) # affichage : ir
message[1] = c
# resultat :
# File "<pyshell#6>", line 1, in <module>
#
message[1] = c
# TypeError: str object does not support item assignment



Il faut alors bien distinguer les oprations qui recopient le tableau de celles qui le modifient. Par
exemple


mot=abc
mot=mot + d # correct parce que + cre une nouvelle chane
list.insert(mot, 0, e) # erreur parce que list.insert() modifie son premier argument

I Sur ce thme : Exercices 1, 2 et 3, TD8


Bases de la programmation


88 

1re anne

Departement informatique

8.2

Algorithmes avancs de traitement de chanes de caractres

Les chanes de caractres comme un ensemble de sous-chanes


Beaucoup de traitements de chanes de caractres consistent dcouper des chanes de caractres en informations lmentaires (tokens). En effet, une ligne (se terminant par un retour
chariot) peut tre considre comme un tout (conteneur) pour le transfert de linformation (dans
un rseau notamment sous forme de trames). la rception de la chane, il est souvent ncessaire
de dsagrger les tokens, cest--dire de les sparer afin de les traiter individuellement.
Exemple : Enseignant%informatique#Bouchaib ;Khafif 0149403124
Dans la chane de caractres prcdente, on peut identifier 5 informations lmentaires spares
par des caractres appels sparateurs : fonction%domaine#prnom;nom numroProfessionnel
Terminologie : La chane #% ; (noter un espace aprs le ;) est appele chane des sparateurs,
elle contient les caractres qui jouent le rle de sparateurs ; ils ne sont donc pas autorises dans
les tokens. De plus, leurs ordres dapparitions dans la chane des sparateurs nest pas important.
I Sur ce thme : Exercices 4, 5 et 6, TD 8

1re anne


89 

Bases de la programmation

IUT de Villetaneuse

TD9 : Chanes
Pour tous les exercices qui suivent, vous prvoirez des jeux dessais probants qui permettront
de tester les fonctions crites.

Exercice 1 : Recherche dun caractre lintrieur dune chane de caractres


Un des traitements les plus courants est la recherche dun (unique) caractre lintrieur dune
chane de caractres.
crire une fonction indexOfCar() qui prend comme paramtres une chane de caractres
chane et un (unique) caractre car et qui retourne lindice de la premire occurrence de ce
caractre dans la chane. Si car nappart pas dans chane la fonction retournera -1.
Par exemple, les instructions suivantes


1
2
3

1
2

chaine="il fait beau ici ; nest ce pas ? oui cest vrai"


print(indexOfCar(chaine, e))
print(indexOfCar(chaine, x))


conduiront laffichage suivant :





9
-1

Exercice 2 : Recherche dune sous-chane lintrieur dune chane de


caractres
On peut gnraliser le problme prcdent en recherchant, non pas un unique caractre, mais
une sous-chane dans une chane. Par exemple, dans la chane "il fait beau aujourdhui", la souschane eau apparatt la position 9, mais on ne trouve pas la sous-chane uae.
crire une fonction indexOfStr() qui recherche la prsence dune sous-chane sStr dans la
chane de caractres chaine, toutes deux passes en paramtres. La fonction retournera la postion
de la premire occurrence de sStr dans la chane de caractres chaine ; si celle-ci nexiste pas, la
fonction retournera -1.
Par exemple, les instructions suivantes


1
2
3

1
2

chaine="il fait beau ici, nest ce pas ? oui cest vrai"


print(indexOfStr(chaine, bea))
print(indexOfStr(chaine, aeb))


conduiront laffichage suivant :





8
-1

Exercice 3 : Comptage du nombre de voyelle(s) dans une chane de caractres


On rappelle que les voyelles sont les caractres a, e, i, o, u,y.
On souhaite concevoir une fonction qui retourne le nombre de voyelle(s) (indiffremment majuscule(s) ou minuscule(s)) dans une chane de caractres. Pour cela,
1. identifier les paramtres et les valeurs retournes,
2. crire la fonction,
3. proposer un jeu de tests.
Bases de la programmation


90 

1re anne

Departement informatique

Exercice 4 : Reprage des tokens dans une chane de caractres


On souhaite concevoir une fonction indexOfSep(chaine, sep) qui reoit deux paramtres en
entres :
chaine, une chane de caractres traiter, cest--dire dans laquelle il faut reprer la position
dun sparateur apparaissant dans la chane de caractres des sparateurs sep (voir item
suivant),
sep, une seconde chane de caractres contenant lensemble des sparateurs utiliss, par
exemple la chane *; :.
Le but de cette fonction est de retourner lindice du premier sparateur trouv dans la chane. La
valeur -1 est retourne dans le cas o aucun sparateur nest prsent dans la chane.
Par exemple, si lon prend comme chane "Le printemps ;est pour bientt mais :il faut attendre
lhiver" et comme ensemble de sparateurs * : ;. Lindice retourn par la fonction sera 12, il
correspond au sparateur ; qui a t trouv (en premier) dans la chane chaine. Lordre des
sparateurs dans la chane de caractres sep na strictement aucune importance.
crire la fonction indexOfSep().

Exercice 5 : Dcoupage dune chane de caractres en tokens


On souhaite concevoir une fonction stringTokenizer() qui permet de dcouper une chane
de caractres en une suite de tokens ; pour cela elle sappuiera sur un ensemble de sparateurs.
Cette fonction recevra deux paramtres :
Une chane de caractres dcouper,
une chane de caractres contenant les sparateurs,
La fonction renverra un tableau de chanes de caractres contenant les tokens.
Question 5.1 : Analyse prliminaire
1. Soit la chane "il fait*beau ici;nest ce pas:oui cest vrai" et la liste de sparateurs : *;:. Donnez la liste des tokens.
2. En considrant la mme chane de caractres et la liste de sparateurs : (espace),
donnez la liste des tokens.
Question 5.2 : Fonction utile
crire une fonction sousCh() prenant en paramtre une chane de caractres ch et deux entiers
i et j, et retournant la chane compose de tous les caractres de ch compris entre lindice i (inclus)
et lindice j (exclu). Ainsi, lexcution de la fonction sousCh(abcdefg,2,5) renvoie la chane
cde.
Question 5.3 : Fonction stringTokenizer()
1. crire la fonction,
2. proposez dautres jeux de tests.

Exercice 6 : Reconstitution dune chane de caractres partir de tokens


et dun sparateur
Lobjectif de cet exercice est dcrire un fonction implodeStrToken() faisant le traitement
inverse de la fonction prcdente. Cette fonction doit, partir dun tableau de tokens (tableau de
chanes de caractres) et dun sparateur, crer et retourner une chane de caractres contenant la
concatnation des tokens spars par le sparateur.
Par exemple, si nous transmettons la fonction implodeStrToken() :
un tableau tab contenant les tokens suivants : [il, fait, beau, ici, "nest",
ce, pas, oui, "cest", vrai],
le sparateur ;,
alors la fonction implodeStrToken() retournera la chane :
il;fait;beau;ici;nest;ce;pas;oui;cest;vrai
crire la fonction implodeStrToken() et proposer dautres jeux de tests.

1re anne


91 

Bases de la programmation

IUT de Villetaneuse

TP9 : Chaines

Exercice 7 : Insertions de symboles


crire une fonction qui reoit une chane en argument et qui renvoie une chane dans laquelle
ont t insres des tirets bas (_) entre chaque lettre de la chane dorigine. Par exemple, si on
lui passe la chane bonjour, la fonction retourne la chane b_o_n_j_o_u_r.

Exercice 8 : Prsentation rapide du langage html


Les pages Web sont crites dans un langage appel HTML (HyperText Markup Language/
langage de marquage hypertexte). Cest un langage de description de documents qui permet de
dcrire la structure du document et son contenu. HTML est un langage qui utilise des balises (ou
marqueurs, ou tags). Toute structure de texte est encadre par une paire de balises. Le canevas
de base dun document HTML est le suivant :
<html>
<head>
<title> Exemple pour le cours </title>
</head>
<body>
<p> Cest ici que lon crit le texte de la page </p>
</body>
</html>
Chaque balise est reconnaissable car entoure des caractres < >
Certaines balises vont par 2 : <html></html>, <head></head>, <p></p>. Elles indiquent comment le texte qui est entre la paire de balises doit tre structur. La deuxime balise (la balise
de fin) est construite partir de la premire (balise de dbut) en lui ajoutant devant le caractre
/. Dautres balises sont "seules" : <br/> indique un passage la ligne,<img/> indique linsertion
dune image. On supposera que les noms des balises HTML, cest--dire la chane comprises entre
< (ou </) et >, est uniquement compose de lettres minuscules. Vous allez dfinir diffrentes fonctions concernant les documents HTML. On supposera que le document est reprsent par une
chane de caractres.
1. crire une fonction estBaliseDebut() qui vrifie si une chane s, reue en argument est une
balise de dbut. Une balise de dbut est entoure des caractres < et> et entre les deux, elle
nest compose que de caractres alphabtiques minuscules.
2. crire une fonction construitBaliseFin(balDeb) qui retourne deux valeurs, un boolen et
une chane :
retourne en premire valeur True dans le cas ou la balise balDeb est une balise de dbut,
auquel cas, la deuxime valeur retourne reprsente la balise de fin correspondant balDeb,
retourne False dans le cas ou la balise balDeb nest pas conforme au langage HTML,
auquel cas, la deuxime valeur retourne est une chane vide.
Exemple complter :
balDebut = <head>
flag,balFin = construitBaliseFin(balDebut)
print(str(flag)+ + balFin)
balDebut = <he67d>
flag,balFin = construitBaliseFin(balDebut)
print(str(flag)+ + balFin)

Bases de la programmation


92 

1re anne

Departement informatique

balDebut = head>
flag,balFin = construitBaliseFin(balDebut)
print(str(flag)+ + balFin)
Prvoyez les affichages qui doivent tre obtenus
3. crire une fonction paireBalises() qui, prenant deux balises b1, b2 en paramtre, retourne
True si la balise b2 est la balise de fin correspondant la balise de dbut b1, retourne False
sinon.
Donnez les jeux dessai ncessaires.

Exercice 9 :
crire une fonction qui indique si une chane de caractres reprsentant une expression parenthse est syntaxiquement correcte du point de vue des parenthses ou pas. La fonction renvoie
-1 si lexpression est correcte et la position de la premire erreur si lexpression est incorrecte.
Exemple :
pour
pour
pour
pour
pour

"(a.(b))" elle retourne -1


"(()())" elle retourne -1
"a.(b))(" elle retourne 5
"(()(()a.(b))" elle retourne 12
")(" elle retourne 0

1re anne


93 

Bases de la programmation

IUT de Villetaneuse

Bases de la programmation


94 

1re anne

Chapitre 9

Dictionnaires
9.1
9.1.1

Introduction
Prsentation

Les dictionnaires sont des structures de donnes qui, comme les tableaux, permettent de stocker
des collections de valeurs. Ils sont utiles dans de nombreuses situations o les tableaux noffrent
plus assez de souplesse ou dexpressivit pour structurer un jeu de donnes. La particularit principale qui distingue les dictionnaires des tableaux, est que les donnes sont stockes sous forme de
couples (clef-valeur).

9.1.2

Diffrentes faons de stocker et donc daccder aux valeurs

On rappelle que dans les tableaux les valeurs sont dans lordre. On peut donc accder une
valeur en indiquant sa position au moyen dun indice :

tab_astro :

indice
valeur

0
Terre

1
Lune

2
Soleil


1
2

print( tab_astro[1] )
Lune

Dans un dictionnaire il ny a pas de notion dordre et donc pas de position. Pour accder une valeur il faut un autre moyen. Ce moyen, cest une clef unique associe chaque valeur
lors de la dfinition du dictionnaire.

dico_astro :

clef
valeur

Planete
Terre


1
2

Satellite
Lune

Etoile
Soleil


print( dico_astro[Satellite] )
Lune

Les dictionnaires sont aussi appels tableaux associatifs dans le sens o ils associent des valeurs
des clefs (et non des positions). Dans le dictionnaire dico_astro prcdent, trois couples
clef-valeur sont dfinis : Planete-Terre, Satellite-Lune et Etoile,Soleil.

95

IUT de Villetaneuse

On accde donc diffremment aux valeurs stockes dans un tableau et dans un dictionnaire.
La faon dont on veut accder aux valeurs stockes va conditionner le choix entre une structure
de donnes ou lautre.
Pour certains jeux de donnes, lutilisation dun tableau est naturelle car il y a une correspondance simple entre la valeur et sa position. Pour dautres jeux de donnes, cette correspondance
nest pas vidente. Dans de nombreux cas il sera avantageux dutiliser des dictionnaires.

9.2

Dfinition dun dictionnaire

Il existe deux faons de dfinir un dictionnaire.


La premire consiste donner littralement lensemble des couples clef-valeur lors de sa dclaration. La collection de couples clef-valeur est donne entre accolades (symboles { et }), et
chaque couple est spar par une virgule. Un couple clef-valeur est spcifi littralement en
donnant la clef suivie de la valeur qui lui est associe, les deux tant spars par deux points (le
symbole de ponctuation :), soit
dico = { clef_1:valeur_1 , clef_2:valeur_2 , ...}



1

dico_astro = {Planete:Terre, Satellite:Lune, Etoile:Soleil}

La deuxime faon de dfinir un dictionnaire, consiste dclarer un dictionnaire vide, puis de


le remplir. La dclaration dun dictionnaire vide est similaire celle de la dclaration dun tableau
vide. Les symboles du tableau vide [] sont remplacs par les symboles dun dictionnaire vide {} :


1

dico_astro2 = {}

Lajout de nouveaux couples clef-valeur au dictionnaire dico_astro2 ainsi initialis se fait


au moyen de la syntaxe suivante : dico_astro2[clef] = valeur


1
2
3
4
5

dico_astro2[Planete]
= Terre
dico_astro2[Satellite]
= Lune
dico_astro2[Etoile]
= Soleil
print( str( dico_astro2 ) )
{Planete: Terre, Satellite: Lune, Etoile: Soleil}

I Sur ce thme : Exercice 1, TD

9.3

Manipulation dun dictionnaire

Nous avons vu dans lintroduction que les clefs des dictionnaires jouent en quelque sorte le rle
des indices dans les tableaux :
les clefs permettent daccder une valeur stocke dans le dictionnaire,
les clefs permettent de modifier une valeur stocke dans le dictionnaire.
Pour illustrer ces cas nous utiliserons les tableaux et le dictionnaires dcrits prcdemment dans
lintroduction et dont la syntaxe de dfinition littrale est la suivante :



1

tab_astro = [Terre,Lune,Soleil]

2
3

dico_astro = {Planete:Terre, Satellite:Lune, Etoile:Soleil}

Bases de la programmation


96 


1re anne

Departement informatique

9.3.1

Accder une valeur

Dans un tableau la valeur correspondant lindice de position i est accessible en faisant suivre
le nom du tableau de lindice donn entre crochets.



1
2

print( str( tab_astro[1] ) )


Lune

Dans un dictionnaire cest la mme chose, la diffrence que lindice de position est remplac
par la clef.

1
2

print( str( dico_astro[Satellite] ) )


Lune

Lorsquon appelle une valeur dun tableau avec un indice qui dpasse sa taille, linterprteur
affiche un message derreur.

1
2
3
4

tab_astro[100]
Traceback (innermost last):
File "<stdin>", line 1, in ?
IndexError : list index out of range

Il en est de mme si on utilise une clef non contenue dans le dictionnaire lors dun appel de
valeur.

1
2
3
4

dico_astro[Galaxie]
Traceback (most recent call last ):
File "<stdin>", line 1, in <module>
KeyError: Galaxie

9.3.2

Modifier une valeur

Pour modifier une valeur dans un tableau il suffit daffecter une nouvelle valeur une certaine
position en spcifiant lindice de position.

1
2

print( str( tab_astro ) )


[Terre,Lune,Soleil]

3
4

tab_astro[0] = Mars

5
6
7

print( str( tab_astro ) )


[Mars,Lune,Soleil]

De la mme faon, dans un dictionnaire il suffit daffecter une nouvelle valeur une clef :

1
2

print( str( dico_astro ) )


{Planete:Terre, Satellite:Lune, Etoile:Soleil}

3
4

dico_astro[Planete] = Mars

5
6
7

print( str( dico_astro ) )


{Planete:Mars, Satellite:Lune, Etoile:Soleil}

1re anne


97 


Bases de la programmation

IUT de Villetaneuse

9.3.3

Ajouter une valeur

Pour ajouter une valeur dans un tableau il est possible dutiliser la concatenation de tableau.
Lajout dune valeur modifie alors la taille du tableau.

1
2

print( str( tab_astro ) )


[Terre,Lune,Soleil]

3
4

tab_astro = tab_astro + [ Voie Lactee ]

5
6
7

print( str( tab_astro ) )


[Mars,Lune,Soleil,Voie Lactee ]

Pour ajouter une valeur dans un dictionnaire il suffit daffecter une valeur une clef non encore
utilise :

1
2

print( str( dico_astro ) )


{Planete:Terre, Satellite:Lune, Etoile:Soleil}

3
4

dico_astro[Galaxie] = Voie Lactee

5
6
7

print( str( dico_astro ) )


{Planete: Terre, Satellite: Lune, Etoile: Soleil, Galaxie: Voie Lactee}

Il faut remarquer ici que la syntaxe utilise pour ajouter une valeur un dictionnaire est la
mme que celle employe pour modifier la valeur associe une clef existante. Pour ajouter une
valeur (ou plus exactement ajouter un couple clef-valeur), il faut imprativement que la clef ne
soit pas encore utilise dans le dictionnaire. En dautres termes,
si on utilise une clef existante, la syntaxe conduit changer la valeur associe la clef, et le
dictionnaire ne change pas de taille,
si on utilise une nouvelle clef, la syntaxe ajoute un couple clef-valeur au dictionnaire et
augmente sa taille.

9.4
9.4.1

Quelques fonctions lies lutilisation des dictionnaires


Accder la liste des clefs

Dans certains cas il peut tre utile davoir accs la liste des clefs dun dictionnaire. Cela est
ralis par la fonction dict.keys(dico) qui renvoie un tableau dont les lments sont les clefs du
dictionnaire dico.

1

dico_astro = {Planete:Terre, Satellite:Lune, Etoile:Soleil}

2
3
4

print( str( dict.keys( dico_astro ) ) )


[Planete, Satellite, Etoile]

Ici, les trois clefs du dictionnaire sont renvoyes dans le tableau [Planete, Satellite,
Etoile].
Attention :
On rappelle encore quil ny pas de notion dordre dans les dictionnaires. Le tableau
retourn par la fonction dict.values() ne traduit pas lordre dans lequel les couple
clef-valeur ont t dfinis...
Bases de la programmation


98 

1re anne

Departement informatique

9.4.2

Accder la liste des valeurs

Dans dautres cas on peut souhaiter parcourir toutes les valeurs dun dictionnaire indpendamment des clefs auxquelles elles sont associes. Cela est possible en utilisant la fonction dict.values(dico)
qui renvoie un tableau contenant les valeurs du dictionnaire dico.

1

dico_astro = {Planete:Terre, Satellite:Lune, Etoile:Soleil}

2
3
4

print( str( dict.values( dico_astro ) ) )


[Terre, Lune, Soleil]

Ici, les valeurs correspondant aux 3 clefs du dictionnaire sont renvoyes dans la liste [Terre,
Lune, Soleil].
Attention (encore) :
On rappelle quil ny pas de notion dordre dans les dictionnaires. Le tableau retourn
par la fonction dict.keys() ne traduit pas lordre dans lequel les couple clef-valeur
ont t dfinis...

9.4.3

Tester si une clef existe

dict.has_key(mon_dico, cl) : Est une fonction boolenne qui renvoie True si le dictionnaire
mon_dico a la clef cl et False sinon.


1
2

print( str( dict.has_key( dico_astro , Etoile ) ) )


True

3
4
5

print( str( dict.has_key( dico_astro , Galaxie ) ) )


False

Dans le premier cas, la fonction renvoie True car le dictionnaire comporte la clef Etoile et
False dans le second cas car la clef Galaxie est absente du dictionnaire.
I Sur ce thme : Exercice 2, TD
I Sur ce thme : Exercice 3, TD
I Sur ce thme : Exercice 4, TD

9.4.4

Supprimer une entre (clef-valeur)

del(mon_dico[cl]) : Supprime du dictionnaire la clef cl et la valeur qui lui est associe.




1

del( dico_astro[Planete] )

2
3
4

print( str( dico_astro ) )


{Satellite: Lune, Etoile: Soleil}

Ici, le couple clef-valeur correspondant la clef Planete est supprim.

9.5
9.5.1

Les clefs des dictionnaires


Utiliser une variable comme clef

Comme pour les tableaux, il est possible dutiliser comme clef dun dictionnaire la valeur affecte une variable.

1re anne


99 

Bases de la programmation

IUT de Villetaneuse


1

c = Etoile

2
3
4

print( str( dico_astro[ c ] ) )


Soleil

Ici, la clef c contient la valeur Etoile. La commande dico_astro[ c ] sera donc interprte
comme la commande dico_astro[ Etoile ].

9.5.2

Pour aller plus loin : Les clefs doivent tre des constantes

Un mme dictionnaire peut admettre des clefs de diffrents types :



1

semaine = {}

2
3

semaine[1] = lundi

# Integer

4
5

semaine[Couleur] = rouge # String

6
7
8

print( str( semaine ) )


{Couleur: rouge, 1: lundi}

Ici, le dictionnaire semaine admet la clef 1 de type entier et la clef Couleur de type chane
de caractres.
Cependant, une limitation importante concernant les clefs des dictionnaires est quelles doivent
correspondre des types constants. Par exemple, un entier, un flottant, un boolen, une chane
de caractres sont des constantes et peuvent tre utiliss comme une clef de dictionnaire.

1
2
3
4
5

dico = {}
dico[12735]=Diameter
dico[ 6367.5] = Radius
dico[True]=Vrai
dico[Nom] = Gaia


#
#
#
#

Integer
Float
Boolean
String

6
7
8

print( str( dico ) )


{6367.5: Radius, True: Vrai, 12735: Diameter, Nom: Gaia}

Par contre, les tableaux ou les dictionnaires ne sont pas des constantes puisque leur contenu
est susceptible dtre modifi. Les utiliser comme clef de dictionnaire provoquera alors un message
derreur.

1

distance = [ Terre, Lune ]

2
3

planete = {}

4
5
6
7
8

planete [ distance ] = 388272


Traceback (most recent call last ):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: list

Ceci explique lintrt des tuples. On rappelle que les tuples sont des sortes de tableaux
constants, non-modifiables. Il est donc possible de les utiliser comme clef dans un dictionnaire :


1

distance = ( Terre, Lune )

2
3

planete = {}
Bases de la programmation


100 

1re anne

Departement informatique

4
5

planete [ distance ] = 388272

9.6

Les valeurs des dictionnaires

Comme pour les tableaux, les valeurs stockes dans un dictionnaire peuvent tre de types
diffrents, sans aucune contrainte. Une valeur dun dictionnaire peut donc tre un nombre entier
ou flottant, une chane de caractres, un boolen mais aussi des collections contenant dautres
valeurs comme un tableau ou un autre dictionnaire. Par exemple, le dictionnaire suivant contient
des donnes htrognes :
clef

valeur

type

Satellites

Rayon

6378.137

<int>

<float>

Tellurique
indice
0
1
2

True

<bool>

<list>

Oceans
valeur
Pacifique
Atlantique
Indien

Superficie
clef
valeur
Pacifique
49.7
Atlantique
29.5
Indien
20.4
<dict>

Il peut tre cod de la faon suivante :





1
2
3
4
5
6

terre = {}
terre [Satellites]
terre [Rayon]
terre [Tellurique]
terre [Oceans]
terre [Superficie]

=
=
=
=
=

1
6378.137
True
[Pacifique, Atlantique, Indien]
{Pacifique:49.7, Atlantique:29.5,Indien:20.4}

7
8
9
10
11
12
13

print( str( terre ) )


{Satellites: 1,
Superficie: {Pacifique: 49.700000000000003, Atlantique: 29.5, Indien: 20.399999999999999},
Rayon: 6378.1369999999997,
Oceans: [Pacifique, Atlantique, Indien],
Tellurique: True}

Dans le cas o une valeur du dictionnaire est elle mme une collection, il doit tre possible
daccder une valeur de cette collection. La syntaxe est la mme que pour accder une valeur
dans un tableau multi-dimensionnel.
Ainsi, partir du tableau prcdent, pour accder la superficie de locan indien on utilise la
syntaxe suivante :

1
2

print( str( planete[Superficie][Indien] ) )


20.4

En effet, le dictionnaire planete admet pour clef Superficie qui pour valeur un dictionnaire. Lexpression planete[Superficie] est donc un dictionnaire qui lui-mme pour clef la
chane de caractre Indien et dont la valeur est 20.4.
De faon analogue, pour accder au nom du premier ocan, on utilise la syntaxe suivante :

1
2

print( str( planete[Oceans][0] ) )


Pacifique

1re anne



101 

Bases de la programmation

IUT de Villetaneuse

En effet, le dictionnaire planete admet pour clef Oceans qui pour valeur un tableau.
Lexpression planete[Ocean] est donc un tableau dont le premier lment est Pacifique.
I Sur ce thme : Exercice 5, TD

9.7

Rcapitulatif et Comparaison Dictionnaire/Tableau


Opration
Dfinition dun conteneur vide
Dfinition dun littral
Appel dune valeur
Ajout dun lment
Modification dune valeur
Nombre dlments
Suppression dun lment

Bases de la programmation

Tableau
t=[]
t = [ val_1, val_2, . . .]
t[ indice ]
t = t + [ nlle_val ]
t[ indice ] = nlle_val
len( t )
del( t[ indice ] )


102 

Dictionnaire
d={}
d = { clef_1 :val_1 , clef_2 :val_2 , . . .}
d[ clef ]
d[ nlle_clef ] = nlle_val
d[ clef ] = nlle_val
len( d )
del( d[ clef ] )

1re anne

Departement informatique

TD10 : Dictionnaires

Exercice 1 : Dfinition dun dictionnaire


Dfinissez le dictionnaire lunes reprsent ci-dessous. Ce dictionnaire stocke le nombre de
satellites de chaque plantes. Dans un premier temps vous dfinirez de faon littrale le dictionnaire
pour les 4 premiers couples clef-valeur puis vous ajouterez successivement les 4 derniers couples.
clef
valeur

Mercure
0

Venus
0

Terre
1

Mars
2

Jupiter
63

Saturne
61

Uranus
27

Neptune
11

Proposez un jeu de tests permettant de vrifier que le dictionnaire est correctement dfini.

Exercice 2 : Exploration dun dictionnaire


partir du dictionnaire dfini dans lexercice prcdent, proposez un programme permettant
de :
modifier le dictionnaire prcdent pour corriger une erreur qui sest glisse dans lnonc. La
plante Neptune comporte en fait 13 satellites.
afficher le nombre de lunes de la Terre,
afficher la liste des plantes,
afficher le tableau des plantes et du nombre de leurs lunes,
afficher le nombre total de lunes.

Exercice 3 : Nombre doccurrences des caractres dun texte


Proposez une fonction occurrences(texte) prenant comme paramtre une chane de caractres et renvoyant un dictionnaire contenant le nombre doccurrences de chaque caractre prsent
dans un texte dont :
les clefs sont les caractres rencontrs dans le texte (et seulement ceux-l) et
les valeurs le nombre de leurs occurrences.
Pour implmenter cela, vous aurez besoin :
de la fonction dict.has_key( dico , clef ) qui permet de tester si une clef existe dans
le dictionnaire. En effet, lors de lanalyse du texte, pour chaque caractre lu, vous devrez
tester si il a dj t vu. Si il a dj t vu vous incrmenterez son nombre doccurrences, Si
il na jamais t vu, vous crerez une nouvelle clef dans le dictionnaire.
de la fonction dict.keys( dico ) qui renvoie la liste des clefs du dictionnaire dict. Cette
fonction vous permettra de passer en revue le contenu du dictionnaire pour laffichage final.
Vous donnerez un script de test qui affichera le tableau des occurrences.

Exercice 4 : Comptage des points la Belote Coinche


La belote coinche est un jeu qui se joue 4 joueurs par quipe de 2 et un jeu de 32 cartes.
Il se distingue de la Belote par un systme dannonce. Tout tour, avant de commencer poser
les cartes chaque joueur "passe" ou "annonce" une couleur datout et le nombre de points quil
pense faire en choisissant cet atout. Celui qui propose lannonce la plus forte dfinit latout pour
la partie. Lors du comptage des points en fin de partie, chaque carte remporte par une quipe
est convertie en points. Le score dune quipe correspond au nombre de points associs aux plis
quelle a remport. Les rgles de calcul sont les suivantes :
1re anne


103 

Bases de la programmation

IUT de Villetaneuse

Figure
As
Roi
Dame
Valet
Dix
Neuf
Huit
Sept

Nb de points
lAtout
11
4
3
20
10
14
0
0

Nb de points
Autre Couleur
11
4
3
2
10
0
0
0

1. Dfinissez 2 dictionnaires Atout et Autre dont les couples (clef,valeur) sont respectivement
la figure porte par la carte et le nombre de points associs cette figure lorsquelle est de
la couleur de latout ou dune autre couleur.
2. Dfinissez une fonction comptage() prenant comme paramtre les 2 dictionnaires, une couleur datout et un ensemble de cartes. La fonction renvoie le nombre de points associs cet
ensemble de cartes. Les cartes seront passes comme une liste de tuples dont
la premire valeur correspond la figure de la carte (As, Roi, Dame, Valet, Dix, Neuf,
Huit, ou Sept) et
la deuxime valeur correspond la couleur de la carte (Pic, Coeur, Carreau, Trefle)
3. Calculez le nombre de points que les joueurs se partagent au cours dune partie sachant que
10 points sont accords lquipe qui remporte le dernier tour de jeu,
4. Dfinissez une fonction affiche_carte_point qui prend comme argument les 2 dictionnaires
et la couleur datout et affiche lensemble des 32 cartes et leur valeur.

Exercice 5 :
Les ARN sont forms dune squence de "bases" prises parmi un alphabet de 4 lettres (A, U,
C, G).
Les protines sont forment une squence dacides amins pris parmi un alphabet de 20 lettres.
On considrera que chaque ARN peut tre traduit en protine si lon connait le code de conversion
appel "code gntique".
Pour traduire un ARN en protine, on dcoupe la squence dARN en groupe de 3 bases (un
codon). A chaque codon correspond un acide amin unique. Traduire une squence dARN en
protine et vice versa est donc un exercice de r-criture.
Par exemple, si lon considre la squence AUG GUU AGG UUG UGA dARN, celle-ci est traduite par
la squence dacide amine suivante : MVRLLe dtail de la traduction est donn par le tableau suivant :
ARN
Code gntique
Acide Amins

code 3 lettres
code 1 lettre

codon1
AUG

codon2
GUU

codon3
AGG

codon4
UUG

codon5
UGA

Par exemple, le premier codon dARN AUG, code pour lacide amin Mthionine, dont le nom
abrg une lettre est M.
Afin de pouvoir travailler sur un vrai code gntique, vous allez devoir tlcharger un fichier
contenant le code et le lire dans Python. Le fichier qui vous est donn la forme suivante :


1
2
3
4
5

AAA
AAC
AAG
AAT
ACA

K
N
K
N
T

Bases de la programmation


104 

1re anne

Departement informatique

6
7
8
9
10

...
UUA
UUC
UUG
UUU

L
F
L
F

chaque ligne correspond un codon (3 lettres de lARN)


La premire colonne donne les 3 lettres formant le codon dARN.
La deuxime colonne donne la lettre (le nom) de lacide amin (protine) correspondant
ce codon,
Chaque colonne est spare par une tabulation.
Le fichier CodeGenetique.tsv tlchargeable ladresse :
http://www-lipn.univ-paris13.fr/santini/data/CodeGenetique.tsv
Il doit tre enregistr dans votre rpertoire de travail.
Question 5.1 : Dfinissez une fonction lire_code_genetique( fichier ) qui prend en paramtre le nom dun fichier de code gntique (son chemin) et qui renvoie un dictionnaire dont
les clefs sont les codons (3 lettres de lARN) et les valeurs la lettre de lacide amin (protine)
correspondant.
Pour lire un fichier dans Python il faut connatre les oprations suivantes :
f_in = open(nom_du_fichier , r )
ouvre le fichier en mode lecture(r) dans la variable f_in et place un curseur de lecture au
dbut de la premire ligne,
raw_line = file.readline(f_in)
lit une seule ligne du fichier, stocke la ligne dans la variable raw_line sous la forme dune
chane de caractres et place le curseur de lecture au dbut de la ligne suivante,
Lorsquon arrive la fin du fichier la fonction file.readline(f_in) renvoie la chane de
caractres vide .
Vous pourrez utiliser la fonction stringTokenizer() vue dans un TD/TP prcdent pour
dcomposer la ligne lue.
Question 5.2 : On rappelle que plusieurs codons (3 lettres de lARN) peuvent coder pour un
mme acide amin (protine).
Dfinissez une fonction reverse_genetic_code( code_genetique ) qui prend pour paramtre le
dictionnaire produit la fonction prcdente lire_code_genetique() et qui renvoie un dictionnaire
dont les clefs sont les lettres de acides amins et les valeur la liste (tableau) des codons (3 lettres
de lARN) codant pour cet acide amin.
Il sagit en quelque sorte "dinverser" le dictionnaire sans perdre dinformation. A titre dexemple
les valuations suivantes donnent les rsultats indiqus :


1
2

CodeGenetique = lire_code_genetique( CodeGenetique.tsv )


Codon = reverse_genetic_code( CodeGenetique )

3
4
5

print( str( Codon[R] ) )


[AGG, AGA, CGA, CGC, CGG, CGU]

6
7
8

print( str( Codon[E] ) )


[GAA, GAG]

Question 5.3 : Proposez une fonction ARN_to_Proteine( seq_ARN , code_genetique ) qui


prend pour paramtre une squence dARN et le dictionnaire du code gntique et renvoie la
squence de la protine correspondante. A titre dexemple les valuations suivantes donnent les
rsultats indiqus :


1re anne


105 

Bases de la programmation

IUT de Villetaneuse

1
2

print( ARN_to_Proteine( AUGGUCCUAAAACGAAGAACCUGGCCGUU ,CodeGenetique) )


MVLKRRTWP

Question 5.4 : Proposez une fonction nombre_de_sequences( seq_proteines , codons )


qui prend pour paramtre une squence de protine et le dictionnaire des codons et qui renvoie le
nombre de squences possibles dARN codant pour la proteine. A titre dexemple les valuations
suivantes donnent les rsultats indiqus :


1
2

print( nombre_de_sequences( MVLKRRTWP, Codon) )


27648

Exercice 6 : Dictionnaire de dictionnaires


Nous voulons ici dfinir un programme permettant de grer un stock darticles. Pour cela, nous
voulons tre capable :
dajouter une rfrence (prix, quantit, et couleur) dans le stock,
de calculer le prix total du stock.
Pour cela :
Question 6.1 : Crez une fonction ajout_reference() sans paramtre qui renvoie un dictionnaire dont les couples clef-valeur sont :
Clef
"Prix"
"Quantit"
"Couleur"

Valeur
<float>
<int>
<string>

Pour paramtrer le dictionnaire renvoy, la fonction demandera lutilisateur de saisir itrativement au clavier, les diffrentes valeurs.
Question 6.2 : Dfinissez le programme principal permettant, de saisir plusieurs rfrences, puis
en fin de saisie, dafficher le montant total du stock.
Question 6.3 : Pour aller plus loin, vous pourrez enrichir le programme principal de fonctionnalits telles que :
supprimer une rfrence du stock,
modifier la quantit dune rfrence,
Afficher ltat du stock,
...

Bases de la programmation


106 

1re anne

Chapitre 10

Tri
10.1

Tri dun tableau

Trier un tableau, cest le modifier pour que ses lments soient rangs dans lordre croissant.
Par exemple, le tableau


[3, 9, 5, 6, 1]


devient, ue fois tri :


[1, 3, 5, 6, 9]




Lordre entre les chanes de caractres est alphabtique, si bien quun tableau comme

[Hakim, Yaniss, Joel, Bastien, Loic, Remy, Deborah, Laurent, Ayoub]


devient une fois tri :





[Ayoub, Bastien, Deborah, Hakim, Joel, Laurent, Loic, Remy, Yaniss]

Il existe de nombreux algorithmes diffrents pour trier des algorithmes. Les algorithmes sont
plus ou moins difficiles comprendre, et plus ou moins efficaces. Parmi les algorithmes facilement
comprhensibles, mais peu efficaces ds que la taille du tableau trier augmente, notons :
Tri bulles
Tri par insertion
Parmi les algorithmes avancs et efficaces avec des tableaux de grande taille, notons :
Tri fusion (merge sort)
Tri rapide (quick sort)
Tri par tas (heap sort)

10.2

Complexit des algorithmes

Les performances de diffrents algorithmes dpendent de la nature des donnes trier : dj


presque tries, ordre inverse ou presque, rpartition quelconque etc. Certains algoritmes peuvent
tre trs rapides dans certains cas, et moins dans dautres. Avoir une ide de la configuration des
tableaux trier permet dutiliser les algorithmes les plus rapides.
Pour trier un tableau, quelle que soit la mthode employe, les algorithmes seront amens
effectuer un certain nombre de tests (pour savoir si une valeur est plus grande quune autre) et
surtout un certain nombre de modifications des valeurs du tableau. Ce nombre doprations
effectuer pour trier un tableau crot avec la taille des tableaux. Par exemple, trier un tableau de
100 000 lments dans un ordre quelconque demandera plus doprations que den trier un de 100
lments, mais pas ncessairement 1 000 de plus.
107

IUT de Villetaneuse

La relation entre le nombre doprations effectuer donc le temps de calcul ncessaire


pour le tri et la taille du tableau nest pas ncessairement linaire (i.e., gale constante
tailledutableau ). Si n est la taille du tableau trier,
Pour les algorithmes peu efficaces cits plus haut, le nombre doprations ncessaires est de
lordre de n2 , n tant la taille du tableau. Autrement dit, le temps de calcul crot de manire
quadratique par rapport la taille du tableau trier.
Pour les algorithmes efficaces mentionns prcedemment, la complexit est parfois de lordre
de n log(n). Autrement dit, le surcot laugmentation de la taille du tableau est moindre.
Il est possible danalyser de manire thorique la plupart des algorithmes, et den dduire
son ordre de complexit (n2 , n log2 (n) etc) : on procde alors une analyse de complexit.
Cest absolument ncessaire ds quon en vient traiter de gros volumes de donnes. Ce nest
pourtant pas ce qui sera abord dans la suite de ce cours. Nous nous livrerons ici plutt une
tude empirique des temps de calcul de diffrents algorithmes de tri.

10.3

Tri par insertion

Parmi les algorithmes de tri faciles mettre en oeuvre, le tri par insertion est le plus efficace
avec des tableaux de petite taille. Lide est simple :
On considre chaque lment du tableau, en partant du premier. Ceci constitue une premire
boucle sur les lments du tableau.
A chaque tape, lobjectif est dinsrer llment considr sa place parmi ceux qui prcdent. Il faut pour cela trouver quel endroit llment doit tre insr en le comparant aux
autres, puis dcaler les lments afin de pouvoir effectuer linsertion. En pratique, ces deux
actions sont frquemment effectues en une passe, qui consiste faire remonter llment
au fur et mesure jusqu rencontrer un lment plus petit.
Considrons par exemple le tableau [9, 6, 1, 4, 8]. A la premire tape, on considre llment 6 et on le place sa place parmi les lments prcdents, cest dire en toute premire
position :

A la seconde tape, cest llment 1 que lon considre. Pour le faire remonter jusqu sa
place, on dcale le 9 puis le 6 vers la droite, puis on met le 1 en premire position :

A la troisime tape, cest le 4 que lon considre. Le 9 puis le 6 sont dcals, mais pas le 1 car
sa valeur est infrieure. La place du 4 est donc lancienne position du 6. On linsre ici :

La dernire tape permet de terminer le tri du tableau :

Le tri par insertion nest pas efficace ds que les tableaux sont grands. En revanche, il reste
trs efficace pour de petits tableaux et avec des tableaux plus grands, mais presque ordonns.
I Sur ce thme : Exercice 1, TP 10

10.4
10.4.1

Fonction range() et tranches de tableaux


Rappel sur la fonction range()

Dans le chapitre sur les tableaux, nous avons introduit la fonction range() qui permet de crer
des tableaux dentiers (et dentiers uniquement) de manire simple et rapide. Elle fonctionne sur le
Bases de la programmation


108 

1re anne

Departement informatique

modle : range([dbut,] fin[, pas]). Elle cre alors un tableau contenant tous les entiers entre
dbut compris et fin non compris, selon le pas pas. Les arguments entre crochets sont optionnels.
Si largument dbut nest pas spcifi, il est alors considr comme gal 0. Si le pas pas nest
pas spcifi, il est alors considr comme gal 1. Attention, si seulement deux arguments sont
spcifis, ils correspondent alors aux arguments dbut et fin. En excutant le code


1
2
3
4
5

1
2
3
4
5

print(range(0,10))
print(range(10))
print(range(15,21))
print(range(0,1000,100))
print(range(2,-5,-1))


on obtient laffichage





[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[15, 16, 17, 18, 19, 20]
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
[2, 1, 0, -1, -2, -3, -4]

10.4.2

Tranches de tableaux

Avec une syntaxe proche de celle de la fonction range() on peut extraire un sous-tableau dun
tableau. Plus prcisment, si tab est un tableau alors tab[[dbut]: fin[: pas]] est le soustableau de tab forms des lments compris entre tab[dbut] compris et tab[fin] non compris,
selon le pas pas. Les arguments entre crochets sont optionnels. Si largument dbut nest pas
spcifi, il est alors considr comme gal 0. Si le pas pas nest pas spcifi, il est alors considr
comme gal 1. Attention, si seulement deux arguments sont spcifis, ils correspondent alors
aux arguments dbut et fin. En excutant le code


1
2
3
4

1
2
3

tab=range(0,10)
print(tab)
print(tab[5:8])
print(tab[1:10:2])


on obtient laffichage





[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 6, 7]
[1, 3, 5, 7, 9]

10.5

Temps dexcution dune fonction

En Pyhton, on peut utiliser le module time pour dterminer avec prcision le temps dexcution
dun programme. Pour ce faire, il faut placer import time en dbut de programme. On utilisera la
fonction time.clock() qui retourne un nombre flottant (float exprimant le nombre de secondes
coules depuis une origine dpendant du systme dexploitation utilis).
Mais cette origine importe peu quand on veut mesurer le temps dexcution dune fonction :
il suffira denregistrer ce qui est renvoy par time.clock() avant lexcution, puis aprs, et enfin
de faire la diffrence des deux temps. Pour afficher le nombre de secondes ncessaires lexcution
de la fonction test(), par exemple, on peut crire


1
2
3
4

t1=time.clock()
test ()
t2=time.colck()
print(t2-t1)

1re anne



109 

Bases de la programmation

IUT de Villetaneuse

Ce faisant, on affiche un nombre de secondes avec de nombreux chiffres aprs la virgule (lchelle
de prcision de time.clock() est de lordre de la micro-seconde). La plupart les fonctions seffectuant en quelques millisecondes, on prfre souvent afficher un nombre millisecondes.
A cet effet, rappelons la possibilit de formater laffichage des nombres flottants dans la fonction
print().

Bases de la programmation


110 

1re anne

Departement informatique

TP10 : Etude empirique dalgorithmes de tri

Exercice 1 : Test du tri par insertion


Question 1.1 : Proposez une fonction de tri par insertion triTableauInsertion(tab).
Question 1.2 : Testez la fonction triTableauInsertion(tab) de tri par insertion avec des
tableaux dj tris, tris en ordre inverse (le pire des cas) ou bien initialiss avec des valeurs
alatoires. Vous pourrez utiliser les fonctions ci-dessous pour initialiser les tableaux.


1
2

1
2

1
2
3
4
5

def construireTableauCroissant ( taille ) :


return range(10,11+taille)







def construireTableauDecroissant ( taille ) :


return range(11+ taille ,10, -1)







def construireTableauAleatoire ( taille ) :


tab=[]
for i in range (0, taille ) :
tab.append(random.randint(0,taille*2))
return tab

Question 1.3 : Excutez des tris par insertion de tableaux alatoires de longueurs diffrentes. En
1 minute peu prs, combien dlments est-il possible de trier ?

Exercice 2 : Test de la fonction list.sort


Question 2.1 : Testez la fonction de tri list.sort de Python avec des tableaux alatoires de
tailles diffrentes. En 1 minute peu prs, combien dlments est-il possible de trier ?
Question 2.2 : Mesurez prcisment le temps dexcution du tri rapide en utilisant les fonctions
clock() du module time dcrites dans le cours.
Question 2.3 : Avec des tableaux alatoires de mme taille, selon les nombres tirs, le temps dexcution peut varier de manire significative. Modifiez le programme principal pour que la fonction
de tri soit appele plusieurs fois de manire afficher une moyenne pour les temps dexcution.

Exercice 3 : Comparaison empirique entre la fonction list.sort et le tri


par insertion
Question 3.1 : Mesurez le temps dexcution moyen pour list.sort de tableaux alatoires de
50, 100, 200, 500 et 1000 lments. Reportez ces donnes sur un graphique avec :
En abscisse le nombre dlments trier
En ordonne le temps dexcution
Question 3.2 : Que signifie le fait que la courbe ne soit pas une droite ?
Question 3.3 : Sur le mme graphique, reportez les temps dexcution moyens pour le tri par
insertion de tableaux alatoires de 50, 100, 200, 500 et 1000 lments. Pour des tableaux de petite
taille, quelle mthode de tri vaut-il mieux utiliser ? A partir de quelle taille de tableaux vaut-il
mieux employer list.sort ?

Exercice 4 : Tri bulles (Pour les plus rapides)


Lalgorithme du tri bulles parcourt le tableau, et compare les couples dlments successifs.
Lorsque deux lments successifs ne sont pas dans lordre croissant, ils sont changs. Aprs chaque
1re anne


111 

Bases de la programmation

IUT de Villetaneuse

parcours complet du tableau, lalgorithme recommence lopration. Lorsquaucun change na lieu


pendant un parcours, cela signifie que le tableau est tri. On arrte alors lalgorithme.
Prenons le tableau [5, 1, 4, 2, 8] et trions-le de manire croissante en utilisant lalgorithme de
tri bulles. Pour chaque tape, les lments compars sont crits en gras.
Premire tape :
[5, 1, 4, 2, 8] [1, 5, 4, 2, 8]
Les lments 5 et 1 sont compars, et comme 5 > 1, lalgorithme les intervertit.
[1, 5, 4, 2, 8] [1, 4, 5, 2, 8]
[1, 4, 5, 2, 8] [1, 4, 2, 5, 8]
[1, 4, 5, 2, 8] [1, 4, 5, 2, 8]
Comme 5 < 8, les lments ne sont pas changs.
Continuez drouler lexemple.
Question 4.1 : Proposez une fonction de tri bulles triBulles(tab).
Question 4.2 : Quel est le pire cas (celui ncessitant le plus dchanges dlment du tableau) ?
Quand cela se produit-il ? Combien y a-t-il alors dchanges, de tests ? Quel est le meilleur cas
(celui ncessitant le moins dchanges dlment du tableau) ? Quand cela se produit-il ? Combien
y a-t-il alors dchanges, de tests ?
Question 4.3 : Comparez lefficacit du tri bulles avec celle des algorithmes prcedemment
tudies

Bases de la programmation


112 

1re anne

Chapitre 11

Rvisions
Les trois premiers exercices constituaient le sujet du controle long de janvier 2011

Exercice 1 : Index
On se propose de raliser une sorte dindex. Pour cela, on passera par les tapes suivantes (les
questions sont indpendantes).
Question 1.1 : crire une fonction code_a qui tant donne une chaine de caractres, calcule
la somme des codes ASCII de ses lettres. En Python la fonction ord renvoie le code ASCII du
caractre pass en argument.
Exemple : code_a("jussieu")= 106+117+115+115+105+101+117=776
Question 1.2 : crire une fonction separateur qui, tant donne une chaine de caractres,
remplace tous les caractres non alphabtiques par un espace. En Python la fonction, isalpha
renvoie True si son argument est constitu de caractres alphabtiques et False sinon.
Exemple : Il sen allait ruminant son bonheur, comme ceux qui machent encore, apres son
diner, le gout des truffes quils digerent.
Aprs lappel de la fonction sparateur :
Il s en allait ruminant son bonheur comme ceux qui machent encore apres son diner le gout
des truffes qu ils digerent.
Question 1.3 : On suppose que la fonction code_a ne renvoie jamais la mme valeur pour deux
mots diffrents. On dfinit un tableau de comptage : cest--dire un tableau dentiers dont les
indices varient entre 1 et M, o M est lentier maximum que lon peut obtenir par la fonction
code_a. Autrement dit, chaque indice correspond la reprsentation dun mot par la valeur
que renvoie la fonction code_a. Le contenu de chaque case de ce tableau reprsente le nombre
doccurrences du mot correspondant ;
crire un programme de comptage : tant donn un tableau t de mots (chaines de caractre)
suppos rempli et reprsentant un texte. Ce programme remplit un tableau de comptage C, en
indiquant pour chaque mot son nombre doccurrences dans le texte.
Exemple : Si le mot "bonheur" apparait 3 fois dans le tableau t et code_a("bonheur")=755.
La case C[755] doit avoir la valeur 3.
Question 1.4 : On souhaite pouvoir savoir quel mot du tableau t correspond chacune des
valeurs prises par la fonction code_a. cette fin, on dfinit un tableau de dcodage de la mme
taille que le tableau de comptage, chaque indice correspond la valeur prise par la fonction code_a
et la case correspondante contient la chane de caractres qui a ce code_a sil y en a une dans t,
la chane vide sinon.
crire un programme de dcodage : tant donn un tableau t de mots (chaines de caractre)
suppos rempli et reprsentant un texte. Ce programme remplit un tableau de dcodage D, en
plaant chaque mot de t dans la case dindice son code_a et en sassurant que les autres cases
113

IUT de Villetaneuse

contiennent la chane vide.

Exercice 2 : Programme mystre


Question 2.1 : Quaffiche le programme suivant ? (remarque : une chane de caractres est considre comme suprieure une autre lorsquelle est plus loin dans lordre alphabtique)


1
2
3
4
5
6

def grandAbsorbe(x, y):


if (x>y) :
y=x
else :
x=y
return x

7
8
9
10
11
12
13

def petitAbsorbe(x, y):


if (x<y) :
y=x
else :
x=y
return (x, y)

14
15
16
17
18
19

def grandRemplace(tab):
for i in range (0, len(tab)-1):
if tab[i]>tab[i+1] :
tab[i+1]=tab[i]
return tab

20
21
22
23
24
25
26
27

print("debut")
str1 ="abc"
str2 ="def"
str3 =grandAbsorbe(str1, str2)
print(str1)
print(str2)
print(str3)

28
29
30
31
32
33

str1 ="abc"
str2 ="def"
( str1 , str2)=petitAbsorbe( str1 , str2)
print(str1)
print(str2)

34
35
36
37
38
39

t1=[2, 1, 4, 3]
print(t1)
t2=grandRemplace(t1)
print(t1)
print(t2)

Question 2.2 : crire grandRemplace2 qui renvoie le nombre dlments modifis par grandRemplace
dans tab. Quels sont les tableaux tab pour lesquels grandRemplace2 renvoie 0 ?
Question 2.3 : crire une fonction grandRemplace3 qui renvoie le mme rsultat que grandRemplace
mais qui ne modifie pas son argument.

Exercice 3 : Manipulation des lments dun tableau


Dans cet exercice, les questions sont indpendantes. On supposera pour chaque fonction que
le tableau pass en paramtre est correct.
Lors dune enqute de satisfaction pour un produit, des clients taient invits donner une
note entire entre 0 et 20. Les 500 rponses ont t collectes dans le tableau dentiers donn
Bases de la programmation


114 

1re anne

Departement informatique

ci-dessous.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

resultat =[3, 7, 9, 0, 18, 5, 4, 19, 8, 3, 10, 7, 14, 13, 0, 18, 17, 5,


16, 4, 5, 1, 20, 6, 16, 10, 13, 12, 6, 5, 20, 8, 9, 15, 3, 17, 12, 10,
19, 3, 13, 4, 13, 14 , 17, 17, 15, 14, 18, 6, 17, 9, 9, 6, 15, 17, 11,
8, 8, 0, 19, 19, 13, 18, 11, 1, 16, 5, 16, 7, 18, 20, 3, 16, 3, 9, 1,
3, 20, 11, 6, 19, 0, 13, 10, 14, 13, 5, 1, 16, 2, 19, 10, 2, 14, 6, 8,
15, 4, 6, 8, 20, 4, 2, 0, 18, 19, 20, 13, 1, 13, 16, 12, 12, 7, 19,
13, 11, 3, 18, 10, 7, 20, 0, 4, 4, 16, 14, 19, 0, 0, 16, 4, 0, 7, 18,
15, 8, 8, 6, 1, 12, 17, 9, 1, 4, 13, 0, 8, 15, 19, 4, 3, 1, 3, 1, 1,
1, 6, 10, 15, 8, 14, 17, 14, 3, 5, 0, 19, 6, 8, 13, 14, 2, 1, 12, 4,
1, 10, 17, 11, 7, 11, 12, 6, 10, 8, 18, 13, 15, 12, 14, 8, 2, 2, 3,
17, 6, 9, 17, 9, 19, 16, 8, 18, 0, 10, 15, 2, 17, 2, 3, 13, 19, 13,
12, 12, 2, 2, 4, 17, 17, 17, 2, 11, 19, 13, 8, 0, 9, 8, 5, 4, 13, 9,
9, 19, 15, 19, 1, 19, 10, 20, 1, 11, 8, 13, 0, 10, 6, 5, 1, 11, 0, 8,
13, 5, 0, 15, 9, 7, 0, 10, 0, 1, 12, 12, 10, 19, 17, 0, 6, 16, 12, 8,
12, 14, 13, 15, 20, 7, 17, 1, 18, 15, 13, 6, 14, 18, 8, 13, 14, 8, 14,
7, 16, 2, 19, 14, 6, 17, 8, 11, 14, 16, 11, 19, 2, 20, 16, 2, 13, 14,
20, 6, 13, 20, 9, 3, 19, 3, 0, 7, 0, 16, 7, 4, 15, 16, 17, 2, 14, 3,
15, 12, 16, 18, 1, 5, 9, 2, 1, 5, 9, 5, 13, 10, 11, 16, 6, 16, 8, 13,
11, 6, 8, 2, 5, 2, 5, 9, 1, 7, 20, 19, 4, 14, 2, 8, 9, 5, 9, 9, 5, 15,
12, 3, 7, 15, 17, 6, 0, 7, 2, 17, 19, 20, 15, 1, 11, 11, 18, 9, 7, 1,
1, 17, 1, 17, 10, 2, 5, 1, 14, 7, 2, 3, 0, 4, 2, 9, 17, 3, 6, 7, 18,
14, 14, 4, 10, 3, 15, 16, 17, 6, 15, 12, 17, 9, 5, 14, 14, 6, 4, 4, 4,
17, 10, 10, 11, 13, 16, 3, 0, 2, 18, 3, 20, 5, 16, 6, 0, 8, 3, 3, 10,
2, 0, 6, 11, 12, 9, 18, 8, 6, 2, 0, 0, 19, 12, 17, 5, 19, 12, 17, 4,
0, 20, 8, 3, 7, 6, 10, 0, 3, 4, 4, 6, 11, 0, 13, 14, 17, 20, 12, 3,
18, 3, 13, 14]

Question 3.1 : On souhaite connatre la rpartition prcise des notes qui ont t donnes, cest-dire le nombre de fois que chaque note a t donne. crire une fonction qui retourne un tableau
de 21 lments indics de 0 20 dont la n-ime composante contiendra le nombre de fois o la
note n a t donne.
Question 3.2 : On souhaite connatre les notes qui ont t donnes le plus et moins frquemment.
crire une fonction qui partir dun tableau de notes affiche les notes qui ont t donnes le plus
et le moins souvent ainsi que le nombre de fois quelles ont t donnes. Utiliser cette fonction pour
afficher les notes donnes le plus et le moins frquemment, ainsi que le nombre de fois quelles ont
t utilises dans le cas de lenqute mentionne ci-dessus.
Lexemple a t choisi afin que le maximum et le minimum des frquences soient uniques.
Question 3.3 : Afin davoir une vision plus prcise, on souhaite obtenir le pourcentage de personnes tant trs satisfaites (note entre 16 et 20), plutt satisfaites (note entre 11 et 15), plutt
insatisfaites (note entre 6 et 10) et pas du tout satisfaites (note entre 0 et 5). Pour cela, crer une
fonction prenant en paramtre le tableau retourn par la fonction de la question 1 et retournant
un tableau de 4 cases, chaque case contenant le pourcentage de satisfaction.
Question 3.4 : Pour simplifier la lecture des rsultats, crire les pourcentage de satisfaction sous
la forme de graphique selon :
Tres satisfaites
Plutot satisfaites
Plutot instatisfaites
Tres insatisfaites

:
:
:
:

*******************************
***********************
**********************
**********************

o le nombre dtoiles de chaque ligne correspond la partie entire infrieure du pourcentage de


satisfaction associ.
Pour cela, crer une fonction prenant en paramtre le tableau de pourcentage et affichant sous
forme graphique les rsultats.
1re anne


115 

Bases de la programmation

IUT de Villetaneuse

On rappelle que quand le paramtre pass la fonction int est un nombre rel ( virgule
flottante) x , la fonction retourne la partie entire de x.

Exercice 4 : Divisible ou pas ?


crire une fonction prenant comme paramtres deux entiers min et max qui vrifie dabord
que min max et qui affiche les nombres entiers, compris entre les valeurs min (inclus) et max
(inclus), et qui sont pairs. De plus, si le cas chant, le nombre (en plus dtre divisible par 2)
est divisible par 3, le message "de plus ce nombre est divisible par 3". On crira un programme
principal o les valeurs min et max seront demandes lutilisateur et la fonction est appele.
On vous rappelle que loprateur % (modulo) permet de calculer le reste de la division euclidienne.
Exemple : Si min = 3 et max = 7
Affichage obtenu


1
2

4 est divisible par 2


6 est divisible par 2 de plus ce nombre est divisible par 3

Exercice 5 : Calcul du de la cl dun numro de SIREN


(Source Wikipdia) En France, SIREN (Systme dIdentification du Rpertoire des ENtreprises) est un code INSEE unique qui sert identifier une entreprise franaise. Il existe au sein
dun rpertoire gr par lINSEE : SIRENE. Il est national, invariable et dure le temps de la vie
de lentreprise. LINSEE attribue un identifiant toute personne juridique, physique ou morale,
introduite dans le rpertoire SIRENE sur demande des organismes habilits, en gnral le Centre
de formalits des entreprises (CFE). Il correspond donc au numro didentification au rpertoire
(NIR) des personnes physiques. Il est compos de neuf chiffres, les huit premiers sont attribus
squentiellement, sauf pour les organismes publics commenant par 1 ou 2, le neuvime est une
cl de contrle.
Le numro SIREN est compos de 8 chiffres, plus un chiffre de contrle qui permet de vrifier
la validit du numro.
Cest ce chiffre de contrle que nous voulons engendrer. La cl de contrle utilise pour vrifier
lexactitude dun identifiant est une cl suivant lalgorithme de Luhn. ipe est le suivant : on
multiplie les chiffres de rang impair partir de la droite par 1, ceux de rang pair par 2 ; la somme
des chiffres obtenus doit tre congrue zro modulo 10, cest--dire quelle doit tre multiple de
10.
Exemple : 1 3 9 2 8 2 3 7 ? La somme des chiffres suivants : 7+6+2+16+2+18+3+2 = 56 nest
pas divisible par 10. Pour que cette valeur le soit, il faut rajouter 4. 56 + 4 = 60 qui est divisible
par 10. Le numero : 1 3 9 2 8 2 3 7 4 est donc un numero de SIREN correct.
Nous reprsenterons ce numro SIREN par un tableau dentiers ; et le nombre La case dindice
8 reprsentera la cl calculer..
Votre programme devra :
Question 5.1 : Demander lutilisateur les huit premiers chiffres du numro de SIREN
Question 5.2 : Calculer la cl de contrle et complter le tableau dans une fonction calcul_cle
Question 5.3 : Faire un affichage qui permet de valider cette cl, cest--dire dafficher la somme
vue prcdemment (en tenant compte de la cl) et vrifier que le nombre est bien divisible par 10
en affichant par exemple le reste de la division par 10.

Exercice 6 : Programme mystre



1
2

Quaffiche le programme suivant ?

def augmente1(x):
x+=1

3
4

def augmente2(x):
Bases de la programmation


116 

1re anne

Departement informatique

return x+1

6
7
8
9

def augmente3(x):
x+=1
return x

10
11
12
13

def diminue1(tab, x):


for i in range(0, len(tab)) :
tab[i]=tab[i]-x

14
15
16
17

def diminue2(tab, x):


for elem in tab :
elem-=x

18
19
20
21
22
23

def diminue3(tab, x):


res =[]
for elem in tab :
res =res+[elem-1]
return res

24
25
26
27
28
29

def diminue4(tab, x):


copie=[]
for elem in tab :
copie+=[elem]
tab=diminue3(copie, x)

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

print("debut")
y=1
augmente1(y)
print(y) # 1er print
x=1
augmente1(x)
print(x) # 2e print
augmente2(y)
print(y) # 3e print
x=augmente2(x)
print(x) # 4e print
y=augmente3(x)
print(x) # 5e print
print(y) # 6e print

45
46
47
48
49
50
51
52

print("diminue1")
t=range(5, 10)
tab=t
print(t) # 7e print
print(tab) # 8e print
diminue1(t, x)
print(t) # 9e print

53
54
55
56

print("diminue2")
diminue2(t, x)
print(tab) # 10e print

57
58
59
60
61

print("diminue3")
t=diminue3(t, x)
print(t) # 11e print
print(tab) # 12e print

62

1re anne


117 

Bases de la programmation

IUT de Villetaneuse

63
64
65

print("diminue4")
diminue4(tab, x)
print(tab) # 13e print

Exercice 7 : Recherche dichotomique


Dans le cas gnral, la recherche dun lment dans un tableau se fait en comparant llment
que lon recherche chaque case du tableau. Cependant, si le tableau est dj tri, on peut utiliser
cette proprit pour effectuer une recherche sans comparer llment toutes les cases du tableau.
Une telle recherche est appele recherche dichotomique.
Question 7.1 : Si lon compare llment une case quelconque du tableau, que peut-on conclure
de cette comparaison ? Dterminer alors lide gnrale de la recherche dichotomique.
Question 7.2 : crire une fonction de recherche dichotomique et appliquez-la un tableau de
chanes de caractres.

Exercice 8 : Ajout dun lment dans un tableau tri


Lorsquun tableau est tri, il est important, lorsque lon lui ajoute un lment, de faire en sorte
que le tableau reste tri. Il est donc impratif dinsrer llment au bon endroit dans le tableau.
crivez une fonction permettant dajouter un lment dans un tableau tri de manire ce que le
tableau reste tri aprs lajout de llment.

Bases de la programmation


118 

1re anne