Mathsteps Cahier des charges - mathalea/mathalea GitHub Wiki

Présentation de la résolution

  • Remplacer les formes à l'infinitif ? soustraire -> soustraction Rem Loïc : En fait cela dépend où l'on met la phrase (L'action (verbe à l'infinitif) devrait être réservée au point de départ) tandis que soustraction devrait être réservé au résultat de l'action. C'est beaucoup plus visible quand on met des opérateurs fléchés.

Fred : Faut-il garder la présentation en deux colonnes ? La sortie Html doit-elle être identique à la sortie LaTex ?

  • Version Latex : Présentation en lignes plutôt qu'en colonnes ?
  • Version Html avec des folders comme ici ?
  • Internationaliser ?
  • La fonction resoudre() doit-elle proposer plus d'outils de mise en forme ?

Rem Loïc : Il faudrait faire une classe avec différentes méthodes parmi lesquelles il y aurait des méthodes spécialisées dans les calculs et d'autres dans la mise en forme.

Fred : Actuellement c'est la fonction solveEquation() de Mathsteps qui nous fournit un tableau dont chaque ligne est une étape de la résolution décrit sous la forme d'un objet equation (qui peut être une inéquation) :

  • equation.leftNode, (objet Mathjs)
  • equation.rightNode, (objet Mathjs)
  • equation.comparator (=,>,<,>=,<=)
  • equation.changeType (par exemple, valeur possible : DISTRIBUTE pour indiquer qu'une distribution est effectuée.

La fonction resoudre() ne faisait au départ qu'une mise en forme à l'aide de la fonction toTex() qui permet d'obtenir une écriture mathématique plus proches de nos habitudes (voir ici pour le rendu d'orgine).

Le code

Faut-il poursuivre le développement avec une fonction ou bien passer à un objet equation ? Rem Loïc : Voir à plusieurs objets. Par exemple, Equation (convention : Majuscule car classe), Expression ainsi une Equation aurait un membre de gauche qui serait une instance de Expression. Idem avec membre de droite. Je verrais bien un type 'égalité', 'inégalité' pour Equation.

Deux chantiers :

  • transformer une équation : une tentative a été faite dans Mathsteps pour utiliser l'identité (a+b)^2=(a+b)(a+b) et pour utiliser l'identité (a/b)^2= a^2/b^2 et une autre dans la fonction resoudre() pour transformer a/x=b/c en ac=bx.
  • la mise en forme des étapes de la résolution d'une équation : c'est ce que fait resoudre() principalement. On peut imaginer des méthodes sur l'objet resoudre() plutôt que des paramètres (voir plus ci-dessous les propositions).

Une classe Equation

equation = new Equation('égalité', '3*x+7', '6*x-8') ou bien new Equation('3*x+7', 'égalité', '6*x-8') ou bien on reprend ton idée mais on traite la string avec une expression régulière pour déterminer le type de l'équation. Par exemple, si l'utilisateur entre new Equation('3*x+7<6*x-8') nous on s'arrange pour obtenir le type et les membres.

class Expression{
  constructor(expression: string){
    this.ecriture = expression
    ...
  }
  factoriserPar(expression: Expression){
    // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
    ...
    const produit = new Expresion(...)
    return produit
  }
    developper(){
    // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
    ...
    const developpement = new Expresion(...)
    return developpement 
  }
    simplifierPar(expression: Expression){
    // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
    ...
    const resultat = new Expresion(...)
    return resultat
  }
    reduire(){
    // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
    ...
    const resultat = new Expresion(...)
    return resultat
  }
    ordonner(type: string){ // croissant, décroissant
    // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
    ...
    const resultat = new Expresion(...)
    return resultat
  }
  somme(expression: Expression){
    // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
    ...
    const somme = new Expresion(...)
    return somme
  }
  multiplication(expression: Expression){
    // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
    ...
    const produit = new Expresion(...)
    return produit
  }
  
  ...
}
class Equation {
  constructor(equation: string){
    // traitement de equation
    ...
    this.membreGauche = new Expression('3*x+7')
    this.membreDroit = new Expression('6*x-8')
    this.type = '<'
  }
    méthode1(){}
  // Utilisation d'une bibliothèque déjà existante mais de façon **fortement découplée** pour pourvoir en changer le cas échéant
  ...
}
// Utilisation
const monEquation = new Equation( '3x^2-4x = 2x+3' )
const gauche = monEquation.membreGauche
const droit = monEquation.membreDroit
gauche.factoriserPar('x').somme('-2x')
droit.developper().simplifier()
monEquation.operateur('*',2).simplifier()

Une classe Resolution

resolution = new Resolution('3*x+7=6*x-8')
resolution.colorChange = blue // couleur des changements
resolution.display = 'colonnes' //
resolution.substeps = true | false
resolution.distribute = true | false
resolution.comment = true | false
resolution.reduceSteps = true | false
console.log(resolution.steps) // donne les étapes de la résolution retournées par Mathsteps (objets mathjs)
console.log(resolution.toTex()) // renvoie une mise en forme selon les paramètres définis