exercices/6e/6N31-3.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeNombresPremiersStrictJusqua, shuffle2tableaux, choice, listeQuestionsToContenu, randint, troncature, calcul, texNombre, miseEnEvidence, texFraction, combinaisonListes, sp } from '../../modules/outils.js'
import { propositionsQcm } from '../../modules/interactif/questionQcm.js'
import { degCos } from '../../modules/fonctionsMaths.js'

export const amcReady = true
export const amcType = 'qcmMult' // type de question AMC
export const interactifReady = true
export const interactifType = 'qcm'

export const titre = 'Arrondir une valeur'

/**
 * * Encadrer_puis_arrondir_une_valeur
 * * 6N31-3
 * @author Mireille Gain, s'inspirant de 6N31-1 de Sébastien Lozano
 * Ajout Nouvel AMC : Janvier 2022 par EE
 */

export const uuid = 'ab793'
export const ref = '6N31-3'
export default function ArrondirUneValeur () {
  Exercice.call(this) // Héritage de la classe Exercice()

  this.nbQuestions = 3
  this.nbColsCorr = 1
  this.sup = 1
  this.sup2 = 1
  this.spacingCorr = context.isHtml ? 2.5 : 1

  this.nouvelleVersion = function () {
    if (this.version === 3) {
      this.sup = 3
    } else if (this.version === 4) {
      this.sup = 4
    }
    this.sup = parseInt(this.sup)
    this.sup2 = parseInt(this.sup2)
    if (this.sup === 2 && !context.isHtml) {
      this.spacingCorr = 2.5
      this.spacing = 1.5
    }
    this.amcType = this.sup2 === 1 ? 'qcmMono' : 'AMCHybride'
    this.spacing = (this.interactif && this.sup === 2) ? 3 : 1
    this.autoCorrection = []
    if (!context.isAmc && !this.interactif) {
      this.consigne = 'Encadrer '
      this.consigne += this.nbQuestions > 1 ? 'chaque' : 'ce'
      this.consigne += " nombre à l'unité, puis au dixième, puis au centième.<br>Dans chaque cas, mettre ensuite en évidence son arrondi."
    } else {
      this.consigne = "Quels sont les encadrements où la valeur orange est la valeur arrondie du nombre à l'unité, au dixième et au centième ?"
    }

    const tabrep = []; const tabicone = []; const preTabRep = []; let preTabIcone = []
    let espace = ''
    if (context.isHtml) {
      espace = '<br>'
    } else {
      espace = '\\\\'
    }
    this.listeQuestions = []
    this.listeCorrections = []
    let m, c, d, u, di, ci, mi, me, ce, de, n, den, num, nb, rac, angle, v
    const listeTypeDeQuestion = this.sup < 5 ? combinaisonListes([this.sup], this.nbQuestions) : combinaisonListes([1, 2, 3, 4], this.nbQuestions)
    for (let i = 0, texte = '', texteCorr = '', cpt = 0; i < this.nbQuestions && cpt < 50;) {
      this.autoCorrection[i] = {}
      switch (listeTypeDeQuestion[i]) {
        case 1:
          m = randint(0, 9)
          c = randint(0, 9)
          d = randint(0, 9)
          u = randint(2, 9)
          di = randint(1, 9)
          ci = randint(1, 9)
          mi = randint(1, 9, 5)
          me = randint(0, 1)
          ce = randint(0, 1)
          de = randint(0, 1)
          n = me * m * 1000 + ce * c * 100 + de * d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001)
          nb = texNombre(n)
          texte = `$${nb}$`

          break
        case 2:
          den = choice([7, 9, 11, 13])
          num = randint(1, 50, [7, 9, 11, 13, 14, 18, 21, 22, 26, 27, 28, 33, 35, 36, 39, 42, 44, 45, 49])
          n = num / den
          nb = texFraction(num, den)
          di = 10 * (troncature(n - troncature(n, 0), 1))
          ci = 100 * (troncature(n - troncature(n, 1), 2))
          mi = 1000 * (troncature(n - troncature(n, 2), 3))
          texte = ` $${nb}\\quad (\\text{Quand on${sp()}écrit${sp()}sur${sp()}la${sp()}calculatrice${sp()}} ${num}\\div ${den}, \\text{${sp()}elle${sp()}renvoie} : ${texNombre(n)}.$`
          break
        case 3:
          rac = randint(2, 300, [listeNombresPremiersStrictJusqua(300)])
          n = Math.sqrt(rac)
          nb = `\\sqrt{${rac}}`
          di = 10 * (troncature(n - troncature(n, 0), 1))
          ci = 100 * (troncature(n - troncature(n, 1), 2))
          mi = 1000 * (troncature(n - troncature(n, 2), 3))
          texte = ` $${nb}\\quad (\\text{Quand${sp()}on${sp()}écrit${sp()}sur${sp()}la${sp()}calculatrice${sp()}} ${nb}, \\text{${sp()}elle${sp()}renvoie} : ${texNombre(n)}.)$`
          break
        case 4:
          v = randint(11, 99) / 10
          angle = randint(1, 89, 60)
          if (choice([true, false])) {
            n = v * degCos(angle)
            nb = `${texNombre(v)}\\cos(${angle})`
            di = 10 * (troncature(n - troncature(n, 0), 1))
            ci = 100 * (troncature(n - troncature(n, 1), 2))
            mi = 1000 * (troncature(n - troncature(n, 2), 3))
          } else {
            n = v / degCos(angle)
            nb = `\\dfrac{${texNombre(v)}}{\\cos(${angle}\\degree)}`
            di = 10 * (troncature(n - troncature(n, 0), 1))
            ci = 100 * (troncature(n - troncature(n, 1), 2))
            mi = 1000 * (troncature(n - troncature(n, 2), 3))
          }
          texte = `$${nb}\\quad \\text{Quand${sp()}on${sp()}écrit${sp()}sur${sp()}la${sp()}calculatrice${sp()}} ${nb}, \\text{${sp()}elle${sp()}renvoie} : ${texNombre(n)}$.`
          break
      }

      texteCorr = "Encadrement et arrondi à l'unité : "
      if (di < 5) {
        texteCorr += `$\\phantom{1234567}${miseEnEvidence(texNombre(troncature(n, 0)))} < ${nb} < ${texNombre(troncature(n + 1, 0))}$`
        preTabRep[0] = `$${miseEnEvidence(texNombre(troncature(n, 0)))} < ${nb} < ${texNombre(troncature(n + 1, 0))}$`
        preTabRep[1] = `$${texNombre(troncature(n, 0))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 1, 0)))}$`
        preTabIcone = [true, false]
        if (choice([false, true])) {
          shuffle2tableaux(preTabRep, preTabIcone)
        }
        tabrep.push(preTabRep[0], preTabRep[1])
        tabicone.push(preTabIcone[0], preTabIcone[1])
      } else {
        texteCorr += `$\\phantom{1234567}${texNombre(troncature(n, 0))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 1, 0)))}$`
        preTabRep[0] = `$${texNombre(troncature(n, 0))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 1, 0)))}$`
        preTabRep[1] = `$${miseEnEvidence(texNombre(troncature(n, 0)))} < ${nb} < ${texNombre(troncature(n + 1, 0))}$`
        preTabIcone = [true, false]
        if (choice([false, true])) {
          shuffle2tableaux(preTabRep, preTabIcone)
        }
        tabrep.push(preTabRep[0], preTabRep[1])
        tabicone.push(preTabIcone[0], preTabIcone[1])
      }

      texteCorr += '<br>Encadrement et arrondi au dixième : '
      if (ci < 5) {
        texteCorr += `$\\phantom{123}${miseEnEvidence(texNombre(troncature(n, 1)))} < ${nb} < ${texNombre(troncature(n + 0.1, 1))}$`
        preTabRep[0] = `$${miseEnEvidence(texNombre(troncature(n, 1)))} < ${nb} < ${texNombre(troncature(n + 0.1, 1))}$`
        preTabRep[1] = `$${texNombre(troncature(n, 1))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 0.1, 1)))}$`
        preTabIcone = [true, false]
        if (choice([false, true])) {
          shuffle2tableaux(preTabRep, preTabIcone)
        }
        tabrep.push(preTabRep[0], preTabRep[1])
        tabicone.push(preTabIcone[0], preTabIcone[1])
      } else {
        texteCorr += `$\\phantom{123}${texNombre(troncature(n, 1))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 0.1, 1)))}$`
        preTabRep[0] = `$${texNombre(troncature(n, 1))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 0.1, 1)))}$`
        preTabRep[1] = `$${miseEnEvidence(texNombre(troncature(n, 1)))} < ${nb} < ${texNombre(troncature(n + 0.1, 1))}$`
        preTabIcone = [true, false]
        if (choice([false, true])) {
          shuffle2tableaux(preTabRep, preTabIcone)
        }
        tabrep.push(preTabRep[0], preTabRep[1])
        tabicone.push(preTabIcone[0], preTabIcone[1])
      }

      texteCorr += `<br>Encadrement et arrondi au centième : ${sp()}`
      if (mi < 5) {
        texteCorr += `$${miseEnEvidence(texNombre(troncature(n, 2)))} < ${nb} < ${texNombre(troncature(n + 0.01, 2))}$`
        preTabRep[0] = `$${miseEnEvidence(texNombre(troncature(n, 2)))} < ${nb} < ${texNombre(troncature(n + 0.01, 2))}$`
        preTabRep[1] = `$${texNombre(troncature(n, 2))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 0.01, 2)))}$`
        preTabIcone = [true, false]
        if (choice([false, true])) {
          shuffle2tableaux(preTabRep, preTabIcone)
        }
        tabrep.push(preTabRep[0], preTabRep[1])
        tabicone.push(preTabIcone[0], preTabIcone[1])
      } else {
        texteCorr += `$${texNombre(troncature(n, 2))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 0.01, 2)))}$`
        preTabRep[0] = `$${texNombre(troncature(n, 2))} < ${nb} < ${miseEnEvidence(texNombre(troncature(n + 0.01, 2)))}$`
        preTabRep[1] = `$${miseEnEvidence(texNombre(troncature(n, 2)))} < ${nb} < ${texNombre(troncature(n + 0.01, 2))}$`
        preTabIcone = [true, false]
        if (choice([false, true])) {
          shuffle2tableaux(preTabRep, preTabIcone)
        }
        tabrep.push(preTabRep[0], preTabRep[1])
        tabicone.push(preTabIcone[0], preTabIcone[1])
      }
      if (!context.isAmc || ((context.isAmc) && this.sup2 === 1)) {
        this.autoCorrection[i].enonce = `Quels sont les encadrements où la valeur orange est l'arrondi de ${texte} ?\\\\ \n Réponses possibles`
        this.autoCorrection[i].options = { vertical: true, ordered: true }
        this.autoCorrection[i].propositions = [
          {
            texte: tabrep[0],
            statut: tabicone[0],
            feedback: ''
          },
          {
            texte: tabrep[1],
            statut: tabicone[1],
            feedback: ''
          },
          {
            texte: tabrep[2],
            statut: tabicone[2],
            feedback: ''
          },
          {
            texte: tabrep[3],
            statut: tabicone[3],
            feedback: ''
          },
          {
            texte: tabrep[4],
            statut: tabicone[4],
            feedback: ''
          },
          {
            texte: tabrep[5],
            statut: tabicone[5],
            feedback: ''
          }
        ]
      }
      if (this.modeQcm && !context.isAmc) {
        texte += '<br><br>Réponses possibles : <br>  '
        texteCorr = ''
        // shuffle2tableaux(tabrep, tabicone);
        for (let i = 0; i < 6; i++) {
          texte += `$\\square\\;$ ${tabrep[i]}` + espace
          if (tabicone[i] === 1) {
            texteCorr += `$\\blacksquare\\;$ ${tabrep[i]}` + espace
          } else {
            texteCorr += `$\\square\\;$ ${tabrep[i]}` + espace
          }
        }
      }
      if ((context.isAmc) && this.sup2 !== 1) {
        this.autoCorrection[i] = {
          enonce: 'On s en moque !',
          enonceAvant: false,
          propositions: [
            {
              type: 'AMCOpen',
              propositions: [{ enonce: 'Encadrer ' + texte + " à l'unité et entourer son arrondi à l'unité.", statut: 1 }]
            },
            {
              type: 'AMCOpen',
              propositions: [{ enonce: 'Encadrer ' + texte + ' au dixième et entourer son arrondi au dixième.', statut: 1 }]
            },
            {
              type: 'AMCOpen',
              propositions: [{ enonce: 'Encadrer ' + texte + ' au centième et entourer son arrondi au centième.', statut: 1 }]
            }
          ]
        }
      }
      if (this.listeQuestions.indexOf(texte) === -1) {
        // Si la question n'a jamais été posée, on en créé une autre
        if (this.interactif) {
          texte += propositionsQcm(this, i).texte
        }
        this.listeQuestions.push(texte) // Sinon on enregistre la question dans listeQuestions
        this.listeCorrections.push(texteCorr) // On fait pareil pour la correction
        tabrep.length = 0
        tabicone.length = 0
        i++ // On passe à la question suivante
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Type de nombres', 2, ' 1 : Nombres décimaux\n 2 : Fractions']
  if (context.isAmc) {
    this.besoinFormulaire2Numerique = ['Choix de sortie AMC', 2, ' 1 : QCM\n 2 : Questions ouvertes']
  }
}