Vous êtes sur la page 1sur 24

Programmation1

Variables:notiondetypeetdevaleurdunevariable,typessimples.

Dmonstration:

>>>a=3
>>>print(a)
3
>>>print(type(a))
<type'int'>
>>>
>>>a=3.14
>>>print(a)
3.14
>>>print(type(a))
<type'float'>
>>>
>>>b=a
>>>print(b)
3.14
>>>a=4
>>>print(b)
3.14

>>>s='abc'
>>>print(s)
abc
>>>print(type(s))
<type'str'>
>>>
>>>s="abc"
>>>print(s)
abc
>>>print(type(s))
<type'str'>
>>>

1
>>>print(s[0])
a
>>>print(s[1])
b
>>>print(len(s))
3
>>>
>>>l=['a','b','c']
>>>print(l)
['a','b','c']
>>>print(type(l))
<type'list'>
>>>
>>>print(l[0])
a
>>>print(l[1])
b
>>>print(len(l))
3

Questions:
x=3
x=4
quevautx?
4

a=4
b=a
a=5
quevautb?
4

b=2
a=b
b=b+1
a=a
b=a
quevautb?
2

Exercice:inverserlecontenudedeuxvariables

2

>>>a
4
>>>b
3.14
>>>tmp=a
>>>a=b
>>>b=tmp
>>>a
3.14
>>>b
4

Expressionsetinstructionssimples:affectation,oprateursusuels,distinctionentre
expressionetinstruction.

Uneexpressionsvalueetaunevaleur
Unevaleurauntype

>>>a=2
>>>a=2
>>>b=a+3
>>>b
5
>>>"bon"+"jour"
'bonjour'
>>>b+max([4,2,8,5,7])
13

Uneinstructionnapasdevaleur
Cestunecommandequiestexcute

>>>a=2#estuneinstruction
>>>b=(a=2)#onnepeutpasmettresonrsultatdansune
variable
File"<stdin>",line1
b=(a=2)#onnepeutpasmettresonrsultatdansune
variable
^
SyntaxError:invalidsyntax

3
>>>print(a)#estuneinstruction
2
>>>type(print(a))#print(a)n'apasdevaleurnidetype
File"<stdin>",line1
type(print(a))#print(a)n'apasdevaleurnidetype
^
SyntaxError:invalidsyntax

Exercice:diffrencierlesexpressionsdesinstructions
a=2,a==2,l=[1,2,3],l=l+l,ifa>0:,a=b=3,ab>=0,x/2ifx%2==0else3*x+1

Instructionsconditionnelles:expressionsboolennesetoprateurslogiquessimples,
instructionif.Variantesavecalternative(else).

Exercice:crirelestermesdelasuitedeSyracuse.
Partantdunentierpositif,onledivisepar2silestpairetonlemultipliepar3etonajoute1
sinon.

Instructionsitratives:bouclesfor,bouclesconditionnelleswhile.

Fonctions:notiondefonction(ausensinformatique),dfinitiondanslelangageutilis,
paramtres(ouarguments)etrsultats,portedesvariables.

deff(x):returnx+1
f(3),f(f(3))
defg(x):x=x

Manipulationdequelquesstructuresdedonnes:chanesdecaractres(cration,accs
uncaractre,concatnation),listes(cration,ajoutdunlment,suppressiondunlment,
accsunlment,extractiondunepartiedeliste),tableauxuneouplusieursdimensions.

Fichiers:notiondechemindaccs,lectureetcriturededonnesnumriquesoudetype
chanedecaractresdepuisouversunfichier.

Algorithmique1

Exercice:recherchedansuneliste
Ecrireunefonctionindicequiprendunlmentetunelisteenparamtreetquiretournele
premierindicedellmentsiceluiciapparatdanslaliste.

#*coding:utf8*

defindice(x,liste):
"""Retournelapremierepositiondexdanslaliste.

Args:
x:l'elementcherch
liste:lalistedanslequelxestcherch

Returns:
l'indicedelapremiereoccurrencedexsurliste

Raises:
ValueErrorsil'lmentn'estpasprsent

>>>indice(5,[2,1,0,3,3,5,1])
5

>>>indice(0,[2,1,0,3,3,5,1])
2

>>>indice(2,[2,1,0,3,3,5,1])
0

>>>indice(3,[2,1,0,3,3,5,1])
3

>>>indice(9,[2,1,0,3,3,5,1])
Traceback(mostrecentcalllast):
...
ValueError:nontrouve

"""

index=0
foreinliste:
ifx==e:
returnindex
index=index+1
raiseValueError("nontrouve")

5

if__name__=="__main__":
importdoctest
doctest.testmod()

Exercice:recherchedumaximumdansunelistedenombres

#*coding:utf8*

defrecherche_max(liste):
"""Retournel'lmentmaximumd'unelisted'entiers.

Args:
liste:lalisted'entiers

Returns:
l'lmentmaximal

>>>recherche_max([2,1,0,3,3,5,1])
5

>>>recherche_max([3,4,7,12,100,52])
100

>>>recherche_max([3,7,12,53])
3

>>>recherche_max([])
Traceback(mostrecentcalllast):
...
ValueError:listevide
"""

iflen(liste)>0:
max=liste[0]
foreinliste:
ife>max:
max=e
returnmax

6
else:
raiseValueError("listevide")

if__name__=="__main__":
importdoctest
doctest.testmod()

Exercice:calculdelamoyenneetdelavariance.

#*coding:utf8*

defmoyenne(liste):
"""Retournelamoyennedeslmentsd'uneliste.

Args:
liste:lalisted'lments

Returns:
lamoyenne

>>>moyenne([1,2,3,4,5,6])
3.5

>>>moyenne([3,2,1,1,2,3])
0.0

>>>moyenne([3,2,1,1.0,2,3])
0.0

>>>moyenne([])
Traceback(mostrecentcalllast):
...
ValueError:listevide
"""

iflen(liste)>0:
returnsum(liste)/float(len(liste))
else:
raiseValueError("listevide")

7

defvariance(liste):
"""Retournelavariancedeslmentsd'uneliste.

Args:
liste:lalisted'lments

Returns:
lavariance

>>>variance([1,2,3,4,5,6])==sum((3.5i)**2foriin
range(1,6+1))/6
True

>>>variance([])
Traceback(mostrecentcalllast):
...
ValueError:listevide
"""

iflen(liste)>0:
moy=moyenne(liste)
somme=0.0
forxinliste:
somme=somme+(xmoy)**2
returnsomme/len(liste)
else:
raiseValueError("listevide")


if__name__=="__main__":
importdoctest
doctest.testmod()

Exercice:recherchepardichotomiedansuntableautri.

#*coding:utf8*

defest_dans(x,liste):

8
"""Retournevraisixestdanslaliste.

Args:
x:l'elementcherch
liste:lalistetriedanslequelxestcherch

Returns:
vraisixestdansliste
fauxsinon

>>>est_dans(0,[0,1,1,2,3,3,5])
True

>>>est_dans(1,[0,1,1,2,3,3,5])
True

>>>est_dans(2,[0,1,1,2,3,3,5])
True

>>>est_dans(3,[0,1,1,2,3,3,5])
True

>>>est_dans(4,[0,1,1,2,3,3,5])
False

>>>est_dans(5,[0,1,1,2,3,3,5])
True

>>>est_dans(5,[])
False
"""

bi=0
bs=len(liste)1

whilebi<=bs:
pivot=(bi+bs)/2
#print("bi=%s,bs=%s,pivot=%s")%(bi,bs,pivot)
ifliste[pivot]==x:
returnTrue
elifx<liste[pivot]:
bs=pivot1

9
else:
bi=pivot+1

returnFalse

if__name__=="__main__":
importdoctest
doctest.testmod()

Exercice:recherchepardichotomieduzrodunefonctioncontinueetmonotone.

#*coding:utf8*

defcherche_zero(f,bi,bs,epsilon):
"""Retournextelque|f(x)|<epsilon.

Args:
f:lafonctioncontinuemonotone
epsilon:lamarged'erreur

Returns:
xtelque|f(x)|<epsilon

>>>cherche_zero(lambdax:x,1.0,1.0,0.1)
0.0

>>>0.1<cherche_zero(lambdax:x2,5.0,5.0,0.1)2.0<
0.1
True

>>>cherche_zero(lambdax:x,2.0,3.0,0.1)
Traceback(mostrecentcalllast):
...
ValueError:pasdesolution
"""

whilebsbi>epsilon:
pivot=(bi+bs)/2.0
ifabs(f(pivot))<epsilon:

10
returnpivot
eliff(bi)*f(pivot)>=0:
bi=pivot
else:
bs=pivot

raiseValueError("pasdesolution")

if__name__=="__main__":
importdoctest
doctest.testmod()

Exercice:mthodesdesrectanglesetdestrapzespourlecalculapprochduneintgralesur
unsegment.


Exercice:recherchedunmotdansunechanedecaractres.
Onutiliserapourcelaunalgorithmenaf.Maisonpeutimaginerltudedesalgorithmesde
KnuthMorrisPratt,ouRabinKarpparexemple.

#*coding:utf8*

defest_prefix(mot,chaine):
"""Retournevraisimotestprefixdechaine.

Args:
mot:lemotcherch
chaine:lachainelaquellemotestcherch(entte)

Returns:
vraisimotestprefixdechaine
fauxsinon

>>>est_prefix('a','abc')
True

>>>est_prefix('b','abc')
False

11

>>>est_prefix('ab','abc')
True

>>>est_prefix('abc','abc')
True

>>>est_prefix('bc','abc')
False

>>>est_prefix('','')
True

>>>est_prefix('','abc')
True

>>>est_prefix('a','')
False
"""

iflen(mot)>len(chaine):
returnFalse

foriinxrange(len(mot)):
ifmot[i]!=chaine[i]:
returnFalse
returnTrue

defest_sous_chaine(mot,chaine):
"""Retournevraisimotapparaitdanschaine.

Args:
mot:lemotcherch
chaine:lachainedanslaquellemotestcherch

Returns:
vraisimotestdanschaine
fauxsinon

>>>est_sous_chaine('a','abc')
True

12
>>>est_sous_chaine('b','abc')
True

>>>est_sous_chaine('bb','abbc')
True

>>>est_sous_chaine('bc','abc')
True

>>>est_sous_chaine('','')
True

>>>est_sous_chaine('abc','')
False
"""

#onveutallerde0len(chaine)len(mot)inclus
foriinxrange(0,len(chaine)len(mot)+1):
ifest_prefix(mot,chaine[i:]):
returnTrue
returnFalse

if__name__=="__main__":
importdoctest
doctest.testmod()

Exercice:tantdonnuntableaudentiers,retourneruntableaucommenantaveclesentiers
pairsetseterminantaveclesentiersimpairs

#*coding:utf8*

defpair_a_gauche(t):
"""Retourneuntableauoleslmentspairssontgauche.

Args:
t:letableauclasser

Returns:
untableauoleslmentspairssontgauche

>>>pair_a_gauche([1,2,3,4,5])

13
[2,4,5,3,1]

>>>pair_a_gauche([2,3,4,5,6,7])
[2,4,6,7,5,3]

>>>pair_a_gauche([])
[]

"""
res=list(t)
x=0
y=len(t)1
foraint:
ifa%2==0:
res[x]=a
x=x+1
else:
res[y]=a
y=y1
returnres

if__name__=="__main__":
importdoctest
doctest.testmod()

Exercice:mmeexerciceenutilisantdescomprhensionsdeliste

#*coding:utf8*

defpair_a_gauche_comprehension(t):
"""Retourneuntableauoleslmentspairssontgauche.

Args:
t:letableauclasser

Returns:
untableauoleslmentspairssontgauche

>>>pair_a_gauche_comprehension([1,2,3,4,5])
[2,4,1,3,5]

14

>>>pair_a_gauche_comprehension([2,3,4,5,6,7])
[2,4,6,3,5,7]

>>>pair_a_gauche_comprehension([])
[]

"""
return[xforxintifx%2==0]+[xforxintifx%2==
1]

if__name__=="__main__":
importdoctest
doctest.testmod()

15
Algorithmique2

Piles

Exercice:Ecrireunefonctionquipermetdesavoirsiuneexpressiondeparenthseest
correcte.Exemple(()),()(),()(()),Contreexemple)()(,((),())),

Rcursivit

Exercice:Comptezlenombredemots(sur(et))delongueurnbienparenthss.

Exercice:Etantdonneunechanedecaractrescommedebarbouiller,calculezlalongueur
delapluslonguesoussuitecroissantecontenuedanscemot.Parexempleabillaune
longueur5.Lordredeslettresesta<b<c<.

Exercice:

Lejoueurcommenceunepositiona.Ilveutatteindrelapositionb>a.Sonpremierpasfaitune
unit,cequelonnoteP(1)=1.LepasP(n+1)vrifie|P(n+1)P(n)|1.Leslongueursdepas
sontdesentiers.Unexemple:
10123456
faitpasserdelaposition2laposition6entroistapes.Peutontoujoursatteindreuneposition
bpartirdunepositiona?Calculezlenombredepaslepluscourtpourpasserdeab.

Exercice:rsoudredescryptarithmes(SEND+MORE=MONEY)

Tris

Exercice:Tribulles.Onpartdesdeuxpremierslments,silssontinvers,onlespermute.
Onpasseaudeuxlmentssuivant.Silsontinverss,onlespermute,etcjusqulafindela
liste.Onrecommenceleprocessusn1foisonestlalongueurdelaliste

deftribulle(t):
"""
Trid'uneliste

16
Args:
t:listetrier
Returns:
t,trie
>>>tribulle([1,4,2,8,3])
[1,2,3,4,8]
>>>tribulle([5,3,4,4])
[3,4,4,5]
>>>tribulle([9,8,7,6,5,4,3,2,1])
[1,2,3,4,5,6,7,8,9]
"""
foriinrange(len(t)1):
forjinrange(len(t)i1):
ift[j]>t[j+1]:
(t[j],t[j+1])=(t[j+1],t[j])
returnt

Exercice:Triparinsertion.Ontrouvelepluspetitlmentdelaliste,etonlepermuteavecle
premierlmentdelaliste,oncontinueavecledeuximepluspetitmislaplacedudeuxime,
etcjusqulafindelaliste.

deftriinsertion(t):
"""
Trid'uneliste
Args:
t:listetrier
Returns
t(trie)
>>>tribulle([1,4,2,8,3])
[1,2,3,4,8]
>>>tribulle([5,3,4,4])
[3,4,4,5]
>>>tribulle([9,8,7,6,5,4,3,2,1])
[1,2,3,4,5,6,7,8,9]
"""
foriinrange(len(t)1):
(minimum,min_index)=(sys.maxint,0)
forjinrange(i,len(t)):
ifminimum>t[j]:
(minimum,min_index)=(t[j],j)

17
(t[min_index],t[i])=(t[i],t[min_index])
returnt

Exercice:TrouverllmentmdiandunelisteLdonneenargument.Onrappellequilsagitde
llmentxtelquelamoitideslmentsdeTestpluspetitquex,lautretantplusgrande.

defmedian(t):
"""
Calculel'lmentmdian
d'uneliste
Args:
t:laliste
Returns:
l'lmentmdian
Raises:
IndexErrorsitestvide
>>>median([1,5,3,3,5,
9])
5
>>>median([1,4,3,5,5])
4
"""
t.sort()
returnt[len(t)/2]

18
Programmation2

Classesetobjets

TDcomptebancaire

Interfacesgraphiques

Basesdedonnes

Exercice:comptebancaire

L'objectifdeceTDestdes'exercerlaspcificationetlaprogrammationdeclasses
lmentaires.Enparticulier,ils'agitpartird'unnoncd'identifieretdedfinirles
caractristiquesd'uneclassemodlisantunconceptdonn.[TDinspirdunexercicepropos
parPhilippeGenoud,UniversitdeGrenoble]

"Cahierdescharges"
Ils'agitdedfiniruneclassePythonCompteSimplepermettantdemodliserdescomptes
bancaires.
Lasommed'argentdisponiblesuruncompte,appelesolde,estexprimeenEuros.Le
soldeestunnombredcimalpositif,nuloungatif.Onditquelecompteestdcouvertlorsque
sonsoldeestngatif.
Enaucuncasledcouvertd'uncomptenepeuttresuprieurunevaleurfixe,appele
decouvert_autorise.Parexemplepouruncomptedontledcouvertmaximalautorisest
2000,lesoldenepourrajamaistreinfrieur2000.Ledcouvertmaximalautorispeut
varierd'uncompteunautre,ilestfixarbitrairementparlabanquelacrationducompteet
peuttreensuitervisselonlesmodificationsdesrevenusdutitulaireducompte.
Crditeruncompteconsisteajouterunmontantpositifausoldeducompte.
Dbiteruncompteconsisteretirerunmontantpositifausoldeducompte.Lesoldersultant
nedoitenaucuncastreinfrieuraudcouvertmaximalautorispourcecompte.
Lorsd'uneoprationderetrait,uncomptenepeuttredbitd'unmontantsuprieurune
valeurdsignesousletermededebit_maximalautoris.Commeledcouvertmaximal
autoris,ledbitmaximalautorispeutvarierd'uncompteunautreetestfixarbitrairement
parlabanquelacrationducompte.Ilpeuttreensuitervisselonlesmodificationsdes
revenusdutitulaireducompte.
Effectuerunvirementconsistedbiteruncompteauprofitd'unautrecomptequisera
crditdumontantdudbit.
Lorsdelacrationd'uncompte,enl'absencededptinitiallesoldeestfix0.Lesvaleurs
pardfautpourledcouvertmaximalautorisetledbitmaximalautorissontrespectivement
de0et500.

19

Travaildemand:
Apartirdu"cahierdescharges"prcdentlaborerunespcificationdelaclassePython
modlisantuncomptebancaire.
quellessontlesmthodesproposesparlaclasse?
quellessontlesvariablesdinstancesncessaires?
quelleestlasignatureduconstructeurdeclasse?
Raliseruneimplantationenprenantsoindedocumenterlecomportementduconstructeuret
desdiffrentesmthodes.

Scnariodetest:
creruncomptec1ayant1000commedpotinitial
afficherlesoldedececompte.Lersultatdoittredelaforme
1000
dbiter50dececompteetafficherlesoldecourant
creruncomptec2
transfrer200ducomptec1verslecomptec2.Afficherlesoldedesdeuxcomptes
transfrer2000ducomptec1verslecomptec2.Afficherlesoldedesdeuxcomptes

"Cahierdescharges"(suite)
Uncomptebancaireestassociunclienttitulaireducompte,ceclientestdcritparson
nomainsiqueparlalistedescomptesquilpossde.Touteslesinformationsrelativesun
clientdoiventpouvoirtreaffiches(nomduclient,listedesescomptesetsoldesrespectifs)

Travaildemand
raliseruneimplantationenlangagePythondelaclasseClient(constructeurprenanten
paramtrelenomduclientainsiquelalistedescomptesassocis)
laclasseclientdevrapermettredafficherlasituationfinanciredunclient.Parexemple:
Client:A
Compte1:0
Compte2:300

crer2clients(AetB).Lepremierpossde2comptes(lecomptec1cr
prcdemmentetunnouveaucompteinitialis50)etlesecondunseulcompte(le
comptec2crprcdemment).
affichezlasituationfinanciredecesclients.Laffichagedoittredelaforme
***situationinitiale
Client:A
Compte1:750
Compte2:50
Client:B

20
Compte1:200
ModifierlaclasseClientdesortequechaqueclientaitunnumrodeclientunique.
Modifierlamthodequiaffichelasituationfinancireduneclientdesortequelenumro
apparaisse.

#*coding:utf8*

classCompteSimple:
def__init__(self,depot_initial=0.0,decouvert=0.0,debit
=500.0):
self.solde=depot_initial
self.decouvert_autorise=decouvert
self.debit_maximal=debit

def__str__(self):
"""
Returns:
unechainereprsentantlesoldeducompte

>>>c1=CompteSimple(200)print(c1)
200

"""
returnstr(self.solde)+""

defcredit(self,montant):
"""
Args:
montant:lemontantpositifcrditer

>>>c1=CompteSimple(200)c1.credit(100)print(c1)
300

>>>c1=CompteSimple(200)c1.credit(100)print(c1)
Traceback(mostrecentcalllast):
...
ValueError:montantnegatif
"""
ifmontant<0:
raiseValueError("montantnegatif")
self.solde+=montant

21


defdebit(self,montant):
"""
Args:
montant:lemontantpositifdbiter

>>>c1=CompteSimple(200)c1.debit(100)print(c1)
100

>>>c1=CompteSimple(200,100)c1.debit(400)print(c1)
Traceback(mostrecentcalllast):
...
ValueError:decouvert

>>>c1=CompteSimple(200)c1.debit(100)print(c1)
Traceback(mostrecentcalllast):
...
ValueError:montantnegatif
"""
ifmontant<0:
raiseValueError("montantnegatif")
nouveau_solde=self.soldemontant
ifnouveau_solde<0andnouveau_solde>
self.decouvert_autorise:
raiseValueError("decouvert")
self.solde=nouveau_solde


defvirement(self,destinataire,montant):
self.debit(montant)
destinataire.credit(montant)


classClient():
numero=1

def__init__(self,nom,comptes=[]):
self.nom=nom
self.comptes=comptes
self.numero=Client.numero
Client.numero+=1

22

def__str__(self):
res="Client:"+self.nom
for(i,c)inenumerate(self.comptes):
res+="\nCompte%s(%s):%s"%(i+1,self.numero,c)
returnres


if__name__=="__main__":
importdoctest
doctest.testmod()

c1=CompteSimple(depot_initial=1000)
print("c1:%s"%c1)
c1.debit(50)
print("c1:%s"%c1)

c2=CompteSimple()
print("c2:%s"%c2)

c1.virement(c2,200)
print("c1:%s"%c1)
print("c2:%s"%c2)
try:
c1.virement(c2,2000)

exceptValueError:
print("oprationnoneffectue")

print("c1:%s"%c1)
print("c2:%s"%c2)

a=Client("A",[c1,CompteSimple()])
b=Client("B",[c2])
print(a)
print(b)

Scrabblenaif:

#*coding:utf8*
#motsdudictionnaire

23
mots=set()

deflecture_fichier(nom):
f=open(nom,'r')
forligneinf:
#enleverlecaracteredefindeligne
mot=ligne[:len(ligne)1]
iflen(mot)<=8:
mots.add(mot)
f.close()

defsousensemble(mot,tirage):
#retournevraisimotestunsousensembledutirage
liste=list(tirage)
forcinmot:
ifcinliste:
liste.remove(c)
else:
returnFalse
returnTrue

defmot_plus_long(l):
res=''
forminl:
if(len(m)>len(res)):
res=m
returnres

lecture_fichier('frenchssaccent.dic')
print('nombremots:%s'%len(mots))

lettres='tunie'
print('tirage=%s'%lettres)

solution=[mforminmotsifsousensemble(m,lettres)]
print('solution=%s'%solution)
print('meilleuresolution=%s'%mot_plus_long(solution))

24