exercices/6e/6N33.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, choice, arrondi, simplificationDeFractionAvecEtapes, calcul, texNombrec, miseEnEvidence, texFraction } from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const titre = 'Calculer la fraction d\'un nombre'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCNum'

/**
 * Calculer la fracton d'un nombre divisible par le dénominateur ... ou pas.
 *
 * Par défaut la division du nombre par le dénominateur est inférieure à 11
 * @author Rémi Angot + Jean-Claude Lhote
 * référence 6N33
 */
export const uuid = 'ddb83'
export const ref = '6N33'
export default function FractionDUnNombre () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.nbQuestions = 5
  this.consigne = 'Calculer.'
  context.isHtml ? (this.spacingCorr = 3.5) : (this.spacingCorr = 2)
  context.isHtml ? (this.spacing = 2) : (this.spacing = 2)
  this.sup = true
  this.sup2 = false
  this.nbCols = 2
  this.nbColsCorr = 1

  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    const listeFractions = [
      [1, 2],
      [1, 3],
      [2, 3],
      [1, 4],
      [3, 4],
      [1, 5],
      [2, 5],
      [3, 5],
      [4, 5],
      [1, 6],
      [5, 6],
      [1, 7],
      [2, 7],
      [3, 7],
      [4, 7],
      [5, 7],
      [6, 7],
      [1, 8],
      [3, 8],
      [5, 8],
      [7, 8],
      [1, 9],
      [2, 9],
      [4, 9],
      [5, 9],
      [7, 9],
      [8, 9],
      [1, 10],
      [3, 10],
      [7, 10],
      [9, 10]
    ] // Couples de nombres premiers entre eux

    for (
      let i = 0, a, b, k, n, j, fraction, texte, texteCorr, cpt = 0;
      i < this.nbQuestions && cpt < 50;

    ) {
      fraction = choice(listeFractions)
      a = fraction[0]
      b = fraction[1]
      k = randint(1, 11)
      j = false
      if (this.sup || context.isAmc) n = b * k
      else if (randint(0, 1) === 0) n = b * k
      else n = randint(10, b * 11)
      texte = `$${texFraction(a, b)}\\times${n}=$`
      texteCorr = ''
      if (a === 1) {
        // Si n * 1/b
        if (calcul(n / b - arrondi(n / b, 4)) === 0) {
          texteCorr += `$${texFraction(
            a,
            miseEnEvidence(b)
          )}\\times${n}=${n}\\div${miseEnEvidence(b)}=${texNombrec(
            calcul(n / b)
          )}$`
        } else { // si résultat décimal
          texteCorr += `$${texFraction(a, b)}\\times${n}=${texFraction(
            n,
            b
          )}${simplificationDeFractionAvecEtapes(n, b)}$`
        } // si résultat non décimal
      } else {
        if (calcul(n / b - arrondi(n / b, 4)) === 0) {
          // si n/b décimal calcul (n/b)*a
          texteCorr += `$${texFraction(
            a,
            miseEnEvidence(b)
          )}\\times${n}=(${n}\\div${miseEnEvidence(
            b
          )})\\times${a}=${texNombrec(
            calcul(n / b)
          )}\\times${a}=${texNombrec(calcul((n / b) * a))}$<br>`
        } else {
          if (calcul((n * a) / b - arrondi((n * a) / b, 4)) === 0) {
            // si n/b non décimal, alors on se rabat sur (n*a)/b
            texteCorr += ` $${texFraction(
              a,
              miseEnEvidence(b)
            )}\\times${n}=(${n}\\times${a})\\div${miseEnEvidence(
              b
            )}=${calcul(n * a)}\\div${miseEnEvidence(
              b
            )}=${texNombrec(calcul((n / b) * a))}$<br>`
          } else {
            // si autre méthode et résultat fractionnaire calcul (n*a)/b
            texteCorr += ` $${texFraction(
              a,
              miseEnEvidence(b)
            )}\\times${n}=(${n}\\times${a})\\div${miseEnEvidence(
              b
            )}=${calcul(n * a)}\\div${miseEnEvidence(
              b
            )}=${texFraction(n * a, miseEnEvidence(b))}$<br>`
          }
          j = true
        }
        if (
          calcul((n * a) / b - arrondi((n * a) / b, 4)) === 0 &&
          this.sup2 &&
          !j
        ) {
          // Si autres méthodes et si (a*n)/b décimal calcul (n*a)/b
          texteCorr += ` $${texFraction(
            a,
            miseEnEvidence(b)
          )}\\times${n}=(${n}\\times${a})\\div${miseEnEvidence(
            b
          )}=${calcul(n * a)}\\div${miseEnEvidence(b)}=${texNombrec(
            calcul((n / b) * a)
          )}$<br>`
        } else {
          // si autre méthode et résultat fractionnaire calcul (n*a)/b
          if (this.sup2 && !j) {
            texteCorr += ` $${texFraction(
              a,
              miseEnEvidence(b)
            )}\\times${n}=(${n}\\times${a})\\div${miseEnEvidence(
              b
            )}=${calcul(n * a)}\\div${miseEnEvidence(
              b
            )}=${texFraction(n * a, miseEnEvidence(b))}$<br>`
          }
        }
        // si autre méthode et a/b décimal calcul (a/b)*n
        if ((b === 2 || b === 4 || b === 5 || b === 8 || b === 10) && this.sup2) {
          texteCorr += ` $${texFraction(
            a,
            miseEnEvidence(b)
          )}\\times${n}=(${a}\\div${miseEnEvidence(
            b
          )})\\times${n}=${texNombrec(
            calcul(a / b)
          )}\\times${n}=${texNombrec(calcul((n / b) * a))}$`
        }
      }

      setReponse(this, i, calcul(n * a / b))
      if (n * a % b !== 0 && !context.isAmc) {
        setReponse(this, i, [calcul(n * a / b), texFraction(n * a, b)])
      }
      texte += ajouteChampTexteMathLive(this, i)
      if (context.isAmc) {
        this.autoCorrection[i].enonce = texte
        this.autoCorrection[i].propositions = [{ texte: texteCorr, statut: '' }]
        this.autoCorrection[i].reponse.param.digits = 2
        this.autoCorrection[i].reponse.param.decimals = 0
      }
      if (this.listeQuestions.indexOf(texte) === -1) {
        // Si la question n'a jamais été posée, on en crée une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireCaseACocher = ['Forcer résultat entier', true]
  this.besoinFormulaire2CaseACocher = ['Plusieurs méthodes', false]
}