Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

faire une boucle

18 réponses
Avatar
fred1599
Bonjour,

Un probl=E8me de boucle,

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

C'est surement possible mais je n'ai rien vu par rapport =E0 =E7a

8 réponses

1 2
Avatar
fred1599
Extrait de la doc :

"Ensuite vient le GOTOGOTO..."
"le GOTOGOTO requiert, en plus du label, un pourcentage de
réussite qui va permettre de calculer la probabilité pour
que le GOTOGOTO vous envoie vraiment à cette étiquette"


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'

raw_input()


Voila, maintenant, une fois que j'appuis sur une nouvelle touche,
j'aimerais que le programme revienne au point de départ en me
redemendant la valeur a et la valeur b


# _*_ coding:Utf-8 _*_

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

while True:
# (ton code, indenté d'un cran à droite:)
# 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!!! Recommence z le
programme'
elif a > 0 and b < 0 :
print 'votre pourcentage ne peut pas être négatif!!! Recommence z le
programme'
elif a < 0 and b < 0 :
print 'soyons logique, recommencez le programme'

raw_input()


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?

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



Avatar
Thierry B.
--{ Méta-MCI (MVP) a plopé ceci: }--

"Ensuite vient le GOTOGOTO..."
"le GOTOGOTO requiert, en plus du label, un pourcentage de
réussite qui va permettre de calculer la probabilité pour
que le GOTOGOTO vous envoie vraiment à cette étiquette"

Ça ne serait pas un peu pompé sur Intercal, cette

fonctionnalité probabilistiquàlacon ?


--
Ce n'est pas forcément optimal, mais pour un
débutant, c'est la solution "agricole".

Avatar
Thierry B.
--{ 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*

Avatar
Laurent Pointal
wrote:

<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.


Avatar
jean-michel bain-cornu
Merci beaucoup ca me simplifie énormément la vie.
Ya pas de quoi


Avatar
jean-michel bain-cornu
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.





Avatar
Pierre Maurette

[...]

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

Avatar
jean-michel bain-cornu
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').replace(';',',')
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('$','_dollar')
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()

1 2