π
<-
Chat plein-écran
[^]

Script qui refuse de s’exécuter sur la Numworks N0100 (bis)

Online

Script qui refuse de s’exécuter sur la Numworks N0100 (bis)

Unread postby cent20 » 13 Oct 2019, 15:25

Bonjour,

Cette fois ci mon script est tout petit, à peine 800 octets et mon problème n'est donc pas un problème de mémoire.

Le script est ici : https://workshop.numworks.com/python/cent20/longueurcourbe et par sécurité je le colle ci-dessous, juste au cas où je renomme un jour celui du workshop ce qui brise le lien ...

Code: Select all
from math import sqrt


def fonc():
    global f
    print("Saisir une fonction :")
    f = str(input("f(x) = "))


def interval():
    global a, b
    print("Saisir un intervalle [a,b] :")
    a = float(input("a = "))
    b = float(input("b = "))


def coupe():
    global n
    print("Combien de segment :")
    n = int(input("n = "))


def long():
    fonc()
    interval()
    coupe()
    lc, p = 0, (b-a)/n
    for i in range(n):
        x1, x2 = a + i*p, a + (i+1)*p
        x = x1
        y1 = eval(f)
        x = x2
        y2 = eval(f)
        d = sqrt((x1-x2)**2+(y1-y2)**2)
        lc = lcn + d
    print("La longueur de la courbe de f")
    print("définie par f(x) =",f)
    print("sur [{},{}]".format(a, b))
    print("est :",lc)


Il tourne sans problème sur Spyder, sur Thonny mais sur la numworks rien à faire elle ne veut pas le faire tourner...

Bon je vais me rabattre sur celui de sesamath (ci-dessous), mais c'est fatiguant ces implémentations non standard !

Code: Select all
from math import sqrt
def f(x):
    return x**2 #Modifier la fonction ici
def distance(x1,y1,x2,y2):
    return sqrt((x1-x2)**2 + (y1-y2)**2)
def longueurCourbe(f,a,b,n):
    longueur = 0
    x1,y1 = a,f(a)
    h = (b-a)/n
    for i in range(n):
        x2 = x1 + h
        y2 = f(x2)
        longueur = longueur + distance(x1,y1,x2,y2)
        x1,y1 = x2,y2
    return longueur
Last edited by cent20 on 13 Oct 2019, 15:35, edited 3 times in total.
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 51.4%
 
Posts: 96
Images: 6
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby cent20 » 13 Oct 2019, 15:29

spyderOK.JPG


thonnyOK.JPG
thonnyOK.JPG (30.49 KiB) Viewed 225 times


numworksKO.JPG
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 51.4%
 
Posts: 96
Images: 6
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby critor » 13 Oct 2019, 18:22

Bonjour.

Apparemment la fonction eval() évalue dans l'environnement global, et non pas dans l'environnement local associé à l'exécution de la fonction long().
La variable x étant définie dans la fonction long(), elle n'existe pas dans l'environnement global, d'où l'erreur.

Pour contourner ce problème, il te suffit de rajouter une simple ligne au début de la fonction long() :
Code: Select all
def long():
  global x
  ...

Et ça marche : :)
Image
Image
User avatar
critorAdmin.
Niveau 18: DC (Deus ex Calculatorum)
Niveau 18: DC (Deus ex Calculatorum)
Level up: 98.1%
 
Posts: 33688
Images: 8790
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby critor » 13 Oct 2019, 18:30

Comme compléments, eval() utilise apparemment :
  • l'environnement global dans ma ligne de commande
  • l'environnement local sur NumWorks
  • l'environnement local sur Casio Graph 90/35+E II
  • l'environnement local sur TI-83 Premium CE
C'est sûrement une des différences entre le Python complet et les implémentations légères MicroPython/CircuitPython.

Merci à toi, tu me fais apprendre des choses, j'ignorais cette différence-ci. :)
Image
User avatar
critorAdmin.
Niveau 18: DC (Deus ex Calculatorum)
Niveau 18: DC (Deus ex Calculatorum)
Level up: 98.1%
 
Posts: 33688
Images: 8790
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby cent20 » 13 Oct 2019, 19:29

Merci beaucoup pour ces explications très claires. J’avais oublié que c’était micro python et pas Python. En plus je pense que ça va résoudre mon problème d’origine car le script proposé ici était une version dégradée d’un autre script...
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 51.4%
 
Posts: 96
Images: 6
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Online

Script qui refuse de s’exécuter sur la Numworks N0100 (bis)

Unread postby cent20 » 13 Oct 2019, 20:57

Mon problème d'origine persiste, il n'était pas l'objet du post d'origine...

Code: Select all
def fonction(f,a):
    global x
    x = a
    return eval(f)


L'utilisateur saisie alors f(x**2,3) dans la console et il doit obtenir en retour 9 mais cela plante car

Code: Select all
NameError: name 'x' is not defined


J'ai essayé de bricolé, sans succès :

Code: Select all
def fon(str(f), a):
    global x
    x = a
    return eval(f)


ne marche bien sur pas, tout comme les tentative pour rajouter une déclaration de type

Code: Select all
def fonction(fonc,a):
    global x
    x = a
    f = str(fonc)
    return eval(f)


N'y a t'il vraiment aucun moyen de faire saisir l'utilisateur la "fonction mathématiques" directement dans les paramètres de la "fonction python" sans passer par une saisie manuelle préalable ?

Code: Select all
    print("Saisir une fonction :")
    f = str(input("f(x) = "))


J'aurais voulu faire ceci :

Code: Select all
def long(fonction, a=1, b=2, n=2):


directement, récupérer une chaîne de caractère dans fonction et l'évaluer en f° d'un x défini à l'aide de a,b et n

Alors oui, on peut toujours faire

long("x**2",1, 2, 10) mais se souvenir qu'il faut saisir des " " est peu probable ..

Bon sinon merci pour le "global", il n'y a plus qu'à tester ça demain.
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 51.4%
 
Posts: 96
Images: 6
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby critor » 13 Oct 2019, 21:19

Lors d'un appel de fonction, les paramètres sont d'abord évalués avant même l'exécution de sa première ligne de code, d'où l'erreur.

Si l'on souhaite passer une expression à la fonction, il faut donc la mettre entre "..." pour en bloquer l'évaluation.
Ou sinon il faut passer par un input(...).
Image
User avatar
critorAdmin.
Niveau 18: DC (Deus ex Calculatorum)
Niveau 18: DC (Deus ex Calculatorum)
Level up: 98.1%
 
Posts: 33688
Images: 8790
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby cent20 » 14 Oct 2019, 16:07

Mon script marche est il est terminé.

longueurcourbe.JPG


Sur numworks : https://workshop.numworks.com/python/cent20/longueurcourbe

Ici en copié collé codé au format PEP8 :

Code: Select all
from math import sqrt


def fonc():
    global f
    print("Saisir une fonction :")
    f = str(input("f(x) = "))


def interval():
    global a, b
    print("Saisir un intervalle [a,b] :")
    a = float(input("a = "))
    b = float(input("b = "))


def coupe():
    global n
    print("Combien de segment :")
    n = int(input("n = "))


def long(h=""):
    global x
    if (h == 15) or (h == 112):
        print('long() calcule la longueur')
        print("de la courbe de la f° f")
        print("sur l'intervalle [a,b]")
        print("en la découpant en n segments")
    else:
        fonc()
        interval()
        coupe()
        lc, p = 0, (b-a)/n
        for i in range(n):
            x1, x2 = a + i*p, a + (i+1)*p
            x = x1
            y1 = eval(f)
            x = x2
            y2 = eval(f)
            d = sqrt((x1-x2)**2+(y1-y2)**2)
            lc = lc + d
        print("La longueur de la courbe de f")
        print("définie par f(x) =",f)
        print("sur [{},{}]".format(a, b))
        print("est :",lc)


Il calcule la longueur d'une courbe en la découpant en n segment.
Last edited by cent20 on 14 Oct 2019, 16:21, edited 1 time in total.
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 51.4%
 
Posts: 96
Images: 6
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby cent20 » 14 Oct 2019, 16:10

Mon code n'est pas reconnu en python, c'est quoi cette diablerie ? Il y a des agents lexibook infiltrés ici ou quoi ?

Ohhh il vient de changer de couleur ...
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 51.4%
 
Posts: 96
Images: 6
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100 (b

Unread postby coco33920 » 14 Oct 2019, 18:08

Pourquoi passer par des eval() et ne pas utiliser les lambda ?.
Par exemple passer un argument f dans ta fonction qui est juste lambda x: x**2 et comme ça tu fais f(1), f(2) etc. ?
I think I can safely say that nobody understands quantum mechanics

La nature de la physique ( The Character of Physical Law ) (1967), Richard Feynman


Github : https://github.com/coco33920/
User avatar
coco33920Premium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Level up: 56.7%
 
Posts: 41
Joined: 14 Oct 2017, 18:09
Location: Sol III, Sector 001, UFP
Gender: Female
Calculator(s):
Class: Terminale S SII
Twitter: coco33920_r
Facebook: coco33920
GitHub: coco33920

Next

Return to Programmation Python

Who is online

Users browsing this forum: No registered users and 1 guest

-
Search
-
Featured topics
Concours TI-Planet-Casio de rentrée 2019. 3 défis pour plus d'une 15aine de calculatrices graphiques et nombre de goodies sortant de l'ordinaire ! :D
Comparaisons des meilleurs prix pour acheter sa calculatrice !
12
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...

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 
-
Stats.
702 utilisateurs:
>644 invités
>53 membres
>5 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)