je suis en train de faire des conversions de programmes ( vite fait, on verra à améliorer plus tard ). En l'occurence, je bute sur un truc simples :
sur PB100 : IF A<X;IF B<X THEN...
se traduirait par IF A<X AND B<X THEN ... sur un TI 74
mais un doute sur le PC1403. J'aurai traduit par IF (A<X)+(B<X) THEN ou LET
seulement voilà : comment se "traduit" ce signe "*" ou "+". Cela voudrait dire AND ou OR,non?
besoin d'une confirmation please
conversions de Basic
Modérateur : Politburo
-
- Fonctionne à 300 bauds
- Messages : 121
- Enregistré le : 18 sept. 2008 10:48
- Localisation : BEAUVAIN, Orne
conversions de Basic
Canon X-07, TI-74S, Casio PB-100, Amstrad NC100, Sharp PC1403
- Woodstock
- Fonctionne à 2400 bauds
- Messages : 1969
- Enregistré le : 17 mai 2008 11:19
- Localisation : Au fin fond du Santerre ...
Re: conversions de Basic
Logique booléenne version Sharp :
Mais... comme tous les Sharp (sauf 1210/1211/1212) ont d'origine AND et OR dans leur vocabulaire, on peut oublier tout cela et écrire IF A<X AND B<X THEN...
Ce qui marchera très bien sur PC-1403, sera plus clair et économisera en prime quatre octets : les parenthèses, nécessaires dans le premier cas puisque sinon il va évaluer de droite à gauche en calculant un truc genre A< (X*B) <X ce qui n'est pas du tout le but recherché... Elles sont inutiles dans le second cas, puisque l'ordre de priorité des opérations algébriques place les opérateurs logiques (AND, OR) après les opérateurs relationnels (= < > etc...).
- Condition vraie = 1, condition fausse = 0 (et non -1 et 0 comme dans un Basic Microsoft par exemple)
Instructions après THEN exécutées si résultat du test est vrai (en pratique suivant les modèles, différent de 0 ou supérieur à 0, ce qui ne change rien dans ce cas précis)
- comme 1+1=2 (vrai), 1+0=1 (vrai), 0+1=1 (vrai) mais que 0+0=0 (faux) il s'ensuit qu'il suffit qu'une seule des deux conditions soit vraie pour que le résultat du test complet soit vrai. Autrement dit, l'opérateur d'addition fonctionne comme un OR non exclusif
- comme 1*0=0 (faux), 0*1=0 (faux), 0*0=0 (faux) mais que 1*1=1 (vrai), il s'ensuit qu'il faut que les deux conditions soient vraies pour que le résultat du test complet soit vrai. Autrement dit, l'opérateur de multiplication fonctionne comme un AND.
Mais... comme tous les Sharp (sauf 1210/1211/1212) ont d'origine AND et OR dans leur vocabulaire, on peut oublier tout cela et écrire IF A<X AND B<X THEN...
Ce qui marchera très bien sur PC-1403, sera plus clair et économisera en prime quatre octets : les parenthèses, nécessaires dans le premier cas puisque sinon il va évaluer de droite à gauche en calculant un truc genre A< (X*B) <X ce qui n'est pas du tout le but recherché... Elles sont inutiles dans le second cas, puisque l'ordre de priorité des opérations algébriques place les opérateurs logiques (AND, OR) après les opérateurs relationnels (= < > etc...).
I'm the operator
Of my pocket calculator
I am adding
And substracting...
(Kraftwerk, Computer World, 1981)
Of my pocket calculator
I am adding
And substracting...
(Kraftwerk, Computer World, 1981)
-
- Fonctionne à 300 bauds
- Messages : 121
- Enregistré le : 18 sept. 2008 10:48
- Localisation : BEAUVAIN, Orne
Re: conversions de Basic
ok, bien reçu le message, je mets de côté pour le reste des programmes à transformer.
merci
merci
Canon X-07, TI-74S, Casio PB-100, Amstrad NC100, Sharp PC1403
- Woodstock
- Fonctionne à 2400 bauds
- Messages : 1969
- Enregistré le : 17 mai 2008 11:19
- Localisation : Au fin fond du Santerre ...
Re: conversions de Basic
Ceci dit, il y a quand même des cas où l'utilisation de l'arithmétique booléenne devient plus élégante.
Par exemple, pour mettre un mot au pluriel sur un Sharp, il est possible de faire :
100:IF N=1 PRINT "RESTE ";N;" COUP"
110:IF N>1 PRINT "RESTE ";N;" COUPS"
Mais c'est un peu lourd. Pour les Sharp qui acceptent le ; en fin de PRINT (eh oui, pas tous...), on peut tricher un peu :
100:PRINT "RESTE ";N;" COUP";
110:IF N>1 PRINT "S"
Mais ce n'est pas parfait, puisque dans le cas où il reste 1 coup, l'affichage reste en attente, et le prochain PRINT viendra s'ajouter à ce message au lieu de le remplacer... Et pis ça marche pô sur 1251, 1401 etc...
On peut toujours passer par une variable, mais cela alourdit encore l'écriture (et coûte encore des octets) :
100:A$=""
110:IF N>1 LET A$="S"
120:PRINT "RESTE ";N;" COUP";A$
Alors qu'en se rappelant que le code ASCII de la lettre S est 83 et que le résultat d'un test logique est 1 si vrai, 0 si faux, il existe une solution aussi simple que rapide, en une seule ligne :
100:PRINT "RESTE ";N;" COUP";CHR$ (83*(N>1))
Si N est bien supérieur à 1, alors le code 83*1 c'est-à-dire 83 est généré et CHR$(83) donne un beau S, et si N n'est pas supérieur à 1, le code 83*0 c'est-à-dire 0 est généré, et CHR$(0) a le bon goût de ne rien afficher (normal : ASCII 0 est défini comme NUL).
Comme quoi l'algèbre booléenne peut aussi avoir son intérêt !
Par exemple, pour mettre un mot au pluriel sur un Sharp, il est possible de faire :
100:IF N=1 PRINT "RESTE ";N;" COUP"
110:IF N>1 PRINT "RESTE ";N;" COUPS"
Mais c'est un peu lourd. Pour les Sharp qui acceptent le ; en fin de PRINT (eh oui, pas tous...), on peut tricher un peu :
100:PRINT "RESTE ";N;" COUP";
110:IF N>1 PRINT "S"
Mais ce n'est pas parfait, puisque dans le cas où il reste 1 coup, l'affichage reste en attente, et le prochain PRINT viendra s'ajouter à ce message au lieu de le remplacer... Et pis ça marche pô sur 1251, 1401 etc...
On peut toujours passer par une variable, mais cela alourdit encore l'écriture (et coûte encore des octets) :
100:A$=""
110:IF N>1 LET A$="S"
120:PRINT "RESTE ";N;" COUP";A$
Alors qu'en se rappelant que le code ASCII de la lettre S est 83 et que le résultat d'un test logique est 1 si vrai, 0 si faux, il existe une solution aussi simple que rapide, en une seule ligne :
100:PRINT "RESTE ";N;" COUP";CHR$ (83*(N>1))
Si N est bien supérieur à 1, alors le code 83*1 c'est-à-dire 83 est généré et CHR$(83) donne un beau S, et si N n'est pas supérieur à 1, le code 83*0 c'est-à-dire 0 est généré, et CHR$(0) a le bon goût de ne rien afficher (normal : ASCII 0 est défini comme NUL).
Comme quoi l'algèbre booléenne peut aussi avoir son intérêt !
I'm the operator
Of my pocket calculator
I am adding
And substracting...
(Kraftwerk, Computer World, 1981)
Of my pocket calculator
I am adding
And substracting...
(Kraftwerk, Computer World, 1981)
- babaorhum
- Fonctionne à 1200 bauds
- Messages : 454
- Enregistré le : 13 janv. 2013 19:44
- Localisation : Marseille-est
Re: conversions de Basic
Woodstock a écrit : 100:PRINT "RESTE ";N;" COUP";CHR$ (83*(N>1))
Code : Tout sélectionner
110 PRINT "BRAVO, JOLI COUP WOODSTOCK !"
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
-
- Fonctionne à 300 bauds
- Messages : 121
- Enregistré le : 18 sept. 2008 10:48
- Localisation : BEAUVAIN, Orne
Re: conversions de Basic
ah oui pas mal, c'est logique dans un sens mais toutes les machines ne le font pas
Canon X-07, TI-74S, Casio PB-100, Amstrad NC100, Sharp PC1403
- rogeroge
- Fonctionne à 9600 bauds
- Messages : 4254
- Enregistré le : 14 mai 2010 21:41
- Localisation : Entre Nancy et Bercy : à Torcy
Re: conversions de Basic
Bonjour,Woodstock a écrit :Ceci dit, il y a quand même des cas où l'utilisation de l'arithmétique booléenne devient plus élégante.
Par exemple, pour mettre un mot au pluriel sur un Sharp, il est possible de faire :
.......
Si N est bien supérieur à 1, alors le code 83*1 c'est-à-dire 83 est généré et CHR$(83) donne un beau S, et si N n'est pas supérieur à 1, le code 83*0 c'est-à-dire 0 est généré, et CHR$(0) a le bon goût de ne rien afficher (normal : ASCII 0 est défini comme NUL).
Comme quoi l'algèbre booléenne peut aussi avoir son intérêt !
Beau travail d'analyse Woodstock !
J'apporte quelques éléments :
Dans ce cas évoqué, N appartient au corps des nombres réels entiers positifs.
Dans un cas plus général où N n'est plus entier mais décimal, frationnaire,... la règle grammaticale qui s'appliquerait pour le "s",
c'est de comparer N à 2 car pour
1,9999 objets le singulier s'applique et pour 2 objets et plus, le pluriel s'applique.
(pour autant que les décimales s'appliquent au mot "objet" car "1,5 chat" ou "2,2 chats" n'a pas de sens à priori)
Il faut être fou pour venir sur ce site mais encore plus fou pour ne pas y revenir !