[php] losse tekens uitrekenen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoe kan ik, als ik bijvoorbeeld dit invul:
1+4*5-2*11-1-2/3*7
Dat PHP het ook zo uitrekent, ik had al wel iets gevonden, maar dat werkt alleen als er of alleen maar +jes in staan of alleen -netjes enzovoort.

Weet iemand hier een oplossing voor?

Alvast bedankt,
- Frag

Enne, de code die ik had/heb
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
    $i=0; $uit=0;
    $som = str_replace("^", "+", $som);
    $plus = explode("+", $som);
    $maal = explode("*", $som);
    $min = explode("-", $som);
    $deel = explode("/", $som);
    echo"De uitkomst op de som: $som<BR><BR>";
    $ap = count($plus)-1;
    $am = count($maal)-1;
    $ai = count($min)-1;
    $ad = count($deel)-1;
    if ($ap>0) { for ($i=0; $i<=$ap; $i++) { $uit = $uit+$plus[$i]; } }
    if ($am>0) { for ($i=0; $i<=$am; $i++) { $uit = $uit*$maal[$i]; } }
    if ($ai>0) { for ($i=0; $i<=$ai; $i++) { $uit = $uit-$min[$i]; } }
    if ($ad>0) { for ($i=0; $i<=$ad; $i++) { $uit = $uit/$deel[$i]; } }
    echo"$som";
?>
Som word in een andere pagina aangemaakt.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je, bijvoorbeeld, zult een parsetree moeten maken (boompje met in de 'root' steeds de operator en in de 'leafs' andere boompjes of de getallen zelf) en vervolgens die boompjes bottom-up door moeten rekenen.

Het is, denk ik, niet met een simpele for-loop te doen :)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
bedoel je dan zoals het hoort, dus meneervandalewachtopantwoord of wil je gewoon 1+4=5*5=25-2=23 etcetera?

Acties:
  • 0 Henk 'm!

  • ThaDaNo
  • Registratie: Mei 2002
  • Laatst online: 05-04-2023
Misschien kun je ook eval gebruiken :?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
DaNo2002 schreef op 23 December 2002 @ 20:04:
Misschien kun je ook eval gebruiken :?
Dat ben ik nu ook aan het testen:
PHP:
1
2
3
4
5
<?
    $som = str_replace("^", "+", $som);
    echo"'$som'<BR>"; // Resultaat: '16+5+6*9/6-2'
    eval($som); 
?>


Maar hij geeft deze error aan:
Parse error: parse error in c:\apache\htdocs\test\index.php(77) : eval()'d code on line 1

[ Voor 13% gewijzigd door Verwijderd op 23-12-2002 20:23 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nog even een dit.... Hij moet dit in een bestand zetten:
<? $tot = $som; ?>
Waar som = "16+5+6*9/6-2"

Alleen het vervelende is dat hij dit in een bestand zet:
<? = 16+5+6*9/6-2; ?>

Er zou moeten staan:
<? $tot = 16+5+6*9/6-2; ?>

Weet iemand hoe ik dit moet doen?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

PHP:
1
2
3
4
$som = ...;
$tot = 0;
eval("\$tot = $som;");
echo $tot;


hope that helps..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op 23 December 2002 @ 20:56:
PHP:
1
2
3
4
$som = ...;
$tot = 0;
eval("\$tot = $som;");
echo $tot;


hope that helps..
Lol....it does :D

Ik snap het niet echt helemaal meer, 8)7 maar goed, ik kom er nog wel uit dan denk ik :? :/

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 23 december 2002 @ 21:00:
Lol....it does :D

Ik snap het niet echt helemaal meer, 8)7 maar goed, ik kom er nog wel uit dan denk ik :? :/

Probeer het verschil tussen
PHP:
1
2
3
4
$y = 10;
$a = "$y";
$b = "\$y";
$c = '$y';


Te snappen :)
en dan zal het wel wat duidelijker worden (zie de phpmanual over de string types)

Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Een \ wordt gebruikt om de 'escapen'. Stel, je wilt een " in een string hebben. Probleem, want zo weet PHP niet meer waar een string eindigt of niet:
PHP:
1
$str = "blaat en nog"eens blaat";



Dit is dus foutZoals je ziet gaat het met de colorcoding dan ook niet goed. Daarom heeft met escape-sequences uitgevonden. Dit is een combinatie van een \ en een ander teken, bijvoorbeeld de ":
PHP:
1
$str = "blaat en \" nog eens blaat";


Dit werkt wel. Hetzelfde kun je doen met newlines enzo:
PHP:
1
$str = "dit is een string \n over meerdere regels";


Stel je gaat een $ in een string gebruiken. PHP zal proberen om de waarde van $[varnaam] in de string te plakken, maar in dit geval wil je dat niet. Daarom zet je een \ voor de $, zodat PHP weet dat die $ niet als variabele moet worden gezien, maar gewoon rechtstreeks in de string moet worden geplakt :)

PHP:
1
2
3
4
5
6
7
8
9
function doewat($var) {
   echo $var;
}

$waarde = "blaaterdieblaat";

doewat("$waarde woei"); // output: blaaterdieblaat woei
doewat("\$waarde woei"); // output: $waarde woei
doewat('$waarde woei'); // output: $waarde woei


:) Let bij het laatste voorbeeld op het verschil tussen enkele (') en dubbele (") quotes :)

[ Voor 32% gewijzigd door MisterData op 23-12-2002 22:47 ]


Acties:
  • 0 Henk 'm!

  • Sendy
  • Registratie: September 2001
  • Niet online
Goed, eval() is inderdaad de functie. Maar als je het zonder eval() functie moet doen (dat is in de meeste niet-geintrepeteerde (sp?) programmeertalen) dan kan je dit ook redelijk eenvoudig doen.

Je maakt twee stacks: op de ene push je de operators (+, -, *, /) en op de andere de getallen. Hierna pop je de operator-stack en twee keer de getallen-stack. Het resultaat van die berekening zet je terug op de getallen stack. Als je de operator-stack leeg popt dan is het antwoord de waarde op de getallen-stack. Dit is even versimpeld, de unaire operators (+ en -) en haakjes moet je iets anders afhandelen.

Dit is ongeveer hetzelfde algoritme als dat van ACM zie ik nu.. :Z

[ Voor 6% gewijzigd door Sendy op 23-12-2002 23:57 . Reden: Oh ja, ik slaap. De uitgebreide versie is natuurlijk de boom van ACM. Mijn algoritme doet zakrekenmachines na. ]


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Thuissendy schreef op 23 december 2002 @ 23:50:
Goed, eval() is inderdaad de functie. Maar als je het zonder eval() functie moet doen (dat is in de meeste niet-geintrepeteerde (sp?) programmeertalen) dan kan je dit ook redelijk eenvoudig doen.

Je maakt twee stacks: op de ene push je de operators (+, -, *, /) en op de andere de getallen. Hierna pop je de operator-stack en twee keer de getallen-stack. Het resultaat van die berekening zet je terug op de getallen stack. Als je de operator-stack leeg popt dan is het antwoord de waarde op de getallen-stack. Dit is even versimpeld, de unaire operators (+ en -) en haakjes moet je iets anders afhandelen.

Dit is ongeveer hetzelfde algoritme als dat van ACM zie ik nu.. :Z
Voor de C++'ers onder ons: er is op Flipcode ooit iemand geweest die een Expression-compiler/evaluator online heeft gezet. http://www.flipcode.com/c...Compiler&forum=cotd&id=-1

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Zo moeilijk is dat nou ook weer niet :).. Is 1 van de eerste practica die ik bij mijn opleiding heb gehad :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1