Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Калькулятор на PHP, Конечно блажь, но интересно! 
:(
    Опции темы
Pilgrim Anton
Дата 17.12.2004, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.12.2004

Репутация: 1
Всего: 1



Можно использовать конечные состояния вместе с рекурсией.
В принципе это – не особо сложно. Рекурсия разбивает выражение на атомы, а с атомами работают конечные состояния.

PM MAIL   Вверх
Наставник
Дата 17.12.2004, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



quote=Pilgrim Anton, 17.12.2004, 17:55]Рекурсия разбивает выражение на атомы, а с атомами работают конечные состояния[/quote]
Это что-то типа "Разделяй и властвуй" - хм, кстати может быть и замечательная идея...

хм, хотелось бы узнать, как с помощью рекурсии разбивать выражения на атомы, я понимаю там быстрая сортировка или подсчет факториала, когда данные однородные, но в данном случае данные не одного формата (числа, скобки и sin, cos ...)



--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Pilgrim Anton
Дата 17.12.2004, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.12.2004

Репутация: 1
Всего: 1



Наставник
Для начала нужно сформулировать что есть атом. Когда это станет понятно, то, думаю дальше пойдет легче.

Еще идея: можно проставить недостающие скобки - это и будет разбиением на атомы.

PM MAIL   Вверх
Наставник
Дата 17.12.2004, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



Хм, может оно верно

Цитата(Pilgrim @ 17.12.2004, 18:14)
Для начала нужно сформулировать что есть атом


но, как-то не могу выделить атом из потока данных.

Цитата(Pilgrim @ 17.12.2004, 18:14)
Еще идея: можно проставить недостающие скобки - это и будет разбиением на атомы.


К сожалению не понял, что Вы хотели этим сказать.

А вообще чтобы не просто так говорить, лучше на примере всё это объснять, вот допустим очень простое выражение

2+(cos(34*6)+80 - (25^3))*11.5+((34/5-8)+exp(4*2+90))

Какие есть идеи?

Это сообщение отредактировал(а) Наставник - 17.12.2004, 18:23


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Pilgrim Anton
Дата 17.12.2004, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.12.2004

Репутация: 1
Всего: 1



Давайте разберем пример попроще: 3+6/8*cos(4+6*2)
Итак, 3+6/8*cos(4+6*2)= (3+((6/8)*(cos((4+(6*2))))))

В результате, каждое выражение находится в скобках, причем скобки строго указывают последовательность действий.
PM MAIL   Вверх
Наставник
Дата 17.12.2004, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



Цитата(Pilgrim @ 17.12.2004, 18:32)
Итак, 3+6/8*cos(4+6*2)= (3+((6/8)*(cos((4+(6*2))))))


хорошо, можно и попроще. - но это ведь, по меньшей мере, маразм smile вводить дополнительные скобки, для того чтобы указывать последовательность действий... как это потом объяснять простому пользователю

итак 3+6/8*cos(4+6*2) - можно вот с этим выражением повозиться, кроме анализатора, не представляю возможности как это можно было бы посчитать.

Тут когда я парсер делал, мне попалась интересная статья, что можно разбирать выражения проще, если вначале их перевести в обратную польскую запись, тогда скобки убираются, и последовательность действий легко выполняется, найду сейчас пример...

Добавлено @ 18:46
это по поводу тупого анализатора -

Я так понимаю... создаем таблицу , в которой будет храниться операция и приоритет её, потом простым сравнением входного выражения с таблицей выполняем куски выражений -- но тут возникаем, как лучше хранить посчитанные куски выражения, в стек их пихать или как, просто встраивать во все выражение

Это сообщение отредактировал(а) Наставник - 17.12.2004, 18:47


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Pilgrim Anton
Дата 17.12.2004, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.12.2004

Репутация: 1
Всего: 1



Атомом первого рода будем считать:
число.
Атомом второго рода будем считать:
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) а - выражение

Это - разбивка на атомы и выражения.
Скобки нужны для разбивки на атомы, хотя над этим стоит еще подумать smile

Это сообщение отредактировал(а) Pilgrim Anton - 17.12.2004, 18:52
PM MAIL   Вверх
Наставник
Дата 17.12.2004, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



Хм, в теории более мение понятно... хотя конечно лучше на практическом примере.
Добавлено @ 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
выполнить умножение






Это сообщение отредактировал(а) Наставник - 17.12.2004, 19:09


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Pilgrim Anton
Дата 17.12.2004, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.12.2004

Репутация: 1
Всего: 1



Цитата
Обратная польская нотация

Наиболее простая система записи математических выражений для электронной обработки - обратная польская нотация. Например, выражение "(a + b)*(c - d)/sin(e)" в этой системе записывается как "a b + c d - * e sin /". В этой системе не нужны скобки. и все выражения могут быть вычислены с помощью простого алгоритма, использующего стек. Когда при проходе строки встречается переменная, она помещается в стек, а когда встречается знак математической операции, из стека извлекается нужное количество переменных, осуществляется операция и результат снова помещается в стек. Когда вся строка пройдена, остается лишь извлечь из стека результат (если формула была записана правильно, то это будет единственный элемент стека).

Перевод традиционной формы записи математических выражений в ОПН - немного более сложная операция. Она также осуществляется с использованием стека, но теперь это стек математических операций. Приоритете математических операций таков:

  1. Функции (напр. sin, cos) и скобки
  2. Умножение и деление
  3. Сложение и вычитание

Алгоритм перевода таков:

    * Когда в исходной строке встречается переменная, она записывается прямо в конечную строку
    * Когда встречается символ математической операции, из стека извлекаются все операции с высшим приоритетом, затем операция помещается в стек
    * Когда встречается открывающая скобка, она помещается в стек
    * Когда встречается закрывающая скобка, из стека извлекается всё до открывающей скобки. Открывающая скобка может быть извлечена только закрывающей, сами скобки в конечную строку не записываются.
    * Когда вся строка уже пройдена, из стека извлекается всё, что там осталось.

Цитата с сайта http://mathmatrix.narod.ru/AlgorR.html

Надо попробовать будет
PM MAIL   Вверх
Наставник
Дата 17.12.2004, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



Насчет обратной польской записи я привел в ДОПОЛНЕНИЕ пример..
Добавлено @ 19:12
А вообще классная статья. (поставил бы +, да не могу.)

Это сообщение отредактировал(а) Наставник - 17.12.2004, 19:13


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Secandr
Дата 18.12.2004, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Да интересная статья, повысил репутацию.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
EXTR
Дата 19.12.2004, 01:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Исходник на JS, может понадобится.

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <title>Êàëüêóëÿòîð</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251;" />
 <style type="text/css">
  .i_button{width: 30px}
 </style>
 <script type="text/javascript">
 
   var str_value="";
   var new_value="";
   var button="";
   function s_write(new_value)
   {
      str_value+=new_value;
      document.getElementById('txt_field').value=str_value;
   }
   function clean()
   {
      str_value="";
      document.getElementById('txt_field').value=str_value;
   }
   function calculate()
   {
      str_value=document.getElementById('txt_field').value;
      str_value=eval(str_value);
      if(str_value==undefined)
      {
         alert("Ïîæàëóéñòà, ââåäèòå âàøå âûðàæåíèå, à çàòåì íàæìèòå íà êíîïî÷êó \"Ââîä\"");
         str_value="";
         return false;
      }
      if(str_value==Infinity)
      {
        str_value="Áåñêîíå÷íîñòü";
      }
      document.getElementById('txt_field').value=str_value;
      return false;
   }
 </script>
</head>
<body style="background-color: #cccccc;" onLoad="calc.txt_field.focus();">
 <h2 style="text-align: center; font-family: Verdana, sans-serif; color: Darkred;">Êàëüêóëÿòîð</h2>
 <form name="calc" onSubmit="return calculate();">
  <table cllpadding="10" cellspacing="0" border="0" align="center" style="text-align: center; background-color: #ffffff; ">
   <tr>
    <td colspan="4"><input type="text" length="20" maxlength="20" id="txt_field" style="background-color: #f4f4f4; text-align: right;" value=" " readonly=\"true\" /></td>
   </tr>
   <tr>
    <td><input type="button" class="i_button" value="/" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="*" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="-" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="C" style="width: 50px; color: Darkred; font-weight: bold;" onClick="clean();" /></td>
   </tr>
   <tr>
    <td><input type="button" class="i_button" value="7" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="8" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="9" onClick="s_write(this.value);" /></td>
    <td rowspan="2"><input type="button" name="plus" value="+" style="width: 50px; height: 50px;" onClick="s_write(this.value);" /></td>
   </tr>
   <tr>
    <td><input type="button" class="i_button" value="4" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="5" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="6" onClick="s_write(this.value);" /></td>
   </tr>
   <tr>
    <td><input type="button" class="i_button" value="1" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="2" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="3" onClick="s_write(this.value);" /></td>
    <td rowspan="2"><input type="submit" value="Ââîä" style="width: 50px; height: 50px; font-weight: bold;" /></td>
   </tr>
   <tr>
    <td colspan="2"><input type="button" value="0" style="width: 62px;" onClick="s_write(this.value);" /></td>
    <td><input type="button" class="i_button" value="." onClick="s_write(this.value);" /></td>
    <td></td>
   </tr>
  </table>
 </form>
</body>
</html>

  Вверх
Alx
Дата 19.12.2004, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 6
Всего: 78



ну тогда и мой пример посмотрите! smile это был мой самый первый в жизни скрипт! smile
http://portfolio.alx.com.ru/scripts/javascript/sumball2.html


--------------------
PM MAIL WWW ICQ   Вверх
Наставник
Дата 19.12.2004, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: 2
Всего: 15



Цитата(EXTR @ 19.12.2004, 01:55)
Исходник на JS, может понадобится.

Не это не дело на ЖаваСкрипт писать, так как встроенная функция eval - сама разбирает и вычисляет выражение, разговор же идет о том как лучше САМОМУ написать программу-скрипт - синтаксический анализатор.


Цитата(ALEXANDRO @ 19.12.2004, 02:00)
ну тогда и мой пример посмотрите!  это был мой самый первый в жизни скрипт!

Да и ваш пример, тоже :--(((

Смысл, в чем -- как это функция - eval работает, вот тут интересно, а так, тут и думать почти не надо.


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
Vinipoo
Дата 15.3.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Пришлите программу РНР калькулятор, кто нибудь, сложный калькулятор.

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1423 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.