Edupython / casio graph 35

stejan83 Messages postés 1 Date d'inscription mardi 5 novembre 2024 Statut Membre Dernière intervention 5 novembre 2024 - Modifié le 7 nov. 2024 à 15:52
luckydu43 Messages postés 3886 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 20 novembre 2024 - 8 nov. 2024 à 16:45

Bonjour,

J'ai créé ce petit code qui fonctionne sous edupython sans bug mais dès que je le charge sur ma casio graph 35+ il ne fonctionne pas... rrrr ca m'énerve!

Quelqu'un a une idée?

print("mise sous forme canonique de ax²+bx+c")
a = int(input("choisir la valeur de a = "))
b = int(input("choisir la valeur de b = "))
c = int(input("choisir la valeur de c = "))
alphaa = -b / (2 * a)
deltaa = b ** 2 - (4 * a * c)
betaa = -deltaa / (4 * a)
print("alpha= -b/2a=", alphaa)
print("delta= b²-4ac=", deltaa)
print("beta= -delta/(4a) = ", betaa)
if alphaa < 0 and betaa < 0:
    print("forme canonique: ", a, "(x+", -alphaa, ")²-", -betaa)
if alphaa < 0 and betaa > 0:
    print("forme canonique: ", a, "(x+", -alphaa, ")²+", betaa)
if alphaa > 0 and betaa > 0:
    print("forme canonique: ", a, "(x-", alphaa, ")²+", betaa)
if alphaa > 0 and betaa < 0:
    print("forme canonique: ", a, "(x-", alphaa, ")²-", -betaa)

Modération: merci de mettre en forme les extraits code en utilisant le bouton dédié.

A voir également:

4 réponses

luckydu43 Messages postés 3886 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 20 novembre 2024 966
Modifié le 5 nov. 2024 à 16:58

Bonjour

J'ai utilisé FX-Manager Plus pour émuler la calto sur mon pc.

  • Retire les "²"
    • je ne pense pas que l'émulateur python gère ce caractère. À la pression de cette touche, l'émulateur tape "**2".
    • S'agissant de texte affiché, remplace par des "2" standards.
  • Toujours dans les affichages, évite les ":"
    • remplace par des "="
  • Tu es limité à 21*7 caractères simultanément
    • Il faut ajuster l'affichage.
  • Exploite les float en entrée au lieu des int
    • tu ne rencontreras pas forcément que des valeurs entières
  • Utilise des elif
    • Cela simplifie l'exécution
  • Tu peux factoriser !

Voici une version révisée du code qui fonctionne parfaitement dans l'émulateur :

print("---------------------")
print("   Mise sous forme")
print("canonique de ax2+bx+c")
print("---------------------")
print("")
print("")
a = float(input("Valeur de a = "))
b = float(input("Valeur de b = "))
c = float(input("Valeur de c = "))
alphaa = -b/(2*a)
deltaa = b**2-(4*a*c)
betaa = -deltaa/(4*a)
print("alpha= -b/2a=",alphaa)
print("delta= b2-4ac=",deltaa)
print("beta = -d/(4a)=",betaa)
print("")
print("Forme canonique=")
if alphaa<0 and betaa<0:
  print(a,"(x+",-alphaa,")2-",-betaa)
elif alphaa<0 and betaa>0:
  print(a,"(x+",-alphaa,")2+",betaa)
elif alphaa>0 and betaa >0:
  print(a,"(x-",alphaa,")2+",betaa)
elif alphaa>0 and betaa >0:
  print(a,"(x-",alphaa,")2-",-betaa)

Pour la perf, admire ce qui est faisable en BASIC et tente d'adapter en python :-)

C'est un pack de programmes à charger dans la mémoire secondaire puis à importer dans la mémoire principale. Utilise cet émulateur.

Celui du degré 2 doit s'appeler "M_DEGRE2" ou un truc du genre, je n'ai pas testé aujourd'hui mais je l'ai écrit  il y a 13 ans -__-


0
luckydu43 Messages postés 3886 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 20 novembre 2024 966
Modifié le 5 nov. 2024 à 21:33

Faute de frappe à la dernière condition

if alphaa>0 and betaa <0

Tant que j'y suis, une factorisation supplémentaire :

[...]
print("Forme canonique=")
alphas="+" if alphaa<0 else "-"
betas="-" if betaa<0 else "+"
print(a,"(x",alphas,abs(alphaa),")²",betas,abs(betaa))
0
mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
7 nov. 2024 à 16:32

Bonjour,

Quelques remarques par rapport au programme initial.

  • a, b, et c sont généralement des réels, pas forcément des entiers relatifs.
  • Il n'y a pas vraiment de raison de nommer ta variables alpha en alphaa, alpha marcherait tout aussi bien. Idem pour les autres lettres grecques. 
  • Attention, il manque tous les cas où alpha == 0 et/ou beta == 0.
  • Tu auras sans doute envie de simplifier tes chaînes de caractères si a == 0 ou a == 1, et/ou si alpha == 0, et/ou si beta == 0.

Si tu veux pouvoir traiter tous ces cas, il va falloir construire progressivement la chaîne résultat. Ci-dessous, je me base sur les formules données ici et je nomme

  • s_alpha la partie qui correspond "à (x - alpha) ** 2"
  • s_a la partie qui correspond à "a * (x - alpha) ** 2"
  • s_beta la partie qui correspond à "+ beta"
from math import sqrt

a = float(input("a = "))
b = float(input("b = "))
c = float(input("c = "))
delta = b ** 2 - 4 * a * c
alpha = -b / (2 * a)
beta = -delta / (4 * a)
if delta >= 0:
    x1 = (-b - sqrt(delta)) / (2 * a)
    x2 = (-b + sqrt(delta)) / (2 * a)
    print("Racines réelles:")
    print("x1 =", x1) 
    print("x2 =", x2)
    if a != 0:
        if alpha != 0:
            s_alpha = (
                "(x + %s) ** 2" % (-alpha) if alpha < 0 else
                "(x - %s) ** 2" % alpha if alpha > 0 else
                ""
            )
        else:
            s_alpha = "x ** 2"
        s_a = (
            s_alpha if a == 1 else
            "%s * %s" % (a, s_alpha)
        )
    else:
        s_a = ""

    s_beta = (
        " - %s" % (-beta) if beta < 0 else
        " + %s" % beta if beta > 0 else
        ""
    )
    print("Forme canonique: %s%s" % (s_a, s_beta))
else:
    print("Pas de racine réelle")

Exemple :

a = 1
b = -2
c = 0
Racines réelles:
x1 = 0.0
x2 = 2.0
Forme canonique: (x - 1.0) ** 2 - 1.0

Au cas où, quelques petits point de syntaxe python utilisés dans ce programme que tu ne connais peut-être pas :

  • if ... else ...  en une ligne. Les deux extraits de code ci-dessous sont équivalents :
if condition1:
   x = 1
elif condition2:
   x = 2
else:
   x = 3
x = (
    1 if condition1 else
    2 if condition2 else
    3
)
  • Création d'une chaîne de caractère. Ces trois extraits de codes sont équivalents car on ne manipule que des chaînes :
prenom = "Luke"
nom = "Skywalker"
s = prenom + " " + nom

... le problème, c'est que l'addition se fait selon le type le plus à gauche, donc si prenom est un entier, c'est l'addition entière qui est utilisée... et ça ne marchera pas. Il faut donc recourir à l'une des deux autres syntaxes qui suit, qui marchent à tous les coups. 

prenom = "Luke"
nom = "Skywalker"
s = "%s %s" % (prenom, nom)

Pour le 3e (f-string), je ne sais pas si ça marche sur calculatrice donc c'est plus à titre indicatif 

prenom = "Luke"
nom = "Skywalker"
s = f"{prenom} {nom}"

Bonne chance

0
luckydu43 Messages postés 3886 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 20 novembre 2024 966
Modifié le 7 nov. 2024 à 19:03

Bonjour @mamiemando StatutModérateur,

Bien vu d'avoir pris le temps de lire ce que fait le programme.

J'ai effectué quelques changements mineurs :

  • affichage de la forme canonique même avec un delta négatif
  • cas d'une seule racine
  • réduction du code (espaces et indentations) pour lecture facilitée depuis la calculatrice elle-même (l'éditeur embarqué indente de 2 espaces)
  • merge de mon affichage sur ton code

Par le fait, les ":" sont bien acceptés par Python depuis la calculatrice mais les "²", toujours pas. De même pour les caractères accentués

Voici ce que donne ton code avec mes retouches :

from math import sqrt
print("---------------------")
print("   Mise sous forme")
print("canonique de ax2+bx+c")
print("---------------------\n\n")
a = float(input("Valeur de a = "))
b = float(input("Valeur de b = "))
c = float(input("Valeur de c = "))
if a!=0:
  print("\n\n\n")
  delta = b**2-4*a*c
  alpha = -b/(2*a)
  beta=-delta/(4*a)
  if delta>=0:
    if delta==0:
      x1=-b/2*a
      print("Racine reelle:")
      print("x1 =", x1)
    else:
      x1=(-b-sqrt(delta))/(2*a)
      x2=(-b+sqrt(delta))/(2*a)
      print("Racines reelles:")
      print("x1 =", x1)
      print("x2 =", x2)
  else:
    print("Pas de racine reelle.")
  if a!=0:
    if alpha!=0:
      s_alpha = (
        "(x+%s)**2" % (-alpha) if alpha<0 else
        "(x-%s)**2" % alpha if alpha>0 else
        ""
      )
    else:
      s_alpha="x2"
    s_a=(
      s_alpha if a==1 else
      "%s*%s" % (a, s_alpha)
    )
  else:
    s_a=""
  s_beta = (
    "-%s" % (-beta) if beta<0 else
    "+%s" % beta if beta>0 else
    ""
  )
  print("\nForme canonique:")
  print("%s%s" % (s_a, s_beta))
else:
  print("Pas un trinome.")

Le voici exécuté :


0
mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
Modifié le 8 nov. 2024 à 15:05

Hello,

Tout d'abord, merci pour ta proposition.

Quelques remarques mineures : 

cas d'une seule racine

En fait c'est un cas particulier qui n'en est pas vraiment un sur le plan des maths, voir ici : "Le théorème de d'Alembert-Gauss indique que tout polynôme à coefficients complexes de degré n admet n racines complexes (non nécessairement distinctes)" ). Donc le cas particulier d'un polynôme du second degré, tu peux avoir :

  • discriminant >= 0 : deux racines réelles,
    • discriminant == 0 : une racine réelle double (cas où les deux racines réelles sont égales),
  • discriminant < 0: ou deux racines dont la partie imaginaire est non nulle (voir nombres complexes).

réduction du code (espaces et indentations) pour lecture facilitée depuis la calculatrice elle-même (l'éditeur embarqué indente de 2 espaces)

J'ai quelques réserves. Je pense que dans la mesure du possible, il faut se conformer autant que possible aux conventions de codage PEP8, qui indiquent comment "espacer" le code pour le rendre lisible (et que j'ai suivies dans le code que j'ai proposé). Au sens de l'interpréteur ça n'a pas d'impact de rajouter quelques espaces, car le code est soit précompilé (cf .pyc), soit compilé à l'exécution. L'impact est donc négligeable.

Ceci dit, je comprends que les calculatrices affichent peu de caractères sur chaque ligne, et que les conventions PEP8 peuvent être parfois contre productives (en particulier quand la ligne devient plus longue que ce que permet d'afficher la calculatrice). Néanmoins,  je pense que ça reste un cas de figure assez rare dans le cas présent.

merge de mon affichage sur ton code

Ok

depuis la calculatrice mais les "²", toujours pas. De même pour les caractères accentués

Je ne crois pas avoir mis de "²" mais pour les caractères accentués, oui tu as raison. C'est dommage qu'UTF-8 ne soit pas la norme partout... Je me demande si l'en-tête python stipulant que le fichier source embarque des caractères UTF-8 fonctionne sur calculatrice (voir ici).

# -*- coding: utf-8 -*-

print("carré, réel, trinôme")

Merci pour ta contribution :-)

0
luckydu43 Messages postés 3886 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 20 novembre 2024 966
8 nov. 2024 à 16:45

Bonjour !

Merci pour ton retour.

  • "une racine réelle double (cas où les deux racines réelles sont égales),"

Je suis totalement d'accord mais ce ne sont pas les mathématiques apprises au lycée où dans le cas d'un delta nul, il n'y a qu'une racine valant -b/2a et il sera attendu sur ça.

J'aurais pu lui ajouter l'affichage du delta, il y a une ligne disponible.

  • il faut se conformer autant que possible aux conventions de codage PEP8

Je suis le premier à le faire mais sur un écran d'ordinateur permettant d'afficher les 80 caractères max attendus par ligne, ce n'est pas tant un problème de garder les 4 espaces par tabulation, c'est même nécessaire. Dans le cas présent ça rend lent et encore, l'éditeur embarqué ne fait pas un saut de ligne automatique à l'affichage comme l'éditeur BASIC ce qui aurait rendu illisible. Dans les 2 cas naviguer avec les touches est vite fastidieux, ce même de puis l'émulateur avec un programme de seulement 50 lignes ^^ J'ai importé, j'ai vite corrigé !

  • Je ne crois pas avoir mis de "²" 

Tu n'en as pas mis mais j'ai réessayé en important le programme avec ce caractère, sans succès.

  • C'est dommage qu'UTF-8 ne soit pas la norme partout

Les caractères ne sont pas affichés dans l'éditeur, partant de là ça ne sert à rien d'aller plus loin.

C'est déjà beau qu'une calculatrice graphique permette ceci ! A noter que certains grands fous indépendants avaient créé un éditeur de texte, un compilateur C et un interpréteur C sur ces machines, j'ai donc pu me faire la main sur le C en 21*7 caractères à l'époque. La question était alors "quelles sont les fonctions actuellement implémentées dans les 2 briques" :-D

L'éditeur et interpréteur Python a depuis été fait en indépendant aussi mais loin d'être aussi puissant que celui de Casio.

0