【问题标题】:PHP calculator with words as operators以单词为运算符的 PHP 计算器
【发布时间】:2013-01-06 10:23:08
【问题描述】:

我被困在解析 PHP 脚本中。

我想根据一组指令计算结果。指令由关键字和数字组成,每行用空格分隔。从文件加载指令并将结果输出到屏幕。可以指定任意数量的指令。指令是运算符(加、除、减、乘)。指令将忽略数学优先级。最后一条指令应该是“apply”和一个数字(例如,“apply 3”)。然后使用该数字初始化计算器,并将前面的指令应用于该数字。

[Input]
add 2
multiply 3
apply 3
[Output]
15

[解释] (3 + 2) * 3 = 15

例子

[Input]
multiply 9
apply 5
[Output]
45

谁能帮忙提供一些示例逻辑或代码?

这是我迄今为止尝试过的:

class calculator {

    public
    function calculate($expression) {
        $expression = str_replace(' ', '', $expression);
        return $this - > exec($expression);
    }
    private
    function exec($expression) {

        switch ($expression['op']) {
            case 'add':
                $r = $expression[0] + $expression[1];
                break;
            case 'subtract':
                $r = $expression[0] - $expression[1];
                break;
            case 'multiply':
                $r = $expression[0] * $expression[1];
                break;
            case 'divide':
                $r = $expression[0] / $expression[1];
                break;

        }
        return $r;
    }

    private
    function parseExpression($expression) {

        $blankspace = preg_match('/\s/', $expression);

        $counter = count($expression);
    }
}

【问题讨论】:

  • 所以基本上它是从左到右的,除了把“应用X”贴在前面?输入的范围是多少?
  • raekye 感谢您的时间,输入是 textarea 每条指令都在一行中,下一条必须在新行中(例如:乘以 5,然后新行加 6,然后新行应用 3)我怎么能实现这个
  • 你试过什么?好像您只是在请人为您编写代码。
  • 我已经用我目前尝试过的方法更新了代码,但我可以正确的逻辑
  • 感谢 samuel 的 jquer 解决方案

标签: php jquery class


【解决方案1】:

我会走这条路:

class Calculator {
    public $result = 0;
    public $queue = Array();
    public parseString($text) {
       // parse input string
       $cmds = explode(" ", $text);
       foreach($cmds as $cmd) {
          $cmd = trim($cmd);
          if(!$cmd) continue; // blank or space, ignoring
          $this->queue[] = $cmd;
       }

       // lets process commands
       $command = false;
       foreach($this->queue as $index => $cmd) { 
           if(is_number($cmd)) {
               // if it's number fire previous command if exists
               if(!$command || !method_exists($this, $command)) {
                   throw new Exception("Unknown command $command");
               }
               $this->$command($index, $cmd);
           }else{
               $command = $cmd;
           }
       }
    }
    public function apply($index, $number) {
       // manipulate $result, $queue, $number
    }
    public function add($index, $number) {
       // manipulate $result, $queue, $number
    }
    public function substract($index, $number) {
       // manipulate $result, $queue, $number
    }
}

$calculator = new Calculator();
$calculator->parseString('...');

这只是示例,但这是你的工作:)

您需要添加一些方法,例如clearQueueclearResultsetResult 等...

【讨论】:

  • 谢谢彼得,我怎样才能触发应用或分割方法?我是 php 的初学者
  • // lets process commands 之前,您应该按自定义优先级对$queue 进行排序,apply 应该排在第一位。方法 apply 应该是这样的:function apply($index, $number) { $this->result = $number; }
  • 没有问数学优先级,我对逻辑有更清晰的了解,但是我如何调用或切换加、除、乘、减以及如何区分和触发应用词,你能请提供更多帮助
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多