[Tutoriel] Un Lbl tout en un
Posté le 26/02/2014 16:42
Bonjour,
aujourd'hui je vous propose un alternative au GoTo, fonction controversée et souvent évité.
Pourquoi ?
C'est un fonction lente
Elle peut etre a l'origine de bug (voir
ce tutoriel)
Il n'y en a que 26 (les lettres) + 10 (les chiffres) + 2 (θ et π) =38
L'astuce ?
C'est simple, voici le code :
0[b]->[/b]L [green]'Libelé par défault[/green]
[red]Lbl[/red] [maroon]0[/maroon]
[b][blue]If[/blue][/b] L=[maroon]0[/maroon]
[b][blue]Then[/blue][/b] [green]'Libelé [maroon]0[/maroon][/green]
...
[b][blue]IfEnd[/blue][/b]
[b][blue]If[/blue][/b] L=[maroon]1[/maroon]
[b][blue]Then[/blue][/b] [green]'Libelé [maroon]1[/maroon][/green]
...
[b][blue]IfEnd[/blue][/b]
etc...
[b][blue]If[/blue][/b] L=[maroon]9[/maroon]e99
[b][blue]Then[/blue][/b] [green]'Libelé [maroon]9[/maroon]e99[/green]
...
[b][blue]IfEnd[/blue][/b]
[red]Goto[/red] [maroon]0[/maroon]
Ici, L est la variable de "libelé", c'est a dire que si par exemple vous voulez accèder au premier libelé, mettez la variable L a 1 (0->L) puis faire un retour a la racine par un Goto 0 (j'aurais aussi bien pu mettre la variable X et le Lbl 7... Question d'habitude, a vous de choisir ;D)
Ensuite, je vous conseille de mettre comme je l'ai fais un Goto 0 général a la fin du programme pour éviter les boucles infinis...
Et enfin, avant le Lbl 0, initialiser la variable L pour savoir quel sera le libelé "par défault" de votre programme.
Maintenant, on a :
Une infinité (enfin presque) de libelés
Plus aucun bug
Un Goto rapide puisque le Lbl se trouve au début du programme (la calculatrice recherchant les Lbl de manière linéaire)
Ainsi, quand vous voulez par exemple faire une redirection, vous n'avez plus qu'a écrire ce code :
Numero_du_libelé [b]->[/b] L : [red]Goto[/red] [maroon]0[/maroon]
Bonne programmation a tous !
Alternative proposée par Louloux
Cliquer pour enrouler
Remplacer le "Lbl 0" par un "Do" et le "Goto 0" par un "Lpwhile 1" de sorte a avoir la meme chose sous forme de boucle.
Avantages :
Eviter la perte de temps avec le Goto
Inconvénient :
Avant de rejoindre le libelé de destination, le programme doit finir le parcourt de la boucle, sauf si ce libelé se trouve après celui en cours
Il faut utiliser une variable de sortie s'il y a des boucles/conditions imbriquées les unes dans les autres
Citer : Posté le 26/02/2014 17:02 | #
Il y en a 38 car A-Z/0-9/θ/π.
-ASM (assembleur) sur x86 et gb-Z80
-locomotive basic/amstrad basic
-Basic Casio
-VBS
-Batch
-Bash
-Python 3.4
-html
-CSS
-javascript
-Lua
-brainfuck
-ruby
Il faut savoir que je ne maitrise pas parfaitement tout ces langages
[/spoiler]
Remerciment
Ma calto: graph 75
Citer : Posté le 26/02/2014 17:19 | #
Mais c'est une très grande découverte !
Toutes les formules de Première S.
Toutes les formules de Terminale S.
Un programme de calculs.
Super Mario 3
warrior
Jump Ball
First Fly
►Jeu gagnant des 48h CPC n°12◄
Mon site de discussion pour ados : http://entre-ados.net/ (a brûlé dans l'incendie d'OVH)
Mon éditeur de cours en ligne et plateforme de partage : http://wordline.xyz (a succombé à la concurrence de Google Drive...)
Citer : Posté le 26/02/2014 17:20 | #
je ne le savais pas
Citer : Posté le 26/02/2014 17:22 | #
Je ne savais pas pour θ et π, je modifie
Programmeur Basic sur Casio 75+
Citer : Posté le 26/02/2014 17:33 | #
Pourquoi pour faire une soi-disant alternative au Label tu utilises un Lbl / Goto alors qu'on pourrait utiliser une boucle ??
Je m'explique :
.......
[red]Goto[/red] [maroon]0[/maroon]
... peut être remplacé par :
........
[b][blue]LpWhile[/blue][/b] [maroon]1[/maroon]
Citer : Posté le 26/02/2014 17:34 | #
Le 'Libelé X remplace Lbl X ?
-ASM (assembleur) sur x86 et gb-Z80
-locomotive basic/amstrad basic
-Basic Casio
-VBS
-Batch
-Bash
-Python 3.4
-html
-CSS
-javascript
-Lua
-brainfuck
-ruby
Il faut savoir que je ne maitrise pas parfaitement tout ces langages
[/spoiler]
Remerciment
Ma calto: graph 75
Citer : Posté le 26/02/2014 17:35 | #
Et c'est plus rapide, les lbl ne sont pas des boucles non plus! Même quand j'ai démarré la prog je ne les ais pas utilisés comme boucles.
Citer : Posté le 26/02/2014 17:35 | #
Ta méthode marche également, mais il faut finir la boucle a chaque fois et tester chaque condition avec le retour au début, ce qui entraine peut etre plus de temps perdu, a voir selon les cas...
En tout cas, je met l'alternative.
Programmeur Basic sur Casio 75+
Citer : Posté le 26/02/2014 17:41 | #
Mais c'est une très grande découverte !
Hum... un peu moins d'enthousiasme svp, c'est pas la découverte des Amériques non plus.
Ce qui est reproché aux labels et goto, très controversés, c'est certes les erreurs qu'ils peuvent générer, leur lenteur, et leur nombre limité, mais surtout leur utilisation considérée comme sale et anti-pédagogique : c'est une fonctionnalité utilisée par défaut par les débutants pour combler leurs lacunes dans l'utilisation des boucles et des conditions, et cela rend le code mal organisé (pas organisé du tout en fait). Les labels sont utilisés dans beaucoup de cas pour remplacer des conditions et des boucles, ou d'autres utilisations moins honorables encore.
Cette "astuce", bien qu'évitant l'utilisation des labels, propose un code long qui dans beaucoup de cas sera disproportionné par rapport à l'utilisation qu'on va en faire.
Autant utiliser les sous-programmes, avec les instructions Prog et Return, c'est infiniment plus propre !
Ajouté le 26/02/2014 à 17:42 :
Ta méthode marche également, mais il faut finir la boucle a chaque fois et tester chaque condition avec le retour au début, ce qui entraine peut etre plus de temps perdu, a voir selon les cas...
En tout cas, je met l'alternative.
La condition est 1, c'est la condition vraie par excellence. Et ce n'est pas plus long que de rechercher le Lbl correspondant au Goto, et surtout plus cohérent parce qu'on veut éviter le Lbl/Goto.
Ajouté le 26/02/2014 à 17:43 :
Parce que je me demande bien l'utilité de remplacer une Lbl/Goto par un autre Lbl/Goto avec des conditions au milieu
Ajouté le 26/02/2014 à 17:43 :
Le 'Libelé X remplace Lbl X ?
Non, c'est un commentaire...
Ajouté le 26/02/2014 à 17:46 :
Inconvénient :
Avant de rejoindre le libelé de destination, le programme doit finir le parcourt de la boucle, sauf si ce libelé se trouve après celui en cours
Ce qui ne change strictement rien par rapport au code que tu as proposé
Ajouté le 26/02/2014 à 17:50 :
Bref, je te redirige vers des liens qui pourraient t'aider :
Prog
Return
Citer : Posté le 26/02/2014 17:58 | #
c'est une fonctionnalité utilisée par défaut par les débutants pour combler leurs lacunes dans l'utilisation des boucles et des conditions, et cela rend le code mal organisé (pas organisé du tout en fait). Les labels sont utilisés dans beaucoup de cas pour remplacer des conditions et des boucles, ou d'autres utilisations moins honorables encore.
Oublié le plus important, je rajoute !
Autant utiliser les sous-programmes, avec les instructions Prog et Return, c'est infiniment plus propre !
En effet, mais je préfère programmer sur un seul programme, condensé ... Je rédigerai bientot un tutoriel pour rassembler plusieurs programmes sans perte de trop de temps pendant l'execution.
En effet, les calculatrices 35+ n'ont pas envie la plupart du temps d'avoir des programmes "+niveau", "+je_sais_pas_quoi", etc... dans tous les sens, sa deviens vite incompréhensible, et si tu supprime le sous programme, tu peux faire bugger le programme père ou au contraire, tu peux oublier de supprimer le programme fils lorsque tu supprime un programme père.
Ce qui ne change strictement rien par rapport au code que tu as proposé
Si, ça change un peu
Regarde ce code :
[red]Goto[/red] [maroon]0[/maroon]
[b][blue]If[/blue][/b] L=[maroon]1[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[b][blue]If[/blue][/b] L=[maroon]2[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
1[b]->[/b]L:[red]Goto[/red] [maroon]0[/maroon]
Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[b][blue]If[/blue][/b] L=[maroon]3[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[b][blue]If[/blue][/b] L=[maroon]4[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
...
[b][blue]If[/blue][/b] L=[maroon]10000000[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[red]Goto[/red] [maroon]0[/maroon]
Si tu remplace par la boucle, tu testera mes 99999998 avant de revenir au début de la boucle et en plus, tu ne peut pas sortir s'il y a quelque chose après ta redirection dans la condition...
Ajouté le 26/02/2014 à 18:00 :
Imagine que tu ait ça :
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]Do[/blue][/b]
[b][blue]If[/blue][/b] A=[maroon]27[/maroon]
[b][blue]Then[/blue][/b] Endroit d[green]'ou je veux sortir du libelé[/green]
[b][blue]IfEnd[/blue][/b]
[b][blue]Lpwhile[/blue][/b] Je_sais_pas_quoi
[b]IfEnd[/b]
Tu fais comment sans ma méthode ?
Programmeur Basic sur Casio 75+
Citer : Posté le 26/02/2014 18:07 | #
Utilise des Break pour sortir d'une boucle:
Then Je_sais_pas_quoi
Do
If A=27
Then Break
IfEnd
Lpwhile Je_sais_pas_quoi
IfEnd
Citer : Posté le 26/02/2014 18:10 | #
Et si y'en a plus d'une ?
Si par exemple tu en as 4 imbriquées les unes dans les autres ... Tu fais comment ?
Programmeur Basic sur Casio 75+
Citer : Posté le 26/02/2014 18:18 | #
T'utilise une variable de sortie:
Do
Do
//du code...
If //on regarde si on quitte
Then 1→S
Break
IfEnd
LpWhile 1
S⇒Break
LpWhile 1
Après il y a plein de solutions
Sinon tu as mis "36 possibilités" au lieu de 38
Citer : Posté le 26/02/2014 19:58 | #
Mais c'est une très grande découverte !
Hum... un peu moins d'enthousiasme svp, c'est pas la découverte des Amériques non plus.
On est d'accord.
Ce qui est reproché aux labels et goto, très controversés, c'est certes les erreurs qu'ils peuvent générer, leur lenteur, et leur nombre limité, mais surtout leur utilisation considérée comme sale et anti-pédagogique
Non. Les Labels ont un intérêt pédagogique indéniable, notamment pour ceux qui apprennent le concept de boucle.
c'est une fonctionnalité utilisée par défaut par les débutants pour combler leurs lacunes dans l'utilisation des boucles et des conditions
Non. C'est par commodité d'utilisation que cette fonction est utilisée. J'ajouterai que certains anciens tutoriels qui avaient pour vocation de faire apprendre le Basic CASIO dédiaient un chapitre entier aux Labels. Quoi de plus normal que les débutants l'utilisent ?
et cela rend le code mal organisé (pas organisé du tout en fait)
Non. Un Goto-Lbl ça veut dire ce que ça veut dire, les connexions entre les différentes parties du programme sont clairement définies. Il est bien plus simple pour un observateur extérieur de comprendre un programme avec des Lbl qu'un autre qui aurait des tonnes de conditions. Tu voudrais nous faire croire que les bouts de code proposés sur cette page sont clairs peut-être ? Ah ça pour être organisés ils le sont, mais quelle usine à gaz !
ou d'autres utilisations moins honorables encore.
Ah oui ? C'est drôle j'aurais dit que certaines utilisations obligatoires des Lbl étaient pourtant sympas, comme la fonction "Menu"...
Cette "astuce", bien qu'évitant l'utilisation des labels, propose un code long qui dans beaucoup de cas sera disproportionné par rapport à l'utilisation qu'on va en faire.
L'astuce qui est ici proposée est celle que j'utilise systématiquement lorsque je fais un menu dans un jeu. Les conditions "If...Then..." sont parfois remplacées par des doubles flèches ou le tout est souvent raccourci par l'appel d'un sous-programme, mais c'est bien ainsi que je procède, comme beaucoup d'autres.
Ajouté le 26/02/2014 à 17:42 :
Ta méthode marche également, mais il faut finir la boucle a chaque fois et tester chaque condition avec le retour au début, ce qui entraine peut etre plus de temps perdu, a voir selon les cas...
En tout cas, je met l'alternative.
La condition est 1, c'est la condition vraie par excellence. Et ce n'est pas plus long que de rechercher le Lbl correspondant au Goto, et surtout plus cohérent parce qu'on veut éviter le Lbl/Goto.
Ajouté le 26/02/2014 à 17:43 :
Parce que je me demande bien l'utilité de remplacer une Lbl/Goto par un autre Lbl/Goto avec des conditions au milieu
Oui c'est logique, mettre un Goto-Lbl dans un code qui est censé ne pas les utiliser c'est un poil contradictoire !
On dit aux débutants : "les Lbl c'est le mal" (et c'est vrai, dans une certaine mesure), alors par la suite on les voit répéter à leur tout que "c'est le mal" etc... sans qu'ils sachent forcément les raisons de ce déni... On se croirait avec le cliché "Internet Explorer" !
Cette fonction existe, elle a son utilité et son seul grand défaut est de bugger. Voilà pourquoi il ne faut pas l'utiliser. Sans ces bugs, les autres inconvénients de sont absolument pas dissuasifs. C'est tout.
Au fait Louloux, tu ne deviendras pas un géant en prenant les autres pour des nains !
Ces derniers temps tu as le mot "débutant" facile, et ça peut parfois (souvent ?) être blessant, pour ceux qui tentent de progresser. Tu ne le perçois probablement pas, on en peut donc pas t'en vouloir, mais essaie d’assaisonner tes conseils, pour que l'on ai moins l'impression que tu te mettes dans une position "surplombante".
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 26/02/2014 20:19 | #
[red]Goto[/red] [maroon]0[/maroon]
[b][blue]If[/blue][/b] L=[maroon]1[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[b][blue]If[/blue][/b] L=[maroon]2[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
1[b]->[/b]L:[red]Goto[/red] [maroon]0[/maroon]
Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[b][blue]If[/blue][/b] L=[maroon]3[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[b][blue]If[/blue][/b] L=[maroon]4[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
...
[b][blue]If[/blue][/b] L=[maroon]10000000[/maroon]
[b][blue]Then[/blue][/b] Je_sais_pas_quoi
[b][blue]IfEnd[/blue][/b]
[red]Goto[/red] [maroon]0[/maroon]
Comme ça, si je vais à L=10 millions, je peut patienter 10 minutes le temps que l'interpréteur fasse le tour du programme
Il est vrai que l'utilisation des Lbl/Goto est très controversée, et je suis d'accord que les utiliser comme boucles n'est pas approprié
En revanche, je préfère et je pense plus clair de les utiliser pour émuler le concept de fonction absent du BASIC.
On a donc un code structuré en fonctions (délimités par des Lbl), la seule chose à éviter étant de laisser une fonction déborder sur celle écrite en-dessous
Citer : Posté le 26/02/2014 20:35 | #
Dans ce sujet vous n'arretez pas de dire que les Lbl/Goto sont lent mais,j'ai vus marquer sur PC je sais plus où par je sais plus qui que les Lbl/Goto sont plus rapide que les While/WhileEnd,Do/LpWhile est-ce vrai :huh: ?
-ASM (assembleur) sur x86 et gb-Z80
-locomotive basic/amstrad basic
-Basic Casio
-VBS
-Batch
-Bash
-Python 3.4
-html
-CSS
-javascript
-Lua
-brainfuck
-ruby
Il faut savoir que je ne maitrise pas parfaitement tout ces langages
[/spoiler]
Remerciment
Ma calto: graph 75
Citer : Posté le 26/02/2014 20:36 | #
En revanche, je préfère et je pense plus clair de les utiliser pour émuler le concept de fonction absent du BASIC.
On a donc un code structuré en fonctions (délimités par des Lbl), la seule chose à éviter étant de laisser une fonction déborder sur celle écrite en-dessous
Dans ce cas, mets ton code qui émule la fonction dans un sous-programme. C'est beaucoup plus rapide
Vitesse des fonctions en Basic Casio | 7 days CPC | Casio Universal Wiki | Tutoriel Basic Casio
>>> Give me a click Brother <<< >>> Teste mon générateur de mots nouveaux <<<
>>> Random Youtube Video <<<
Citer : Posté le 26/02/2014 20:38 | #
Dans ce sujet vous n'arretez pas de dire que les Lbl/Goto sont lent mais,j'ai vus marquer sur PC je sais plus où par je sais plus qui que les Lbl/Goto sont plus rapide que les While/WhileEnd,Do/LpWhile est-ce vrai :huh: ?
Absolument pas ! Les labels sont beaucoup plus lent que les boucles "classiques". Ils sont pratiques dans le cas d'un retour rapide à faire, et pas régulier.
Citer : Posté le 26/02/2014 20:40 | #
Mais oui c'est bien les sous-programmes (d'ailleurs ça ressemble beaucoup plus à l'idée de fonction ), mais je répète (puisque ça a déjà été dit) que vous ne pouvez pas vous retrouver avec 20 sous-programmes, ce n'est pas gérable
Et puis les sous-programmes sont utiles lorsqu'ils sont appelés souvent, ce qui n'est pas toujours le cas d'une fonction
Citer : Posté le 26/02/2014 20:45 | #
Dans ce sujet vous n'arretez pas de dire que les Lbl/Goto sont lent mais,j'ai vus marquer sur PC je sais plus où par je sais plus qui que les Lbl/Goto sont plus rapide que les While/WhileEnd,Do/LpWhile est-ce vrai :huh: ?
Absolument pas ! Les labels sont beaucoup plus lent que les boucles "classiques". Ils sont pratiques dans le cas d'un retour rapide à faire, et pas régulier.
Exact.
Sinon Pseudopourri tu peux vérifier par toi même la vitesse d’exécution d'une fonction en faisant une boucle For dans laquelle tu mets une première fonction, et la même boucle For dans un autre programme dans laquelle tu mets une seconde fonction dont tu veux comparer la vitesse d’exécution.
En chronométrant le temps que mettent les programmes à s’exécuter, tu pourras déterminer celles des deux fonctions qui est la plus rapide, et si tu fais l'opération pour une boucle For qui se répète un grand nombre de fois, et en divisant par ce nombre, tu pourras même savoir plus précisément le temps d’exécution relatif à une fonction en particulier.
EDIT : je suis bien d'accord avec le Phénix !
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !