exercices/4e/4C36.js

import Exercice from '../Exercice.js'
import { randint, listeQuestionsToContenu, combinaisonListes, prenomPronom, premiereLettreEnMajuscule, texNombre, contraindreValeur, compteOccurences, rangeMinMax } from '../../modules/outils.js'
import Decimal from 'decimal.js'
import { propositionsQcm } from '../../modules/interactif/questionQcm.js'
export const interactifReady = true
export const interactifType = 'qcm'
export const titre = 'Utiliser les ordres de grandeur pour vérifier ses résultats'

export const dateDePublication = '23/05/2022'
export const dateDeModifImportante = '18/06/2022'

/**
 * @author Guillaume Valmont
 * Référence 4C36
 * Reformulation de l'énoncé et ajout de problèmes avec des puissances de 10 par Guillaume Valmont le 18/06/2022
*/
export const uuid = '975cc'
export const ref = '4C36'
export default class nomExercice extends Exercice {
  constructor () {
    super()
    this.titre = titre
    this.nbQuestions = 5
    this.besoinFormulaireTexte = ['Choix des problèmes', 'Nombres séparés par des tirets\n1 : Problèmes \'\'naturels\'\'\n2 : Problèmes avec des puissances de 10\n3 : Mélange']
    this.sup = '3'
  }

  nouvelleVersion (numeroExercice) {
    this.listeQuestions = []
    this.listeCorrections = []
    this.autoCorrection = []

    const problemesNaturels = [
      {
        intitule: 'la distance entre la Terre et la Lune',
        puissanceDe10: 5,
        unite: 'km'
      },
      {
        intitule: 'le rayon de la Terre',
        puissanceDe10: 3,
        unite: 'km'
      },
      {
        intitule: 'la hauteur d\'un immeuble',
        puissanceDe10: 2,
        unite: 'm'
      },
      {
        intitule: 'la longueur d\'un smartphone',
        puissanceDe10: -1,
        unite: 'm'
      },
      {
        intitule: 'la longueur d\'une fourmi',
        puissanceDe10: -3,
        unite: 'm'
      },
      {
        intitule: 'la masse d\'un camion',
        puissanceDe10: 4,
        unite: 'kg'
      },
      {
        intitule: 'la masse d\'une voiture',
        puissanceDe10: 3,
        unite: 'kg'
      },
      {
        intitule: 'la masse d\'une pomme',
        puissanceDe10: -1,
        unite: 'kg'
      },
      {
        intitule: 'le volume d\'une bouteille d\'eau',
        puissanceDe10: 0,
        unite: 'L'
      },
      {
        intitule: 'le volume d\'une bouteille d\'eau',
        puissanceDe10: 0,
        unite: 'dm³'
      },
      {
        intitule: 'le volume d\'une bouteille d\'eau',
        puissanceDe10: -3,
        unite: 'm³'
      },
      {
        intitule: 'le volume d\'une bouteille d\'eau',
        puissanceDe10: 3,
        unite: 'mm³'
      },
      {
        intitule: 'la surface d\'une table',
        puissanceDe10: 0,
        unite: 'm²'
      }
    ]
    const problemesDePuissances = [
      {
        intitule: 'la taille d\'un tardigrade',
        puissanceDe10: -4,
        unite: 'm'
      },
      {
        intitule: 'la vitesse de la lumière',
        puissanceDe10: 8,
        unite: 'm/s'
      },
      {
        intitule: 'la distance entre la Terre et le Soleil',
        puissanceDe10: 8,
        unite: 'km'
      },
      {
        intitule: 'la vitesse de la station spatiale internationale',
        puissanceDe10: 4,
        unite: 'km/h'
      },
      {
        intitule: 'la masse de la station spatiale internationale',
        puissanceDe10: 5,
        unite: 'kg'
      },
      {
        intitule: 'l\'épaisseur d\'un fil de soie',
        puissanceDe10: -4,
        unite: 'm'
      },
      {
        intitule: 'la taille d\'une bactérie',
        puissanceDe10: -6,
        unite: 'm'
      },
      {
        intitule: 'la taille d\'un pixel de téléviseur à haute résolution',
        puissanceDe10: -4,
        unite: 'm'
      },
      {
        intitule: 'la masse du Titanic',
        puissanceDe10: 7,
        unite: 'kg'
      },
      {
        intitule: 'la masse de la grande pyramide de Gizeh',
        puissanceDe10: 9,
        unite: 'kg'
      },
      {
        intitule: 'la production de pétrole mondiale en 2020',
        puissanceDe10: 9,
        unite: 'kg'
      }
    ]
    const justesseResultats = combinaisonListes([-1, 0, 1], this.nbQuestions)

    let listeDesProblemes = [1, 2] // Paramétrage par défaut
    const valMaxParametre = 3
    if (this.sup) { // Si une liste est saisie
      if (this.sup.toString().indexOf('-') === -1) { // S'il n'y a pas de tiret ...
        listeDesProblemes = [contraindreValeur(1, valMaxParametre, parseInt(this.sup), 1)] // ... on crée un tableau avec une seule valeur
      } else {
        listeDesProblemes = this.sup.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
        for (let i = 0; i < listeDesProblemes.length; i++) { // on parcourt notre tableau de strings : ['1', '1', '2'] ...
          listeDesProblemes[i] = contraindreValeur(1, valMaxParametre, parseInt(listeDesProblemes[i]), 1) // ... pour en faire un tableau d'entiers : [1, 1, 2]
        }
      }
    }
    // Attention ! Si la valeur max du paramètre n'est pas une option de type "mélange", supprimer la ligne ci-dessous !
    if (compteOccurences(listeDesProblemes, valMaxParametre) > 0) listeDesProblemes = rangeMinMax(1, valMaxParametre - 1) // Si l'utilisateur a choisi l'option "mélange", on fait une liste avec un de chaque

    listeDesProblemes = combinaisonListes(listeDesProblemes, this.nbQuestions)

    for (let i = 0, texte, texteCorr, probleme, resultatObtenu, puissanceObtenue, remarque, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      const prenom = prenomPronom()
      switch (listeDesProblemes[i]) {
        case 1:
          probleme = problemesNaturels[randint(0, problemesNaturels.length - 1)]
          break
        case 2:
          probleme = problemesDePuissances[randint(0, problemesDePuissances.length - 1)]
          break
      }
      resultatObtenu = new Decimal(randint(101, 199)).div(100)
      let QCMPossible = false
      let QCMImpossible = true
      switch (justesseResultats[i]) {
        case 1:
          puissanceObtenue = probleme.puissanceDe10 + 2
          remarque = 'Ce qui est beaucoup trop !'
          break
        case 0:
          puissanceObtenue = probleme.puissanceDe10
          remarque = 'Ce qui correspond bien à l\'ordre de grandeur qu\'on pouvait attendre'
          QCMPossible = true
          QCMImpossible = false
          break
        case -1:
          puissanceObtenue = probleme.puissanceDe10 - 2
          remarque = 'Ce qui est trop peu !'
          break
      }
      resultatObtenu = resultatObtenu.times(10 ** puissanceObtenue)
      texteCorr = `${premiereLettreEnMajuscule(prenom[1])} a obtenu un résultat de l'ordre de $10^{${puissanceObtenue}}$ ${probleme.unite}. `
      texteCorr += remarque
      switch (listeDesProblemes[i]) {
        case 1:
          texte = `${prenom[0]} a calculé ${probleme.intitule} et a obtenu $${texNombre(resultatObtenu)}$ ${probleme.unite}.<br>
          En utilisant les ordres de grandeur, dire si ce résultat est plausible.`
          if (justesseResultats[i] !== 0) texteCorr += `<br>${premiereLettreEnMajuscule(probleme.intitule)} serait plutôt de l'ordre de grandeur de $10^{${probleme.puissanceDe10}}$ ${probleme.unite}.`
          break
        case 2:
          texte = `${prenom[0]} sait que ${probleme.intitule} est de l'ordre de $10^{${probleme.puissanceDe10}}$ ${probleme.unite}.<br>
          Comme résultat d'un exercice, ${prenom[1]} a obtenu $${texNombre(resultatObtenu)}$ ${probleme.unite}.<br>
          Ce résultat est-il plausible ?`
          break
      }

      this.autoCorrection[i] = {
        enonce: texte,
        propositions: [
          {
            texte: 'C\'est plausible',
            statut: QCMPossible, // true ou false pour indiquer si c'est une bonne réponse (true)
            feedback: '' // qui s'affichera si la réponse est juste ou s'il n'y a qu'une erreur
          },
          {
            texte: 'C\'est impossible',
            statut: QCMImpossible, // true ou false pour indiquer si c'est une bonne réponse (true)
            feedback: ''
          }
        ],
        options: {
          ordered: true, // (true si les réponses doivent rester dans l'ordre ci-dessus, false s'il faut les mélanger),
          vertical: true, // facultatif. true : si on veut une présentation en plusieurs colonnes. false : valeur par défaut, les cases à cocher sont à la suite, toutes sur une colonne. Exercice-témoin : can5A01
          nbCols: 2 // Le nb de colonnes si vertical est true. Sans effet si vertical est false.
        }
      }
      const monQcm = propositionsQcm(this, i) // Les deux paramètres sont obligatoires et désignent, respectivement, l'exercice appelant, le numéro de la question dans la programmation de l'exercice.
      if (this.interactif) {
        texte += monQcm.texte // enonce est l'énoncé global de l'exercice
        texteCorr += '<br>' + monQcm.texteCorr // texteCorr est la correction globale de l'exercice
      }
      if (this.questionJamaisPosee(i, texte)) {
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this) // On envoie l'exercice à la fonction de mise en page
  }
}