abracadabraPDF › Forums › PDF – Général › Réduction fraction
- Ce sujet contient 15 réponses, 2 participants et a été mis à jour pour la dernière fois par bebarth, le il y a 1 année.
-
CréateurSujet
-
22 juin 2021 à 17:58 #46623michel c.Participant
Bonjour, je suis en train d’essayer de créer un document qui me permettrait de réduire une fraction.
J’ai trouvé un script qui était destiné au web et non à des formulaires pdf.
Je tente de l’adapter pour qu’il fonctionne mais je n’arrive pas à trouver l’erreur….Code:function simplify(str) {
var result = ”, data = str.split(‘/’),
numOne = Number(data[0]),
numTwo = Number(data[1]);
for (var i = Math.max(numOne, numTwo); i > 1; i–) {
if ((numOne % i == 0) && (numTwo % i == 0)) {
numOne /= i;
numTwo /= i;
}
}
if (numTwo === 1) {
result = numOne.toString()
} else {
result = numOne.toString() + ‘/’ + numTwo.toString()
}
return result
}
this.getField(“Text1”) = (simplify(“4/6”) + “
“);
this.getField(“Text2”) = (simplify(84810,985612)); -
CréateurSujet
-
AuteurRéponses
-
22 juin 2021 à 19:06 #69373bebarthMaître des clés
bonjour,
Voici une adaptation du script pour Acrobat :Code:function simplify(str) {
var result=””;
var data=str.split(“/”);
var numOne=Number(data[0]);
var numTwo=Number(data[1]);
for (var i=Math.max(numOne,numTwo); i>1; i–) {
if (numOne%i==0 && numTwo%i==0) {
numOne/=i;
numTwo/=i;
}
}
if (numTwo===1) result=numOne.toString();
else result=numOne.toString()+”/”+numTwo.toString();
return result;
}
this.getField(“Text1”).value=simplify(“4/6”);
this.getField(“Text2”).value=simplify(“84810/985612”);Je te laisse étudier ça !!!
@+
:bonjour:22 juin 2021 à 21:28 #69374michel c.ParticipantMerci pour ta réponse, le javascript est nouveau pour moi et j’essaye de me dépatouiller avec votre aide et les différents sites qui traitent du sujet. J’ai l’impression d’avancer mais aussi peut être d’avancer sans maitriser les fondamentaux…J’ai également commandé un ouvrage mais il tarde un peu à arriver…
Bref, tout ça pour dire que j’ai un peu étudié le script modifié et j’ai quelques incertitudes ; voici ce que j’ai compris :
Code:// on déclare la fonction que l’on nomme simplify. pour str je suppose que c’est l’argument à passer à la fonction
function simplify(str) {
// on déclare la variable result et on lui donne une valeur nulle
var result=””;
// supposition : on déclare la variable data qui sera séparée par un/
var data=str.split(“/”);
// on déclare la variable numOne qui aura comme valeur …là je sèche
var numOne=Number(data[0]);
var numTwo=Number(data[1]);
//boucle pour chaque valeur de i égal au maximum entre numOne et numTwo et i>1 …la suite je sèche
for (var i=Math.max(numOne,numTwo); i>1; i–) {
if (numOne%i==0 && numTwo%i==0) {
numOne/=i;
numTwo/=i;
}
}
// si numTwo égal à 1 alors on donne à la variable result la valeur de numOne je suppose
if (numTwo===1) result=numOne.toString();
// sinon on donne à la variable result la valeur de numOne puis / puis la valeur de numTwo
else result=numOne.toString()+”/”+numTwo.toString();
// on met fin à la fonction et on renvoie la valeur result à la fonction simplify
return result;
}
// on affecte au champ Text1 la valeur 4/6 traitée par la fonction simplify
this.getField(“Text1”).value=simplify(“4/6”);
// on affecte au champ Text2 la valeur 84810/985612 traitée par la fonction simplify
this.getField(“Text2”).value=simplify(“84810/985612”);
Sinon, j’ai également essayé de déclarer 2 variables avant la déclaration de la fonction pour pouvoir saisir la fraction à simplifier sans avoir à modifier le script (j’ai également crée 2 champs : nombre1 et nombre2 sur ma page)
Code:var numerateur = this.getField(nombre1).value;Code:var denominateur = this.getField(nombre2).value;
J’ai ensuite essayé de modifier la fin du script en mettant :
Code:this.getField(“Text1”).value=simplify(“numerateur/denominateur”);
Mais ça ne donne rien…
23 juin 2021 à 02:55 #69375Rakesh KumarParticipantmichel c.
Use this:
var t1 = this.getField (“Number1”). valueAsString;
var t2 = this.getField (“Number2”). valueAsString;var t3 = t1 + “/” + t2;
this.getField (“Text1”). value = simplify (t3);23 juin 2021 à 05:50 #69376bebarthMaître des clésHi,
var t1 = this.getField (“Number1”). valueAsString;
var t2 = this.getField (“Number2”). valueAsString;
var t3 = t1 + “/” + t2;
this.getField (“Text1”). value = simplify (t3);This is one of possibilities, but you can directly write:
this.getField (“Text1”). value = simplify (t1+”/”+t2); // without the t3 variable
or more directly:
this.getField (“Text1”). value = simplify (this.getField (“Number1”). value+”/”+this.getField (“Number1”). value); // without any variable
No need to use valueAsString.I will be back a bit later to give both of you other ways and to explain the script.
@michel.c: do you quite well speak English ?@+
:bonjour:23 juin 2021 à 06:26 #69377michel c.ParticipantIt’s working. Thank you.
I understand english but i don’t speak very well.
I would have liked to find books in French on javascript for pdf forms but this kind of book does not exist, so I have no other choice to learn javascript for pdf than to do it in English …23 juin 2021 à 07:22 #69378bebarthMaître des clésbonjour,
Voici le premier script commenté où tu avais déjà compris certaines choses :Code:// Déclaration de la fonction “simplify” avec l’argumet “str”
function simplify(str) {
// Déclaration de la variable “result” vide
var result=””;
// On découpe la chaine de caractères “str” à chaque “/” pour en faire une table
// Ici, comme il n’y a qu’un “/” la table comporte 2 éléments (avant et après le “/”)
var data=str.split(“/”);
// La variable “numOne” est le premier élément de la table “data” (basé sur 0)
var numOne=Number(data[0]);
// La variable “numTwo” est le deuxième élément de la table “data” (basé sur 0)
var numTwo=Number(data[1]);
// Boucle à partir de la valeur maxi entre numOne et numTwo jusqu’à 1 avec incrément de -1
for (var i=Math.max(numOne,numTwo); i>1; i–) {
// Si le reste de la division numOne÷i ET le reste de la division numTwo÷i sont égal à 0
// i est un diviseur commun des 2 nombres
if (numOne%i==0 && numTwo%i==0) {
// donc on divise numOne par i (-> nouveau nombre numOne pour la boucle)
numOne/=i;
// et on divise numTwo par i (-> nouveau nombre numTwo pour la boucle)
numTwo/=i;
}
}
// Si numTwo = 1 (dénominateur ou diviseur = 1) result = numOne (numérateur ou dividende)
if (numTwo===1) result=numOne.toString();
// Sinon return = chaine de caractères numOne+”/”+numTwo
else result=numOne.toString()+”/”+numTwo.toString();
// Renvoi de la variable “result”
return result;
}
// Et on applique la fonction à la chaine de caractères “4/6”
this.getField(“Text1”).value=simplify(“4/6”);
// Puis à la chaine de caractères “84810/985612”
this.getField(“Text2”).value=simplify(“84810/985612”);On peut aussi définir une fonction avec plusieurs arguments :
Code:// Fonction avec 2 arguments à placer en script de document
function simplify(numerateur,denominateur) {
for (var i=Math.max(numerateur,denominateur); i>1; i–) {
if (numerateur%i==0 && denominateur%i==0) {
numerateur/=i;
denominateur/=i;
}
}
if (denominateur===1) result=numerateur.toString();
else result=numerateur.toString()+”/”+denominateur.toString();
return result;
}// Et tu appelles la fonction en script de calcul du champ “Text1”
event.value=simplify(this.getField(nombre1).value,this.getField(nombre1).value);Je te re-laisse étudier ça et je reviens plus tard.
N’hésite pas à demander si tu ne comprends pas.@Rakesh Kumar: Do you want a translation of my comments? let me know.
@+
:bonjour:23 juin 2021 à 07:37 #69379Rakesh KumarParticipant@bebarth no, its fine now i am now on this forum for more than 8 months, i am able to understand atleast the scripts, if i don’t i use the translator, so its fine …
many many thanks.
23 juin 2021 à 09:48 #69380MerlinMaître des clésBonjour
I would have liked to find books in French on javascript for pdf forms but this kind of book does not exist, so I have no other choice to learn javascript for pdf than to do it in English …
You should start here: https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/ressources-pdf-javascript/
23 juin 2021 à 10:23 #69381bebarthMaître des clés…le javascript est nouveau pour moi et j’essaye de me dépatouiller avec votre aide et les différents sites qui traitent du sujet. J’ai l’impression d’avancer mais aussi peut être d’avancer sans maitriser les fondamentaux…J’ai également commandé un ouvrage mais il tarde un peu à arriver…
Il y a une petite quinzaine d’année j’écrivais mon premier post sur ce forum où je disais que je n’y connaissais pas grand chose en JavaScript. Une manière de dire que je n’y connaissais rien du tout !
Pendant une dizaine d’années je n’ai fait que poser des questions lorsque j’en avais besoin et maintenant je répond aux questions.
Tout ça pour dire qu’il ne faut pas te désespérer ! Peut-être un jour répondras-tu aussi aux questions…Comme toi, j’ai appris tout seul le JavaScript et son intégration dans Acrobat. Le lien fourni par Merlin te sera très utile. Je te conseille également de lire ses tutos : https://www.abracadabrapdf.net/category/ressources-et-tutos/ et de télécharger et étudier les exemples fournis sur son site.
Tu as raison, pour mieux comprendre il faut acquérir quelques notions de base comme les opérateurs par exemple (en français) : https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Expressions_and_Operators
Pour le JavaScript, tu as aussi un site en anglais que j’utilise fréquemment : https://www.w3schools.com/jsref/default.asp
Pour la création de formulaires, je te conseille de télécharger la dernière version de l’API Reference https://www.adobe.com/go/acrobatsdk_jsapiref qui va être ta bible…
Sans vouloir te décourager tu vas passer des heures à lire, relire et essayer de comprendre certaines propriétés ou méthodes qui ne sont pas si évidentes.
Et c’est sans compter les heures où tu vas essayer d’appliquer ce que tu croyais avoir compris ! :doute:
Mais si tu es passionné, ça va le faire. Il faut insister un peu… :geek:Ensuite n’hésite pas à poser des questions sur le forum !
J’espère ne pas t’avoir découragé… Bonne chance !
@+
:bonjour:23 juin 2021 à 18:46 #69382michel c.ParticipantBonjour, je ne suis pas découragé, au contraire.
Je suis enseignant et tout a commencé avec le 1er confinement pendant lequel j’ai commencé à utiliser les formulaires pdf afin de faciliter le travail à distance des élève.
J’ai fait acheter pour notre lycée 25 licences d’un logiciel permettant de créer des formulaires pdf afin que d’autres collègues puissent également en profiter.Au bout d’un an d’utilisation, j’ai découvert de plus en plus de possibilités et depuis quelques mois j’ai commencé à tenter d’intégrer quelques scripts, pour rendre les documents un peu plus interactifs et attractifs.
Mais avec le javascript, c’est l’engrenage, je découvre qu’il y a énormément de possibilités et étant de nature curieuse, j’ai envie d’en apprendre toujours un peu plus…
En tout cas, je trouve que vous faites un travail admirable sur ce forum et c’est extrêmement agréable de disposer d’une aide aussi précieuse.23 novembre 2023 à 10:26 #73575michel c.ParticipantBonjour, je relance ce fil car j’ai des cas de figure qui me posent problème avec les nombres négatifs.
Si la bonne réponse est -1/3 ; il faudrait pouvoir accepter comme réponse 1/-3
J’ai une idée en tête avec une condition if et la création d’une table avec / comme séparateur. Je suis en train d’essayer…
Attachments:
You must be logged in to view attached files.23 novembre 2023 à 10:44 #73577michel c.ParticipantJ’ai essayé ceci mais ça ne fonctionne pas.
var RepUser = this.getField("RepEt.3").valueAsString;
var RepUserSplit = RepUser.split("/");
if (RepUserSplit[0] >=0 && RepUserSplit[1]>=0) var ReponseA = simplify (this.getField ("RepEt.2b"). value+"/"+this.getField ("RepEt.1b"). value);
if (RepUserSplit[0] <0 | RepUserSplit[1]<0) {var ReponseB = simplify ("-"+this.getField ("RepEt.2b"). value+"/"+this.getField ("RepEt.1b"). value);
var ReponseC = simplify (this.getField ("RepEt.2b"). value+"/-"+this.getField ("RepEt.1b"). value);
}
if (ReponseA == RepUser | ReponseB == RepUser | ReponseC == RepUser) {app.alert({cMsg:"Bravo.", nIcon:2});}
if (Reponse != RepUser) {app.alert({cMsg:"La fraction est insufisament simplifiée, ou fausse.", nIcon:2});}
Je cherche encore.
Attachments:
You must be logged in to view attached files.23 novembre 2023 à 15:47 #73580michel c.ParticipantJ’ai trouvé ceci comme solution, je ne sais pas si c’est très académique mais ça a l’air de marcher.
function simplify(str) {
var result="";
var data=str.split("/");
var numOne=Number(data[0]);
var numTwo=Number(data[1]);
for (var i=Math.max(numOne,numTwo); i>1; i--) {
if (numOne%i==0 && numTwo%i==0) {
numOne/=i;
numTwo/=i;}
}
if (numTwo===1) result=numOne.toString();
else result=numOne.toString()+"/"+numTwo.toString();
return result;
}
var Reponse = "";
var Reponse1 = "";
var Reponse2 = "";
var Numerateur = this.getField ("RepEt.2b").value;
var Denominateur = this.getField ("RepEt.1b").value;
if (Numerateur>=0 & Denominateur>=0) {Reponse = simplify (Numerateur+"/"+Denominateur);}
if (Numerateur<0 & Denominateur<0) {Numerateur = Math.abs(Numerateur);Denominateur = Math.abs(Denominateur);
Reponse1 = simplify (Numerateur+"/"+Denominateur);
Reponse2 = "-"+simplify (Numerateur+"/-"+Denominateur);
}
if (Numerateur<0 & Denominateur>=0 | Numerateur>=0 & Denominateur<0) {Numerateur = Math.abs(Numerateur);Denominateur = Math.abs(Denominateur);
Reponse1 = "-"+simplify (Numerateur+"/"+Denominateur);
Reponse2 = simplify (Numerateur+"/-"+Denominateur);
}
var RepUser = (this.getField("RepEt.3").value);
if (RepUser == Reponse | RepUser == Reponse1 | RepUser == Reponse2) {app.alert({cMsg:"Bravo.", nIcon:2});}
if (Reponse != RepUser & Reponse1!= RepUser & Reponse2!= RepUser) {app.alert({cMsg:"La fraction est insufisament simplifiée, ou fausse.", nIcon:2});}
Attachments:
You must be logged in to view attached files.24 novembre 2023 à 08:27 #73583bebarthMaître des clésbonjour,
Je ne sais pas si j’ai bien compris, mais sinon ça me parait bien compliqué !
Pour moi il suffit d’écrire :
if (this.getField ("RepEt.2b").value/this.getField ("RepEt.1b").value==eval(this.getField("RepEt.3").value)) app.alert("Bravo.",2);
else app.alert("La fraction est insufisament simplifiée, ou fausse.",2);
ou avec des variables :
var Numerateur=this.getField ("RepEt.2b").value;
var Denominateur=this.getField ("RepEt.1b").value;
var RepUser=this.getField("RepEt.3").value;
if (Numerateur/Denominateur==eval(RepUser)) app.alert("Bravo.",2);
else app.alert("La fraction est insufisament simplifiée, ou fausse.",2);
@+
😎Attachments:
You must be logged in to view attached files.24 novembre 2023 à 11:41 #73588michel c.ParticipantC’est curieux, ça marche dans ton fichier mais quand j’intègre ce script dans mon fichier d’origine ça ne fonctionne pas)
Il faut cliquer sur démarrer, cela génère une équation
Ensuite on clique sur vérification 1 (Je n’ai pas intégré de vérification intermédiaire donc peu importe ce que l’on a saisi)
L’aide 4 affiche la décomposition en facteur de nombres premiers
J’ai intégré la modification que tu proposes sur le bouton vérification 2b
Par exemple si j’ai comme décomposition :
Décomposition du numérateur : -2 x 3 x 5
Décomposition du dénominateur : 5 x 7
et que j’inscris comme réponse 6/-7
NB : j’ai rajouté un affichage sur la console pour comparer ma réponse avec celle qui est exacte →
console.println("RepUser="+RepUser+" ; Reponse="+Reponse)
Quand je clique sur vérification 2b (là ou se trouve le script) :
Cela m’indique que mon résultat est faux (Console → RepUser=6/-7 ; Reponse=-6/7)
Si j’inscris alors -6/7
Cela m’indique aussi que mon résultat est faux alors que ma réponse est la même que la réponse attendue (Console → RepUser=-6/7 ; Reponse=-6/7)
24 novembre 2023 à 16:28 #73591bebarthMaître des clésAvec ma méthode, la fonction ne sert plus, et la variable Reponse est une opération Numerateur/Denominateur;
Il faut donc juste écrire :
Reponse=Numerateur/Denominateur;
if (Reponse ==eval (RepUser)) {
app.alert({cMsg:"Bravo.", nIcon:2});this.getField("Neq").value++;
MessEqOk();
console.println("RepUser="+RepUser+" ; Reponse="+Reponse);
} else {
app.alert({cMsg:"La fraction est insufisament simplifiée, ou fausse.", nIcon:2});
erreurs++;
console.println("RepUser="+RepUser+" ; Reponse="+Reponse);
}
@+
😎- 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. -
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.