exercices/4e/4C10-7.js

import Exercice from '../Exercice.js'
import { listeQuestionsToContenu, randint, combinaisonListes, calcul, ecritureParentheseSiNegatif, contraindreValeur, range1, ecritureNombreRelatif, ecritureAlgebrique, nombreDeChiffresDansLaPartieEntiere, ecritureNombreRelatifc } from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const titre = 'Opérations avec deux entiers relatifs'
export const interactifReady = true
export const interactifType = 'mathLive'

/**
* Effectuer des opérations avec 2 nombres relatifs
*
* * On peut choisir les 4 opérations
* @author Mickael Guironnet - Rémi Angot
* 4C10-7
*/
export const uuid = '0b020'
export const ref = '4C10-7'
export default function ExerciceOperationsRelatifs () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.sup = false // écriture simplifiée
  this.sup2 = 2 // type d'opértions
  this.sup3 = 10 // Valeur maximum
  this.interactifReady = interactifReady
  this.interactifType = interactifType
  this.titre = titre
  this.consigne = 'Calculer.'
  this.spacing = 2
  this.nbQuestions = 10

  this.nouvelleVersion = function () {
    this.sup3 = parseInt(this.sup3)
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    const listeTypeDeSignes = combinaisonListes(['-+', '+-', '--', '-+', '+-', '--', '++'], this.nbQuestions)

    let typesDeQuestionsDisponibles = []
    if (!this.sup2 || parseInt(this.sup2) === 5) { // Si aucune liste n'est saisie ou mélange demandé
      typesDeQuestionsDisponibles = range1(4)
    } else {
      if (typeof (this.sup2) === 'number') { // Si c'est un nombre c'est que le nombre a été saisi dans la barre d'adresses
        typesDeQuestionsDisponibles[0] = contraindreValeur(1, 4, this.sup2, 2)
      } else {
        typesDeQuestionsDisponibles = this.sup2.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
        for (let i = 0; i < typesDeQuestionsDisponibles.length; i++) { // on a un tableau avec des strings : ['1', '1', '2']
          typesDeQuestionsDisponibles[i] = contraindreValeur(1, 4, parseInt(typesDeQuestionsDisponibles[i]), 2) // parseInt en fait un tableau d'entiers
        }
      }
    }

    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    for (let i = 0, a, b, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) { // On limite le nombre d'essais pour chercher des valeurs nouvelles
      switch (listeTypeDeQuestions[i]) {
        case 2:
          b = randint(2, 9)
          a = b * randint(2, this.sup3)
          break
        case 1:
        case 3:
        case 4:
          b = randint(2, this.sup3)
          a = randint(2, this.sup3)
          break
      }
      switch (listeTypeDeSignes[i]) {
        case '-+':
          a *= -1
          break
        case '+-':
          b *= -1
          break
        case '--':
          a *= -1
          b *= -1
          break
      }
      switch (listeTypeDeQuestions[i]) {
        case 1: // multiplications
          if (this.sup) {
            texte = `$ ${a}  \\times ${ecritureParentheseSiNegatif(b)} =$`
            texteCorr = `$ ${a}  \\times ${ecritureParentheseSiNegatif(b)} = ${calcul(a * b)} $`
          } else {
            texte = `$ ${ecritureNombreRelatif(a)}  \\times ${ecritureNombreRelatif(b)} =$`
            texteCorr = `$ ${ecritureNombreRelatifc(a)} \\times ${ecritureNombreRelatifc(b)}  = ${ecritureNombreRelatifc(a * b)} $`
          }
          setReponse(this, i, a * b)
          texte += ajouteChampTexteMathLive(this, i)
          break
        case 2: // quotients
          if (this.sup) {
            texte = `$ ${a} \\div ${ecritureParentheseSiNegatif(b)} =$`
            texteCorr = `$ ${a} \\div ${ecritureParentheseSiNegatif(b)} = ${calcul(a / b)}$`
          } else {
            texte = `$ ${ecritureNombreRelatif(a)}  \\div ${ecritureNombreRelatif(b)} =$`
            texteCorr = `$ ${ecritureNombreRelatifc(a)}  \\div ${ecritureNombreRelatifc(b)} =${ecritureNombreRelatifc(a / b)}$`
          }
          setReponse(this, i, calcul(a / b))
          texte += ajouteChampTexteMathLive(this, i)
          break
        case 3: // additions
          if (this.sup) {
            texte = `$ ${a} + ${ecritureParentheseSiNegatif(b)}  =$`
            texteCorr = `$ ${a} + ${ecritureParentheseSiNegatif(b)}  = ${ecritureNombreRelatif(a + b)} $`
          } else {
            texte = `$ ${ecritureNombreRelatif(a)} + ${ecritureNombreRelatif(b)}  =$`
            texteCorr = `$  ${ecritureNombreRelatifc(a)} + ${ecritureNombreRelatifc(b)} = ${ecritureNombreRelatifc(a + b)} $`
          }
          setReponse(this, i, a + b)
          texte += ajouteChampTexteMathLive(this, i)
          break
        case 4: // soustractions
          if (this.sup) {
            texte = `$ ${a} - ${ecritureNombreRelatif(b)} =$`
            texteCorr = `$ ${a} - ${ecritureNombreRelatif(b)} = ${a - b} $`
          } else {
            texte = `$ ${ecritureNombreRelatif(a)} - ${ecritureNombreRelatif(b)}  =$`
            texteCorr = `$  ${ecritureNombreRelatifc(a)} - ${ecritureNombreRelatifc(b)} = ${ecritureNombreRelatifc(a - b)} $`
          }
          setReponse(this, i, [a - b, `(${ecritureAlgebrique(a - b)})`], { signe: true, digits: Math.max(2, nombreDeChiffresDansLaPartieEntiere(a - b)), decimals: 0 })
          texte += ajouteChampTexteMathLive(this, i)
          break
      }

      if (this.listeQuestions.indexOf(texte) === -1) { // Si la question n'a jamais été posée, on en créé une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireCaseACocher = ['Avec des écritures simplifiées']
  this.besoinFormulaire2Texte = [
    'Type de question', [
      '1 : multiplication',
      '2 : division',
      '3 : addition',
      '4 : soustraction',
      '5 : Mélange'
    ].join('\n')
  ]
  this.besoinFormulaire3Numerique = ['Valeur maximale', 99999]
}