Donnez vie à vos documents numériques !
 

Affichage aléatoire

abracadabraPDF Forums PDF – Général Affichage aléatoire

  • Créateur
    Sujet
  • #73697
    michel c.
    Participant

    Bonjour, je travaille sur un nouveau document dans lequel il y a 2 listes en vis à vis : à gauche une liste de questions et à droite la liste de réponses correspondant aux questions.

    J’aimerais faire plusieurs choses :

    • lorsque l’élève clique sur démarrer, une question arrive de manière aléatoire.
    • lorsqu’il répond juste, une nouvelle question apparaisse de manière aléatoire
    • lorsqu’il répond faux, cela lui soit signalé par une boite de dialogue avec la correction
    • que les questions auxquelles il a répondu juste arrivent de manière moins fréquentes
    • qu’un tableau comptabilise son pourcentage de réussite.
    • que les listes des questions/réponses soient cachées dès le démarrage.

    Je pense arriver à faire ce que j’ai surligné en vert mais je ne sais pas trop comment m’y prendre pour ce que j’ai mis en rouge.

    Merci

     

    • Ce sujet a été modifié le il y a 4 mois et 2 semaines par michel c..
    • Ce sujet a été modifié le il y a 4 mois et 2 semaines par michel c..
    Attachments:
    You must be logged in to view attached files.
Affichage de 12 réponses de 1 à 12 (sur un total de 12)
  • Auteur
    Réponses
  • #73704
    bebarth
    Maître des clés

    bonjour,
    Voici ce que je te propose.
    On met les questions et réponses dans un champ liste ce qui permet de n’avoir qu’un champ au lieu de 2. On pourrait également définir  une table dans le script avec les questions et les réponses.

    Donc, pour répondre aux 2 points indiqués en rouge :
    // Script de calcul "Button1"
    var f=this.getField("entreesListe");
    var nb=f.numItems;
    if (reponses==null) {
    var reponses=[];
    for (var i=0; i<nb; i++) reponses.push([f.getItemAt(i,true),0]);
    }
    var moyenne=0;
    for (var i=0; i<nb; i++) moyenne+=reponses[1]; moyenne/=reponses.length; var aleatoire=Math.floor(Math.random()*nb); while (reponses[aleatoire][1]>moyenne) var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion=f.getItemAt(aleatoire,false);
    var laReponse=f.getItemAt(aleatoire,true);
    this.getField("Reponse").setItems(reponses);
    this.getField("Question").value=laQuestion;

    // Script de touches personnalisé "Reponse"
    if (!event.willCommit) {
    if (event.change!=laReponse) app.alert("Erreur !!!\rLa bonne réponse est : "+laReponse,3);
    else {
    reponses[aleatoire][1]=Number(event.changeEx)+1;
    this.getField("Reponse").setItems(reponses);
    }
    }

    @+
    😎

    • Cette réponse a été modifiée le il y a 4 mois et 2 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #73710
    michel c.
    Participant

    Merci, j’ai essayé de modifier ce que tu propose pour que les questions/réponses soient éditables dans un champ texte (question et réponse sont séparées par un “/”).

    Mais je n’arrive pas à faire apparaître aléatoirement la question ni à avoir les valeurs exportées dans les réponses.

    Attachments:
    You must be logged in to view attached files.
    #73716
    bebarth
    Maître des clés

    bonsoir,
    Voici les différents script pour rester dans le même principe.

    // Script de document
    var reponses=[];
    var nbQuestions=0;
    var nbReponses=0;
    this.getField("Reponse").setItems(["-"]);
    this.getField("Question").value="";
    this.getField("Score").value="";

    // Script de calcul "Démarrer"
    if (reponses==null) {
    var lesReponses=this.getField("entreesListe").value.split("\r");
    var nb=lesReponses.length;
    var reponses=[];
    for (var i=0; i<nb; i++) {
    lesReponses=lesReponses.split("\/");
    reponses.push([lesReponses[1],0]);
    }
    }
    var moyenne=0;
    for (var i=1; i<nb; i++) moyenne+=reponses[1];
    moyenne/=(reponses.length-1);
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion="-";
    while (reponses[aleatoire][1]>moyenne || laQuestion=="-") {
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion=lesReponses[aleatoire][0];
    var laReponse=lesReponses[aleatoire][1];
    }
    this.getField("Reponse").setItems(reponses);
    this.getField("Question").value=laQuestion;

    // Script de touches personnalisé "Reponse"
    if (!event.willCommit) {
    nbQuestions++;
    if (event.change!=laReponse) app.alert("Erreur !!!\rLa bonne réponse est : "+laReponse,3);
    else {
    reponses[aleatoire][1]=Number(event.changeEx)+1;
    this.getField("Reponse").setItems(reponses);
    nbReponses++;
    }
    }

    // Script de calcul "vérifier"
    if (reponses!=null) this.getField("Score").value=nbReponses+"/"+nbQuestions;

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #73719
    michel c.
    Participant

    Merci, j’ai un message d’erreur à la console lors du clic demarrer : à la ligne 15 : Field:Mouse Up:15: TypeError: reponses[aleatoire] is undefined

    Je ne comprend pas pourquoi d’ailleurs, la variable aleatoire est déclarée à la ligne 13

    Je cherche comment y remedier

    • Cette réponse a été modifiée le il y a 4 mois et 2 semaines par michel c..
    #73721
    bebarth
    Maître des clés

    bonjour,
    Je vois ! En fait j’ai rajouté le script de document à la dernière minute avant d’envoyer le fichier et sans le tester… Erreur de débutant lol
    Du coup, la table “reponses” est déclarée à l’ouverture du document et if (reponses==null) n’est plus vrai.
    J’ai donc modifié légèrement les scripts :

    // Script de document
    var reponses=[];
    var nbQuestions=0;
    var nbReponses=0;
    this.getField("Reponse").setItems(["-"]);
    this.getField("Question").value="";
    this.getField("Score").value="";

    // Script de calcul "Démarrer"
    if (!reponses.length) {
    var lesReponses=this.getField("entreesListe").value.split("\r");
    var nb=lesReponses.length;
    var reponses=[];
    for (var i=0; i<nb; i++) {
    lesReponses=lesReponses.split("\/");
    reponses.push([lesReponses[1],0]);
    }
    }
    var moyenne=0;
    for (var i=1; i<nb; i++) moyenne+=reponses[1];
    moyenne/=(reponses.length-1);
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion="-";
    while (reponses[aleatoire][1]>moyenne || laQuestion=="-") {
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion=lesReponses[aleatoire][0];
    var laReponse=lesReponses[aleatoire][1];
    }
    this.getField("Reponse").setItems(reponses);
    this.getField("Question").value=laQuestion;

    // Script de touches personnalisé "Reponse"
    if (!event.willCommit) {
    nbQuestions++;
    if (event.change!=laReponse) app.alert("Erreur !!!\rLa bonne réponse est : "+laReponse,3);
    else {
    reponses[aleatoire][1]=Number(event.changeEx)+1;
    this.getField("Reponse").setItems(reponses);
    nbReponses++;
    }
    }

    // Script de calcul "vérifier"
    if (reponses.length) this.getField("Score").value=nbReponses+"/"+nbQuestions;

    … et ce coup ci c’est testé !

    Il y a juste à voir comment se compte le nombre de question. Dans mon script il est incrémenté par la réponse (correcte ou mauvaise). Si l’utilisateur clique plusieurs fois sur “Démarrer” sans répondre, le nombre de question n’augmente pas.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #73727
    michel c.
    Participant

    Merci pour cette version, je n’y serais pas arrivé tout seul.

    J’ai modifié le document pour permettre 2 types de réponses : Champ texte ou liste déroulante

    et dans chaque cas, un problème survient :

    Pour la liste de réponse, est il possible d’éliminer les doublons dans la liste de réponse et de classer les éléments de la liste par ordre alphanumérique ?

    Pour les réponses type Champ Texte, comme la vérification est en action de frappe, si la réponse saisie contient plusieurs caractères, cela va afficher le message d’erreur dès la frappe du 1er caractère.

    Dernier souci, j’ai remarqué que lorsque je génère les questions, cela fonctionne seulement si je sauvegarde, ferme puis ouvre le document.

    J’essaye de trouver des solutions pour les 2 premiers problèmes. Pour le dernier, je ne pense pas y arriver.

    Merci

    Attachments:
    You must be logged in to view attached files.
    #73729
    michel c.
    Participant

    Pour les réponses de type champ texte, je crois avoir réussi en modifiant le script du bouton valider.

    Par contre, lorsque l’on répond par la liste déroulante, cela ne marche pas, les valeurs exportées dans la liste ne sont pas les bonnes et je ne sais pas pourquoi.

    Attachments:
    You must be logged in to view attached files.
    #73731
    bebarth
    Maître des clés

    bonjour,

    Pour la liste de réponse, est il possible d’éliminer les doublons dans la liste de réponse et de classer les éléments de la liste par ordre alphanumérique ?

    J’avais écris une fonction il y a quelques années… Je l’ai donc adaptée pour ton script !
    Dans l’exemple j’ai ajouté plusieurs doublons pour montrer ce que ça donne.

    Pour les réponses type Champ Texte, comme la vérification est en action de frappe, si la réponse saisie contient plusieurs caractères, cela va afficher le message d’erreur dès la frappe du 1er caractère.

    Vu que pour le type de champ Liste le script est en script de touches personnalisé, il n’est exécuté que lorsque l’évènement vient de ce champ liste. Si On utilise un champ Texte pour indiquer la réponse, il faut d’abord vérifier que l’évènement vient de ce champ (cf. le script de calcul “Rep”).

    Dernier souci, j’ai remarqué que lorsque je génère les questions, cela fonctionne seulement si je sauvegarde, ferme puis ouvre le document.

    Ça c’est normal vu que l’initialisation du champ se fait avec le bouton démarrer par “if (!reponses.length)” et qu’en script de document on a “var reponses=[];”
    Avec ton bouton “generateur” on peut maintenant réinitialiser la liste.

    Pour le bonton “vérifier” j’ai retire le message “Erreur…” car il est déjà affiché directement si la réponse n’est pas correcte que ce soit via une liste ou un champ texte.

    Voici les scripts :

    // Script de document
    var reponses=[];
    var nbQuestions=0;
    var nbReponses=0;
    this.getField(“Reponse”).setItems([“-“]);
    this.getField(“Question”).value=””;
    this.getField(“Score”).value=””;
    this.getField(“Score”).value=””;

    // Script de calcul “Démarrer”
    if (!reponses.length) {
    var lesReponses=this.getField(“entreesListe”).value.split(“\r”);
    function triSansDoublons(uneTable) {
    return uneTable.sort().filter(function(valeur, indice, cetteTable) {
    return !indice || valeur!=cetteTable[indice-1];
    });
    }
    var lesReponses=triSansDoublons(lesReponses);
    this.getField(“entreesListe”).value=lesReponses.toString().replace(/[,]/g,”\r”);
    var nb=lesReponses.length;
    var reponses=[];
    for (var i=0; i<nb; i++) {
    lesReponses=lesReponses.split(“\/”);
    reponses.push([lesReponses[1],0]);
    }
    }
    var moyenne=0;
    for (var i=1; i<nb; i++) moyenne+=reponses[1];
    moyenne/=(reponses.length-1);
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion=”-“;
    while (reponses[aleatoire][1]>moyenne || laQuestion==”-“) {
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion=lesReponses[aleatoire][0];
    var laReponse=lesReponses[aleatoire][1];
    }
    this.getField(“Reponse”).setItems(reponses);
    this.getField(“Question”).value=laQuestion;
    this.getField(“Score”).value=””;

    // Script de touches personnalisé “Reponse”
    if (!event.willCommit) {
    nbQuestions++;
    if (event.change!=laReponse) app.alert(“Erreur !!!\rLa bonne réponse est : “+laReponse,3);
    else {
    reponses[aleatoire][1]=Number(event.changeEx)+1;
    this.getField(“Reponse”).setItems(reponses);
    nbReponses++;
    }
    }

    // Script de calcul “Rep”
    if (event.source && event.source.name==event.target.name) {
    nbQuestions++;
    if (event.value!=laReponse) app.alert(“Erreur !!!\rLa bonne réponse est : “+laReponse,3);
    else {
    reponses[aleatoire][1]=reponses[aleatoire][1]+1;
    nbReponses++;
    }
    }

    // Script de calcul “vérifier”
    if (reponses.length) this.getField(“Score”).value=” • Nombre de bonnes réponses : ” +nbReponses+”\r”+” • Nombre d’erreurs : ” +(nbQuestions-nbReponses)+”\r”+” • Nombre de questions : ” +nbQuestions+”\r”+” • Taux de réussite : ” +(Math.round((100*nbReponses/nbQuestions) * 100) / 100).toString().replace(/[.]/,”,”)+” %”;

    // Script de calcul “geberateur”
    var lesReponses=this.getField(“entreesListe”).value.split(“\r”);
    function triSansDoublons(uneTable) {
    return uneTable.sort().filter(function(valeur, indice, cetteTable) {
    return !indice || valeur!=cetteTable[indice-1];
    });
    }
    var lesReponses=triSansDoublons(lesReponses);
    this.getField(“entreesListe”).value=lesReponses.toString().replace(/[,]/g,”\r”);
    var nb=lesReponses.length;
    var reponses=[];
    for (var i=0; i<nb; i++) {
    lesReponses=lesReponses.split(“\/”);
    reponses.push([lesReponses[1],0]);
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #73733
    michel c.
    Participant

    Merci beaucoup, c’est nickel. Je suis en train d’apporter quelques améliorations, mais j’ai déjà une très bonne base grâce à toi.

    Peux tu m’expliquer les quelques lignes qui permettent d’afficher une question aléatoirement mais avec une plus grande fréquence pour les réponses erronées.

    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion="-";
    while (reponses[aleatoire][1]>moyenne || laQuestion=="-") {
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion=lesReponses[aleatoire][0];
    var laReponse=lesReponses[aleatoire][1];
    }

    Je voudrais savoir ce qui se passe si l’utilisateur ne répond pas et affiche une nouvelle question. Est ce que la question qu’il a sautée reviendra plus fréquemment également.

    Merci

     

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par michel c..
    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par michel c..
    Attachments:
    You must be logged in to view attached files.
    #73737
    michel c.
    Participant

    Je viens de constater qu’il y a encore des doublons pour les réponses sous forme de liste. De plus lors de la création de la liste par ordre alphanumérique, est il possible d’avoir le 10 après le 9 et non entre le 1 et le 2 ou c’est trop complexe?

    Merci

    Attachments:
    You must be logged in to view attached files.
    #73739
    bebarth
    Maître des clés

    bonjour,

    Je viens de constater qu’il y a encore des doublons pour les réponses sous forme de liste.

    J’ai essayé mais je ne trouve pas de doublons !

    De plus lors de la création de la liste par ordre alphanumérique, est il possible d’avoir le 10 après le 9 et non entre le 1 et le 2 ou c’est trop complexe?

    C’est possible mais ça va compliquer le script. Ici les questions (ex. : “3×10”) sont des chaines de caractères. Pour les trier comme tu le souhaite il faudrait transformer chaque chaine en table coupée au “x” (ex. : [3,10]) puis trier sur le deuxième élément de la table et finir par retransformer la table en chaine de caractères .toString() et remplacer la virgule par un “x”.
    Ce n’est pas très compliqué, mais le script sera différent si tu veux changer les questions par des soustractions, divisions ou additions…

    @+
    😎

    #73740
    bebarth
    Maître des clés

    Peux tu m’expliquer les quelques lignes qui permettent d’afficher une question aléatoirement mais avec une plus grande fréquence pour les réponses erronées.

    Lorsque l’on crée le menu déroulant depuis la table “reponses”, la valeur d’exportation de chaque élément est mise à 0. Cette valeur représente le nombre de réponses exactes pour cette question et est incrémentée lorsque la réponse est correcte.
    var moyenne=0;
    for (var i=1; i<nb; i++) moyenne+=reponses[1];
    moyenne/=(reponses.length-1);
    signifie que l’on fait la moyenne de toutes ces valeurs d’exportation, et “for (var i=1…” et non i=0 car on ne tient pas compte de la première ligne “-/-“. Idem pour “…length-1);
    var aleatoire=Math.floor(Math.random()*nb);
    Bon ben ça c’est un nombre aléatoire sur le nombre d’éléments de la table “reponses”.
    while (reponses[aleatoire][1]>moyenne || laQuestion=="-") {
    var aleatoire=Math.floor(Math.random()*nb);
    var laQuestion=lesReponses[aleatoire][0];
    var laReponse=lesReponses[aleatoire][1];
    }
    …et ça c’est une boucle. Tant que le deuxième élément ([1]) de l’élément à la position [aleatoire] de la table “reponses” est supérieure à la moyenne, ou si laQuestion==”-“, on recommence le tirage d’un nombre aléatoire.
    L’explication est un peu compliquée je suppose… J’espère que tu as compris !

    @+
    😎

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par bebarth.
Affichage de 12 réponses de 1 à 12 (sur un total de 12)
  • Vous devez être connecté pour répondre à ce sujet.