Autor Zpráva
MichalekII
Profil
Ahoj,
potřebuji v PHP vytvořit kalkulačku,
ovšem potřebuji takovou kde do jednoho formulářového pole zadám výraz
třeba "1+1" skript tento výraz "pochopí" a zobrazí výsledek 2 čím náročnější
a komplexnější výrazy dokáže takto zpracovat tím lépe.

Potřebuji poradit jakým směrem se při programování něčeho takového vydat nebo
nebo nějaký hotový free scrikript kde bych to eventuálně nastudoval.
šárinka
Profil
já bych kalkulačku řešil radši v javascriptu
Sventek
Profil
Záleží taky pro koho je kalkulačka určena a jak moc důležité bude řešit bezpečnost. Pokud to děláš jenom pro sebe, tak ten výraz nacpeš do
 eval("$a = ".$vyraz); 
a vyhodnotí se ti, kolik je, popř se ukážou chyby v zadání. Ale takto napřímo pro veřejnost je to dost velké riziko, protože tam může kdokoliv spustit prakticky cokoliv, takže potom už je jenom na tobě, jak silnou ochranu si tam vymyslíš, nejspíš něco přes reguláry, že se zakážou textové znaky s výjimkou matematických fcí (číslice a + - * / ^ () e log ln ...)
MichálekII
Profil *
Sventek

Aha, to nejednodušší řešení bývá správné (a geniální)

no chci to na veřejný www, takže bezpečnost důležitá velmi
waltz
Profil *
Cau,

ja som nieco take riesil v PHP. Vytvoril som vlastne parser, ktorym je mozne spocitat math expresion. Parser dokaze pracovat s cislamy typu float a zapornymi cislami. Samozrejmosotu je pouzitie vnorenych zatvoriek.

Zacal som parsovanim jednoducheho vyrazu bez zatvoriek. Treba dat pozor na prioritu operatorov (*,/) a t.d.. Kazde cislo vo vyraze som v poradi hodil do pola, tak isto aj operatory do druheho pola. Potom staci napisat funkciu, ktora to vyhodnoti.

Co sa tyka zatvoriek,...postupoval som tak, ze som najprv vyhladal naj-zanorenejsiu zatvorku, cize ")"...potom som uz len pomocou cyklusu prepisoval povodny expresion v zatvorke vysledkom a odsranil zatvorky....

Neviem ci to pomoze, ale da sa z toho vychaadzat...
Aleš Janda
Profil
waltz
Tímto směrem bych se vydal taky, ale místo toho cyklu u závorek bych dal rekurzi.

A ohledně těch priorit v rámci stejné závorky - asi by se hodil nějaký jednoduchý syntaktický analyzátor. Na nejvyšší úrovni by přijímal všechny operátory (plus. mínus), pokud by něco jiného, zavolal by podfunkci, která by přijímala krát a děleno, pokud by ta viděla něco jiného (kromě plus a mínus, třeba mocninu), zavolala by další podfunkci, která by přijímala jen to. A pokud by ta podfunkce narazila na něco zpracovatelného na vyšší úrovni, jednoduše by výraz vyhodnotila (bez priorit) a vrátila výsledek nadřazené funkci.
A takhle by šly jednoduše udělat vlastně i ty závorky.
Timy
Profil
My to teď děláme ve škole pomocí objektů. Tzn. máme třídy konstanta a neznámá, pak nějakou abstraktní třídu výraz, z ní zděděný binární výraz, z ní zase zděděné +bin, -bin, *bin, /bin — ty mají vždycky dva sloty, které reprezentují hodnotu (musí to být instance konstanty nebo neznámé). A pak tam máme nadefinované nějaké úpravy, parsování, derivování apod. To už je vcelku triviální :-).

Je to taky možnost, sice komplikovaná, ale zase taková hezká.
MichálekII
Profil *
waltz
Timy
Pánové a nechcete se podělit o plody své práce zde, nebo založit na toto téma nějaký opensource projekt?
Lucas
Profil *
nie je to zly napad WebMatlab :-)
Timy
Profil
Jednak moc nevím, k čemu by to bylo dobré a navíc mám takový pocit, že když existuje průvodce neurčitým integrálem, že už bude existovat i nějaká triviálnější kalkulačka.
waltz
Profil *
Neposledna vec, ktora je velmi dolezita, je syntaticka analyza, t.z. treba aj overit ci je zadany vyraz spravne zapisany. Na to by bolo zrejme najlepise pouzit regularne vyrazi.

WebMatlab ? :) ...co sa tyka mna, ja som to skusal napisat len ako experiment (kolko tym zabijem casu, kedze som nemal nic na robote)...
Neskor ma napadlo, ze by nebolo mozno zle to trochu vylepsit, a to o pridanie premennych (do vyrazu), ktore by sa na zaklade niecoho mohli naplnat a v ramci vyrazu nakoniec vyhodnocovat. Mohlo by sa to hodit na tvorbu 'jednoduchych' vzorcov, ktore by prepocitavali bezne veci, ...neskor by sa mohli opatovne pouzivat (s tym, ze uzivatel by mal podla daneho vzorcu automaticky vygenerovane 'vstupy', kde len zada potrebne cisla a vyhodi to vysledok). Fungovalo by to v ramci webu.
Aleš Janda
Profil
Neposledna vec, ktora je velmi dolezita, je syntaticka analyza, t.z. treba aj overit ci je zadany vyraz spravne zapisany. Na to by bolo zrejme najlepise pouzit regularne vyrazi.

Regulární výrazy ne, ty na rekurzivní zápisy použít nejdou.
nightfish
Profil
Aleš Janda
Regulární výrazy ne, ty na rekurzivní zápisy použít nejdou.
tak tak - pomocí regulárních výrazů popíšeš jen třídu regulárních jazyků
když budeš chtít bezkontextový jazyk (např. jazyk se závorkami), potřebuješ už regulární gramatiku, tedy zásobníkový automat

jinak vstupem syntaktické analýzy mohou být třeba tokeny (nejmenší syntaktické jednotky - klíčová slova, názvy funkcí, proměnných, operátory), které ti poskytne tokenizér

jednou jsem dělal jako školní projekt precedenční syntaktickou analýzu, a musím říct, že to bylo velmi poučné - komukoliv, kdo myslí vážně implementaci byť jenom jednoduchého vyhodnocování výrazů vážně, doporučuji nastudovat
jack24
Profil *
cau hele potrebuju udelat kalkulacku v jazyce c pls navod
nightfish
Profil
jack24
přečti si můj příspěvek z 10.4.2008 18:29:14
obávám se, že pro rozumně komplexní kalkulačku se bez lexikální a syntaktické analýzy neobejdeš...
imploder
Profil
Eval() je jednoduché řešení, musíš ale dokonale ošetřit vstup. Nebezpečnější funkce snad v PHP není.

Ty rekurze fungujou, není složité naprogramovat vyhodnocení výrazů s libovolným počtem vnořených závorek.

jack24
cau hele potrebuju udelat kalkulacku v jazyce c pls navod
Použij rekurzi. V C eval naštěstí není, tak se to musí udělat poctivě. Možná (prakticky určitě) je někde už hotová knihovna - zkus pohledat. Kalkulaček už bylo vytvořeno plno.
jack24
Profil *
Hele mam takovyhle script kalkulacky v jazyce c ale nejak mi to furt nejde potrebuju kalkulacku aby nacitala znamenka(+,-,*,/)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int a = 0;
int b;
int c = 0;
int d = 0;
printf("Kalkulator \n\n\a");
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);

if(b=='+'){
d=a+c;
printf("=%d",d);
}

if(b=='-'){
d=a+c;
printf("=%d",d);
}

if(b=='*'){
d=a+c;
printf("=%d",d);
}

if(b=='/'){
d=a+c;
printf("=%d",d);
}



getch();
return 0;
}
Petyk
Profil
mozna by to fungovalo kdyby tam nebylo 4x toto: d=a+c;
Petyk
Profil
a kdyby tam nebylo int b; ale char b; a scanf("%d",&b); => scanf("%c",&b);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: