Visualizzazione risultati 1 fino 7 di 7

Discussione: Creazione calcolatrice con un unico input

  1. #1
    tonydark00 non è connesso Neofita
    Data registrazione
    03-08-2010
    Messaggi
    6

    Predefinito Creazione calcolatrice con un unico input

    Salve gente, sto cercando di sviluppare una calcolatrice, che però abbia un solo input dove scrivere numeri e proprietà matematica. Es: 4+6-7 e un submit che mi stampi il risultato. Sto impazzendo

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito



    Ciao!

  3. #3
    Guest

    Predefinito

    Io ho trovato uno script carino te l'ho messo dentro un form con una input...

    Codice PHP:
    <html>
    <form action="" method="post">

    <label for="espresisone">Inserisci la tua espressione</label>
    <input type="text" value="" id="espressione" name="espressione"/>
    <input type="submit" value="Calcola">
    </form>
    </html>
    <?php

    if (isset($_POST['espressione'])){
    function
    calculate_string( $mathString ) {
    $mathString = trim($mathString); // trim white spaces
    $mathString = ereg_replace ('[^0-9\+-\*\/\(\) ]', '', $mathString);//remove any non-numbers chars; exception for math operators

    $compute = create_function("", "return (" . $mathString . ");" );
    return
    0 + $compute();
    }

    $string = $_POST['espressione'];
    echo
    calculate_string($string);
    }
    ?>

  4. #4
    Guest

    Predefinito

    Che lo puoi fare anche così però non fa il replace delle lettere...Cioè devi pulire la input ci devono essere solo numeri, cioè un'espressione matematica valida...
    Perchè il PHP già calcola l'espressione, se tu scrivi print 3+2 il parse printa 5 però quando la inserisci da una input di sumbit dall'html devi ripulire la stringa altrimenti ti printa 3+2
    Codice PHP:
    <html>
    <form action="" method="post">

    <label for="espresisone">Inserisci la tua espressione</label>
    <input type="text" value="" id="espressione" name="espressione"/>
    <input type="submit" value="Calcola">
    </form>
    </html>
    <?php

    if (isset($_POST['espressione'])){

    $string = $_POST['espressione'];
    $compute = create_function("", "return (" . $string . ");" );
    echo
    $compute();
    }
    ?>
    PHP the best language of the WORLD ;)
    Ultima modifica di fractalcosmo : 12-12-2015 alle ore 19.41.03

  5. #5
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Esistono algoritmi per trasformare espressioni scritte con la notazione infissa in notazione polacca inversa (o post fissa).
    Si tratta di implementare uno scanner e usare una pila (stack, struttura dati LIFO). Alla fine avresti una rappresentazione ad albero come nell'immagine postata da alemoppo.

    Usando la notazione polacca inversa, puoi calcolare il risultato in maniera facile, anche mantenendo la precedenza degli operatori e/o parentesi, ed esiste un algoritmo anche per quello.

    Senza dubbio, esistono numerose implementazioni di questi algoritmi e comunque non sono complicati da implementare da sé.
    Puoi dare una lettura su wikipedia: RPN
    Ultima modifica di javascripter : 13-12-2015 alle ore 15.56.05

  6. #6
    Guest

    Predefinito

    Ariciao Tony, non sapevo che fare e ti ho ordinato il codice con una input ed una funzione javascript che accetta solo numeri e operatori + - * / , però si può fare si meglio, ti spiego, se tu togli la funzione javascript e il ereg_replace dal PHP e scrivi sin(2) dentro la input il parse calcola tranquillamente, adesso qual'è il punto, che bisogna passare alla input una stringa che abbia un'annotazione matematica che il php riconosce...Tu puoi gestire tutti i casi, ovviamente bisogna programmarla, se vai qui vedi quali sono ad esempio le formule che il php accetta che poi sono quelle matematiche di base, tipo asin sin cos tan atan sinh abs sqrt pow etc...


    http://php.net/manual/it/ref.math.php


    Comunque con l'esempio sotto che ho un pochino ordinato hai una input di inserimento espressione che accetta numeri e operatori e parentesi premi calcola e quella calcola tranquillamente...se per esempio scrivi nella input *2**5** ovviamente ti dice espressione non valida devi scrivere 2*5...anche se scrivi **5 ti dice espressione non valida....Si può fare tranquillamente senza complicarsi la vita ma usando le potenzialità del PHP...Ciao

    Ps:Copia ed incolla il codice sotto in una pagina con estensione .php

    Codice PHP:


    <html>
    <form action="" method="post">
    <div style="text-align: center">
    <label for="espresisone">Inserisci la tua espressione</label>
    <input type="text" value="" id="espressione" onkeypress="return numbers(event)" name="espressione"/><br><br>
    <input type="submit" value="Calcola">
    </div>
    </form>
    </html>

    <script type="text/javascript">

    function numbers(e) {
    var keynum;
    var keychar;
    var numcheck;

    if (window.event){// IE
    keynum = e.keyCode;
    } else if (e.which){// Netscape/Firefox/Opera
    keynum = e.which;
    }
    //alert(' keynum ' + keynum);

    if ((keynum == 8) || (keynum == 9)) {
    return true;
    }
    //operatori + - * / e parentesi e freccia di cancellazione
    if ((keynum == 40) || (keynum == 41) ||
    (keynum == 42) || (keynum == 43) ||
    (keynum == 45) || (keynum == 47) ||
    (keynum == 46) ){
    return true;
    }
    keychar = String.fromCharCode(keynum);
    numcheck = /\d/;
    return numcheck.test(keychar);
    }

    </script>

    <?php
    error_reporting
    (E_ERROR);

    if (isset(
    $_POST['espressione'])){

    $string = $_POST['espressione'];

    if (
    trim($string)==''){
    print
    "<div style='text-align: center'>";
    print
    'Inserire l\'equazione';
    print
    "</div>";
    exit;
    }

    function
    calculate_string( $mathString ) {
    $mathString = trim($mathString); // trim white spaces
    $mathString = ereg_replace ('[^0-9\+-\*\/\(\) ]', '', $mathString);//remove any non-numbers chars; exception for math operators
    $compute = create_function("", "return (" . $mathString . ");" );

    if (
    $compute==false){
    print
    "<div style='text-align: center'>";
    print
    'Equazione non valida';
    print
    "</div>";
    exit;
    }
    else{
    return
    $compute();
    }


    }

    print
    "<div style='text-align: center'>";
    echo
    "Risultato : <span style='color:red;font-weight: bold' >" .calculate_string($string) ."</span><br>";
    print
    "</div>";
    }

    ?>
    Cioè tu puoi tranquillamente eliminare l'onkeypress e commentare la riga di ereg_replace nel php, poi nella input se tu fai una prova e scrivi 2+3*(1+sin(2)) ti da come risultato 7.727892280477....Che è quello giusto ma se tu scrivi adfsin(2) ti da un fatal error ovviamente perchè adfsin(2) non è una funzione riconosciuta...Le funzioni riconosciute sono quelle del link che ti ho messo sopra.
    Quindi hai due possibilità o fai la input come ti ho messo sopra quindi che accetta solo numeri e operatori e non hai nessun problema oppure commenti la riga di ereg_replace e togli l'onkeypress e metti error_reporting(0) ed avverti l'utente di cosa deve scrivere dentro la input quali funzione matematiche accetta...Lo avverti che se vuole calcolare il seno o il coseno dovrà scrivere sin() cos() etc...così diventa anche un input scientifica.... :) È un trick perfetto usare la create_function perchè il PHP fa tutto da solo basta solamente farsi ritornare la stringa valida e la create_function in quel modo fa proprio quello.
    Un altro esempio l'elevazione a potenza si usa POW adesso se tu elimini keypress e ereg_replace e scrivi
    pow( (1+2)*2 , 2)

    non è altro che ((1+2)*2)^2 = 36
    Ed infatti se provi e fai calcola ti da 36...Quindi potresti anche permettere l'elevatore così ^ però devi gestire poi nel php che se ttrova ^ è un pow...quindi poi gli devi passare i giusti valori cioè qual'è la base e qual'è l'elevatore ma infatti nelle calcolatrici se vedi per l'elevazione a potenza non c'è il taso con ^ ma c'è x^y di solito è una funzione a parte come lo sqrt cioè la radice quadrata...Devi gestire dal php.
    Ultima modifica di fractalcosmo : 13-12-2015 alle ore 16.59.25

  7. #7
    tonydark00 non è connesso Neofita
    Data registrazione
    03-08-2010
    Messaggi
    6

    Predefinito

    Citazione Originalmente inviato da fractalcosmo Visualizza messaggio
    Ariciao Tony, non sapevo che fare e ti ho ordinato il codice con una input ed una funzione javascript che accetta solo numeri e operatori + - * / , però si può fare si meglio, ti spiego, se tu togli la funzione javascript e il ereg_replace dal PHP e scrivi sin(2) dentro la input il parse calcola tranquillamente, adesso qual'è il punto, che bisogna passare alla input una stringa che abbia un'annotazione matematica che il php riconosce...Tu puoi gestire tutti i casi, ovviamente bisogna programmarla, se vai qui vedi quali sono ad esempio le formule che il php accetta che poi sono quelle matematiche di base, tipo asin sin cos tan atan sinh abs sqrt pow etc...


    http://php.net/manual/it/ref.math.php


    Comunque con l'esempio sotto che ho un pochino ordinato hai una input di inserimento espressione che accetta numeri e operatori e parentesi premi calcola e quella calcola tranquillamente...se per esempio scrivi nella input *2**5** ovviamente ti dice espressione non valida devi scrivere 2*5...anche se scrivi **5 ti dice espressione non valida....Si può fare tranquillamente senza complicarsi la vita ma usando le potenzialità del PHP...Ciao

    Ps:Copia ed incolla il codice sotto in una pagina con estensione .php

    Codice PHP:


    <html>
    <form action="" method="post">
    <div style="text-align: center">
    <label for="espresisone">Inserisci la tua espressione</label>
    <input type="text" value="" id="espressione" onkeypress="return numbers(event)" name="espressione"/><br><br>
    <input type="submit" value="Calcola">
    </div>
    </form>
    </html>

    <script type="text/javascript">

    function numbers(e) {
    var keynum;
    var keychar;
    var numcheck;

    if (window.event){// IE
    keynum = e.keyCode;
    } else if (e.which){// Netscape/Firefox/Opera
    keynum = e.which;
    }
    //alert(' keynum ' + keynum);

    if ((keynum == 8) || (keynum == 9)) {
    return true;
    }
    //operatori + - * / e parentesi e freccia di cancellazione
    if ((keynum == 40) || (keynum == 41) ||
    (keynum == 42) || (keynum == 43) ||
    (keynum == 45) || (keynum == 47) ||
    (keynum == 46) ){
    return true;
    }
    keychar = String.fromCharCode(keynum);
    numcheck = /\d/;
    return numcheck.test(keychar);
    }

    </script>

    <?php
    error_reporting
    (E_ERROR);

    if (isset(
    $_POST['espressione'])){

    $string = $_POST['espressione'];

    if (
    trim($string)==''){
    print
    "<div style='text-align: center'>";
    print
    'Inserire l\'equazione';
    print
    "</div>";
    exit;
    }

    function
    calculate_string( $mathString ) {
    $mathString = trim($mathString); // trim white spaces
    $mathString = ereg_replace ('[^0-9\+-\*\/\(\) ]', '', $mathString);//remove any non-numbers chars; exception for math operators
    $compute = create_function("", "return (" . $mathString . ");" );

    if (
    $compute==false){
    print
    "<div style='text-align: center'>";
    print
    'Equazione non valida';
    print
    "</div>";
    exit;
    }
    else{
    return
    $compute();
    }


    }

    print
    "<div style='text-align: center'>";
    echo
    "Risultato : <span style='color:red;font-weight: bold' >" .calculate_string($string) ."</span><br>";
    print
    "</div>";
    }

    ?>
    Cioè tu puoi tranquillamente eliminare l'onkeypress e commentare la riga di ereg_replace nel php, poi nella input se tu fai una prova e scrivi 2+3*(1+sin(2)) ti da come risultato 7.727892280477....Che è quello giusto ma se tu scrivi adfsin(2) ti da un fatal error ovviamente perchè adfsin(2) non è una funzione riconosciuta...Le funzioni riconosciute sono quelle del link che ti ho messo sopra.
    Quindi hai due possibilità o fai la input come ti ho messo sopra quindi che accetta solo numeri e operatori e non hai nessun problema oppure commenti la riga di ereg_replace e togli l'onkeypress e metti error_reporting(0) ed avverti l'utente di cosa deve scrivere dentro la input quali funzione matematiche accetta...Lo avverti che se vuole calcolare il seno o il coseno dovrà scrivere sin() cos() etc...così diventa anche un input scientifica.... :) È un trick perfetto usare la create_function perchè il PHP fa tutto da solo basta solamente farsi ritornare la stringa valida e la create_function in quel modo fa proprio quello.
    Un altro esempio l'elevazione a potenza si usa POW adesso se tu elimini keypress e ereg_replace e scrivi
    pow( (1+2)*2 , 2)

    non è altro che ((1+2)*2)^2 = 36
    Ed infatti se provi e fai calcola ti da 36...Quindi potresti anche permettere l'elevatore così ^ però devi gestire poi nel php che se ttrova ^ è un pow...quindi poi gli devi passare i giusti valori cioè qual'è la base e qual'è l'elevatore ma infatti nelle calcolatrici se vedi per l'elevazione a potenza non c'è il taso con ^ ma c'è x^y di solito è una funzione a parte come lo sqrt cioè la radice quadrata...Devi gestire dal php.

    Ti ringrazio gentilissimo. Avevo optato per il js utilizzando la funzione eval, ma questo script è decisamente migliore.
    Grazie a tutti!!!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •