exercices/4e/4C23.js

import Exercice from '../Exercice.js'
import { combinaisonListes, listeQuestionsToContenuSansNumero, lettreDepuisChiffre, texFraction, randint, miseEnEvidence, choice, pgcd, simplificationDeFractionAvecEtapes } from '../../modules/outils.js'
import { context } from '../../modules/context.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { fraction } from '../../modules/fractions.js'

export const titre = 'Somme, différence ou produit de fractions'
export const interactifType = 'mathLive'
export const interactifReady = true

/**
 * Description didactique de l'exercice
 * @author Mireille Gain
 * Référence 4C23-1
 * Date de publication septembre 2021
*/
export const uuid = '374b6'
export const ref = '4C23'
export default function SommeOuProduitFractions () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.interactifReady = interactifReady
  this.interactifType = interactifType
  this.spacing = context.isHtml ? 4 : 3
  this.spacingCorr = context.isHtml ? 4 : 3
  this.nbColonneModifiable = false
  this.consigne = 'Effectuer les calculs suivants.'
  this.nbQuestions = 8 // Nombre de questions par défaut
  this.nbCols = 4 // Uniquement pour la sortie LaTeX
  this.nbColsCorr = 1 // Uniquement pour la sortie LaTeX
  this.tailleDiaporama = 3 // Pour les exercices chronométrés. 50 par défaut pour les exercices avec du texte
  this.video = '' // Id YouTube ou url
  this.sup = 1
  this.correctionDetailleeDisponible = true // booléen qui indique si une correction détaillée est disponible.
  this.correctionDetaillee = false

  this.nouvelleVersion = function (numeroExercice) {
    this.sup = parseInt(this.sup)
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.sup = parseInt(this.sup)

    let typeQuestionsDisponibles = ['type1', 'type2', 'type3', 'type4', 'type5', 'type6'] // On crée 6 types de questions
    switch (this.sup) {
      case 1:
        typeQuestionsDisponibles = ['type1', 'type1', 'type1', 'type1', 'type2', 'type2', 'type5', 'type6']
        break
      case 2:
        typeQuestionsDisponibles = ['type1', 'type2', 'type3', 'type3', 'type3', 'type4', 'type5', 'type6']
        break
      case 3:
        typeQuestionsDisponibles = ['type1', 'type2', 'type3', 'type4', 'type5', 'type6', 'type7', 'type8']
        break
    }

    const listeTypeQuestions = combinaisonListes(typeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posés mais l'ordre diffère à chaque "cycle"
    for (let i = 0, num1, num2, den1, den2, den3, k, k2, alea, texte, texteCorr, num, den, cpt = 0; i < this.nbQuestions && cpt < 50;) { // Boucle principale où i+1 correspond au numéro de la question
      // les numérateurs
      num1 = randint(1, 7)
      num2 = randint(3, 9)
      // les dénominateurs
      den1 = randint(2, 9)
      k = randint(1, 4)
      k2 = randint(2, 5)
      den2 = k * den1
      den3 = randint(2, 9)
      alea = choice([1, 2])
      texte = ''
      texteCorr = ''

      if (!context.isHtml) {
        if (i % 4 === 0) {
          texteCorr += '\\begin{multicols}{4}'
        }
      }

      switch (listeTypeQuestions[i]) { // Suivant le type de question, le contenu sera différent
        case 'type1': // Somme de fractions de dénominateurs égaux ou multiples

          if (alea === 1) {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}+${texFraction(num2, den2)}$ `
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}+${texFraction(num2, den2)}$<br>`
            if (k > 1) {
              if (this.correctionDetaillee) {
                texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1 + miseEnEvidence('\\times' + k), den1 + miseEnEvidence('\\times' + k))}+${texFraction(num2, den2)}$<br>`
              }
              texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1 * k, den2)}+${texFraction(num2, den2)}$<br>`
            }
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 * k + num2, den2)}$ `
            num = num1 * k + num2
            den = den2
          } else {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}+${texFraction(num2, den1)}$ `
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}+${texFraction(num2, den1)}$<br>`
            if (k > 1) {
              if (this.correctionDetaillee) {
                texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}+${texFraction(num2 + miseEnEvidence('\\times' + k), den1 + miseEnEvidence('\\times' + k))}$<br>`
              }
              texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}+${texFraction(num2 * k, den2)}$<br>`
            }
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 + num2 * k, den2)}$ `
            num = num1 + num2 * k
            den = den2
          }

          break

        case 'type2': // Somme d'une fraction et d'un entier'
          if (alea === 1) {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${k} + ${texFraction(num1, den1)} $ `
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${k} + ${texFraction(num1, den1)} $<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(k * den1, den1)} + ${texFraction(num1, den1)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 + k * den1, den1)}$`
          } else {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} + ${k} $`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}+${k}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}+${texFraction(k * den1, den1)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 + k * den1, den1)}$`
          }
          num = num1 + k * den1
          den = den1
          break

        case 'type3': // Différence de fractions de dénominateurs égaux ou multiples
          if (alea === 1) {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}-${texFraction(num2, den2)}$`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}-${texFraction(num2, den2)}$<br>`
            if (k > 1) {
              if (this.correctionDetaillee) {
                texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1 + miseEnEvidence('\\times' + k), den1 + miseEnEvidence('\\times' + k))} - ${texFraction(num2, den2)}$<br>`
              }
              texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1 * k, den1 * k)}-${texFraction(num2, den2)}$<br>`
            }
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 * k - num2, den2)}$ `
            num = num1 * k - num2
            den = den2
          } else {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}-${texFraction(num2, den1)}$`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}-${texFraction(num2, den1)}$<br>`
            if (k > 1) {
              if (this.correctionDetaillee) {
                texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}-${texFraction(num2 + miseEnEvidence('\\times' + k), den1 + miseEnEvidence('\\times' + k))}$<br>`
              }
              texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den2)}-${texFraction(num2 * k, den2)}$<br>`
            }
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 - num2 * k, den2)}$`
            num = num1 - num2 * k
            den = den2
          }

          break

        case 'type4': // Différence d'une fraction et d'un entier
          if (alea === 1) {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${k} - ${texFraction(num1, den1)} $`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${k} - ${texFraction(num1, den1)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(k * den1, den1)} - ${texFraction(num1, den1)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(k * den1 - num1, den1)}$`
            num = k * den1 - num1
            den = den1
          } else {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}-${k}$`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}-${k}$<br>`
            if (k > 1) {
              texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)}-${texFraction(k * den1, den1)}$<br>`
            }
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 - k * den1, den1)}$ `
            num = num1 - k * den1
            den = den1
          }

          break

        case 'type5': // Produit de fractions
          texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} \\times ${texFraction(num2, den3)}$`
          texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} \\times ${texFraction(num2, den3)}$<br>`
          if (!context.isHtml) {
            if (i !== (this.nbQuestions - 1)) {
              if (i % 4 !== 3) {
                texteCorr += '\\columnbreak\n'
              }
            }
          } texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 * num2, den1 * den3)}$`
          num = num1 * num2
          den = den1 * den3
          break

        case 'type6': // Produit d'une fraction par un entier
          if (alea === 1) {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} \\times ${k2}$`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} \\times ${k2}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} \\times ${texFraction(k2, '1')}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 * k2, den1)}$`
          } else {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${k2} \\times ${texFraction(num1, den1)} $`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${k2} \\times ${texFraction(num1, den1)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(k2, '1')} \\times  ${texFraction(num1, den1)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 * k2, den1)}$`
          }
          num = num1 * k2
          den = den1

          break

        case 'type7': // Avec priorité opératoire : a +/- bc
          if (alea === 1) {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} + ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)}$ `
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} + ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} + ${texFraction(num2 * k2, den1 * den3)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1 * den3, den1 * den3)} + ${texFraction(num2 * k2, den1 * den3)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 * den3 + num2 * k2, den1 * den3)}$`
            num = num1 * den3 + num2 * k2
            den = den1 * den3
          } else {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} - ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)}$`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} - ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1, den1)} - ${texFraction(num2 * k2, den1 * den3)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num1 * den3, den1 * den3)} - ${texFraction(num2 * k2, den1 * den3)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num1 * den3 - num2 * k2, den1 * den3)}$`
            num = num1 * den3 - num2 * k2
            den = den1 * den3
          }

          break

        case 'type8': // Avec priorité opératoire : ab +/- c
          if (alea === 1) {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)} + ${texFraction(num1, den1)}$`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)} + ${texFraction(num1, den1)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2 * k2, den1 * den3)} + ${texFraction(num1, den1)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2 * k2, den1 * den3)} + ${texFraction(num1 * den3, den1 * den3)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num2 * k2 + num1 * den3, den1 * den3)}$`
            num = num2 * k2 + num1 * den3
            den = den1 * den3
          } else {
            texte += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)} - ${texFraction(num1, den1)}$`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2, den1)} \\times ${texFraction(k2, den3)} - ${texFraction(num1, den1)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2 * k2, den1 * den3)} - ${texFraction(num1, den1)}$<br>`
            texteCorr += `$${lettreDepuisChiffre(i + 1)} = ${texFraction(num2 * k2, den1 * den3)} - ${texFraction(num1 * den3, den1 * den3)}$<br>`
            if (!context.isHtml) {
              if (i !== (this.nbQuestions - 1)) {
                if (i % 4 !== 3) {
                  texteCorr += '\\columnbreak\n'
                }
              }
            }
            texteCorr += `$${lettreDepuisChiffre(i + 1) + '=' + texFraction(num2 * k2 - num1 * den3, den1 * den3)}$`
            num = num2 * k2 - num1 * den3
            den = den1 * den3
          }
          break
      }
      if (pgcd(num, den) !== 1) {
        texteCorr += `<br>$${lettreDepuisChiffre(i + 1)}  ${simplificationDeFractionAvecEtapes(num, den)}$`
      }
      texte += '<br>'
      texteCorr += '\n'
      if (!context.isHtml) {
        if (i % 4 === 3) {
          texteCorr += '\\end{multicols}'
        } else if (i === this.nbQuestions - 1) {
          texteCorr += '\\end{multicols}'
        }
      }

      // Si la question n'a jamais été posée, on l'enregistre
      if (this.questionJamaisPosee(i, texte)) { // <- laisser le i et ajouter toutes les variables qui rendent les exercices différents (par exemple a, b, c et d)
        texte += ajouteChampTexteMathLive(this, i, 'largeur25 inline')
        setReponse(this, i, fraction(num, den), { formatInteractif: 'fractionEgale' })
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }

      cpt++
    }

    listeQuestionsToContenuSansNumero(this, false) // On envoie l'exercice à la fonction de mise en page
  }
  this.besoinFormulaireNumerique = ['Type de questions', 3, '1 : Somme et produit\n2 : Somme ou différence, et produit\n3 : Avec priorité opératoire']
}