J'écrirai donc une ligne telle que celle-ci :
- Code: Select all
a:=seq(sec(x°),x,80,100,5)
Ce qui me donnera quand j'exécuterai cette ligne le résultat suivant :
- Code: Select all
{((1)/(sin(((π)/(18))))),((1)/(sin(((π)/(36))))),undef,((−1)/(sin(((π)/(36))))),((−1)/(sin(((π)/(18)))))}
ou, pour ceux qui n'ont pas le CAS :
- Code: Select all
{5.758770,11.473713,undef,−11.473713,−5.758770}
Imaginons maintenant que je veuille créer un programme qui traite les nombres de cette liste d'une façon quelconque, au moyen d'une boucle for. Je vais donc faire incrémenter une variable i entre 1 et 5, et j'obtiendrai le nombre en cours de traitement dans la boucle par a[i]. Le problème, c'est que, planté au beau milieu de cette liste, il y a un magnifique "undef" qui va donner des résultats bizarres quand ma boucle traitera a[3], ce qui est parfaitement normal, puisque la sécante de 90 degrés n'existe pas. Il faut donc que dans ma boucle, j'intercepte le "undef" quand il va se présenter, au moyen d'une instruction if... then, pour afficher un message d'erreur, ou faire un traitement spécial de ce cas, par exemple. L'idéal serait donc de disposer d'une fonction isUndef, mais hélas, Texas Instruments n'a rien implémenté de tel dans la Nspire. Je vous propose donc de la fabriquer. J'ai mis un peu de temps à trouver le code adéquat, et j'ai pensé qu'il valait mieux en faire profiter les autres.
- Code: Select all
Define isundef(x)=isVoid(ifFn(x=x,x,x,_))
Comment ça marche ? La fonction est basée sur le fait que l'égalité x=x échoue pour undef, c'est-à-dire que cette égalité n'est ni vraie, ni fausse, alors qu'elle est toujours vraie pour tout nombre valide. C'est la fonction ifFn qui sert de discriminant. Si x est un nombre, c'est le premier x (soit la variable elle-même) qui est renvoyé par ifFn. Si x est undef, ifFn renvoie _, l'élément "donnée vide". Ce résultat est réinjecté dans isVoid. Si x est un nombre, isVoid renvoie false et si x est _, isVoid renvoie true. Il ne reste plus qu'à envoyer ce booléen dans un test (if isundef(a[i]) then... dans l'exemple) et le tour est joué ! Nota: Le deuxième x de ifFn ne sera jamais renvoyé, il n'est là que pour respecter la syntaxe de la fonction.