π
<-

Truc : Comment définir qu'une variable est undef

Pour le TI-Basic sur Nspire

Truc : Comment définir qu'une variable est undef

Unread postby marseille » 22 Feb 2013, 17:16

Pour commencer, supposons que je veuille générer la liste des sécantes des angles entre 80 et 100 degrés, par incrément de 5 degrés. Je supposerai ici que la TI Nspire est configurée en radians, ce qu'elle est par défaut.

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.
Last edited by marseille on 22 Feb 2013, 17:52, edited 2 times in total.
User avatar
marseille
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Level up: 32%
 
Posts: 23
Joined: 19 Feb 2013, 13:48
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: autre

Re: Truc : Comment définir qu'une variable est undef

Unread postby Excale » 22 Feb 2013, 17:18

Autre possibilité:
Code: Select all
Define isundef(x)=
Func
string(abs(abs(x)))="abs(undef)"
EndFunc


EDIT: Corrigé avec abs() pour gérer les complexes.
User avatar
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 3.9%
 
Posts: 2955
Images: 3
Joined: 10 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile

Re: Truc : Comment définir qu'une variable est undef

Unread postby marseille » 22 Feb 2013, 17:24

Excale wrote:Autre possibilité:
Code: Select all
Define isundef(x)=
Func
string(abs(x))="undef"
EndFunc


EDIT: Corrigé avec abs() pour gérer les complexes.

Ah oui, effectivement. Ca marche aussi. Je n'avais pas essayé avec undef entre guillemets. Les messages d'erreur sont donc tout bêtement de type chaine de caractères. Bon à savoir.
User avatar
marseille
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Level up: 32%
 
Posts: 23
Joined: 19 Feb 2013, 13:48
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: autre

Re: Truc : Comment définir qu'une variable est undef

Unread postby Excale » 22 Feb 2013, 17:26

marseille wrote:Je n'avais pas essayé avec undef entre guillemets. Les messages d'erreur sont donc tout bêtement de type chaine de caractères. Bon à savoir.


C'est string() qui transforme une expression mathématique en chaine de caractères (undef n'est pas une erreur). :)
User avatar
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 3.9%
 
Posts: 2955
Images: 3
Joined: 10 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile

Re: Truc : Comment définir qu'une variable est undef

Unread postby marseille » 22 Feb 2013, 17:32

M'inspirant de ta réponse, j'ai fait (avec b étant undef)
b="undef", la calculatrice renvoie false
b/="undef", elle renvoie true.

C'est encore plus court. Il n'y a même pas de fonction !

(EDIT : enfin bref, elle renvoie le résultat en logique inversée. Il ne faut pas me demander pourquoi)
User avatar
marseille
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Level up: 32%
 
Posts: 23
Joined: 19 Feb 2013, 13:48
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: autre

Re: Truc : Comment définir qu'une variable est undef

Unread postby Excale » 22 Feb 2013, 17:34

Sauf que si b=2,
b="undef",renvoie false
b/="undef", renvoie true.
Donc ça ne fait plus la différence.

PS: Si tu ne veux pas utiliser de fonction, il suffit de mettre string(abs(x))="undef".
User avatar
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 3.9%
 
Posts: 2955
Images: 3
Joined: 10 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile

Re: Truc : Comment définir qu'une variable est undef

Unread postby marseille » 22 Feb 2013, 17:45

J'ai fait : f:=seq(string(abs(a[i]))="undef",i,1,dim(a))
Ca renvoie : {false,false,false,false,false}

Le troisième false aurait dû être true. Ca ne marche pas.
User avatar
marseille
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Level up: 32%
 
Posts: 23
Joined: 19 Feb 2013, 13:48
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: autre

Re: Truc : Comment définir qu'une variable est undef

Unread postby Excale » 22 Feb 2013, 17:49

Effectivement, la nspire s'y prend comme un pied ( |undef| renvoie |undef| alors que |undef+i*undef| renvoie undef).

En attendant que je trouve mieux, enlève le abs().

EDIT:
Code: Select all
Define isundef(x)=
Func
string(abs(abs(x)))="abs(undef)"
EndFunc


Ça devrait être mieux comme ça.
User avatar
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 3.9%
 
Posts: 2955
Images: 3
Joined: 10 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile

Re: Truc : Comment définir qu'une variable est undef

Unread postby Bisam » 22 Feb 2013, 22:08

Et pourquoi pas simplement :
Code: Select all
Define Libpub isundef(x)=ifFn(x=undef,false,false,true)
User avatar
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 69.6%
 
Posts: 5670
Joined: 11 Mar 2008, 00:00
Location: Lyon
Gender: Male
Calculator(s):
MyCalcs profile

Re: Truc : Comment définir qu'une variable est undef

Unread postby Levak » 22 Feb 2013, 22:09

Delvar a
gettype(a) == "NONE"
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Next

Return to Nspire-Basic

Who is online

Users browsing this forum: ClaudeBot [spider] and 4 guests

-
Search
-
Social TI-Planet
-
Featured topics
Grand Concours 2024-2025 - Programmation Python
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
12345
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
803 utilisateurs:
>773 invités
>24 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)