exercices/3e/3F10-1.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, combinaisonListes, rangeMinMax } from '../../modules/outils.js'
import { propositionsQcm } from '../../modules/interactif/questionQcm.js'
import { droiteParPointEtPente, point, repere, tracePoint } from '../../modules/2d.js'
export const interactifReady = true
export const interactifType = 'qcm'
export const amcReady = true
export const amcType = 'qcmMult'
export const titre = 'Vocabulaire et notations des fonctions (généralités)'

/**
* Répndre à des questions sur les fonctions.
*
* @author Jean-Claude Lhote
* 3F10-1
*/
export const uuid = '0eecd'
export const ref = '3F10-1'
export default function VocabulaireNotationsFonctions () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.sup = 2
  this.consigne = ''
  this.correctionDetailleeDisponible = true
  this.correctionDetaillee = false
  this.spacing = 2
  this.nbQuestions = 3
  this.nbQuestionsModifiable = true

  this.nouvelleVersion = function () {
    this.autoCorrection = []
    this.sup = parseInt(this.sup)
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    this.consigne = 'Cocher toutes les réponses correctes.'

    let typesDeQuestionsDisponibles
    const r = repere({ xMin: -10, xMax: 10, yMin: -10, yMax: 10 })
    switch (this.sup) {
      case 1: // vocabulaire
        typesDeQuestionsDisponibles = ['vocabulaire']
        break
      case 2: // notations
        typesDeQuestionsDisponibles = ['notations']
        break
      case 3: // mélange vocabulaire et notations
        typesDeQuestionsDisponibles = ['vocabulaire', 'notations']
        break
    }
    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    const sousChoix = combinaisonListes(rangeMinMax(0, 4), this.nbQuestions) // pour choisir aléatoirement des questions dans chaque catégorie
    for (let i = 0, texte, texteCorr, x, y, m, d, A, enonce, reponses = [], monQcm, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      this.autoCorrection[i] = {}

      // on ne choisit que des nombres compris entre 1 et 20
      x = randint(-9, 9, [0, 1, -1])
      y = randint(-9, 9, x)
      switch (listeTypeDeQuestions[i]) {
        case 'vocabulaire':
          switch (sousChoix[i]) {
            case 0:
              enonce = `$f$ est la fonction qui à $${x}$ associe $${y}$, alors pour la fonction $f$ :`
              break
            case 1:
              enonce = `$${x}$ a pour image $${y}$ par la fonction $f$, alors pour la fonction $f$ :`
              break
            case 2:
              enonce = `$${y}$ a pour antécédent $${x}$ par la fonction $f$, alors pour la fonction $f$ :`
              break
            case 3:
              enonce = `L'image de $${x}$ par la fonction $f$ est $${y}$, alors pour la fonction $f$ :`
              break
            case 4:
              enonce = `$${y}$ est l'image de $${x}$ par la fonction $f$, alors pour la fonction $f$ :`
              break
          }
          reponses[i] = [[`$${x}$ est un antécédent de $${y}$`, true], [`$${x}$ est l'image de $${y}$`, false], [`$${y}$ est un antécédent de $${x}$`, false], [`$${y}$ est l'image de $${x}$`, true]]
          break

        case 'notations':
          switch (sousChoix[i]) {
            case 0:
              enonce = `On sait que $f(${x})=${y}$, alors pour la fonction $f$ :`
              reponses[i] = [[`$${x}$ est un antécédent de $${y}$.`, true], [`$${x}$ est l'image de $${y}$.`, false], [`$${y}$ est un antécédent de $${x}$.`, false], [`$${y}$ est l'image de $${x}$.`, true]]
              break
            case 1:
              enonce = `$f : ${x} \\longmapsto ${y}$, alors pour la fonction $f$ :`
              reponses[i] = [[`$${x}$ est un antécédent de $${y}$.`, true], [`$${x}$ est l'image de $${y}$.`, false], [`$${y}$ est un antécédent de $${x}$.`, false], [`$${y}$ est l'image de $${x}$.`, true]]
              break
            case 2:
              enonce = `Pour $x=${x}$, $f(x)=${y}$, alors pour la fonction $f$ :`
              reponses[i] = [[`$${x}$ est un antécédent de $${y}$.`, true], [`$${x}$ est l'image de $${y}$.`, false], [`$${y}$ est un antécédent de $${x}$.`, false], [`$${y}$ est l'image de $${x}$.`, true]]
              break
            case 3:
              A = point(x, y)
              d = droiteParPointEtPente(A, randint(-4, 4, 0) / 2, '', 'red')
              enonce = 'La fonction $f$ est représentée par la droite rouge ci-dessous.<br>'
              enonce += mathalea2d({ xmin: -10, ymin: -10, xmax: 10, ymax: 10, pixelsParCm: 15, scale: 0.5 }, r, d, tracePoint(A)) + '<br>Alors pour la fonction $f$ :'
              reponses[i] = [[`$${x}$ est un antécédent de $${y}$.`, true], [`$${x}$ est l'image de $${y}$.`, false], [`$${y}$ est un antécédent de $${x}$.`, false], [`$${y}$ est l'image de $${x}$.`, true]]
              break
            case 4:
              m = randint(-9, 9, [x, y])
              enonce = `On sait que $f(${x})=f(${y})=${m}$, alors pour la fonction $f$ :`
              reponses[i] = [[`$${x}$ et $${y}$ sont des antécédents de $${m}$.`, true], [`$${m}$ est l'image de $${x}$ et de $${y}$.`, true], [`$${x}$ et $${y}$ sont des images de $${m}$.`, false], [`$${m}$ est un antécédent de $${x}$ et $${y}$.`, false]]
              break
          }
          break
      }
      if (!context.isHtml) enonce += '<br>'
      this.autoCorrection[i] = {
        enonce: enonce,
        options: { ordered: false, vertical: true },
        propositions: []
      }
      for (let k = 0; k < reponses[i].length; k++) {
        this.autoCorrection[i].propositions.push({ texte: reponses[i][k][0] + (context.isHtml ? '' : '<br>'), statut: reponses[i][k][1] })
      }
      monQcm = propositionsQcm(this, i)
      if (!context.isAmc) {
        texte = enonce + monQcm.texte
        texteCorr = monQcm.texteCorr
      } else {
        texte = enonce
        texteCorr = ''
      }

      if (this.questionJamaisPosee(i, listeTypeDeQuestions[i], x, y, sousChoix[i])) {
        // 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.besoinFormulaireNumerique = [
    'Choix des questions',
    3,
    '1 : Vocabulaire\n2 : Notations \n3 : Mélange'
  ]
}