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 :shock:
Printable View
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 :shock:
- Se vuoi far le cose fatte bene, dovresti dividere tutte le cifre dagli operatori, e creare un albero dove in ogni nodo c'è un operatore, una cosa del genere:
http://i.imgur.com/7HlHm7o.jpg
Ammetto di non aver letto i siti che ti linko, ma le immagini esprimono bene ciò che voglio dire:
http://www.cs.utexas.edu/~cannata/cs...%20javacc.html
https://www.eecs.berkeley.edu/~bh/ssch18/trees.html- Se vuoi far le cose fatte "facilmente", potresti provare usando la eval() però occhio a controllare l'input, visto che qualsiasi comando PHP l'utente scriva, questo viene eseguito. Potrebbero facilissimamente eliminare l'intero sito se non controlli opportunamente la stringa in ingresso.
- Cercando un attimo so google, puoi trovare anche cose già fatte tipo:
http://stackoverflow.com/a/1015281
http://stackoverflow.com/a/27077376
Ciao!
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);
}
?>
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
PHP the best language of the WORLD ;)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();
}
?>
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
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
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.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>";
}
?>
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.