PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.python > faire une boucle
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
faire une boucle

Réponse
 
LinkBack Outils de la discussion
Vieux 08/08/2007, 16h17   #26
Thierry B.
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

--{ Laurent Pointal a plopé ceci: }--

> "Go To Statement Considered Harmful"
> par Edsger W. Dijkstra
> http://www.acm.org/classics/oct95/
>

Pour aller plus loin, il faut googler avec les
mots clef "COMEFROM Datamation"...

--
Statique: tu remplis tu remplis tu remplis y'a plus de place sur la
partition/dans le fichier alloué au swap -> *POUF*
Dynamique: le fichier de swap se remplit, se remplit, se remplit, y'a
plus de place sur c:\ -> *POUF*
  Réponse avec citation
Vieux 08/08/2007, 16h17   #27
Thierry B.
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

--{ Laurent Pointal a plopé ceci: }--

> "Go To Statement Considered Harmful"
> par Edsger W. Dijkstra
> http://www.acm.org/classics/oct95/
>

Pour aller plus loin, il faut googler avec les
mots clef "COMEFROM Datamation"...

--
Statique: tu remplis tu remplis tu remplis y'a plus de place sur la
partition/dans le fichier alloué au swap -> *POUF*
Dynamique: le fichier de swap se remplit, se remplit, se remplit, y'a
plus de place sur c:\ -> *POUF*
  Réponse avec citation
Vieux 08/08/2007, 17h48   #28
Laurent Pointal
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

fred1599@gmail.com wrote:

> Laurent Pointal a écrit :

<zip>
>>
>> Si tu veux sortir, tu peux faire qq chose sur la dernière ligne comme:
>>
>> if raw_input("Continuer (O/N) ?").upper() in ("N","NON","NO) : break

>
> Peux tu m'expliquer cette dernière ligne s'il te plait?


raw_input("Continuer (O/N) ?")
Affiche le message donné en paramètre, attend la saisie de l'utilisateur et
la retourne sous forme de chaîne lorsque l'utilisateur valide.

..upper()
passe la chaîne retournée en majuscules.

in ("N","NON","NO)
teste si la chaîne est une de celles dans le tuple.

if .... : break
termine la boucle courante (en sort) si la condition est vérifiée.

> Pour le module goto dans le précédent message ça fonctionne super,
> j'ai oublié de préciser qu'est ce qui fonctionnait correctement


Ca peut fonctionner... mais c'est vraiment pas propre...
Il faut vraiment apprendre à structurer les algos sans le goto.

A+

Laurent.

  Réponse avec citation
Vieux 08/08/2007, 17h48   #29
Laurent Pointal
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

fred1599@gmail.com wrote:

> Laurent Pointal a écrit :

<zip>
>>
>> Si tu veux sortir, tu peux faire qq chose sur la dernière ligne comme:
>>
>> if raw_input("Continuer (O/N) ?").upper() in ("N","NON","NO) : break

>
> Peux tu m'expliquer cette dernière ligne s'il te plait?


raw_input("Continuer (O/N) ?")
Affiche le message donné en paramètre, attend la saisie de l'utilisateur et
la retourne sous forme de chaîne lorsque l'utilisateur valide.

..upper()
passe la chaîne retournée en majuscules.

in ("N","NON","NO)
teste si la chaîne est une de celles dans le tuple.

if .... : break
termine la boucle courante (en sort) si la condition est vérifiée.

> Pour le module goto dans le précédent message ça fonctionne super,
> j'ai oublié de préciser qu'est ce qui fonctionnait correctement


Ca peut fonctionner... mais c'est vraiment pas propre...
Il faut vraiment apprendre à structurer les algos sans le goto.

A+

Laurent.

  Réponse avec citation
Vieux 09/08/2007, 09h48   #30
jean-michel bain-cornu
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

> Merci beaucoup ca me simplifie énormément la vie.
Ya pas de quoi
  Réponse avec citation
Vieux 09/08/2007, 09h48   #31
jean-michel bain-cornu
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

> Merci beaucoup ca me simplifie énormément la vie.
Ya pas de quoi
  Réponse avec citation
Vieux 09/08/2007, 09h59   #32
jean-michel bain-cornu
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

> Et bien moi j'ai vérifié si ça fonctionne, et je te dis que ca marche
> au poil.
>

Précision : c'est le contenu du lien que je n'ai pas testé.
Le bout de code fourni fonctionne bien, ça c'est sûr.
On pourrait d'ailleurs aller plus loin et faire évoluer ça vers un
émulateur de 'l3g à goto'. Je n'y avait pas pensé lors de ma migration,
mais ça permettrait une solution propre pour la pérennisation des
vieilles applis écrites avec ce genre de langage.
Ceux qui trainent des vieux basics ou assimilés tournant sur des
machines à bout de souffle dresseront peut-être l'oreille...

>>> J'aimerais faire comme dans les machines a calculer avec la fonction
>>> 'lbl' et la fonction 'goto'

>> Il y a quelques temps, j'avais trouvé sur un forum ce qui suit pour le goto.
>> Je me rappelle l'avoir utilisé pour la migration d'une vieille
>> application en basic (on verse une larme).
>> Le deuxième est un lien vers un module qui ajoute le goto à python.
>> http://entrian.com/goto/index.html
>> Je n'ai pas vérifié si ça marche.

  Réponse avec citation
Vieux 09/08/2007, 09h59   #33
jean-michel bain-cornu
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

> Et bien moi j'ai vérifié si ça fonctionne, et je te dis que ca marche
> au poil.
>

Précision : c'est le contenu du lien que je n'ai pas testé.
Le bout de code fourni fonctionne bien, ça c'est sûr.
On pourrait d'ailleurs aller plus loin et faire évoluer ça vers un
émulateur de 'l3g à goto'. Je n'y avait pas pensé lors de ma migration,
mais ça permettrait une solution propre pour la pérennisation des
vieilles applis écrites avec ce genre de langage.
Ceux qui trainent des vieux basics ou assimilés tournant sur des
machines à bout de souffle dresseront peut-être l'oreille...

>>> J'aimerais faire comme dans les machines a calculer avec la fonction
>>> 'lbl' et la fonction 'goto'

>> Il y a quelques temps, j'avais trouvé sur un forum ce qui suit pour le goto.
>> Je me rappelle l'avoir utilisé pour la migration d'une vieille
>> application en basic (on verse une larme).
>> Le deuxième est un lien vers un module qui ajoute le goto à python.
>> http://entrian.com/goto/index.html
>> Je n'ai pas vérifié si ça marche.

  Réponse avec citation
Vieux 09/08/2007, 13h05   #34
Pierre Maurette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

fred1599@gmail.com, le 08/08/2007 a écrit :

[...]

> Bon je te passe un code exemple que je me suis amusé a faire pour
> faire cette boucle
>
> # _*_ coding:Utf-8 _*_
>
> print 'voila un petit programme afin de calculer un pourcentage'
>
> # Les chiffres dont on a besoin
>
> a = float(raw_input('Donner la valeur de votre article :'))
> b = float(raw_input('Donner la valeur de votre pourcentage :'))
>
> if a > 0 and b > 0 :
> c=((a*b)/100)
> d= (a-c)
> print 'vous avez demandé sur votre article d\'une valeur de' , a ,
> 'euros, un pourcentage de' , b , '%, ce qui donne une valeur finale
> pour votre article de :' , d
> elif a < 0 and b > 0 :
> print 'vous ne pouvez pas avoir une valeur négative!!! Recommencez le
> programme'
> elif a > 0 and b < 0 :
> print 'votre pourcentage ne peut pas être négatif!!! Recommencez le
> programme'
> elif a < 0 and b < 0 :
> print 'soyons logique, recommencez le programme'


Vous pourriez vous contenter d'un seul if ... else et d'une liste de
trois chaînes. Notez que (a <= 0) + (2 * (b <= 0)) prend les valeurs 0,
1, 2 et 3. Généralisable à N conditions.
Si vous n'aimez pas les if, et sans goto:

def agir(valArticle, pourCent):
ristourne = (valArticle*pourCent) / 100
valeurFinale = (valArticle - ristourne)
print 'vous avez demandé sur votre article d\'une valeur de' ,
valArticle , 'euros, un pourcentage de' , pourCent , '%, ce qui donne
une valeur finale pour votre article de :' , valeurFinale

def afficher(valArticle, pourCent):
print [
'vous ne pouvez pas avoir une valeur négative!!!
Recommencez le programme'
, 'votre pourcentage ne peut pas être négatif!!! Recommencez
le programme'
, 'soyons logique, recommencez le programme'
][(valArticle <= 0) + (2 * (pourCent <= 0)) - 1]


print 'voila un petit programme afin de calculer un pourcentage'

valArticle = float(raw_input('Donner la valeur de votre article :'))
pourCent = float(raw_input('Donner la valeur de votre pourcentage
:'))

[afficher, agir][valArticle > 0 and pourCent > 0](valArticle, pourCent)


J'utilise plutôt des dictionnaires d'actions. Pour si peu de cas, c'est
sans intérêt, mais ça devient vite pratique, surtout si on utilise les
mêmes listes depuis la ligne de commande avec OptionParser jusqu'aux
menus TKInter générés automatiquement.

--
Pierre Maurette


  Réponse avec citation
Vieux 09/08/2007, 13h05   #35
Pierre Maurette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

fred1599@gmail.com, le 08/08/2007 a écrit :

[...]

> Bon je te passe un code exemple que je me suis amusé a faire pour
> faire cette boucle
>
> # _*_ coding:Utf-8 _*_
>
> print 'voila un petit programme afin de calculer un pourcentage'
>
> # Les chiffres dont on a besoin
>
> a = float(raw_input('Donner la valeur de votre article :'))
> b = float(raw_input('Donner la valeur de votre pourcentage :'))
>
> if a > 0 and b > 0 :
> c=((a*b)/100)
> d= (a-c)
> print 'vous avez demandé sur votre article d\'une valeur de' , a ,
> 'euros, un pourcentage de' , b , '%, ce qui donne une valeur finale
> pour votre article de :' , d
> elif a < 0 and b > 0 :
> print 'vous ne pouvez pas avoir une valeur négative!!! Recommencez le
> programme'
> elif a > 0 and b < 0 :
> print 'votre pourcentage ne peut pas être négatif!!! Recommencez le
> programme'
> elif a < 0 and b < 0 :
> print 'soyons logique, recommencez le programme'


Vous pourriez vous contenter d'un seul if ... else et d'une liste de
trois chaînes. Notez que (a <= 0) + (2 * (b <= 0)) prend les valeurs 0,
1, 2 et 3. Généralisable à N conditions.
Si vous n'aimez pas les if, et sans goto:

def agir(valArticle, pourCent):
ristourne = (valArticle*pourCent) / 100
valeurFinale = (valArticle - ristourne)
print 'vous avez demandé sur votre article d\'une valeur de' ,
valArticle , 'euros, un pourcentage de' , pourCent , '%, ce qui donne
une valeur finale pour votre article de :' , valeurFinale

def afficher(valArticle, pourCent):
print [
'vous ne pouvez pas avoir une valeur négative!!!
Recommencez le programme'
, 'votre pourcentage ne peut pas être négatif!!! Recommencez
le programme'
, 'soyons logique, recommencez le programme'
][(valArticle <= 0) + (2 * (pourCent <= 0)) - 1]


print 'voila un petit programme afin de calculer un pourcentage'

valArticle = float(raw_input('Donner la valeur de votre article :'))
pourCent = float(raw_input('Donner la valeur de votre pourcentage
:'))

[afficher, agir][valArticle > 0 and pourCent > 0](valArticle, pourCent)


J'utilise plutôt des dictionnaires d'actions. Pour si peu de cas, c'est
sans intérêt, mais ça devient vite pratique, surtout si on utilise les
mêmes listes depuis la ligne de commande avec OptionParser jusqu'aux
menus TKInter générés automatiquement.

--
Pierre Maurette


  Réponse avec citation
Vieux 09/08/2007, 18h53   #36
jean-michel bain-cornu
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

> On pourrait d'ailleurs aller plus loin et faire évoluer ça vers un
> émulateur de 'l3g à goto'. Je n'y avait pas pensé lors de ma migration,
> mais ça permettrait une solution propre pour la pérennisation des
> vieilles applis écrites avec ce genre de langage.
> Ceux qui trainent des vieux basics ou assimilés tournant sur des
> machines à bout de souffle dresseront peut-être l'oreille...
>


Comme je suis en congé, et que je m'ennuie avec ce temps incroyablement
froid et humide pour la saison, j'ai fait l'essai avec un bout de basic
trouvé dans wikipédia, que je me suis amusé à faire tourner en python.
C'est très rudimentaire, mais ça marche !
A+
jm

PS: j'avoue que j'ai un peu triché en retirant un LEFT$ qui me gênait.

# -*- coding: iso-8859-1 -*-
"""
10 INPUT "Quel est votre nom"; NOM$
20 PRINT "Bonjour "; NOM$
30 INPUT "Combien d'étoiles voulez-vous"; NOMBRE
40 FOR I = 1 TO NOMBRE
50 ETOILE$ = ETOILE$ + "*"
55 NEXT I
60 PRINT ETOILE$
70 INPUT "Voulez-vous plus d'étoiles"; ETOILE$
80 IF LEN(ETOILE$) = 0 GOTO 70
100 IF (ETOILE$ = "O") OR (ETOILE$ = "o") THEN GOTO 30
110 PRINT "Au revoir ";
120 FOR I = 1 TO 200
130 PRINT NOM$; " ";
140 NEXT I
150 PRINT
"""
import traceback

z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); lineNumList = [0] + sorted(z.keys());
linesDic = dict((b,a) for
a,b in enumerate(lineNumList)); l = lineNumList[1]

def main():
global l
forStack= []
while l and l <= lineNumList[-1]:
line= z[l].split()
# entrée console
if line[0] == 'INPUT':
varTxt= line[-1]
var= varTxt.replace('$','_dollar')
txt= ' '.join(line[1:len(line)-1]).replace('";',' "')
s= '%s = raw_input(%s)'%(var,txt)
if varTxt.find('$') == -1:
s= '%s = int(raw_input(%s))'%(var,txt)
# affichage console
elif line[0] == 'PRINT':
s=
z[l].replace('PRINT','print').replace('$','_dollar').r eplace(';',',')
s= s.replace(' ",','",')
# branchement
elif line[0] == 'GOTO':
n= int(line[1])
l = lineNumList[linesDic[n]-1]
# début boucle for
elif line[0] == 'FOR':
indVar= line[1]
indValue= int(line[3])
endVar= line[-1]
forStack.append([l,indVar,indValue,endVar])
s= '%s = %s'%(indVar,indValue)
# fin boucle for
elif line[0] == 'NEXT':
s= ''
var= line[1]
for i,(lno,indVar,indValue,endVar) in enumerate(forStack):
if indVar == var:
indValue+= 1
forStack[i][2]= indValue
s= '%s = %s'%(indVar,indValue)
exec 'w=%s>%s'%(indValue,endVar)
if not w:
l = lno
else:
forStack.pop()
break
# test
elif line[0] == 'IF':
w= line[1:len(line)-2]
cond= []
for inst in w:
a= inst
if a in ('OR','AND'):
a= a.lower()
cond.append(a)
if cond[-1] == 'THEN':
cond.pop()
s= ''.join(cond).replace('=','==').replace('$','_doll ar')
s= s.replace('LEN(','len(')
rc= False
exec 'if %s: rc= True'%s
if rc:
w2= int(line[-1])
l= lineNumList[linesDic[w2]-1]
s= ''
# affectation
elif line[1] == '=':
txt= z[l].replace('$','_dollar')
s= '\n'.join((
'try:',
' %s'%txt,
'except NameError:',
' var= traceback.format_exc().split("\'")[1]',
' exec "%s=\'\'"%var',
' try:',
' %s'%txt,
' except TypeError:',
' exec "%s=0"%var',
' %s'%txt,))
else:
s= "print 'non supporté : %s'"%z[l]
#
exec s
l = l != lineNumList[-1] and lineNumList[linesDic[l]+1]

main()
  Réponse avec citation
Vieux 09/08/2007, 18h53   #37
jean-michel bain-cornu
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

> On pourrait d'ailleurs aller plus loin et faire évoluer ça vers un
> émulateur de 'l3g à goto'. Je n'y avait pas pensé lors de ma migration,
> mais ça permettrait une solution propre pour la pérennisation des
> vieilles applis écrites avec ce genre de langage.
> Ceux qui trainent des vieux basics ou assimilés tournant sur des
> machines à bout de souffle dresseront peut-être l'oreille...
>


Comme je suis en congé, et que je m'ennuie avec ce temps incroyablement
froid et humide pour la saison, j'ai fait l'essai avec un bout de basic
trouvé dans wikipédia, que je me suis amusé à faire tourner en python.
C'est très rudimentaire, mais ça marche !
A+
jm

PS: j'avoue que j'ai un peu triché en retirant un LEFT$ qui me gênait.

# -*- coding: iso-8859-1 -*-
"""
10 INPUT "Quel est votre nom"; NOM$
20 PRINT "Bonjour "; NOM$
30 INPUT "Combien d'étoiles voulez-vous"; NOMBRE
40 FOR I = 1 TO NOMBRE
50 ETOILE$ = ETOILE$ + "*"
55 NEXT I
60 PRINT ETOILE$
70 INPUT "Voulez-vous plus d'étoiles"; ETOILE$
80 IF LEN(ETOILE$) = 0 GOTO 70
100 IF (ETOILE$ = "O") OR (ETOILE$ = "o") THEN GOTO 30
110 PRINT "Au revoir ";
120 FOR I = 1 TO 200
130 PRINT NOM$; " ";
140 NEXT I
150 PRINT
"""
import traceback

z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); lineNumList = [0] + sorted(z.keys());
linesDic = dict((b,a) for
a,b in enumerate(lineNumList)); l = lineNumList[1]

def main():
global l
forStack= []
while l and l <= lineNumList[-1]:
line= z[l].split()
# entrée console
if line[0] == 'INPUT':
varTxt= line[-1]
var= varTxt.replace('$','_dollar')
txt= ' '.join(line[1:len(line)-1]).replace('";',' "')
s= '%s = raw_input(%s)'%(var,txt)
if varTxt.find('$') == -1:
s= '%s = int(raw_input(%s))'%(var,txt)
# affichage console
elif line[0] == 'PRINT':
s=
z[l].replace('PRINT','print').replace('$','_dollar').r eplace(';',',')
s= s.replace(' ",','",')
# branchement
elif line[0] == 'GOTO':
n= int(line[1])
l = lineNumList[linesDic[n]-1]
# début boucle for
elif line[0] == 'FOR':
indVar= line[1]
indValue= int(line[3])
endVar= line[-1]
forStack.append([l,indVar,indValue,endVar])
s= '%s = %s'%(indVar,indValue)
# fin boucle for
elif line[0] == 'NEXT':
s= ''
var= line[1]
for i,(lno,indVar,indValue,endVar) in enumerate(forStack):
if indVar == var:
indValue+= 1
forStack[i][2]= indValue
s= '%s = %s'%(indVar,indValue)
exec 'w=%s>%s'%(indValue,endVar)
if not w:
l = lno
else:
forStack.pop()
break
# test
elif line[0] == 'IF':
w= line[1:len(line)-2]
cond= []
for inst in w:
a= inst
if a in ('OR','AND'):
a= a.lower()
cond.append(a)
if cond[-1] == 'THEN':
cond.pop()
s= ''.join(cond).replace('=','==').replace('$','_doll ar')
s= s.replace('LEN(','len(')
rc= False
exec 'if %s: rc= True'%s
if rc:
w2= int(line[-1])
l= lineNumList[linesDic[w2]-1]
s= ''
# affectation
elif line[1] == '=':
txt= z[l].replace('$','_dollar')
s= '\n'.join((
'try:',
' %s'%txt,
'except NameError:',
' var= traceback.format_exc().split("\'")[1]',
' exec "%s=\'\'"%var',
' try:',
' %s'%txt,
' except TypeError:',
' exec "%s=0"%var',
' %s'%txt,))
else:
s= "print 'non supporté : %s'"%z[l]
#
exec s
l = l != lineNumList[-1] and lineNumList[linesDic[l]+1]

main()
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 20h08.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,21265 seconds with 20 queries