conversions de Basic

Aucun problème sur nos chères vieilleries, cela se saurait.... Hop! je me lâche ^_^

Modérateur : Politburo

Répondre
driver
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 121
Enregistré le : 18 sept. 2008 10:48
Localisation : BEAUVAIN, Orne

conversions de Basic

Message par driver »

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
Canon X-07, TI-74S, Casio PB-100, Amstrad NC100, Sharp PC1403
Avatar du membre
Woodstock
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1969
Enregistré le : 17 mai 2008 11:19
Localisation : Au fin fond du Santerre ...

Re: conversions de Basic

Message par Woodstock »

Logique booléenne version Sharp :
  • 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)
Donc dans un test multiple de type IF (condition1)+(condition2) THEN... :
  • 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
De même, dans un test multiple de type IF (condition1)*(condition2) THEN... :
  • 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.
Donc dans ton cas de figure, IF (A<X)*(B<X) THEN... sera la syntaxe adéquate.

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)
driver
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 121
Enregistré le : 18 sept. 2008 10:48
Localisation : BEAUVAIN, Orne

Re: conversions de Basic

Message par driver »

ok, bien reçu le message, je mets de côté pour le reste des programmes à transformer.
merci :P
Canon X-07, TI-74S, Casio PB-100, Amstrad NC100, Sharp PC1403
Avatar du membre
Woodstock
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1969
Enregistré le : 17 mai 2008 11:19
Localisation : Au fin fond du Santerre ...

Re: conversions de Basic

Message par Woodstock »

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 !
I'm the operator
Of my pocket calculator
I am adding
And substracting...
(Kraftwerk, Computer World, 1981)
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: conversions de Basic

Message par babaorhum »

Woodstock a écrit : 100:PRINT "RESTE ";N;" COUP";CHR$ (83*(N>1))

Code : Tout sélectionner

110 PRINT "BRAVO, JOLI COUP WOODSTOCK !" 
:wink:
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
driver
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 121
Enregistré le : 18 sept. 2008 10:48
Localisation : BEAUVAIN, Orne

Re: conversions de Basic

Message par driver »

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
Avatar du membre
rogeroge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4221
Enregistré le : 14 mai 2010 21:41
Localisation : Entre Nancy et Bercy : à Torcy

Re: conversions de Basic

Message par rogeroge »

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 !
Bonjour,
Beau travail d'analyse Woodstock ! 8)
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 !
Répondre

Retourner vers « Résolution de problèmes »