| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Калькулятор на PHP |
| Автор: Osrus 16.12.2004, 03:44 |
| Наврняка кто-нибудь писал таковой, если простой какой-нибудь есть, покажите код, интересно как это выглядит |
| Автор: Secandr 16.12.2004, 14:30 |
| Калькулятор на php - изврат, тебе придётся перегружать каждый раз страничку. Есть смысл писать калькулятор на jsvsscript. |
| Автор: Black 16.12.2004, 14:51 |
| Можно с помощью нуль фрейма передавать данные и при помощи JavaScript выводить данные в <div></div> Однако, как сказал Secandr калькултор на PHP - это полное извращение над человечеством :-) |
| Автор: Sardar 16.12.2004, 16:54 |
| Да ладно в консоли запустил и вперёд. Только зачем оно нужно? |
| Автор: Рыжий 16.12.2004, 17:23 |
| Я например когда писал то просто делал 2 страници, на одной я размещал формы для заполнения, а на второй сам скрипт и все PS обращался я к переменным при помощи их имен в параметре <input type=text name="name"> |
| Автор: sergejzr 16.12.2004, 17:28 |
| А зачем? Ведь есть Google А msn даже уравнения вырешивает |
| Автор: Рыжий 16.12.2004, 17:38 | ||||
Кстати вот нашел код если что не понятно - пиши:
Этот файл сохрани как хочешь, а следующий - hello.php Вот он:
Он будет только складывать (думаю остальное ты догадаешься). Он будет выполнять действия только с целыми числами, если хочешь чтобы дробные считал - дай им другой тип (думаю тоже поймешь |
| Автор: Sardar 17.12.2004, 00:46 |
| Это совсем никуда, калькулятор должен разбирать выражения. Это не сложно |
| Автор: sergejzr 17.12.2004, 00:50 |
| Вот кстати, как должен он работать http://beta.search.msn.com/results.aspx?q=3*x%5E2%3D6&FORM=QBHP Только мелкомягкие вообще математику не уважают |
| Автор: penizillin 17.12.2004, 04:04 |
| чем он неверен? 6 знаков после запятой вам мало? |
| Автор: sergejzr 17.12.2004, 04:44 | ||||
Нет, мне другое глаз режет. Вот за такие знаки "=" ставят две двойки с минусом в четвёртом классе средней школы
|
| Автор: penizillin 17.12.2004, 05:08 |
| это да. |
| Автор: Наставник 17.12.2004, 07:24 |
| Кстати, господа, если уж зашла речь, а как на Ваш взгляд проще разбирать выражения -- что использовать бин. деревья, или теорию конечных автоматов. Мне было бы интересно послушать ответы, просто делал как-то такое сам (конечно не на php, но все же) и как-то честно признаюсь фигово это все работало. |
| Автор: Secandr 17.12.2004, 09:20 |
| не деревья не теорию автоматов не знаю |
| Автор: Наставник 17.12.2004, 17:40 |
| Вот так и я делал, в лоб - разбирал, приоритеты выставлял и со скобками мучился... но потом меня попросили, чтобы этот парсер ещё мог разбирать и тригонометрические выражения, всего-то шесть sin, cos и т. д. и вот мне тут настала полная ж**а, т.к. тяжело было вносить изменения в уже существующий код... |
| Автор: Pilgrim Anton 17.12.2004, 17:55 |
| Можно использовать конечные состояния вместе с рекурсией. В принципе это – не особо сложно. Рекурсия разбивает выражение на атомы, а с атомами работают конечные состояния. |
| Автор: Наставник 17.12.2004, 18:01 |
| quote=Pilgrim Anton, 17.12.2004, 17:55]Рекурсия разбивает выражение на атомы, а с атомами работают конечные состояния[/quote] Это что-то типа "Разделяй и властвуй" - хм, кстати может быть и замечательная идея... хм, хотелось бы узнать, как с помощью рекурсии разбивать выражения на атомы, я понимаю там быстрая сортировка или подсчет факториала, когда данные однородные, но в данном случае данные не одного формата (числа, скобки и sin, cos ...) |
| Автор: Pilgrim Anton 17.12.2004, 18:14 |
| Наставник Для начала нужно сформулировать что есть атом. Когда это станет понятно, то, думаю дальше пойдет легче. Еще идея: можно проставить недостающие скобки - это и будет разбиением на атомы. |
| Автор: Наставник 17.12.2004, 18:21 | ||||
Хм, может оно верно
но, как-то не могу выделить атом из потока данных.
К сожалению не понял, что Вы хотели этим сказать. А вообще чтобы не просто так говорить, лучше на примере всё это объснять, вот допустим очень простое выражение 2+(cos(34*6)+80 - (25^3))*11.5+((34/5-8)+exp(4*2+90)) Какие есть идеи? |
| Автор: Pilgrim Anton 17.12.2004, 18:32 |
| Давайте разберем пример попроще: 3+6/8*cos(4+6*2) Итак, 3+6/8*cos(4+6*2)= (3+((6/8)*(cos((4+(6*2)))))) В результате, каждое выражение находится в скобках, причем скобки строго указывают последовательность действий. |
| Автор: Наставник 17.12.2004, 18:42 | ||
хорошо, можно и попроще. - но это ведь, по меньшей мере, маразм итак 3+6/8*cos(4+6*2) - можно вот с этим выражением повозиться, кроме анализатора, не представляю возможности как это можно было бы посчитать. Тут когда я парсер делал, мне попалась интересная статья, что можно разбирать выражения проще, если вначале их перевести в обратную польскую запись, тогда скобки убираются, и последовательность действий легко выполняется, найду сейчас пример... Добавлено @ 18:46 это по поводу тупого анализатора - Я так понимаю... создаем таблицу , в которой будет храниться операция и приоритет её, потом простым сравнением входного выражения с таблицей выполняем куски выражений -- но тут возникаем, как лучше хранить посчитанные куски выражения, в стек их пихать или как, просто встраивать во все выражение |
| Автор: Pilgrim Anton 17.12.2004, 18:47 |
| Атомом первого рода будем считать: число. Атомом второго рода будем считать: 1) любой оператор L(a, b), где a, b - атомы первого рода (Например: +(2, 3)=2+3); 2) любой оператор L(a) , где а - атом первого рода (например: Cos(90)) Выражением будем считать: Оператор L(a, b), где 1) a - атом первого рода, b -атом второго рода 2) a - атом второго рода, b -атом первого рода 3) a - атом второго рода, b -атом второго рода 4) a или b - выражение Оператор L(a), где 1) а - атом второго рода 2) а - выражение Это - разбивка на атомы и выражения. Скобки нужны для разбивки на атомы, хотя над этим стоит еще подумать |
| Автор: Наставник 17.12.2004, 18:50 |
| Хм, в теории более мение понятно... хотя конечно лучше на практическом примере. Добавлено @ 18:58 Вот пример польской нотации.. (a*(c+d)+(e+f)*g)/(j+i) получим /+*a+cd*+efg+ji а в обратной польской нотации acd+*ef+g*+ji+/ а вот очень простой пример допустие есть выражение a*b+c Переводим в обратную польскую нотацию, получаем ab*c+ ---> ВЫПОЛНЕНИЕ загрузить a в аккумулятор A1 поместить в стек содержимое A1 загрузить b в аккумулятор A1 поместить в стек содержимое A1 извлечь из стека и поместить в аккумулятор A2 извлечь из стека и поместить в аккумулятор A1 выполнить умножение поместить в стек содержимое A1 загрузить c в аккумулятор A1 поместить в стек содержимое A1 извлечь из стека и поместить в аккумулятор A2 извлечь из стека и поместить в аккумулятор A1 выполнить умножение |
| Автор: Pilgrim Anton 17.12.2004, 19:06 | ||
Цитата с сайта http://mathmatrix.narod.ru/AlgorR.html Надо попробовать будет |
| Автор: Наставник 17.12.2004, 19:10 |
| Насчет обратной польской записи я привел в ДОПОЛНЕНИЕ пример.. Добавлено @ 19:12 А вообще классная статья. (поставил бы +, да не могу.) |
| Автор: Secandr 18.12.2004, 09:19 |
| Да интересная статья, повысил репутацию. |
| Автор: EXTR 19.12.2004, 01:55 | ||
Исходник на JS, может понадобится.
|
| Автор: Alx 19.12.2004, 02:00 |
| ну тогда и мой пример посмотрите! http://portfolio.alx.com.ru/scripts/javascript/sumball2.html |
| Автор: Наставник 19.12.2004, 04:03 | ||||
Не это не дело на ЖаваСкрипт писать, так как встроенная функция eval - сама разбирает и вычисляет выражение, разговор же идет о том как лучше САМОМУ написать программу-скрипт - синтаксический анализатор.
Да и ваш пример, тоже :--((( Смысл, в чем -- как это функция - eval работает, вот тут интересно, а так, тут и думать почти не надо. |
| Автор: Vinipoo 15.3.2006, 16:57 |
| Пришлите программу РНР калькулятор, кто нибудь, сложный калькулятор. |
| Автор: Guedda 15.3.2006, 17:53 |
| Что сложного? Конкретизируйте, пожалуйста... |
| Автор: CyClon 15.3.2006, 22:33 |
| Хм, хочу написать калькулятор на PHP. Вот токо нада кнопки как-то заделать ан JS. У нас просто на информатике, в школе, все VB долбят, а я в блокноте пишу |
| Автор: Ciber SLasH 15.3.2006, 23:49 |
| Имхо нерационально делать калькулятор на PHP, разве тока для баловства. Если и делать, то только на JS. |
| Автор: B2_Russia 19.9.2007, 23:47 | ||
Сорри что тему поднял, но всеже... Столкнулся с такой проблемой. Нужно написать калькулятор, именно на PHP! И нерациональность тут не при чем, я пишу калькулятор автострахования пользователь вводит не математическую формулу, а параметры такие как возраст, стаж вождения, марку авто, стоимость авто, и т.д. Система по этим параметрам заполняет некий набор переменных значениями. Эти переменные используются функцией при вычислении результата. Система должна позволять менять формулу расчета. Клиент, вводит данные и должен получить только результат расчета. Так вот задача вполне востребованная, если ктото встречал решения, был бы премного благодарен ознакомиться с ним. Возможно ктото знает как использовать http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BF%D0%B0%D1%80%D1%81%D0%B5%D1%80%D0%B0 Вобщем, если кому интересно, давайте добьем тему, возможно она пригодится не один еще раз. Нужно предоставить пользователю возможность редактирования формулы, и соответственно написать скрипт который эту формулу сможет разобрать и вычислить. Я впринципе представляю как это можно сделать, разбор можно реализовать при помощи рекурсивного парсера с использованием регулярок. Так как формулы будут довольно простыми, то на производительности использование регулярных выражений не должно сказаться, ну можно и без них в конце концов обойтись, не суть важно. |
| Автор: B2_Russia 21.9.2007, 00:36 | ||
| Вобщем сделал, сами формулы считаю через eval с деревьями и пр. париться не стал =) Сделал возможность многострочной формулы со временными переменными (складываю в стек), плюс обрабатываются условные выражения ЕСЛИ {cond} ТО {expr;expr;...} ИНАЧЕ {expr;expr;...} Значения переменных подставляю через preg_replace();
Вобщем париться не стал абсолютно, все максимально для себя упростил (мне сейчас главное результат выкатить), если кто захочет обсудить - вэлком, я его несомненно буду оптимизировать/менять и т.п., так что актуально. Если кто что полезное посоветует буду рад! Для наглядности скрин как это выглядит. |
| Автор: spectrre 22.4.2008, 15:50 | ||
А можно еще небольшой пример использования данного класса разместить?? Очень заинтересовало, предстоит почти аналогичная задачка... |
| Автор: awers 22.4.2008, 15:56 |
| spectrre, может лучше о таком писать в ПМ, а не поднимать тему 2004 года |
| Автор: Feldmarschall 22.4.2008, 16:02 |
| http://xbb.uz/calc/ |
| Автор: CyClon 22.4.2008, 19:42 | ||||
Как-то на олимпиаде по информатике попалась задачка, сделать парсер полинома:
Добавлено @ 19:43 Вообще сам калькулятор примерно так будет:
|