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

Поиск:

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


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

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



Что сложного? Конкретизируйте, пожалуйста...


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
CyClon
Дата 15.3.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм, хочу написать калькулятор на PHP. Вот токо нада кнопки как-то заделать ан JS. У нас просто на информатике, в школе, все VB долбят, а я в блокноте пишу smile


--------------------
user posted image
PM   Вверх
Ciber SLasH
Дата 15.3.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

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



Имхо нерационально делать калькулятор на PHP, разве тока для баловства. Если и делать, то только на JS.
PM   Вверх
B2_Russia
Дата 19.9.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В доску свой :)
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 3.7.2003
Где: Тверь

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



Цитата(Ciber SLasH @ 15.3.2006,  23:49)
Имхо нерационально делать калькулятор на PHP, разве тока для баловства. Если и делать, то только на JS.

Сорри что тему поднял, но всеже...

Столкнулся с такой проблемой.
Нужно написать калькулятор, именно на PHP!
И нерациональность тут не при чем, я пишу калькулятор автострахования пользователь вводит не математическую формулу, а параметры такие как возраст, стаж вождения, марку авто, стоимость авто, и т.д. Система по этим параметрам заполняет некий набор переменных значениями. Эти переменные используются функцией при вычислении результата.
Система должна позволять менять формулу расчета.
Клиент, вводит данные и должен получить только результат расчета.

Так вот задача вполне востребованная, если ктото встречал решения, был бы премного благодарен ознакомиться с ним.

Возможно ктото знает как использовать ParserFunctions

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

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

Это сообщение отредактировал(а) B2_Russia - 19.9.2007, 23:53
PM WWW ICQ   Вверх
B2_Russia
Дата 21.9.2007, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В доску свой :)
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 3.7.2003
Где: Тверь

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



Вобщем сделал, сами формулы считаю через eval с деревьями и пр. париться не стал =) 
Сделал возможность многострочной формулы со временными переменными (складываю в стек), плюс обрабатываются условные выражения
ЕСЛИ {cond} ТО {expr;expr;...} ИНАЧЕ {expr;expr;...}
Значения переменных подставляю через preg_replace();

Код

<?

class Formula
{
  var $db;
  var $VARS = array(); // массив переменных в котором содержится имена переменных и их значения
  // Массив "действий" а ля "T1=K2*K10/100*23.09" или "ЕСЛИ {T1>15} ТО {T2=21.8; T1=15} ИНАЧЕ {Т1=5}"
  // Функции должны быть записаны (упорядочены) по ходу вычислений!!!
  // Результат должен быть записан в переменную RESULT "RESULT = T1*T2/8.8"
  var $FUNCS = array(); 
  var $c_id;  // Идентификатор компании
  var $ot_id; // Тип ТС
  
  /////////////////////////////////////////////////////////////////////
  // Конструктор
  function Formula($VARS, $c_id, $ot_id)
  {
    global $g_db, $INFO;
    $this->db = & $g_db;
    $this->VARS = $VARS;
    $this->data = $data;
    $this->c_id = $c_id;
    $this->ot_id = $ot_id;
    
  // Функции должны быть записаны (упорядочены) по ходу вычислений!!!
    $this->db->query("SELECT fn_data FROM ".$INFO['sql_prefix']."functions WHERE fn_group_id='".$this->c_id."' ORDER BY fn_id");
    $this->FUNCS = $g_db->get_result();
  }
  /////////////////////////////////////////////////////////////////////
  // Добавляем в массив переменную
  function AddVariable($name, $value)
  {
    $index = sizeof($this->VARS);
    if (($this->VARS==NULL)||(!isset($this->VARS))) $index = 0;
    $this->VARS[$index]['name'] = $name;
    $this->VARS[$index]['value'] = $value;
  }
  
  function PostTemp($name, $value)
  {
    for ($i=0; $i<sizeof($this->VARS); $i++)
    {
      if ($this->VARS[$i]['name']==$name)
      {
        $this->VARS[$i]['value'] = $value;
        return;
      }
    }
    
    $newindex = sizeof($this->VARS);
    if (($this->VARS==NULL)||(!isset($this->VARS))) $newindex = 0;
    $this->VARS[$newindex]['name'] = $name;
    $this->VARS[$newindex]['value'] = $value;
    
  }
  
  function CheckCondition($data)
  {
    for ($i=0; $i<sizeof($this->VARS); $i++)
    {
      $reg = '/'.$this->VARS[$i]['name'].'([=*+\/\-]{0,1})/i';
      $to = $this->VARS[$i]['value'].'$1';
      
      $data = preg_replace($reg, $to, $data);
    }
    eval('$res='.$data.';');
    if ((!isset($res))||($res=='')) $res = 0;
    return $res;
  }
  
  function CalcExpression($data)
  {
    $src = $data;
    $res = null;
    for ($i=0; $i<sizeof($this->VARS); $i++)
    {
      $reg = '/'.$this->VARS[$i]['name'].'([=*+\/\-]{0,1})/i';
      $to = $this->VARS[$i]['value'].'$1';
      
      $data = preg_replace($reg, $to, $data);
    }
    eval('$res='.$data.';');
    return $res;
  }
  
  function CalcItem($data)
  {
      ////////////////////////////////////////////////////////////////////////////////
      // Смотрим какого типа выражение
      if (preg_match('/ЕСЛИ{(.*)}ТО{(.*)}ИНАЧЕ{(.*)}/', $data, $result))
      {
        //print_r($result);
        if ($this->CheckCondition($result[1]))
        {
          $exp = explode(';', $result[2]);
          for ($i=0; $i<sizeof($exp); $i++)
            $this->CalcItem($exp[$i]);
        }else
        {
          $exp = explode(';', $result[3]);
          for ($i=0; $i<sizeof($exp); $i++)
            $this->CalcItem($exp[$i]);
        }
          return false;
      }
      // Выражение = присваивание
      if (preg_match('/(.*)=(.*)/', $data, $result)>0)
      {
        $left = $result[1];
        $right = $result[2];
        $ResExpr = $this->CalcExpression($right);
        
        $this->PostTemp($left, $ResExpr);
      }
  }
  
  function Calc()
  {
    $RESULT = NULL;
    //print_r($this->VARS);
    for ($i=0; $i<sizeof($this->FUNCS); $i++)
    {
      $data = $this->FUNCS[$i]['fn_data'];
      // Удаляем все пробелы
      $data = preg_replace('/[ ]+/', '', $data);
      $this->CalcItem($data);
    }
  }
  
  function GetResult()
  {
    for ($i=0; $i<sizeof($this->VARS); $i++)
      if (strcmp($this->VARS[$i]['name'],'RESULT')==0) return $this->VARS[$i]['value'];
    return '-';
  }


?>



Вобщем париться не стал абсолютно, все максимально для себя упростил (мне сейчас главное результат выкатить), если кто захочет обсудить - вэлком, я его несомненно буду оптимизировать/менять  и т.п., так что актуально.
Если кто что полезное посоветует буду рад!

Для наглядности скрин как это выглядит.



Присоединённый файл ( Кол-во скачиваний: 40 )
Присоединённый файл  1.gif 21,92 Kb
PM WWW ICQ   Вверх
spectrre
Дата 22.4.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(B2_Russia @ 21.9.2007,  00:36)
Вобщем сделал, сами формулы считаю через eval с деревьями и пр. париться не стал =) 
Сделал возможность многострочной формулы со временными переменными (складываю в стек), плюс обрабатываются условные выражения
ЕСЛИ {cond} ТО {expr;expr;...} ИНАЧЕ {expr;expr;...}
Значения переменных подставляю через preg_replace();

А можно еще небольшой пример использования данного класса разместить?? Очень заинтересовало, предстоит  почти аналогичная задачка...
PM MAIL   Вверх
awers
Дата 22.4.2008, 15:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

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



spectrre, может лучше о таком писать в ПМ, а не поднимать тему 2004 года
PM MAIL WWW ICQ Skype   Вверх
Feldmarschall
Дата 22.4.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



PM   Вверх
CyClon
Дата 22.4.2008, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как-то на олимпиаде по информатике попалась задачка, сделать парсер полинома:

Код
<?php

$data_in = file('poly.in');

$string = str_replace('x', rtrim($data_in[1]), rtrim($data_in[0]));
$string = preg_replace('~([0-9]+)\^([0-9]+)~e', 'pow("\\1", "\\2")', $string);
eval('$string = ' . $string . ';');

$data_out = fopen('poly.out', 'w');
fputs($data_out, $string . PHP_EOL);
fclose($data_out);

?>


Добавлено @ 19:43
Вообще сам калькулятор примерно так будет:

Код
<?php

$string = '55^23-45+33/22+66';

$string = preg_replace('~([0-9]+)\^([0-9]+)~e', 'pow("\\1", "\\2")', $string);
eval('$string = ' . $string . ';');

echo $string;

?>


Это сообщение отредактировал(а) CyClon - 22.4.2008, 19:44


--------------------
user posted image
PM   Вверх
Страницы: (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.0828 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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