2013-01-23 28 views
0

我陷入瞭解決PHP腳本的困境。以計算器爲詞的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); 
    } 
} 
+0

所以基本上它是從左到右,除了堅持前面的「申請X」?什麼是輸入範圍? – Raekye

+0

raekye謝謝你的時間,輸入是textarea每條指令是在一個行中,下一個必須在一個新行(例如:乘以5然後新行添加6然後新行apply3)我怎麼能實現這 – user888300

+5

你試過什麼?似乎你只是要求某人爲你編碼。 – Supericy

回答

0

我會走這條路:

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等一些方法......

+0

感謝彼得,我怎麼能觸發應用或除法?我在PHP – user888300

+0

之前是一個初學者,在'//處理命令'之前,你應該按照自定義優先級對$ queue進行排序,'apply'應該是第一個。方法apply應該看起來像這樣:'function apply($ index,$ number){$ this-> result = $ number; }' – Peter

+0

沒有數學優先權問,我對邏輯有更清晰的想法,但我怎樣才能調用或切換添加,除法,乘法,減法以及如何區分和觸發應用程序字,你可以給更多的幫助plz – user888300