Autor | Zpráva | ||
---|---|---|---|
MichalekII Profil |
#1 · Zasláno: 8. 4. 2008, 20:54:11
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 |
#2 · Zasláno: 8. 4. 2008, 20:55:44
já bych kalkulačku řešil radši v javascriptu
|
||
Sventek Profil |
#3 · Zasláno: 8. 4. 2008, 21:49:09 · Upravil/a: Sventek
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); |
||
MichálekII Profil * |
#4 · Zasláno: 9. 4. 2008, 07:25:53
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 * |
#5 · Zasláno: 9. 4. 2008, 10:20:38
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 |
#6 · Zasláno: 9. 4. 2008, 12:17:09
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 |
#7 · Zasláno: 9. 4. 2008, 12:43:33
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 * |
#8 · Zasláno: 9. 4. 2008, 13:09:15
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 * |
#9 · Zasláno: 9. 4. 2008, 13:21:21
nie je to zly napad WebMatlab :-)
|
||
Timy Profil |
#10 · Zasláno: 9. 4. 2008, 13:32:13
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 * |
#11 · Zasláno: 10. 4. 2008, 17:18:57
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 |
#12 · Zasláno: 10. 4. 2008, 17:24:14
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 |
#13 · Zasláno: 10. 4. 2008, 18:29:14
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 |
||
Časová prodleva: 6 měsíců
|
|||
jack24 Profil * |
#14 · Zasláno: 30. 9. 2008, 20:56:54
cau hele potrebuju udelat kalkulacku v jazyce c pls navod
|
||
nightfish Profil |
#15 · Zasláno: 30. 9. 2008, 21:10:04
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 |
#16 · Zasláno: 30. 9. 2008, 23:33:11
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. |
||
Časová prodleva: 21 dní
|
|||
jack24 Profil * |
#17 · Zasláno: 21. 10. 2008, 17:56:10
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 |
#18 · Zasláno: 21. 10. 2008, 19:22:09
mozna by to fungovalo kdyby tam nebylo 4x toto: d=a+c;
|
||
Petyk Profil |
#19 · Zasláno: 21. 10. 2008, 19:24:57
a kdyby tam nebylo int b; ale char b; a scanf("%d",&b); => scanf("%c",&b);
|
||
Časová prodleva: 15 let
|
0