exercices/5e/5N10.js

import Exercice from '../Exercice.js'
import { randint, listeQuestionsToContenu, choice, combinaisonListes, texNombre, arrondi } from '../../modules/outils.js'
import FractionX from '../../modules/FractionEtendue.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const titre = "Passer d'une fraction à une écriture décimale et inversement"
export const interactifReady = true
export const interactifType = 'mathLive'

export const dateDePublication = '16/03/2022'
// export const dateDeModifImportante = '16/03/2022'

/**
 * Propose de passer de l'écriture décimale à l'écriture fractionnaire et inversement
 * Un paramètre permet de limiter cela aux fractions décimales ou d'y incorporer des fractions "simples" (multiples de 1/2, 1/4, 1/5)
 * @author Guillaume Valmont
 * Référence 5N10
*/
export const uuid = '91d72'
export const ref = '5N10'
export default function PasserEcritureDecimaleEcritureFractionnaireInversement () {
  Exercice.call(this)
  this.nbQuestions = 10

  this.besoinFormulaireNumerique = ['Sens demandé', 3, '1 : De l\'écriture décimale à une fraction\n2 : D\'une fraction à l\'écriture décimale\n3 : Mélange']
  this.sup = 3
  this.besoinFormulaire2CaseACocher = ['Uniquement des fractions décimales']
  this.sup2 = false

  this.nbCols = 2
  this.nbColsCorr = 2

  this.nouvelleVersion = function (numeroExercice) {
    this.listeQuestions = []
    this.listeCorrections = []
    this.autoCorrection = []

    let typesDesSensDemandes
    if (this.sup === 1) {
      typesDesSensDemandes = ['DecimaleAFractionnaire']
    } else if (this.sup === 2) {
      typesDesSensDemandes = ['FractionnaireADecimale']
    } else {
      typesDesSensDemandes = ['DecimaleAFractionnaire', 'FractionnaireADecimale']
    }
    const listeDesSensDemandes = combinaisonListes(typesDesSensDemandes, this.nbQuestions)

    let typesDeFractionsDisponibles
    if (this.sup2) {
      typesDeFractionsDisponibles = ['fractionsDecimales']
    } else {
      typesDeFractionsDisponibles = ['fractionsDecimales', 'fractionsNonDecimales']
    }
    const listeTypeFractions = combinaisonListes(typesDeFractionsDisponibles, this.nbQuestions)
    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      let numerateur, denominateur
      if (listeTypeFractions[i] === 'fractionsDecimales') {
        numerateur = 0
        while (numerateur % 2 === 0 || numerateur % 5 === 0) {
          numerateur = choice([randint(1, 9), randint(11, 99), randint(101, 999)])
        }
        denominateur = choice([10, 100, 1000])
      } else if (listeTypeFractions[i] === 'fractionsNonDecimales') {
        numerateur = randint(1, 9)
        denominateur = choice([2, 4, 5])
        if (numerateur * denominateur % 4 === 0 || numerateur * denominateur % 25 === 0) {
          numerateur += 1
        }
      }
      // eslint-disable-next-line no-unmodified-loop-condition
      while (numerateur % denominateur === 0 || denominateur % numerateur === 0 || (denominateur === 4 && numerateur % 2 === 0)) {
        numerateur += 1
      }
      const ecritureDecimale = numerateur / denominateur

      if (listeDesSensDemandes[i] === 'DecimaleAFractionnaire') {
        texte = `Écrire $${texNombre(ecritureDecimale, 3)}$ sous la forme d'une fraction.`
        if (this.interactif) {
          texte += '<br>' + ajouteChampTexteMathLive(this, i, 'inline largeur25', { texte: `$${texNombre(ecritureDecimale, 3)} = $` })
        }
        if (listeTypeFractions[i] === 'fractionsNonDecimales') {
          let multiple
          denominateur === 4 ? multiple = 100 : multiple = 10
          texteCorr = `$${texNombre(ecritureDecimale, 3)} = \\cfrac{${ecritureDecimale * multiple}}{${multiple}}$  ou $${texNombre(ecritureDecimale, 3)} = \\cfrac{${numerateur}}{${denominateur}}$`
          setReponse(this, i, [new FractionX(ecritureDecimale * multiple, multiple), new FractionX(numerateur, denominateur)], { formatInteractif: 'fraction' })
        } else {
          texteCorr = `$${texNombre(ecritureDecimale, 3)} = \\cfrac{${numerateur}}{${denominateur}}$`
          setReponse(this, i, new FractionX(numerateur, denominateur), { formatInteractif: 'fraction' })
        }
      } else if (listeDesSensDemandes[i] === 'FractionnaireADecimale') {
        texte = `Donner l'écriture décimale de $\\cfrac{${numerateur}}{${denominateur}}$.`
        if (this.interactif) {
          texte += '<br>' + ajouteChampTexteMathLive(this, i, 'inline largeur25', { texte: `$\\cfrac{${numerateur}}{${denominateur}} = $` })
        }
        texteCorr = `$\\cfrac{${numerateur}}{${denominateur}} = ${texNombre(ecritureDecimale, 3)}$`
        setReponse(this, i, arrondi(ecritureDecimale, 3))
      }

      if (this.questionJamaisPosee(i, numerateur, denominateur, listeTypeFractions[i], listeDesSensDemandes[i])) {
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
}