exercices/2e/2F32-3.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, sp, combinaisonListes, numAlpha } from '../../modules/outils.js'
import { tableauDeVariation } from '../../modules/TableauDeVariation.js'
export const titre = 'Déterminer un extremum ou encadrer par lecture d\'un tableau de variations'
export const dateDePublication = '20/12/2021'
/**
* @author Gilles Mora
*/
export const uuid = 'acee0'
export const ref = '2F32-3'
export default function LireUnTableauDevariations () {
  Exercice.call(this)
  this.consigne = ''
  this.nbQuestions = 1
  this.nbCols = 2 // Uniquement pour la sortie LaTeX
  this.nbColsCorr = 2 // Uniquement pour la sortie LaTeX
  this.sup = 1 // Niveau de difficulté
  this.tailleDiaporama = 1 // Pour les exercices chronométrés. 50 par défaut pour les exercices avec du texte
  this.video = '' // Id YouTube ou url
  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    let typeDeQuestionsDisponibles
    if (this.sup === 1) {
      typeDeQuestionsDisponibles = ['typeE1']
    } else {
      if (this.sup === 2) {
        typeDeQuestionsDisponibles = ['typeE2']
      } else { typeDeQuestionsDisponibles = ['typeE1', 'typeE2'] }
    }
    const listeTypeQuestions = combinaisonListes(typeDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posés mais l'ordre diffère à chaque "cycle"
    for (let i = 0, x1, x2, x3, x4, y1, y2, y3, y4, ligne1, M, m, M1, M2, m1, choix, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      // Boucle principale où i+1 correspond au numéro de la question
      switch (listeTypeQuestions[i]) { // Suivant le type de question, le contenu sera différent
        case 'typeE1':
          x1 = randint(-20, 10)
          x2 = randint(x1 + 1, 15)
          x3 = randint(x2 + 1, 20)
          x4 = randint(x3 + 1, 25)
          y1 = randint(-10, 10)
          y2 = randint(y1 - 10, y1 - 1)
          y3 = randint(y2 + 1, y2 + 10, y1)
          y4 = randint(y3 - 10, y3 - 1, y2)
          M = Math.max(y1, y2, y3, y4)
          m = Math.min(y1, y2, y3, y4)
          choix = randint(1, 2)
          if (choix === 1) {
            ligne1 = ['Var', 10, `+/$${y1}$`, 10, `-/$${y2}$`, 10, `+/$${y3}$`, 10, `-/$${y4}$`, 10]
          } else {
            ligne1 = ['Var', 10, `-/$${-y1}$`, 10, `+/$${-y2}$`, 10, `-/$${-y3}$`, 10, `+/$${-y4}$`, 10]
          }
          // xmin détermine la marge à gauche, ymin la hauteur réservée pour le tableau, xmax la largeur réservée pour le tableau et ymax la marge au dessus du tableau

          texte = ` Voici le tableau de variations d'une fonction $f$ définie sur $[${x1};${x4}]$.<br><br>
              `
          texte += mathalea2d({ xmin: -0.5, ymin: -6.1, xmax: 30, ymax: 0.1, scale: 0.6 }, tableauDeVariation({
            tabInit: [
              [
                // Première colonne du tableau avec le format [chaine d'entête, hauteur de ligne, nombre de pixels de largeur estimée du texte pour le centrage]
                ['$x$', 2, 10], ['$f(x)$', 4, 30]
              ],
              // Première ligne du tableau avec chaque antécédent suivi de son nombre de pixels de largeur estimée du texte pour le centrage
              [`$${x1}$`, 10, `$${x2}$`, 10, `$${x3}$`, 10, `$${x4}$`, 10]
            ],
            // tabLines ci-dessous contient les autres lignes du tableau.
            tabLines: [ligne1],
            colorBackground: '',
            espcl: 3, // taille en cm entre deux antécédents
            deltacl: 1, // distance entre la bordure et les premiers et derniers antécédents
            lgt: 3, // taille de la première colonne en cm
            hauteurLignes: [15, 15]
          }))

          texte += ' <br>Déterminer le minimum et le maximum de $f$ sur son ensemble de définition. Préciser en quelles valeurs de $x$ ils sont atteints.'

          texteCorr = `$\\bullet~$ $f$ admet un maximum en $a$ sur un intervalle $I$ signifie que pour tout réel $x$ de $I$, $f(x)\\leqslant f(a)$.<br>
          Le nombre $f(a)$ est le maximum de $f$ sur $I$.<br>
          $\\bullet~$ $f$ admet un minimum en $b$ sur un intervalle $I$ signifie que pour tout réel $x$ de $I$, $f(x)\\geqslant f(b)$.<br>
          Le nombre $f(b)$ est le minimum de $f$ sur $I$.<br>
          <br>`
          if (choix === 1) {
            if (M === y1) {
              texteCorr += `Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\leqslant ${y1}$, c'est-à-dire  $f(x)\\leqslant f(${x1})$.<br>
           Ainsi, le maximum de $f$ est $${y1}$. Il est atteint en $x=${x1}$. `
            } else {
              texteCorr += `Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\leqslant ${y3}$, c'est-à-dire  $f(x)\\leqslant f(${x3})$.<br>
          Ainsi, le maximum de $f$ est $${y3}$. Il est atteint en $x=${x3}$.  `
            }
            if (m === y2) {
              texteCorr += `<br>Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\geqslant ${y2}$, c'est-à-dire  $f(x)\\geqslant f(${x2})$.<br>
          Ainsi, le minimum de $f$ est $${y2}$. Il est atteint en $x=${x2}$. `
            } else {
              texteCorr += `<br>Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\geqslant ${y4}$, c'est-à-dire  $f(x)\\geqslant f(${x4})$.<br>
         Ainsi, le minimum de $f$ est $${y4}$. Il est atteint en $x=${x4}$.  `
            }
          } else {
            if (M === y1) {
              texteCorr += `Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\geqslant ${-y1}$, c'est-à-dire  $f(x)\\geqslant f(${x1})$.<br>
           Ainsi, le minimum de $f$ est $${-y1}$. Il est atteint en $x=${x1}$. `
            } else {
              texteCorr += `Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\geqslant ${-y3}$, c'est-à-dire  $f(x)\\geqslant f(${x3})$.<br>
          Ainsi, le minimum de $f$ est $${-y3}$. Il est atteint en $x=${x3}$.  `
            }
            if (m === y2) {
              texteCorr += `<br>Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\leqslant ${-y2}$, c'est-à-dire  $f(x)\\leqslant f(${x2})$.<br>
          Ainsi, le maximum de $f$ est $${-y2}$. Il est atteint en $x=${x2}$. `
            } else {
              texteCorr += `<br>Pour tout réel $x$ de $[${x1};${x4}]$, on a  $f(x)\\leqslant ${-y4}$, c'est-à-dire  $f(x)\\leqslant f(${x4})$.<br>
         Ainsi, le maximum de $f$ est $${-y4}$. Il est atteint en $x=${x4}$.  `
            }
          }
          break
        case 'typeE2':
          x1 = randint(-20, 10)
          x2 = randint(x1 + 1, 15)
          x3 = randint(x2 + 1, 20)
          x4 = randint(x3 + 1, 25)
          y1 = randint(-10, 10)
          y2 = randint(y1 - 10, y1 - 1)
          y3 = randint(y2 + 1, y2 + 10, y1)
          y4 = randint(y3 - 10, y3 - 1, y2)
          M1 = Math.max(y1, y3)
          M2 = Math.max(y1, y3)
          m1 = Math.min(y2, y4)
          choix = randint(1, 2)
          if (choix === 1) {
            ligne1 = ['Var', 10, `+/$${y1}$`, 10, `-/$${y2}$`, 10, `+/$${y3}$`, 10, `-/$${y4}$`, 10]
          } else {
            ligne1 = ['Var', 10, `-/$${-y1}$`, 10, `+/$${-y2}$`, 10, `-/$${-y3}$`, 10, `+/$${-y4}$`, 10]
          }
          texte = ` Voici le tableau de variations d'une fonction $f$ définie sur $[${x1};${x4}]$.<br><br>
              `
          texte += mathalea2d({ xmin: -0.5, ymin: -6.1, xmax: 30, ymax: 0.1, scale: 0.6 }, tableauDeVariation({
            tabInit: [
              [
                // Première colonne du tableau avec le format [chaine d'entête, hauteur de ligne, nombre de pixels de largeur estimée du texte pour le centrage]
                ['$x$', 2, 10], ['$f(x)$', 4, 30]
              ],
              // Première ligne du tableau avec chaque antécédent suivi de son nombre de pixels de largeur estimée du texte pour le centrage
              [`$${x1}$`, 10, `$${x2}$`, 10, `$${x3}$`, 10, `$${x4}$`, 10]
            ],
            // tabLines ci-dessous contient les autres lignes du tableau.
            tabLines: [ligne1],
            colorBackground: '',
            espcl: 3, // taille en cm entre deux antécédents
            deltacl: 1, // distance entre la bordure et les premiers et derniers antécédents
            lgt: 3, // taille de la première colonne en cm
            hauteurLignes: [15, 15]
          }))

          texte += ' <br>Encadrer le plus précisément possible $f(x)$ (en déterminant les valeurs de $m$ et de $M$ telles que $m\\leqslant f(x)\\leqslant M$) dans chacun des cas suivants :<br>'
          texte += numAlpha(0) + ` $x\\in[${x1};${x3}]$<br>`
          texte += numAlpha(1) + ` $x\\in[${x2};${x4}]$`
          texteCorr = ''
          if (choix === 1) {
            if (M1 === y1) {
              texteCorr += numAlpha(0) + `Sur $[${x1};${x3}]$, le minimum de $f$ est $${y2}$ et le maximum est 
          $${y1}$. <br>
          Ainsi, pour $x\\in[${x1};${x3}]$, ${sp(3)} $${y2}\\leqslant f(x)\\leqslant ${y1}$.<br>`
            } else {
              texteCorr += numAlpha(0) + `Sur $[${x1};${x3}]$, le minimum de $f$ est $${y2}$ et le maximum est 
          $${y3}$. <br>
          Ainsi, pour $x\\in[${x1};${x3}]$, ${sp(3)} $${y2}\\leqslant f(x)\\leqslant ${y3}$.<br>`
            }
            if (m1 === y2) {
              texteCorr += numAlpha(1) + `Sur $[${x2};${x4}]$, le minimum de $f$ est $${y2}$ et le maximum est 
          $${y3}$. <br>
          Ainsi, pour $x\\in[${x2};${x4}]$, ${sp(3)} $${y2}\\leqslant f(x)\\leqslant ${y3}$.<br>`
            } else {
              texteCorr += numAlpha(1) + `Sur $[${x2};${x4}]$, le minimum de $f$ est $${y4}$ et le maximum est 
          $${y3}$. <br>
          Ainsi, pour $x\\in[${x2};${x4}]$, ${sp(3)} $${y4}\\leqslant f(x)\\leqslant ${y3}$.<br>`
            }
          } else {
            if (M2 === y1) {
              texteCorr += numAlpha(0) + `Sur $[${x1};${x3}]$, le minimum de $f$ est $${-y1}$ et le maximum est 
            $${-y2}$. <br>
            Ainsi, pour $x\\in[${x1};${x3}]$, ${sp(3)} $${-y1}\\leqslant f(x)\\leqslant ${-y2}$.<br>`
            } else {
              texteCorr += numAlpha(0) + `Sur $[${x1};${x3}]$, le minimum de $f$ est $${-y3}$ et le maximum est 
            $${-y2}$. <br>
            Ainsi, pour $x\\in[${x1};${x3}]$, ${sp(3)} $${-y3}\\leqslant f(x)\\leqslant ${-y2}$.<br>`
            }
            if (m1 === y2) {
              texteCorr += numAlpha(1) + `Sur $[${x2};${x4}]$, le minimum de $f$ est $${-y3}$ et le maximum est 
            $${-y2}$. <br>
            Ainsi, pour $x\\in[${x2};${x4}]$, ${sp(3)} $${-y3}\\leqslant f(x)\\leqslant ${-y2}$.<br>`
            } else {
              texteCorr += numAlpha(1) + `Sur $[${x2};${x4}]$, le minimum de $f$ est $${-y3}$ et le maximum est 
            $${-y4}$. <br>
            Ainsi, pour $x\\in[${x2};${x4}]$, ${sp(3)} $${-y3}\\leqslant f(x)\\leqslant ${-y4}$.<br>`
            }
          }
          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 = ['Choix des questions', 3, '1 : Minimum et maximum\n2 :Encadrement\n3 :Mélange']
}