Section courante

A propos

Section administrative du site

Les fonctions

Considérez le ZX Spectrum comme une machine à saucisses : Vous mettez un morceau de viande à une extrémité, tournez une poignée et une saucisse sort à l'autre extrémité. Un morceau de porc donne une saucisse de porc, un morceau de poisson donne une saucisse de poisson et une charge de boeuf une saucisse de boeuf.

Les fonctions (LEN, STR$, VAL, SGN, ABS, INT, SQR) sont pratiquement impossibles à distinguer des machines à saucisses, mais il y a une différence : elles fonctionnent sur des chiffres et des chaînes de caractères au lieu de la viande. Vous fournissez une valeur (appelée le paramètre), la hachez en faisant quelques calculs dessus et obtenez finalement une autre valeur en résultat :

Entrée de viande → Machine à saucisses → Sortie de saucisses
Paramètre d'entrée → Fonction → Résultat de sortie

Différents paramètres donnent des résultats différents, et si le paramètre est complètement inapproprié, la fonction s'arrêtera et donnera un rapport d'erreur.

Tout comme vous pouvez avoir différentes machines pour fabriquer différents produits - une pour les saucisses, une autre pour les torchons et une troisième pour les bâtonnets de poisson,..., différentes fonctions effectueront des calculs différents. Chacun aura sa propre valeur pour le distinguer des autres.

Vous utilisez une fonction dans des expressions en tapant son nom suivi de le paramètre, et lorsque l'expression est évaluée, le résultat de la fonction sera élaboré.

Par exemple, il existe une fonction appelée LEN, calculant la longueur d'une chaîne de caractères. Son paramètre est la chaîne de caractères dont vous voulez trouver la longueur, et son résultat est la longueur, de sorte que si vous tapez :

  1. PRINT LEN "Sinclair"

l'ordinateur écrira la réponse 8, le nombre de lettres dans "Sinclair". (Pour obtenir LEN, comme pour la plupart des noms de fonction, vous devez utiliser le mode étendu : appuyez simultanément sur CAPS SHIFT et SYMBOL SHIFT pour faire passer le curseur de L à E, puis appuyez sur la touche K.)

Si vous mélangez des fonctions et des opérations dans une seule expression, les fonctions seront élaborées avant les opérations. Encore une fois, cependant, vous pouvez contourner cette règle en utilisant des crochets. Par exemple, voici deux expressions qui ne diffèrent que par les parenthèses, et pourtant les calculs sont effectués dans un ordre entièrement différent dans chaque cas (bien que, en l'occurrence, les résultats finaux soient les mêmes).

LEN "Fred"+LEN "Robert" LEN ("Fred"+"Robert")
4+LEN "Robert" LEN("FredRobert")
4+6 LEN "FredRobert"
10 1

Voici quelques fonctions supplémentaires.

STR$ convertit les nombres en chaînes de caractères : son paramètre est un nombre et son résultat est la chaîne apparaissant à l'écran si le nombre était affiché par une instruction PRINT. Notez comment son nom se termine par un signe $ pour montrer que son résultat est une chaîne de caractères. Par exemple, vous pourriez dire :

  1. LET a$=STR$ 1e2

ce qui aurait exactement le même effet que de taper :

  1. LET a$="100"

Ou vous pourrez dire :

  1. PRINT LEN STR$ 100.0000

et obtenez la réponse 3, car STR$ 100.0000="100". VAL est comme STR$ à l'envers : il convertit les chaînes de caractères en nombres. Par exemple :

  1. VAL "3.5"=3.5

Dans un sens, VAL est l'inverse de STR$, car si vous prenez un nombre, que vous lui appliquez STR$, puis que vous lui appliquez VAL, vous revenez au nombre auquel vous avez pensé en premier. Cependant, si vous prenez une chaîne de caractères, lui appliquez VAL, puis lui appliquez STR$, vous ne revenez pas toujours à votre chaîne de caractères d'origine.

VAL est une fonction extrêmement puissante, car la chaîne de caractères étant son paramètre n'est pas limitée à ressembler à un nombre simple - il peut s'agir de n'importe quelle expression numérique. Ainsi, par exemple :

  1. VAL "*2*3"=6

ou même :

  1. VAL("2"+"*3")=6

Il y a deux processus à l'oeuvre ici. Dans le premier, le paramètre de VAL est évalué comme une chaîne de caractères : l'expression de chaîne de caractères "2"+"*3" est évaluée pour donner la chaîne de caractères "2*3". Ensuite, la chaîne de caractères a ses guillemets doubles supprimés et ce qui reste est évalué comme un nombre : donc 2*3 est évalué pour donner le nombre 6.

Cela peut devenir assez déroutant si vous ne gardez pas votre esprit sur vous; par exemple :

  1. PRINT VAL "VAL""VAL""""2""""""

N'oubliez pas qu'à l'intérieur d'une chaîne de caractères, un guillemet de chaîne de caractères doit être écrit deux fois. Si vous descendez plus profondément dans les chaînes de caractères, vous constaterez que les guillemets de chaînes de caractères doivent être quadruplés, voire octuplés.)

Il existe une autre fonction, assez similaire à VAL, bien que probablement moins utile, appelé VAL$. Son paramètre est toujours une chaîne de caractères, mais son résultat est également une chaîne de caractères. Pour voir comment cela fonctionne, rappelez-vous comment VAL se déroule en deux étapes : d'abord son paramètre est évalué comme une chaîne de caractères, puis la chaîne de caractères cite cela, et tout ce qui reste est évalué comme un nombre. Avec VAL$, la première étape est la même, mais une fois les guillemets de chaîne de caractères supprimés à la deuxième étape, tout ce qui reste est évalué comme une autre chaîne de caractères. Ainsi :

  1. VAL$ """Punch au fruit""" = "Punch au fruit"

(Remarquez comment les guillemets de chaîne de caractères prolifèrent à nouveau.) Faire :

  1. LET a$="99"     

et affichez tous les éléments suivants : VAL a$, VAL "a$", VAL """a$""", VAL$ a$, VAL$ "a$" et VAL$ """a$""". Certains d'entre eux fonctionneront, et d'autres non; essayez d'expliquer toutes les réponses. (Gardez la tête froide.)

SGN est la fonction de signe (parfois appelée signum). Il est la première fonction que vous avez vue n'ayant rien à voir avec les chaînes de caractères, car son paramètre et son résultat sont des nombres. Le résultat est +1 si le paramètre est positif, 0 si le paramètre est zéro et -1 si le paramètre est négatif.

ABS est une autre fonction dont le paramètre et le résultat sont tous deux des nombres. Il convertit le paramètre en un nombre positif (étant le résultat) en oubliant le signe 30 que par exemple :

  1. ABS -3.2 = ABS 3.2 = 3.2

INT signifie "partie entière" - un entier est un nombre entier, éventuellement négatif. Cette fonction convertit un nombre fractionnaire en entier en jetant la partie fractionnaire, de sorte que par exemple :

  1. INT 3.9 = 3

Soyez prudent lorsque vous l'appliquez à des nombres négatifs, car il arrondit toujours à l'inférieur; ainsi, par exemple :

  1. INT -3.9 = -4

SQR calcule la racine carrée d'un nombre - le résultat qui, multiplié par lui-même, donne le paramètre. Par exemple :

  1. SQR 4 = 2 
Parce que 2*2=4
  1. SQR 0.25 = 0.5
parce que 0.5*0.5=0.25
  1. SQR 2 = 1.4142136
(environ) parce que 1.4142136*1.4142136=2.000000

Si vous multipliez un nombre (même négatif) par lui-même, la réponse est toujours positive. Cela signifie que les nombres négatifs n'ont pas de racines carrées, donc si vous appliquez SQR à un paramètre négatif, vous obtenez un rapport d'erreur An Invalid Argument.

Vous pouvez également définir vos propres fonctions. Les noms possibles pour ceux-ci sont FN suivi d'une lettre (si le résultat est un nombre) ou FN suivi d'une lettre suivie de $ (si le résultat est une chaîne de caractères). Celles-ci sont beaucoup plus strictes concernant les parenthèses : le paramètre doit être mis entre parenthèses.

Vous définissez une fonction en plaçant une instruction DEF quelque part dans le programme. Par exemple, voici la définition d'une fonction FN dont le résultat est le carré du paramètre :

  1. 10 DEF FN s(x)=x*x: REM le carre de x

DEF est obtenu en mode étendu, en utilisant SYMBOL SHIFT et 1. Lorsque vous tapez ceci, l'ordinateur vous donnera automatiquement FN, car dans une instruction DEF, DEF est toujours suivi immédiatement de FN. Après cela, le s complète le nom FN s de la fonction.

Le x entre parenthèses est un nom par lequel vous souhaitez vous référer à l'argument de la fonction. Vous pouvez utiliser n'importe quelle lettre que vous aimez pour cela (ou, si le paramètre est une chaîne de caractères, une seule lettre suivie de $).

Après le signe = vient la définition réelle de la fonction. Cela peut être n'importe quelle expression, et il peut également faire référence au paramètre en utilisant le nom que vous lui avez donné (dans ce cas, x) comme s'il s'agissait d'une variable ordinaire.

Lorsque vous avez saisi cette ligne, vous pouvez invoquer la fonction comme une fonction propre à l'ordinateur, en tapant son nom, FN s, suivi du paramètre. N'oubliez pas que lorsque vous avez défini vous-même une fonction, le paramètre doit être placé entre parenthèses. Essayez-le plusieurs fois :

  1. PRINT FN s(2)
  2. PRINT FN s(3+4)
  3. PRINT 1+INT FN s (LEN "poulet"/2+3)

Une fois que vous avez inséré l'instruction DEF correspondante dans le programme, vous pouvez utiliser vos propres fonctions dans des expressions aussi librement que vous pouvez utiliser celles de l'ordinateur.

Remarque : dans certains dialectes du BASIC, vous devez même mettre le paramètre d'une des fonctions de l'ordinateur entre parenthèses. Ce n'est pas le cas dans ZX Spectrum BASIC.

INT arrondit toujours à l'inférieur. Pour arrondir à l'entier le plus proche, ajoutez d'abord 0,5 - vous pouvez écrire votre propre fonction pour ce faire&bsp;:

  1. 20 DEF FN r(x)=INT(x+0.5): REM donne x arrondi à l'entier le plus proche

Vous obtiendrez alors, par exemple :

  1. FN r(2.9) = 3 
  2. FN r(2.4) = 2
  3. FN r(-2.9) = -3 
  4. FN r(-2.4) = -2

Comparez-les avec les réponses que vous obtenez lorsque vous utilisez INT au lieu de FN r. Tapez et exécutez ce qui suit :

  1. 10 LET x=8: LET y=0: LET a=10
  2. 20 DEF FN p(x,y)=a+x*y
  3. 30 DEF FN q()=a+x*y
  4. 40 PRINT FN p(2,3),FN q()

Il y a beaucoup de points subtils dans ce programme.

Premièrement, une fonction n'est pas limitée à un seul paramètre : elle peut en avoir plusieurs, voire aucun - mais vous devez toujours conserver les crochets.

Deuxièmement, peu importe où vous mettez les instructions DEF dans le programme. Une fois que l'ordinateur a exécuté la ligne 10, il saute simplement les lignes 20 et 30 pour arriver à la ligne 40. Cependant, elles doivent se trouver quelque part dans le programme. Ils ne peuvent pas être dans une commande.

Troisièmement, x et y sont à la fois les noms des variables du programme dans son ensemble et les noms des arguments de la fonction FN p. FN p oublie temporairement les variables appelées x et y, mais comme il n'a pas du paramètre appelé a, il se souvient toujours de la variable a. Ainsi, lorsque FN p(2,3) est évalué, a vaut 10 car c'est la variable, x vaut 2 car c'est le premier paramètre et y vaut 3 car c'est le deuxième paramètre. Le résultat est alors 10+2*3=16. Lorsque FN q() est évalué, d'autre part, il n'y a pas de paramètres, donc a, x et y font toujours référence aux variables et ont respectivement les valeurs 10, 0 et 0. La réponse dans ce cas est 10+0*0=10.

Remplacez maintenant la ligne 20 par :

  1. 20 DEF FN p(x,y)=FN q()

Cette fois, FN p(2.3) aura la valeur 10 car FN q reviendra toujours aux variables x et y plutôt que d'utiliser les paramètres de FN p.

Certains BASIC (pas le ZX Spectrum BASIC) ont des fonctions appelées LEFT$, RIGHT$, MID$ et TL$.

Nom Description
LEFT$(a$,n) Donne la sous-chaîne de caractères de a$ composée des n premiers caractères.
RIGHT$(a$,n) Donne la sous-chaîne de caractères de a$ composée des caractères à partir du nième.
MID$(a$, n1, n2) Donne la sous-chaîne de caractères de a$ composée de n2 caractères commençant au n1ème.
TL$(a$) Donne la sous-chaîne de a$ composée de tous ses caractères sauf le premier.

Vous pouvez écrire des fonctions définies par l'utilisateur pour faire de même; par exemple :

  1. 10 DEF FN t$(a$)=aS(2 TO ): REM TL$
  2. 20 DEF FN l$(a$,n)=a$( TO n): REM LEFT$

Vérifiez que ceux-ci fonctionnent avec des chaînes de caractères de longueur 0 ou 1.

Notez que notre FN l$ a deux paramètres, l'un un nombre et l'autre une chaîne de caractères. Une fonction peut avoir jusqu'à 26 paramètres numériques et en même temps jusqu'à 26 paramètres de chaîne de caractères.



Dernière mise à jour : Mercredi, le 19 avril 2023