exercices/6e/6N11-3.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, choice, shuffle, combinaisonListesSansChangerOrdre, texNombre, miseEnEvidence } from '../../modules/outils.js'
export const titre = 'Encadrer un entier'

/**
* * Encadrer un nombre entier par deux entier consécutifs
* * 6N11-3
* @author Sébastien Lozano
*/

export const uuid = '29b40'
export const ref = '6N11-3'
export default function EncadrerUnEntierParDeuxEntiersConsecutifs () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.beta = false
  this.sup = 1
  if (this.beta) {
    this.nbQuestions = 6
  } else {
    this.nbQuestions = 3
  };

  this.consigne = ''

  this.nbCols = 1
  this.nbColsCorr = 1
  // this.nbQuestionsModifiable = false;
  context.isHtml ? this.spacing = 3 : this.spacing = 2
  context.isHtml ? this.spacingCorr = 2.5 : this.spacingCorr = 1.5

  let typesDeQuestionsDisponibles

  this.nouvelleVersion = function () {
    if (this.beta) {
      typesDeQuestionsDisponibles = [0, 1, 2, 3, 4, 5]
    } else {
      typesDeQuestionsDisponibles = shuffle([choice([0, 1]), choice([2, 3]), choice([4, 5])])
    };

    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []

    // let listeTypeDeQuestions  = combinaisonListes(typesDeQuestionsDisponibles,this.nbQuestions) // Tous les types de questions sont posées mais l'ordre diffère à chaque "cycle"
    const listeTypeDeQuestions = combinaisonListesSansChangerOrdre(typesDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posées --> à remettre comme ci dessus

    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      // pour la précision d'encadrement
      let precision

      // selon la precision on veut certains chiffres plus souvant que d'autres ...
      function myNombres (nbChiffres) {
        let sortie = ''
        // on fabrique le nombre à partir de ses chiffres et on veut des cas limites
        let mu, md, mc, mmu, mmd, mmc
        const N = choice([[randint(0, 9, [0]), 0, 0, 0, 0, 0, 0, 0, 0], [randint(0, 9, [0]), 9, 9, 9, 9, 9, 9, 9, 9], [randint(0, 9, [0]), randint(0, 9), randint(0, 9), randint(0, 9), randint(0, 9), randint(0, 9), randint(0, 9), randint(0, 9), randint(0, 9)]])
        mmc = N[0]
        mmd = N[1]
        mmu = N[2]
        mc = N[3]
        md = N[4]
        mu = N[5]
        const c = N[6]
        const d = N[7]
        const u = N[8]
        switch (nbChiffres) {
          case 4:
            mu = randint(0, 9, [0])
            sortie = mu.toString() + c.toString() + d.toString() + u.toString()
            break
          case 5:
            md = randint(0, 9, [0])
            sortie = md.toString() + mu.toString() + c.toString() + d.toString() + u.toString()
            break
          case 6:
            mc = randint(0, 9, [0])
            sortie = mc.toString() + md.toString() + mu.toString() + c.toString() + d.toString() + u.toString()
            break
          case 7:
            mmu = randint(0, 9, [0])
            sortie = mmu.toString() + mc.toString() + md.toString() + mu.toString() + c.toString() + d.toString() + u.toString()
            break
          case 8:
            mmd = randint(0, 9, [0])
            sortie = mmd.toString() + mmu.toString() + mc.toString() + md.toString() + mu.toString() + c.toString() + d.toString() + u.toString()
            break
          case 9:
            mmc = randint(0, 9, [0])
            sortie = mmc.toString() + mmd.toString() + mmu.toString() + mc.toString() + md.toString() + mu.toString() + c.toString() + d.toString() + u.toString()
            break
        };
        return sortie
      };

      this.sup = Number(this.sup) // attention le formulaire renvoie un string, on a besoin d'un number pour le switch !
      switch (this.sup) {
        case 1:
          this.consigne = 'Compléter avec le nombre entier qui précède et le nombre entier qui suit.'
          precision = 1
          break
        case 2:
          this.consigne = 'Compléter avec le multiple de 10 qui précède et le multiple de 10 qui suit.'
          precision = 10
          break
        case 3:
          this.consigne = 'Compléter avec le multiple de 100 qui précède et le multiple de 100 qui suit.'
          precision = 100
          break
      };

      // pour les situations, autant de situations que de cas dans le switch !
      const situations = [
        { // case 0 -->
          nombre: Number(myNombres(4))
        },
        { // case 1 -->
          nombre: Number(myNombres(5))
        },
        { // case 2 -->
          nombre: Number(myNombres(6))
        },
        { // case 3 -->
          nombre: Number(myNombres(7))
        },
        { // case 4 -->
          nombre: Number(myNombres(8))
        },
        { // case 5 -->
          nombre: Number(myNombres(9))
        }
      ]

      // une fonction pour les correction à la precision près
      function encadrementCorr (nb, precision) {
        if (precision === 1) {
          return `$${miseEnEvidence(texNombre(Math.trunc(nb / precision) * precision - precision))} < ${texNombre(nb)} < ${miseEnEvidence(texNombre(Math.trunc(nb / precision) * precision + precision))}$`
        } else if (precision === 10 || precision === 100) {
          if (nb % precision === 0) {
            return `$${miseEnEvidence(texNombre(Math.trunc(nb / precision) * precision - precision))} < ${texNombre(nb)} < ${miseEnEvidence(texNombre(Math.trunc(nb / precision) * precision + precision))}$`
          } else {
            return `$${miseEnEvidence(texNombre(Math.trunc(nb / precision) * precision))} < ${texNombre(nb)} < ${miseEnEvidence(texNombre(Math.trunc(nb / precision) * precision + precision))}$`
          };
        };
      };

      const enonces = []
      for (let k = 0; k < situations.length; k++) {
        enonces.push({
          enonce: `
          $\\ldots < ${texNombre(situations[k].nombre)} < \\ldots$
          `,
          question: '',
          correction: `
          ${encadrementCorr(situations[k].nombre, precision)}
          `
        })
      };

      // autant de case que d'elements dans le tableau des situations
      switch (listeTypeDeQuestions[i]) {
        case 0:
          texte = `${enonces[0].enonce}`
          if (this.beta) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[0].correction}`
            texte += '             '
            texteCorr = ''
          } else {
            texteCorr = `${enonces[0].correction}`
          };
          break
        case 1:
          texte = `${enonces[1].enonce}`
          if (this.beta) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[1].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[1].correction}`
          };
          break
        case 2:
          texte = `${enonces[2].enonce}`
          if (this.beta) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[2].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[2].correction}`
          };
          break
        case 3:
          texte = `${enonces[3].enonce}`
          if (this.beta) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[3].correction}`
            texte += '             '
            texteCorr = ''
          } else {
            texteCorr = `${enonces[3].correction}`
          };
          break
        case 4:
          texte = `${enonces[4].enonce}`
          if (this.beta) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[4].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[4].correction}`
          };
          break
        case 5:
          texte = `${enonces[5].enonce}`
          if (this.beta) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[5].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[5].correction}`
          };
          break
      };
      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.besoinFormulaireNumerique = ['Niveau de difficulté', 3, '1 : Encadrer entre deux entiers consécutifs\n2 : Encadrer entre deux multiples consécutifs de 10\n3 : Encadrer entre deux multiples consécutifs de 100']
  // this.besoinFormulaire2CaseACocher = ["Avec des équations du second degré"];
};