Donnez vie à vos documents numériques !
 

Réduction fraction

abracadabraPDF Forums PDF – Général Réduction fraction

  • Créateur
    Sujet
  • #46623
    michel 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));
Affichage de 16 réponses de 1 à 16 (sur un total de 16)
  • Auteur
    Réponses
  • #69373
    bebarth
    Maî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:

    #69374
    michel c.
    Participant

    Merci 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…

    #69375
    Rakesh Kumar
    Participant

    michel 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); 

    #69376
    bebarth
    Maître des clés

    Hi,

    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:

    #69377
    michel c.
    Participant

    It’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 …

    #69378
    bebarth
    Maître des clés

    bonjour,
    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:

    #69379
    Rakesh Kumar
    Participant

    @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.

    #69380
    Merlin
    Maître des clés

    Bonjour

    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/

    #69381
    bebarth
    Maî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:

    #69382
    michel c.
    Participant

    Bonjour, 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.

    #73575
    michel c.
    Participant

    Bonjour, 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.
    #73577
    michel c.
    Participant

    J’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.
    #73580
    michel c.
    Participant

    J’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.
    #73583
    bebarth
    Maître des clés

    bonjour,
    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.
    #73588
    michel c.
    Participant

    C’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)

    Lien

    #73591
    bebarth
    Maître des clés

    Avec 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 4 mois et 3 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
Affichage de 16 réponses de 1 à 16 (sur un total de 16)
  • Vous devez être connecté pour répondre à ce sujet.