exercices/6e/6S10.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, choice, premiereLettreEnMajuscule, numAlpha, calcul, sp } from '../../modules/outils.js'
import { repere, traceBarre } from '../../modules/2d.js'
import { context } from '../../modules/context.js'
import { ajouteChampTexte, setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const titre = 'Lire un diagramme en barres'
export const amcReady = true
export const amcType = 'AMCHybride'
export const interactifReady = true
export const interactifType = 'mathLive'

/**
 * Lire un diagramme en barres
 * @author Erwan Duplessy
 * Conversion Amc et interactif par Jean-Claude Lhote
 * Référence 6S10
 */

export const uuid = '17bce'
export const ref = '6S10'
export default function LectureDiagrammeBarre () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.consigne = "Répondre aux questions à l'aide du graphique."
  this.nbQuestions = 3
  this.nbQuestionsModifiable = false
  this.nbCols = 1
  this.nbColsCorr = 1
  this.sup = 1
  this.sup2 = 1
  this.spacing = 2
  this.spacingCorr = 2
  this.nouvelleVersion = function () {
    this.listeQuestions = [] // vide la liste de questions
    this.listeCorrections = [] // vide la liste de questions corrigées
    this.autoCorrection = []
    const bornesinf = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    const lstAnimaux = ['Girafes', 'Zèbres', 'Gnous', 'Buffles', 'Gazelles', 'Crocodiles', 'Rhinocéros', 'Léopards', 'Guépards', 'Hyènes', 'Lycaons', 'Servals', 'Phacochères']
    let nbAnimaux = 4 // nombre d'animaux différents dans l'énoncé
    switch (parseInt(this.sup)) {
      case 1: nbAnimaux = 4; break
      case 2: nbAnimaux = 5; break
      case 3: nbAnimaux = 6; break
      default: nbAnimaux = 4
    }
    const propa = []
    const propb = []
    const propc = []
    const lstAnimauxExo = [] // liste des animaux uniquement cités dans l'exercice
    const lstNombresAnimaux = [] // liste des effectifs de chaque animal
    let lstVal = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] // liste des valeurs à éviter pour les effectifs
    let N = 0; let nom; let texte; let texteCorr

    switch (parseInt(this.sup2)) {
      case 1:
        for (let i = 0; i < nbAnimaux; i++) {
          N = randint(2, 100, lstVal) // choisit un nombre entre 2 et 100 sauf dans les valeurs à éviter
          lstNombresAnimaux.push(N)
          lstVal = lstVal.concat([N - 1, N, N + 1]) // valeurs à supprimer pour éviter des valeurs proches
        }
        break
      case 2:
        for (let i = 0; i < nbAnimaux; i++) {
          N = randint(2, 100, lstVal) // choisit un nombre entre 2 et 100 sauf dans les valeurs à éviter
          lstNombresAnimaux.push(10 * N)
          lstVal = lstVal.concat([N - 1, N, N + 1]) // valeurs à supprimer pour éviter des valeurs proches
        }
        break
    }

    for (let i = 0; i < nbAnimaux; i++) {
      nom = choice(lstAnimaux, lstAnimauxExo) // choisit un animal au hasard sauf parmi ceux déjà utilisés
      lstAnimauxExo.push(nom)
    }

    const nMin = Math.min(...lstNombresAnimaux)
    const nMax = Math.max(...lstNombresAnimaux)

    const lstNomParc = ['Dramve', 'Fatenmin', 'Batderfa', 'Vihi', 'Genser', 'Barbetdou', 'Dramrendu', 'Secai', 'Cipeudram', 'Cigel', 'Lisino', 'Fohenlan',
      'Farnfoss', 'Kinecardine', 'Zeffari', 'Barmwich', 'Swadlincote', 'Swordbreak', 'Loshull', 'Ruyron', 'Fluasall', 'Blueross', 'Vlane']

    texte = 'Dans le parc naturel de ' + choice(lstNomParc) + ', il y a beaucoup d\'animaux.<br>Voici un diagramme en bâtons qui donne le nombre d\'individus pour chaque espèce.<br>'
    if (!context.isAmc) {
      texte += numAlpha(0) + ' Quels sont les animaux les plus nombreux ?' + ajouteChampTexte(this, 0, { texte: sp(5) + 'les' })
      texte += '<br>' + numAlpha(1) + ' Quels sont les animaux les moins nombreux ?' + ajouteChampTexte(this, 1, { texte: sp(5) + 'les' }) + '<br>'
      setReponse(this, 0, lstAnimauxExo[lstNombresAnimaux.indexOf(nMax)])
      setReponse(this, 1, lstAnimauxExo[lstNombresAnimaux.indexOf(nMin)])
    } else {
      texte += '1) Quels sont les animaux les plus nombreux ?<br>'
      texte += '2) Quels sont les animaux les moins nombreux ?<br>'
    }
    const numAnimal = randint(0, nbAnimaux - 1)
    switch (parseInt(this.sup2)) {
      case 1:
        if (!context.isAmc) {
          texte += numAlpha(2) + ' Donner un encadrement, à la dizaine, du nombre de ' + lstAnimauxExo[numAnimal] + ' ?<br>'
          if (this.interactif) texte += ajouteChampTexteMathLive(this, 2, 'largeur10 inline', { texte: sp(5) }) + sp(10) + `< nombre de ${lstAnimauxExo[numAnimal]} < `
          texte += ajouteChampTexteMathLive(this, 3, 'largeur10 inline', { texte: sp(5) })
        } else {
          texte += '3) Donner un encadrement, à la dizaine, du nombre de ' + lstAnimauxExo[numAnimal] + ' ?<br>'
        }
        break
      case 2:
        if (!context.isAmc) {
          texte += numAlpha(2) + ' Donner un encadrement, à la centaine, du nombre de ' + lstAnimauxExo[numAnimal] + ' ?<br>'
          if (this.interactif) texte += ajouteChampTexteMathLive(this, 2, 'largeur10 inline', { texte: sp(5) }) + sp(10) + `< nombre de ${lstAnimauxExo[numAnimal]} < `
          texte += ajouteChampTexteMathLive(this, 3, 'largeur10 inline', { texte: sp(5) })
        } else {
          texte += '3)  Donner un encadrement, à la centaine, du nombre de ' + lstAnimauxExo[numAnimal] + ' ?<br>'
        }
        break
    }
    texte += '<br>'

    // coefficient pour gérer les deux types d'exercices (entre 1 et 100) ou (entre 10 et 1000)
    let coef = 1
    switch (parseInt(this.sup2)) {
      case 1:
        coef = 1
        break
      case 2:
        coef = 10
        break
    }

    const r = repere({
      grilleX: false,
      grilleY: 'pointilles',
      xThickListe: [],
      xLabelListe: [],
      yUnite: 0.1 / coef,
      yThickDistance: 10 * coef,
      yMax: 100 * coef,
      xMin: 0,
      xMax: 10,
      yMin: 0,
      axeXStyle: '',
      yLegende: "Nombre d'individus"
    })

    const lstElementGraph = []
    const bornesAEviter = [calcul(10 * coef * Math.floor(lstNombresAnimaux[lstAnimauxExo.indexOf(lstAnimauxExo[numAnimal])] / (10 * coef)))]
    for (let i = 0, borne, reponsea, reponseb, reponsec; i < nbAnimaux; i++) {
      lstElementGraph.push(traceBarre((((r.xMax - r.xMin) / (nbAnimaux + 1)) * (i + 1)), lstNombresAnimaux[i], premiereLettreEnMajuscule(lstAnimauxExo[i]), { unite: 0.1 / coef }))
      if (context.isAmc) {
        reponsea = i === 0 ? { texte: '1) Animaux les plus nombreux :' } : {}
        if (i === lstNombresAnimaux.indexOf(nMax)) {
          propa.push({ texte: premiereLettreEnMajuscule(lstAnimauxExo[i]), statut: true, reponse: reponsea })
        } else {
          propa.push({ texte: premiereLettreEnMajuscule(lstAnimauxExo[i]), statut: false, reponse: reponsea })
        }
        reponseb = i === 0 ? { texte: '2) Animaux les moins nombreux :' } : {}
        if (i === lstNombresAnimaux.indexOf(nMin)) {
          propb.push({ texte: premiereLettreEnMajuscule(lstAnimauxExo[i]), statut: true, reponse: reponseb })
        } else {
          propb.push({ texte: premiereLettreEnMajuscule(lstAnimauxExo[i]), statut: false, reponse: reponseb })
        }
        reponsec = i === 0 ? { texte: `3) encadrement du nombre de ${lstAnimauxExo[numAnimal]} :` } : {}
        if (i === numAnimal) {
          propc.push({ texte: `entre ${bornesAEviter[0]} et ${bornesAEviter[0] + 10 * coef}`, statut: true, reponse: reponsec })
        } else {
          borne = choice(bornesinf, bornesAEviter)
          bornesAEviter.push(borne)
          propc.push({ texte: `entre ${borne} et ${borne + 10 * coef}`, statut: false, reponse: reponsec })
        }
      }
    }
    texte += mathalea2d({ xmin: -5, xmax: 11, ymin: -4, ymax: 11, pixelsParCm: 30, scale: 0.5 }, r, lstElementGraph)
    // debut de la correction
    // question 1
    if (!context.isAmc) {
      texteCorr = numAlpha(0) + ' Les animaux les plus nombreux sont les ' + lstAnimauxExo[lstNombresAnimaux.indexOf(nMax)] + '.<br>'
    } else {
      texte += '<br>'
      texteCorr = '1) Les animaux les plus nombreux sont les ' + lstAnimauxExo[lstNombresAnimaux.indexOf(nMax)] + '.<br>'
    }
    // question 2
    if (!context.isAmc) {
      texteCorr += numAlpha(1) + ' Les animaux les moins nombreux sont les ' + lstAnimauxExo[lstNombresAnimaux.indexOf(nMin)] + '.<br>'
    } else {
      texteCorr += '2) Les animaux les moins nombreux sont les ' + lstAnimauxExo[lstNombresAnimaux.indexOf(nMin)] + '.<br>'
    }

    // question 3
    const reponse = lstNombresAnimaux[lstAnimauxExo.indexOf(lstAnimauxExo[numAnimal])]
    const reponseinf = 10 * coef * Math.floor(reponse / (10 * coef))
    const reponsesup = reponseinf + 10 * coef
    if (!context.isAmc) {
      setReponse(this, 2, reponseinf)
      setReponse(this, 3, reponsesup)
      texteCorr += numAlpha(2) + ' Il y a entre ' + reponseinf + ' et ' + reponsesup + ' ' + lstAnimauxExo[numAnimal] + '.<br>'
    } else {
      texteCorr += '3) Il y a entre ' + reponseinf + ' et ' + reponsesup + ' ' + lstAnimauxExo[numAnimal] + '.<br>'
    }

    this.listeQuestions.push(texte)
    this.listeCorrections.push(texteCorr)
    listeQuestionsToContenu(this)
    if (context.isAmc) {
      this.autoCorrection[0] = {
        enonce: texte,
        propositions: [
          {
            type: 'qcmMono',
            propositions: propa,
            options: { ordered: false }
          },
          {
            type: 'qcmMono',
            options: { ordered: false },
            propositions: propb
          },
          {
            type: 'qcmMono',
            options: { ordered: false },
            propositions: propc
          }
        ]
      }
    }
  }
  this.besoinFormulaireNumerique = ['Nombre d\'espèces différentes', 3, '1 : 4 espèces\n2 : 5 espèces\n3 : 6 espèces']
  this.besoinFormulaire2Numerique = ['Valeurs numériques', 2, '1 : Entre 1 et 100\n2 : Entre 100 et 1 000']
}