abracadabraPDF › Forums › PDF – Général › Raccourcir une condition
- Ce sujet contient 20 réponses, 3 participants et a été mis à jour pour la dernière fois par bebarth, le il y a 1 année.
-
CréateurSujet
-
5 novembre 2023 à 08:51 #73401michel 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 1 année par michel c..
-
CréateurSujet
-
AuteurRéponses
-
5 novembre 2023 à 13:47 #73403MerlinMaî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))) {}
7 novembre 2023 à 14:37 #73414michel c.ParticipantMerci beaucoup, ça fonctionne. par contre j’ai du remplacer .valueAsString par .value
17 novembre 2023 à 08:33 #73536michel c.ParticipantFinalement, 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.17 novembre 2023 à 12:08 #73538bebarthMaître des clésbonjour,
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 !@+
😎17 novembre 2023 à 16:53 #73539michel c.ParticipantOui, ça a marché.
Merci
17 novembre 2023 à 21:05 #73540bebarthMaî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 1 année par bebarth.
Attachments:
You must be logged in to view attached files.19 novembre 2023 à 10:09 #73543bebarthMaître des clésbonjour,
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.19 novembre 2023 à 20:22 #73546michel c.ParticipantBonjour, 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
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
20 novembre 2023 à 14:03 #73554bebarthMaître des clésbonjour,
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 !
@+
😎20 novembre 2023 à 17:25 #73555bebarthMaître des clésDé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 ?@+
😎20 novembre 2023 à 18:45 #73556michel c.ParticipantLa 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 1 année par michel c..
- Cette réponse a été modifiée le il y a 1 année par michel c..
- Cette réponse a été modifiée le il y a 1 année par michel c..
Attachments:
You must be logged in to view attached files.20 novembre 2023 à 19:37 #73561bebarthMaître des clésDans 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…
@+
😎20 novembre 2023 à 21:08 #73562bebarthMaî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.21 novembre 2023 à 09:37 #73565bebarthMaître des clésbonjour,
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.21 novembre 2023 à 14:49 #73569michel c.ParticipantMerci 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 ?
21 novembre 2023 à 15:28 #73570MerlinMaî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.
21 novembre 2023 à 15:39 #73571bebarthMaître des clésC’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.
@+
😎21 novembre 2023 à 16:02 #73572michel c.ParticipantMerci pour toutes ces infos
21 novembre 2023 à 23:38 #73573MerlinMaî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.
22 novembre 2023 à 08:34 #73574bebarthMaître des clésbonjour,
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.@+
😎 -
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.