|
|
|
#26 |
|
Messages: n/a
Hébergeur: |
--{ 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* |
|
|
|
#27 |
|
Messages: n/a
Hébergeur: |
--{ 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* |
|
|
|
#28 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#29 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#30 |
|
Messages: n/a
Hébergeur: |
> Merci beaucoup ca me simplifie énormément la vie.
Ya pas de quoi |
|
|
|
#31 |
|
Messages: n/a
Hébergeur: |
> Merci beaucoup ca me simplifie énormément la vie.
Ya pas de quoi |
|
|
|
#32 |
|
Messages: n/a
Hébergeur: |
> 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. |
|
|
|
#33 |
|
Messages: n/a
Hébergeur: |
> 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. |
|
|
|
#34 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#35 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#36 |
|
Messages: n/a
Hébergeur: |
> 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() |
|
|
|
#37 |
|
Messages: n/a
Hébergeur: |
> 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() |
|
![]() |
| Outils de la discussion | |
|
|