exercices/6e/6S11.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, choice, shuffle, texNombre, prenom, premiereLettreEnMajuscule, numAlpha } from '../../modules/outils.js'
export const titre = 'Organiser des données dans un tableau'

/**
 * Organiser donnees depuis texte
 * @author Erwan Duplessy
 * Référence 6S11
 */

// source : http://www.ac-grenoble.fr/savoie/pedagogie/docs_pedas/ogd_c2_c3/ogd_c2_c3.pdf

export const uuid = '99d95'
export const ref = '6S11'
export default function OrganiserDonneesDepuisTexte () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = "Répondre aux questions à l'aide du texte."
  this.nbQuestions = 4
  this.nbQuestionsModifiable = false
  this.nbCols = 1
  this.nbColsCorr = 1
  this.sup = false // false -> effectif ; true -> masse
  this.sup2 = 4 // paramètre nombre de fruit
  context.isHtml ? this.spacing = 2 : this.spacing = 1
  context.isHtml ? this.spacingCorr = 2 : this.spacingCorr = 1

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

    const nbAmis = 4; let texte; let texteCorr; let m; let S // min = 2
    const nbFruits = parseInt(this.sup2) // min = 2
    const lstPrenomExo = []
    while (lstPrenomExo.length < nbAmis) {
      const p = prenom()
      if (!lstPrenomExo.includes(p)) {
        lstPrenomExo.push(p)
      }
    }

    const lstFruit = ['pomme', 'poire', 'kiwi', 'pêche', 'coing', 'melon', 'citron', 'banane', 'mangue']
    const lstFruitExo = []
    // Choisir les fruits :
    for (let i = 0; i < nbFruits; i++) {
      lstFruitExo.push(choice(lstFruit, lstFruitExo))
    }
    // Choisir les quantités de fruits pour chaque prénoms :
    const lstTabVal = [] // tableau i : amis et j : fruits
    let L = [] // tab temporaire
    for (let i = 0; i < nbAmis; i++) {
      for (let j = 0; j < nbFruits; j++) {
        if (this.sup) {
          if (randint(0, 8) > 0) {
            L.push(randint(0, 100) / 10)
          } else {
            L.push(0)
          }
        } else {
          L.push(randint(0, 10))
        }
      }
      lstTabVal.push(L)
      L = []
    }
    // Affiche l'énoncé :
    texte = 'Plusieurs amis reviennent du marché. Il s\'agit de '
    for (let i = 0; i < nbAmis - 2; i++) {
      texte += lstPrenomExo[i] + ', '
    }
    texte += lstPrenomExo[nbAmis - 2] + ' et ' + lstPrenomExo[nbAmis - 1] + '.<br>'
    let N
    // boucle sur les phrases. 1 phrase par personne.
    for (let i = 0; i < nbAmis; i++) {
      texte += lstPrenomExo[i] + ' rapporte '
      L = [] // ne contient que les fruits d'effectifs strictement positifs
      for (let j = 0; j < nbFruits; j++) {
        N = lstTabVal[i][j]
        if (N > 0) {
          L.push([N, lstFruitExo[j]])
        }
      }
      m = L.length
      L = shuffle(L) // mélange l'ordre des fruits
      for (let k = 0; k < m; k++) {
        if (this.sup) {
          texte += `$${texNombre(L[k][0])}$ kg de ${L[k][1]}s`
        } else {
          texte += `$${texNombre(L[k][0])}$ ${L[k][1]}`
          if (L[k][0] > 1) { texte += 's' }
        }
        if (k < m - 2) { texte += ', ' }
        if (k === m - 2) { texte += ' et ' }
      }
      texte += '. <br>'
    }
    texte += '<br>'
    texte += numAlpha(0) + ' Remplir le tableau suivant. <br>'

    if (this.sup) {
      texte += numAlpha(1) + ' Quelle est la masse totale de fruits achetés par les amis ? <br>'
    } else {
      texte += numAlpha(1) + ' Quel est le nombre total de fruits achetés par les amis ? <br>'
    }
    texte += numAlpha(2) + ' Qui a rapporté le plus de fruits ? <br>'
    texte += numAlpha(3) + ' Quel fruit a été rapporté en la plus grosse quantité ? <br><br>'

    texte += '$\\begin{array}{|l|' + 'c|'.repeat(nbFruits + 1) + '}\n'
    texte += '\\hline\n'
    texte += ' '
    for (let j = 0; j < nbFruits; j++) {
      texte += ' & \\textbf{\\text{' + premiereLettreEnMajuscule(lstFruitExo[j]) + '}}'
    }
    texte += '& \\textbf{TOTAL}'
    texte += '\\\\\\hline\n'
    for (let i = 0; i < nbAmis; i++) {
      texte += `\\textbf{\\text{${lstPrenomExo[i]}}}` + '& '.repeat(nbFruits) + ' & '
      texte += '\\\\\\hline\n'
    }
    texte += '\\textbf{TOTAL}' + '& '.repeat(nbFruits) + ' & '
    texte += '\\\\\\hline\n'
    texte += '\\end{array}\n$'

    // CORRECTION
    // Question 1 :
    texteCorr = numAlpha(0) + ' Voici le tableau complet. <br>'
    texteCorr += '$\\begin{array}{|l|' + 'c|'.repeat(nbFruits + 1) + '}\n'
    texteCorr += '\\hline\n'
    texteCorr += ' '
    for (let j = 0; j < nbFruits; j++) {
      texteCorr += ` & \\text{${lstFruitExo[j]}}`
    }
    texteCorr += '& TOTAL'
    texteCorr += '\\\\\\hline\n'
    for (let i = 0; i < nbAmis; i++) {
      texteCorr += `\\text{${lstPrenomExo[i]}}`
      let S = 0 // pour calculer les sommes
      for (let j = 0; j < nbFruits; j++) {
        texteCorr += '& ' + texNombre(lstTabVal[i][j]) // valeur dans le tableau
        S += lstTabVal[i][j] // somme d'une ligne
      }
      texteCorr += '& ' + texNombre(S)
      texteCorr += '\\\\\\hline\n'
    }
    texteCorr += 'TOTAL'
    let SommeTotale = 0 // somme totale de tous les fruits
    for (let j = 0; j < nbFruits; j++) {
      S = 0
      for (let i = 0; i < nbAmis; i++) {
        S += lstTabVal[i][j] // somme d'une colonne
      }
      // texteCorr += '& ' + Math.round(S*10)/10;
      texteCorr += '& ' + texNombre(S, 1)
      // texteCorr += '& ' + texNombre(S,1);
      SommeTotale += S
    }
    texteCorr += '& ' + texNombre(SommeTotale)
    texteCorr += '\\\\\\hline\n'
    texteCorr += '\\end{array}\n$'
    texteCorr += '<br>'

    // Question 2 :
    SommeTotale = texNombre(SommeTotale)
    if (this.sup) {
      texteCorr += numAlpha(1) + ` La masse totale de fruits est : $${SommeTotale}$ kg. <br>`
    } else {
      texteCorr += numAlpha(1) + ` Le nombre total de fruits est : ${SommeTotale}. <br>`
    }

    // Question 3 :
    texteCorr += numAlpha(2) + ' On regarde la dernière colonne du tableau. '
    let lstmax = [] // liste des prénoms solutions
    let nmax = 0 // nombre max de fruit pour une personne
    for (let i = 0; i < nbAmis; i++) {
      S = 0
      for (let j = 0; j < nbFruits; j++) {
        S += lstTabVal[i][j] // somme d'une ligne
      }
      if (S === nmax) {
        lstmax.push(lstPrenomExo[i])
      }
      if (S > nmax) {
        nmax = S
        lstmax = [lstPrenomExo[i]]
      }
    }
    nmax = texNombre(nmax, 1)
    if (lstmax.length > 1) {
      texteCorr += 'Les personnes qui ont rapporté le plus de fruits sont : '
      texteCorr += lstmax[0]
      for (let k = 1; k < lstmax.length; k++) {
        texteCorr += ` et ${lstmax[k]}`
      }
      if (this.sup) {
        texteCorr += `. La masse maximale rapportée est de $${nmax}$ kg.<br>`
      } else {
        texteCorr += `. Le nombre maximal de fruits rapporté par une personne est de $${nmax}$.<br>`
      }
    } else {
      if (this.sup) {
        texteCorr += `La personne qui a rapporté le plus de fruits est ${lstmax}. Cette masse maximale est de $${nmax}$ kg.<br>`
      } else {
        texteCorr += `La personne qui a rapporté le plus de fruits est ${lstmax}. Ce nombre maximal de fruits est de $${nmax}$.<br>`
      }
    }

    // Question 4 :
    texteCorr += numAlpha(3) + ' On regarde la dernière ligne du tableau. '
    let fmax = [] // liste des fruits apporté en quantité max
    nmax = 0 // nombre max par type de fruit
    for (let j = 0; j < nbFruits; j++) {
      S = 0
      for (let i = 0; i < nbAmis; i++) {
        S += lstTabVal[i][j] // somme d'une colonne
      }
      if (S === nmax) {
        fmax.push(lstFruitExo[j])
      }
      if (S > nmax) {
        nmax = S
        fmax = [lstFruitExo[j]]
      }
    }
    nmax = texNombre(nmax, 1)
    if (fmax.length > 1) {
      if (this.sup) {
        texteCorr += 'Les fruits présents en la plus grosse quantité sont : '
      } else {
        texteCorr += 'Les fruits les plus nombreux sont : '
      }
      texteCorr += 'Les fruits les plus nombreux sont : '
      texteCorr += `les ${fmax[0]}s`
      for (let k = 1; k < fmax.length; k++) {
        texteCorr += ` et les ${fmax[k]}s`
      }
      texteCorr += `. Il y en a $${nmax}$ de chaque sorte.<br>`
    } else {
      if (this.sup) {
        texteCorr += `Il y a plus de ${fmax}s que d'autres fruits. Il y en a $${nmax}$ kg.`
      } else {
        texteCorr += `Il y a plus de ${fmax}s que d'autres fruits. Il y en a $${nmax}$.`
      }
    }

    this.listeQuestions.push(texte)
    this.listeCorrections.push(texteCorr)
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaire2Numerique = ['Nombre de fruits différents', 8]
  this.besoinFormulaireCaseACocher = ['Pour utiliser des nombres décimaux et des masses', false]
}