• Aucun résultat trouvé

Introduction `a l’algorithmique et `a la programmation

N/A
N/A
Protected

Academic year: 2022

Partager "Introduction `a l’algorithmique et `a la programmation"

Copied!
53
0
0

Texte intégral

(1)

Introduction `a l’algorithmique et `a la programmation

SHNU, 2019 – 2020

Anthony Labarre

Anthony.Labarre@u-pem.fr

– Cours 1 –

(2)

– Avant de commencer... –

I En cas de probl `eme, n’h ´esitez pas `aposer des questions;

我没听懂、可以说一遍吗?

−→“Je n’ai pas compris ; pouvez-vous r ´eexpliquer ?”

《老师说得太快了》

−→“Pouvez-vous parler / r ´eexpliquer plus lentement ?”

不懂X、可以一遍吗?

−→“Je n’ai pas compris X, pouvez-vous r ´eexpliquer ? Pouvez-vous donner un exemple ?”

很简单、都明白了》

−→ 太好了!现在你可以去帮你的同学了!

(3)

– Aspects pratiques –

Organisation :

I Quelques s ´eances de cours + exercices (papier) ;

I Quelques s ´eances sur les ordinateurs ;

I Et l’examen `a la fin ;

Ressources :

I http://igm.univ-mlv.fr/˜alabarre/teaching.php, section SHNU — ou 百度: Anthony Labarre

I PythonTutor :http://pythontutor.com/; permet de visualiser du code Python ;

(4)

– Correction des exercices –

I Pas de solutions toutes faites ;

I Pour les exercices sur papier :

I vous corrigez certains exercices au tableau ;

I on v ´erifie ensemble ces corrections ;

I Pour les exercices sur ordinateur :

I vous recevrez desdoctestspour v ´erifier vos r ´eponses ;

I on verra plus tard ce que c’est et comment les utiliser ;

Encore une fois : posez des questions pendant la s ´eance ou par e-mail ;

(5)

– Installer Python –

I On utilise dans ce cours Python 3 ; attention, Python 2 n’estpascompatible !

I Pour l’installer :

I Ubuntu / Debian :sudo apt-get install python3

I Windows : suivez le programme d’installationmais ajoutez python `a la variable PATH !

(6)

– Quelques environnements de d ´eveloppement –

Les ´editeurs suivants rendent le d ´eveloppement Python plus facile ; choisissez celui que vous pr ´ef ´erez :

Geany https://www.geany.org/

PyCharm https://www.jetbrains.com/pycharm/

Notepad++ https://notepad-plus-plus.org/

Kate http://kate-editor.org/

SublimeText https://www.sublimetext.com/

...

(7)

– Plan d’aujourd’hui –

Variables, types et op ´erations

Instructions et blocs

Instruction conditionnelle (if)

Structures it ´erables et bouclesfor

(8)

– Pourquoi un langage ? –

I L’ordinateur ne comprend que le langage binaire ;

I trop difficile pour les humains (en g ´en ´eral) ;

I pas compatible d’une machine `a l’autre !

CPU

. . . 010101101101 110101100010. . .

CPU humain

Est-ce que 210 et 1024 sont ´egaux ?

humain 2 ** 10 == 1024

True

I Il nous faut donc un langage commun pour se comprendre (Python, C, Java, ...) ;

(9)

– Introduction sur un exemple –

Un exemple de programme enPython 3:

if __name__ == '__main__':

date = input(

"Bonjour! Quelle est votre date "

"de naissance (jj/mm/aaaa)? "

)

jour_naissance = int(date.split("/")[0]) mois_naissance = int(date.split("/")[1]) annee_naissance = int(date.split("/")[2]) age = 2019 - annee_naissance

if mois_naissance > 10:

age = age - 1

if mois_naissance == 10 and jour_naissance > 21:

age = age - 1

print("Vous avez", age, "ans")

C’est un programme un peu avanc ´e. . .mais essayons de

(10)

– La coloration syntaxique –

if __name__ == '__main__':

date = input(

"Bonjour! Quelle est votre date "

"de naissance (jj/mm/aaaa)? "

)

jour_naissance = int(date.split("/")[0]) mois_naissance = int(date.split("/")[1]) annee_naissance = int(date.split("/")[2]) age = 2019 - annee_naissance

if mois_naissance > 10:

age = age - 1

if mois_naissance == 10 and jour_naissance > 21:

age = age - 1

print("Vous avez", age, "ans")

I Certains mots sont en couleurs : c’est lacoloration syntaxique;

I Elle varie selon l’ ´editeur utilis ´e ;

I Elle rend le programme plus lisible.

(11)

– La coloration syntaxique –

I La couleur d’un mot indique sa cat ´egorie ; ici, on a entre autres :

I des fonctions int ´egr ´ees de Python envert: input= entr ´ee ,int= entier

I des mots-cl ´es de Python envert gras: if= si ,print= imprimer (afficher)

I des op ´erateurs enmauve gras: and= et

I des chaˆınes de caract `eres enrouge:

"Quelle est votre date de naissance?"

...

(12)

– L’indentation –

if__name__=='__main__':

date=input(

"Bonjour! Quelle est votre date "

"de naissance (jj/mm/aaaa)? "

)

jour_naissance=int(date.split("/")[0]) mois_naissance=int(date.split("/")[1]) annee_naissance=int(date.split("/")[2]) age= 2019 -annee_naissance

ifmois_naissance> 10:

age=age- 1

ifmois_naissance== 10andjour_naissance> 21:

age=age- 1

print("Vous avez", age,"ans")

ILes lignesne commencent pas toutes au m ˆeme endroit.

ICe n’est pas un d ´etail ! ILe positionnement (on dit l’indentation) des lignes est important pour leur signification.

Modifier l’indentation modifie le comportement du programme — et peut m ˆeme l’emp ˆecher de fonc- tionner.

(13)

– La structure –

I Les programmes Python doivent ˆetrestructur ´es(cf.

modele.pysur la page du cours) ;

I On y reviendra ; pour l’instant, retenez qu’il faut commencer parif name == ’ main ’:

I Lescommentaires(# ...) expliquent le code ;

I Notre but : ´ecrire du code 1. qui fonctionne ;

2. qui est facile `a comprendre ; 3. qui est facile `a modifier ;

(14)

– La partie “__main__” –

N’utilisez jamais le mod `ele 0 (on expliquera pourquoi plus tard) : Mod `ele 0 (mauvais)

prenom = input("Quel est votre pr´enom? ") print("Bonjour, ", prenom, "!")

Mod `ele 1 (mieux)

if __name__ == "__main__":

prenom = input("Quel est votre pr´enom? ") print("Bonjour, ", prenom, "!")

Mod `ele 2 (encore mieux) def main():

prenom = input("Quel est votre pr´enom? ") print("Bonjour, ", prenom, "!")

if __name__ == "__main__":

main()

(15)

– Ex ´ecuter du code Python –

I Deux options :

1. utiliser l’interpr ´eteur :

tapezpython3dans le terminal ;

2. ex ´ecuter un programme nomm ´efichier.py: tapezpython3 fichier.pydans le terminal ;

(16)

– Erreurs en Python –

I Python signale les erreurs quand on ex ´ecute du code ;

I Quand une erreur se produit :

I dans l’interpr ´eteur : on peut continuer `a ex ´ecuter du code ;

I dans un programme en cours : il s’arr ˆete et il faut le relancer ;

I Les messages sont tr `es explicites (TypeError,

IndexError, ...) ; il est important de les comprendre pour corriger son code ;

(17)

Python pas `a pas

Variables, types et op ´erations

(18)

– Types de valeurs –

I Lesvaleurs de baseposs `edent untype;

I Letyped ´etermine entre autres ce qui se passe quand on fait uneop ´erationsur des valeurs ;

Les principauxtypes(on en verra d’autres) sont :

Type En Python Exemples

entier(∈Z) int 12, -4, 123545, . . .

r ´eel(∈R) float 3.14159, -1.5, 12., 4.56e12, . . .

bool ´een bool True(vrai) ouFalse(faux)

ind ´efini, rien None None

chaˆıne de caract `eres str 'bonjour',"SHNU", . . .

Les majuscules/minuscules sont impor- tantes :

True6=true

(19)

– Op ´erations sur les nombres –

I Les op ´erations math ´ematiques que vous connaissez existent en Python ;

I Le type du r ´esultat d ´epend du type des donn ´ees de d ´epart :

+,−, int float int int float float float float

I Attention : la division (/) donne toujours unfloat;

I On a aussi :

math python exemple

x mod y x % y 19 % 43 xy x ** y 3 ** 327

(20)

– Op ´erations sur les bool ´eens –

I On a lesop ´erations logiques sur les bool ´eens: and(∧) False True

False False False True False True

or(∨) False True False False True True True True not(¬)

False True True False

I Utilisation :a and b,a or b,not c, ...

I Lescomparaisonsproduisent des bool ´eens : math python

a=b? a == b ab? a <= b ab? a >= b

math python a6=b? a != b a<b? a < b a>b? a > b

(21)

– Op ´erations sur les chaˆınes de caract `eres –

I Seuls+et*marchent sur les chaˆınes ;

I +r ´ealise laconcat ´enationde deux chaˆınes : 'SH' + 'NU''SHNU'

I *concat `enenexemplaires de la chaˆıne : 'SHNU' * 3'SHNUSHNUSHNU'

I Les comparaisons (<,<=, ...) fonctionnent et se basent sur l’ordre alphab ´etique ('a...' < 'b...' < 'c...' < ...) : 'SH' < 'NU'False

I Il existe beaucoup d’autresop ´erations sur les chaˆınes;

I Et aussi plein de fonctions math ´ematiques (cos,log, . . . ) ;

(22)

– Variables –

I Unevariableest unnomqui r ´ef ´erence une valeur en m ´emoire ;

I On peut s’en servir dans les calculs ;

I Elle a lem ˆeme typeque la valeur qu’elle r ´ef ´erence ; – Affectation –

I L’affectationd’une variable lie unnom `a unevaleur;

I La syntaxe :nom= expression, o `uexpressionest unevaleur ou uncalculqui produit une valeur ;

(23)

– Etapes de l’affectation –

x = 40 + 2

1. Le calcul du membre droit donne42; la case en

m ´emoire est cr ´e ´ee avec cette valeur ;

2. Le nom pourxest ensuite cr ´e ´e s’il n’existe pas ;

3. Enfin, on associe lavariablex

`a sa valeur ;

En cas de r ´eaffectation, le lien

42

x 42

x 42

x

× 42

(24)

– Affectation 6= ´egalit ´e ! –

Ce n’est pasdu toutle=des math ´ematiques. Il faut le lire comme “prend la valeur” :x=x+ 1

Exemple

>>> x = 3

>>> y = x

>>> x = x + 2

>>> x 5

>>> y 3

La situation sera diff ´erente pour les “objets modifiables” qu’on verra plus tard.

(25)

– Nommage –

Il y a certainesr `eglesde nommage `a respecter pour les variables (et les fonctions qu’on verra plus tard) :

I caract `eres autoris ´es : abc..., ABC..., 0123..., ;

I caract `eres interdits : tout le reste (et ´e, `e, `a, c¸, ...) ;

I attention: les chiffres sont permis, mais pas au d ´ebut ! exemple ex2 Ex2mpl1 2019shnu

I nomsinterdits : ce qui a d ´ej `a ´et ´e utilis ´e, ainsi que lesmots r ´eserv ´eset les fonctions pr ´ed ´efinies de Python (voir suite) ;

(26)

– Mots r ´eserv ´es –

Les mots suivants sontr ´eserv ´espour le langage :

and as assert break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield True False None

Astuce : si votre ´editeur affiche le nom de votre variable en gras ou en couleur, c’est qu’il s’agit d’un mot r ´eserv ´e

choisissez un autre nom !

(27)

– Au passage ... input

date = input(

"Bonjour! Quelle est votre date "

"de naissance (jj/mm/aaaa)? "

)

I input(str) permet `a l’utilisateur de rentrer des valeurs ;

I Ici, on lui demande de rentrer une date ;

I Attention : la fonctioninputrenvoietoujoursdu texte !

Exemple

>>> x = input("Entrez un nombre: ")

Entrez un nombre: 1

>>> y = input("Entrez un deuxi`eme nombre: ")

Entrez un deuxi`eme nombre: 3

(28)

– Transtypage (conversion de types) –

I Pour convertir ce que nous donneinputen entier, on utilise la fonctionint;

I On peut donc corriger l’exemple pr ´ec ´edent comme ceci : Exemple

>>> x = input("Entrez un nombre: ")

Entrez un nombre: 1

>>> y = input("Entrez un deuxi`eme nombre: ")

Entrez un deuxi`eme nombre: 3

>>> x = int(x) # conversion de la chaˆıne x en entier

>>> y = int(y) # conversion de la chaˆıne y en entier

>>> print(x, "+", y, "=", x + y)

1 + 3 = 4

I Plus g ´en ´eralement :

I str(valeur)convertitvaleuren chaˆıne ;

I int(valeur)convertitvaleuren entiersi possible;

I float(valeur)convertitvaleuren r ´eelsi possible;

I bool(valeur)convertitvaleuren bool ´een ;

(29)

– Quelques exemples –

Voici quelques exemples de conversions :

int(4.5)4 int(-4.5)-4 int('0345')345 int('SHNU')erreur float(4)4. float('4.5')4.5 str(4)'4' str(True)'True' str(-4.5)'-4.5' bool(4)True bool(0)False bool('SHNU')True bool(None)False int('4.5')erreur

Remarques importantes :

I strfonctionne toujours ;

I intetfloat ´echouent sur une chaˆıne qui n’est pas un nombre ;

I int ´echoue sur une chaˆıne repr ´esentant un r ´eel ;

I solution :int(float('4.5'))au lieu deint('4.5');

I booldonneFalsesi son param `etre ´equivaut `a 0,True

(30)

– La fonction type

I On connaˆıt en g ´en ´eral le type des variables qu’on d ´efinit soi-m ˆeme ;

I Comment faire pour connaˆıtre le type des variables qui viennent d’ailleurs ?

I On utilise la fonctiontype; Exemple

>>> type(1.5)

<class 'float'>

>>> type(2)

<class 'int'>

>>> type(input)

<class 'builtin_function_or_method'>

(31)

TypeError : types incompatibles –

I Certains types sont incompatibles : on ne peut pas les m ´elanger dans une m ˆeme op ´eration ;

I Quand ce probl `eme survient, Python provoque une exceptionde typeTypeError;

I Cela a pour effet d’arr ˆeter le programme ; Exemple

>>> '3' * 2 # ok

'33'

>>> '3' + 2 # erreur!

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: Can't convert 'int' object to str implicitly I Si une variable n’a pas le bon type, vous devez la convertir

(32)

Python pas `a pas

Instructions et blocs

(33)

– Instructions et s ´equences d’instructions –

if __name__ == '__main__':

date = input(

"Bonjour! Quelle est votre date "

"de naissance (jj/mm/aaaa)? "

)

jour_naissance = int(date.split("/")[0]) mois_naissance = int(date.split("/")[1]) annee_naissance = int(date.split("/")[2]) age = 2019 - annee_naissance

if mois_naissance > 10:

age = age - 1

if mois_naissance == 10 and jour_naissance > 21:

age = age - 1

print("Vous avez", age, "ans")

I Lesinstructionssont ex ´ecut ´ees dans l’ordre, dehauten bas

I En Python, il n’y aqu’une instruction par ligne

(34)

– Blocs d’instructions –

Certaines instructions sont regroup ´ees enblocsde la fac¸on suivante :

entˆete du bloc:

instruction 1 du bloc instruction 2 du bloc instruction 3 du bloc instruction hors bloc

I L’indentation(le d ´ecalage) se fait avec la touchetabulation;

I On peutins ´ererun bloc dans un bloc, un bloc dans un bloc dans un bloc, . . .

I L’indentationfait partie du langage Python, changer l’indentationchange la significationdu programme

(35)

– Espaces, pas tabulations ! –

Ne m ´elangez pas tabulations et espaces dans l’indentation ! ! ! Configurez votre

´editeur pour qu’il remplace les tabulations par des espaces.

Sous Geany :

(36)

Python pas `a pas

Instruction conditionnelle (if)

(37)

– La conditionnelle : le if

if mois_naissance > 10:

age = age - 1

if mois_naissance == 10 and jour_naissance > 21:

age = age - 1

print("Vous avez", age, "ans")

I Dans cet exemple, on teste simois_naissanceest plus grand que le mois actuel ;

I Si c’est le cas, on effectue le bloc qui suit, o `uagechute d’une unit ´e

I On teste ensuite simois_naissanceest le mois actuel ET sijour_naissance > 10;

I Si c’est le cas, on retire une unit ´e `aage

Dans tous les cas, on termine par afficher l’ ˆage calcul ´e ;

(38)

– La conditionnelle : le if

La forme la plus simple est

# d´ebut

if expression:

# instruction 1 du if

# instruction 2 du if

# ...

# suite

d ´ebut expression vraie ?

blocif

suite non

oui

I expressionrenvoie un bool ´een (doncTrueouFalse) ;

I lebloc duifest ex ´ecut ´eexpression == True

I dans tous les cas, le programme reprend `al’instruction apr `esif

(39)

– Conditions multiples –

I L’expression duifpeut contenir plusieurs conditions ;

if jour == "mardi" and heure > 16 or minutes < 30:

I Les conditions sont ´evalu ´eesdans l’ordre de lecture;

I Python ne teste pas tout si le r ´esultat est connu d’avance :

1 < 2 or x / 0 == 3−→True (m ˆeme sixn’existe pas) x / 0 == 3 or 1 < 2−→erreur

(40)

– Conditions alternatives : else et elif

I L’instructionifpermet de n’ex ´ecuter un bloc de code que sous certaines conditions ;

I On peut aussi pr ´eciser ce qu’il faut faire :

I quand la condition n’estpassatisfaite, avecelse;

I quand d’autres conditions peuvent ˆetre satisfaites, avec elif;

I Exemples de cas o `u ceci est utile :

I un menu en ligne de commande ;

I des actions `a d ´eclencher dans un jeu ;

I . . .

(41)

– La conditionnelle : le ifavec else

La forme avecelse(= sinon) :

# d´ebut

if expression:

# instruction 1 du if

# ...

else:

# instruction 1 du else

# ...

# suite

d ´ebut

expression vraie ?

blocif

suite

blocelse non oui

I lebloc duifest ex ´ecut ´eexpression == True

I lebloc duelseest ex ´ecut ´eexpression == False

I dans tous les cas, le programme continue `al’instruction

(42)

– La conditionnelle : le elif

La forme avecelif(= contraction deelseetif) :

# d´ebut

if expression1:

# bloc du if elif expression2:

# bloc du elif else:

# bloc du else

# suite

d ´ebut

expression1 vraie ? expression2 vraie ?

blocif blocelif

suite

blocelse non

oui oui non

I lebloc duifest ex ´ecut ´eexpression1 == True

I lebloc duelifest ex ´ecut ´eexpression1 == False and expression2 == True

I lebloc duelseest ex ´ecut ´eexpression1 == False and expression2 == False

I On peut mettreplusieurselif, les conditions sont ´evalu ´ees dans l’ordre, et seulela premi `erequi vautTrueest consid ´er ´ee

(43)

– Remarques sur l’utilisation deelif et else

I On n’est jamais oblig ´e d’utiliserelifetelse;

I Si toutefois on y a recours :

I ondoitsuivre l’ordreif...elif...else(toujours en dernier) ;

I onne peut pasutiliserelifnielsesans les associer `a unifpr ´ec ´edent ;

(44)

Python pas `a pas

Structures it ´erables et bouclesfor

(45)

– Boucles : concepts et motivations –

I Lesbouclespermettent de r ´ep ´eter des instructions jusqu’ `a ce qu’une certaine condition soit satisfaite ;

I On imagine sans mal qu’il doit exister un moyen plus intelligent d’afficher les puissances de 2 que celui-ci : if __name__ == "__main__":

print(2 ** 0) print(2 ** 1) print(2 ** 2) print(2 ** 3) print(2 ** 4)

# ...

I Les premi `eres boucles qu’on verra seront les bouclesfor,

(46)

– Structure it ´erable –

I Unestructure it ´erableest une structure qui contient plusieurs valeurs avec :

I une valeur initiale ;

I une notion de valeur suivante ;

I Elle n’est pas n ´ecessairement ordonn ´ee (cf. plus tard), mais Python sait comment la parcourir ;

I Les boucles sont souvent utilis ´ees sur ces structures it ´erables ;

(47)

– Exemple de structure it ´erable : les chaˆınes –

I On connaˆıt d ´ej `a un exemple de structure it ´erable : les chaˆınes de caract `eres ;

I En effet :

I la valeur initiale est le premier caract `ere de la chaˆıne ;

I la valeur suivante est le caract `ere suivant celui qu’on est en train de lire ;

(48)

– Les range

I La fonctionrange()renvoie un intervalle d’entiers ;

I range(a, b)(aveca,bZ) est un it ´erable qui commence `aaet qui s’arr ˆeteavantb;

I range(a, b, c)(aveca,b,cZ) est l’it ´erable qui commence `aaet avance decencjusqu’ `a arriver enb (exclu) ;

Exemple

>>> list(range(5)) # range(n) == range(0, n)

[0, 1, 2, 3, 4]

>>> list(range(1, 5, 2))

[1, 3]

>>> list(range(5, 0, -1))

[5, 4, 3, 2, 1]

I Pour parcourir cesrange, on a besoin des instructions de boucle ;

(49)

– Les boucles for–

I L’instructionforpermet de parcourir un it ´erable du premier au dernier ´el ´ement ;

I L’ordre de parcours est d ´etermin ´e par la structure ; Syntaxe dufor(≡ ∀elementiterable)

for element in iterable:

# instruction 1 du for

# instruction 2 du for

# ...

# suite du programme

Organigramme

iterable vide ? non element1erelement de iterable instructions du for

(50)

– Faire une actionn fois –

I L’association deforet derangefacilite les r ´ep ´etitions :

Sansfor print(1) print(2) print(3) print(4) print(5)

Avecfor

for i in range(1, 6):

print(i)

Comment afficher toutes les puissances de 2 jus- qu’ `a22016compris ?

(51)

– Utiliser la suite des valeurs d’un range –

I On peut ´egalement faire intervenir l’utilisateur dans le contr ˆole du nombre de r ´ep ´etitions :

Exemple (compter de 1 `an (compte.py))

if __name__ == "__main__":

n = int(input('Entrez un nombre : ')) for i in range(1, n + 1):

print(i)

(52)

– It ´erer sur une chaˆıne –

I Les chaˆınes sont ´egalement des structures it ´erables, et l’on peut donc aussi les manipuler `a l’aide d’unfor:

I Voici un exemple simple ; pour rappel :

I voyelles ={'a', 'e', 'i', 'o', 'u', 'y'}

I consonnes ={'b', 'c', 'd', ..., 'z'}

Exemple (compter les voyelles (voyelles.py))

if __name__ == "__main__":

texte = input('texte : ') nombre_voyelles = 0

voyelles = "aeiouyAEIOUY"

for lettre in texte:

if lettre in voyelles:

nombre_voyelles = nombre_voyelles + 1 print('il y a', nombre_voyelles, 'voyelles')

(53)

– Tests et boucles –

La variable utilis ´ee dans la boucle for est unecopiede la valeur manipul ´ee ;

I Ainsi, le code suivant ne modifiepasla chaˆıne de d ´epart :

>>> chaine = 'bonjour'

>>> for lettre in chaine:

... lettre = 'a' ...

>>> chaine

'bonjour'

I Remarque : l’op ´erateurinpermet de faire deux choses : 1. parcourir un it ´erable (avec unfor) ;

2. v ´erifier si un ´el ´ement appartient `a un it ´erable :

Références

Documents relatifs

On estime que si ces animaux appartiennent ` a la mˆ eme esp` ece il doit exister une relation lin´ eaire entre la longueur de deux de leurs os, le f´ emur et l’hum´ erus.. Mˆ

En quelle ann´ ee le nombre de plaintes pour blessures non mortelles est-il le plus faible.. En quelle ann´ ee le nombre de plaintes pour blessures non mortelles est-il relativement

En d’autres termes, pour tout nombre premier p, il existe ` a isomorphisme pr` es un et un seul groupe d’ordre p, qui est le groupe cyclique (donc ab´ elien) C

Dans un anneau principal, tout id´ eal premier non-nul est maximal (et donc, pour les id´ eaux non-nuls, les notions de premier et de maximal

Écrire une fonction syracuse(n) qui prend en entrée un entier n, et qui effectue l’algorithme de Syracuse répétitivement jusqu’à obtenir 1, affichant tous les nombres

6 Equations du premi` ere ordre.

Bien sˆ ur les ´ ecritures des deux signataires devront apparaˆ ıtre de mani` ere significative dans la copie. Probl`

Pour chacune des questions, une seule des propositions est correcte.. L’espace est rapport´e ` a un