Donnez vie à vos documents numériques !
 

Raccourcir une condition

abracadabraPDF Forums PDF – Général Raccourcir une condition

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

    Bonjour, j’ai une condition if qui est assez longue et je me demandais si il y avait une fonction qui me permettrait de simplifier son écriture.

    var RepUser2 = (this.getField("RepEt.2").value);

    if (RepUser2 == this.getField("NB.3").value+"×"+this.getField("NB.2").value | this.getField("NB.2").value+"×"+this.getField("NB.3").value | this.getField("NB.3").value+"*"+this.getField("NB.2").value | this.getField("NB.2").value+"*"+this.getField("NB.3").value | this.getField("NB.3").value+" × "+this.getField("NB.2").value | this.getField("NB.2").value+" × "+this.getField("NB.3").value | this.getField("NB.3").value+" * "+this.getField("NB.2").value | this.getField("NB.2").value+" * "+this.getField("NB.3").value |  this.getField("NB.2").value*this.getField("NB.3").value)

     

    Merci

    • Ce sujet a été modifié le il y a 5 mois et 4 semaines par michel c..
Affichage de 20 réponses de 1 à 20 (sur un total de 20)
  • Auteur
    Réponses
  • #73403
    Merlin
    Maître des clés

    Bonjour

     

    Je l’écrirais plutôt comme ça :

    var vC2 = this.getField("NB.2").valueAsString;
    var vC3 = this.getField("NB.3").valueAsString;
    if (RepUser2 == (vC2 + ("×" || "*" || " × " || " * ") + vC3) || (vC3 + ("×" || "*" || " × " || " * ") + vC2) || (Number(vC2) * Number(vC3))) {}

    #73414
    michel c.
    Participant

    Merci beaucoup, ça fonctionne. par contre j’ai du remplacer .valueAsString par .value

    #73536
    michel c.
    Participant

    Finalement, je ne comprend pas pourquoi ça ne marche plus. En fait toutes les réponses sont validées, exactes ou pas ….

     

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

    bonjour,
    Je vois 2 erreurs :
    var RepUser2 = this.getField("RepUser<span style="color: #ff9900;">2</span>").valueAsString;

    ...
    if (RepUser2 == (vC2 + ("×" || "*" || " × " || " * ") + vC3) || <span style="color: #ff9900;">RepUser2 ==</span> (vC3 + ("×" || "*" || " × " || " * ") + vC2) || <span style="color: #ff9900;">RepUser2 ==</span> (Number(vC2) * Number(vC3))<span style="color: #ff0000;"><del> && vC1</del></span>)...

    Ici j’ai retiré “&& vC1” car je ne sais pas ce que tu veux vérifier…
    Tu testes et tu me dis !

    @+
    😎

    #73539
    michel c.
    Participant

    Oui, ça a marché.

    Merci

    #73540
    bebarth
    Maître des clés

    Ça fonctionne si on indique le résultat mais pas si on écrit la multiplication.
    Voici un script qui vérifie tous les cas :
    var vC2=this.getField("NB.2").valueAsString;
    var ReGex2=new RegExp(vC2);
    var vC3=this.getField("NB.3").valueAsString;
    var ReGex3=new RegExp(vC3);
    var RepUser2=this.getField("RepUser2").valueAsString;;
    if ((ReGex2.test(RepUser2) && ReGex3.test(RepUser2) && /^\d+\s*([*]|[x])\s*\d+$/.test(RepUser2)) || RepUser2==Number(vC2)*Number(vC3)) app.alert({cMsg:"Bravo !", nIcon:2});
    else app.alert({cMsg:"Erreur !", nIcon:2});

    @+
    😎

    En fait cette version fonctionne lorsque le résultat est correct mais également avec de mauvaises réponses lorsqu’on indique l’opération.
    Le script vérifie que les 2 nombres vC2 et vC3 sont présents dans le résultat et qu’il y a bien un signe pour la multiplication, mais si un des nombres est composé des 2 valeurs vC2 et vC3 et que le second nombre est incorrect il indique la réponse comme bonne… alors que ce n’est pas le cas !

    • Cette réponse a été modifiée le il y a 5 mois et 2 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #73543
    bebarth
    Maître des clés

    bonjour,
    Voici donc une version qui devrait correspondre à ce que tu cherches à faire :
    var vC2=this.getField("NB.2").valueAsString;
    var vC3=this.getField("NB.3").valueAsString;
    var RepUser2=this.getField("RepUser2").valueAsString.replace(/\s+/g,"").replace(/[x]/,"*").split("*");
    var OK=0;
    if (RepUser2.length==2 && ((vC2==RepUser2[0] && vC3==RepUser2[1]) || (vC2==RepUser2[1] && vC3==RepUser2[0]))) OK++;
    else if (RepUser2.length==1 && RepUser2==Number(vC2)*Number(vC3)) OK++;
    if (OK) app.alert({cMsg:"Bravo !", nIcon:2});
    else app.alert({cMsg:"Erreur !", nIcon:2});

    @+
    😎

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

    Bonjour, pas testé cette dernière version mais la précédente marchait bien il me semble (j’y ai apporté quelques modifs pour l’adapter à ce que je souhaitais).

    Je met le fichier en pj (attention, c’est une usine à gaz comme à mon habitude)

    Le script est affecté au bouton vérifier de gauche (le 1er) pour le niveau de difficulté 5  → if (diff ==5)

    Sinon, je reconnais que je ne comprend pas cette ligne : var RepUser2=this.getField("RepUser2").valueAsString.replace(/\s+/g,"").replace(/[x]/,"*").split("*");

    Et celle-ci :

    if (RepUser2.length==2 && ((vC2==RepUser2[0] &&
    vC3==RepUser2[1]) || (vC2==RepUser2[1] && vC3==RepUser2[0])))
    OK++;

    Merci

    Equations

    J’ai un autre souci avec ce fichier, pour le niveau de difficulté 6 et le script de document equation.

    Si je remplace la condition if (diff ==6 ) par ce bout de script

    if (diff == 6) {
    this.getField("et.1").value = "Etape 1 : indiquer la valeur de "+VarEq+" sous forme de fraction sans la réduire pour l'instant.";
    //declaration de l'équation aléatoirement
    var OpAl=Math.round(Math.random()*1)+1;
    this.getField("OP").value = OpAl;

    //declaration aléatoire de l'opérateur après terme x & affichage de l'équation
    //++++++++++++++
    if (OpAl == 1) {var OP = "+";
    while (c-b*d == 0) {
    var a=Math.round(Math.random()*7)+2;
    var b=Math.round(Math.random()*9)+1;
    var c=Math.round(Math.random()*8)+1;
    var d=Math.round(Math.random()*9)+1;
    }
    this.getField("NB.1").value = a;
    this.getField("NB.2").value = b;
    this.getField("NB.3").value = c;
    this.getField("NB.4").value = d;

    this.getField("help.0").value = "→ Multiplier l'équation par ("+a+VarEq+"+"+b+") dans un premier temps.";
    console.println("→ Multiplier l'équation par ("+a+VarEq+"+"+b+") dans un premier temps.");}
    if (OpAl == 2) {var OP = "-";
    while (c+b*d == 0) {
    var a=Math.round(Math.random()*7)+2;
    var b=Math.round(Math.random()*9)+1;
    var c=Math.round(Math.random()*8)+1;
    var d=Math.round(Math.random()*9)+1;
    }
    this.getField("NB.1").value = a;
    this.getField("NB.2").value = b;
    this.getField("NB.3").value = c;
    this.getField("NB.4").value = d;

    this.getField("help.0").value = "→ Multiplier l'équation par ("+a+VarEq+"-"+b+") dans un premier temps.";
    console.println("→ Multiplier l'équation par ("+a+VarEq+"+"+b+") dans un premier temps.");}
    this.getField("eqET0").value = c+"/("+a+VarEq+OP+b+") = "+d;
    this.getField("help.1").value = "→ Diviser l'équation par "+d+" puis isoler "+VarEq;
    this.getField("RepEt.1").readonly = false;
    this.getField("RepEt.2").readonly = false;
    this.getField("eqET0").display = display.visible;
    this.getField("RepEt.1").display = display.visible;
    this.getField("RepEt.2").display = display.visible;
    this.getField("verif.0").display = display.visible;
    }

    Cela me génère une erreur : La valeur entrée ne correspond pas au format du champ.

    Merci

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

    bonjour,

    Bonjour, pas testé cette dernière version mais la précédente marchait bien il me semble

    Il fonctionne mais également pour des réponses incorrectes. Ce script vérifie que les 2 nombres vC2 et vC3 sont présents et qu’il y a un signe de multiplication (x ou *) entre 2 nombres. Mais si par exemple la réponse correcte est 3×5, il valide également 35 x 11 car il y a bien un 3, un 5 et un signe entre 2 nombres…

    Sinon, je reconnais que je ne comprend pas cette ligne : var RepUser2=this.getField("RepUser2").valueAsString.replace(/\s+/g,"").replace(/[x]/,"*").split("*");

    Ici la variable RepUser2 va être transformée en une table de 1 ou 2 cellules selon la réponse (un nombre ou une opération).
    replace(/\s+/g,"") On supprime tous les espaces.
    replace(/[x]/,"*") On remplace l’éventuel signe de multiplication “x” en “*”.
    split("*") On transforme la chaine de caractères en table avec “*” comme séparateur de cellules.

    Et celle-ci : if (RepUser2.length==2 && ((vC2==RepUser2[0] && vC3==RepUser2[1]) || (vC2==RepUser2[1] && vC3==RepUser2[0]))) OK++;

    if (RepUser2.length==2... Si la table à 2 valeurs c’est que le résultat est une opération (si elle en a qu’une c’est le résultat de l’opération)
    && ((vC2==RepUser2[0] && vC3==RepUser2[1]) vC2) est égale à la première cellule de ta table et vC3 à la seconde…
    || (vC2==RepUser2[1] && vC3==RepUser2[0])) ou l’inverse…
    ) OK++; la variable “OK” (initialement 0) est incrémentée.

    J’ai un autre souci avec ce fichier…

    Je regarde plus tard !

    @+
    😎

    #73555
    bebarth
    Maître des clés

    Désolé, mais toi tu es dans ton script et tu connais certainement par cœur les variables et ce que tu veux faire, mais à moins de déchiffrer tous tes scripts je suis un peu perdu !!!
    Quand la variable “diff” est-elle incrémentée et devient-elle égale à 6 ?
    Que souhaites-tu faire exactement avec ce script ?

    @+
    😎

    #73556
    michel c.
    Participant

    La variable diff est affectée de la valeur du champ Menu.5 ; il s’agit du niveau de difficulté, qui va modifier le type d’équation généré.

    lorsque diff == 6, l’équation peut avoir 2 types :

    • c/(ax+b) =d ; quand la variable OpAl == 1 (dans le script équation)
    • c/(ax-b) =d ; quand la variable OpAl == 2 (dans le script équation)
    • la variable OpAl peut prendre la valeur 1 ou 2 de façon aléatoire et les variables a, b, c et d sont générées aléatoirement également.

    Mon problème c’est que les scripts (affectés aux champs num et den) qui permettent la décomposition des nombres en produit de facteurs premiers font bugger le programme lorsque le numérateur ou le dénominateur sont = 0.

    Je voudrais donc éviter la valeur 0 pour le numérateur et le dénominateur lorsque les variables a, b, c et d sont générées.

    Concrètement,

    • quand OpAl ==1, ma solution de l’équation est x=(c-bd)/ad donc dans ce cas, il ne faut pas que c-b*d =0
    • quand OpAl ==2, ma solution de l’équation est x=(c+bd)/ad donc dans ce cas, il ne faut pas que c+b*d =0

    D’ou ce code :

    if (OpAl == 1) {var OP = "+";
    while (c-b*d == 0) {
    var a=Math.round(Math.random()*7)+2;
    var b=Math.round(Math.random()*9)+1;
    var c=Math.round(Math.random()*8)+1;
    var d=Math.round(Math.random()*9)+1;
    }
    this.getField("NB.1").value = a;
    this.getField("NB.2").value = b;
    this.getField("NB.3").value = c;
    this.getField("NB.4").value = d;

    this.getField("help.0").value = "→ Multiplier l'équation par ("+a+VarEq+"+"+b+") dans un premier temps.";
    console.println("→ Multiplier l'équation par ("+a+VarEq+"+"+b+") dans un premier temps.");}
    if (OpAl == 2) {var OP = "-";
    while (c+b*d == 0) {
    var a=Math.round(Math.random()*7)+2;
    var b=Math.round(Math.random()*9)+1;
    var c=Math.round(Math.random()*8)+1;
    var d=Math.round(Math.random()*9)+1;
    }
    this.getField("NB.1").value = a;
    this.getField("NB.2").value = b;
    this.getField("NB.3").value = c;
    this.getField("NB.4").value = d;

    Qui me permettrait pensais-je d’éviter ces valeurs lors de la génération des variables aléatoires, mais lorsque je teste, j’ai ce message d’erreur : La valeur entrée ne correspond pas au format du champ.

    J’ai essayé de mettre uniquement mon problème dans ce fichier (je pense que ça vient de là).

    • Cette réponse a été modifiée le il y a 5 mois et 1 semaine par michel c..
    • Cette réponse a été modifiée le il y a 5 mois et 1 semaine par michel c..
    • Cette réponse a été modifiée le il y a 5 mois et 1 semaine par michel c..
    Attachments:
    You must be logged in to view attached files.
    #73561
    bebarth
    Maître des clés

    Dans un premier temps, il faut initialiser tes variables a, b, c et d avant d’effectuer la première boucle “while” !

    Tu me dis si ça fonctionne ensuite…

    @+
    😎

    #73562
    bebarth
    Maître des clés

    …sinon tu peux réduire un peu le script :
    var OpAl=Math.round(Math.random()*1)+1;
    var a=0;
    var b=0;
    var c=0;
    var d=0;
    while (c==0 || b==0 || d==0) {
    var a=Math.round(Math.random()*7)+2;
    var b=Math.round(Math.random()*9)+1;
    var c=Math.round(Math.random()*8)+1;
    var d=Math.round(Math.random()*9)+1;
    }
    if (OpAl==1) var num=(c-b*d);
    else var num=(c+b*d);
    var den=(a*d);
    this.getField("numOk").value=num;
    this.getField("denOk").value=den;
    this.getField("NB.1").value=a;
    this.getField("NB.2").value=b;
    this.getField("NB.3").value=c;
    this.getField("NB.4").value=d;

    Ici, la notation équivaut à var num=c+(b*d) ou var num=c-(b*d)

    @+
    😎

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

    bonjour,
    Une petite erreur…

    Ici, la notation équivaut à var num=c+(b*d) ou var num=c-(b*d)

    Il faut donc écrire :
    ...
    while (c-b*d==0 || c+b*d==0) {
    ...

    Même si “c+b*d==0” avec des nombres aléatoires ne doit pas être fréquent !

    @+
    😎

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

    Merci beaucoup, tout a l’air de fonctionner ! et j’aurais appris encore des trucs.

    Juste pour avoir plus de détails :

    replace(/\s+/g,””) On supprime tous les espaces. → quelle est le rôle de /, celui de \s celui de +/g…

    Sinon, je ne comprend pas encore bien les tables. Si l’on avait 2*45×8×9 comme valeur saisie dans le champs RepUser2, cette ligne de code :

    var RepUser2=this.getField(“RepUser2″).valueAsString.replace(/\s+/g,””).replace(/[x]/,”*”).split(“*”);

    Transformerait la variable RepUser2 en table qui serait composée de 4 éléments que l’on pourrait rappeler ainsi :

    → RepUser2[0]

    → RepUser2[1]

    → RepUser2[2]

    → RepUser2[3]

    C’est bien ça ?

    #73570
    Merlin
    Maître des clés

    “replace(/\s+/g,””) On supprime tous les espaces. → quelle est le rôle de /, celui de \s celui de +/g…”

    C’est du GREP.

    \s signifie : n’importe quelle espace (en typographie l’espace est féminin).

    + signifie : présent une ou plusieurs fois.

    Les deux slashes servent à délimiter le début et la fin de la requête (regex).

    g signifie qu’on veut une recherche globale, c’est à dire une recherche qui ne s’arrête pas à la première occurrence trouvée.

    #73571
    bebarth
    Maître des clés

    C’est bien ça ?

    C’est ça, exactement !

    + signifie : présent une ou plusieurs fois.
    g signifie qu’on veut une recherche globale, c’est à dire une recherche qui ne s’arrête pas à la première occurrence trouvée mais qui les cherche toutes.

    Dans ce cas, ces 2 signes sont redondants, mais ce n’est pas grave de les mettre ensemble.

    @+
    😎

    #73572
    michel c.
    Participant

    Merci pour toutes ces infos

    #73573
    Merlin
    Maître des clés

    “Dans ce cas, ces 2 signes sont redondants, mais ce n’est pas grave de les mettre ensemble.”

    Pas exactement.

    Le + sert à détecter une ou plusieurs espaces consécutives.

    Le g sert à détecter plusieurs séquences de une ou plusieurs espaces consécutives. Par exemple s’il y a plusieurs mots dans la chaîne de caractères testée ça permet de détecter toutes les espaces entre tous les mots.

    #73574
    bebarth
    Maître des clés

    bonjour,

    Pas exactement.

    Tu as tout à fait raison, mais ce que je voulais dire c’est que dans ce cas le résultat est identique que l’on mette le + ou pas avec le g.
    Ici on aurait pu écrire /\s/g car le global détecte toutes les espaces (consécutives ou non) alors que /\s+/g détecte tous les “au moins une” espaces consécutives. En théorie c’est plus rapide puisqu’il peu y avoir moins d’occurences !
    Lorsque on met le signe + (un ou plus) avec le g (global) le + est donc redondant pour moi, ce qui n’est plus vrai à partir de {2,} (2 ou plus). Mais je le laisse car l’expression est plus parlante à mon avis.

    @+
    😎

Affichage de 20 réponses de 1 à 20 (sur un total de 20)
  • Vous devez être connecté pour répondre à ce sujet.