next up previous contents
Next: 代數題 multiply bug Up: 其他小修改 Previous: 簡單計算題變數產生   Contents

代數題新增計算函式

  1. 代數題計算是使 PHP 計算函數,因 PHP 中並沒有 cot,sec,csc,acot,asec,acsc 等函數。雖然這些函數都可以使 sin,cos,tan,atan 等函數計算,但若學生以這些函數作答,將會產生錯誤,故於此題型中加入這些函數。另外,PHP 雖有 abs 函數,但 algebra 題型中並沒有將此函數定義進來,再此也一併加進來,不過 abs 函數在 LATEX上顯示還有問題,但不影響答案的判斷。
    Image algebrafunctions
  2. 加入函數 cot,sec,csc,acot,asec,acsc 等函數後,允許函數已包含這些函數。
    Image algebraaddfunctions
  3. 程式修改 parser.php
    [root@dywang algebra]# diff -uN ../../../mod_tmp/algebra/parser.php parser.php
    --- ../../../mod_tmp/algebra/parser.php	2013-05-20 16:23:42.000000000 +0800
    +++ parser.php	2014-10-07 12:03:10.903224854 +0800
    @@ -1251,7 +1251,17 @@
    
  4. 轉換這些函數成 php 預設的函數來處理。
             // Check to see if there is an entry to map the function name to a PHP function
             if(array_key_exists($this->_value,self::$fnmap)) {
                 $func=self::$fnmap[$this->_value];
    -            return $mult*$func($this->_arguments[0]->evaluate($params));
    +			$flag=0;
    +			$value=$this->_arguments[0]->evaluate($params);
    +			if ($func == "sec") {$func="cos"; $flag=1;}
    +			elseif ($func == "cot") {$func="tan"; $flag=1;}
    +			elseif ($func == "csc") {$func="sin"; $flag=1;}
    +			elseif ($func == "acot") {$func="atan"; $value=1.0/$value;}
    +			elseif ($func == "asec") {$func="atan"; $value=sqrt($value*$value-1.0);}
    +			elseif ($func == "acsc") {$func="atan"; $value=1.0/sqrt($value*$value-1.0);}
    +			$value=$mult*$func($value);
    +            if ($flag==1) {return 1.0/$value;}
    +			return $value;
             }
             // No map entry so the function name must already be a PHP function...
             else {
    
  5. 定義這些函數在 LATEX上的字串。
    @@ -1281,11 +1291,20 @@
         // Static class properties
         const NARGS=1;
         public static $fnmap = array ('ln'  => 'log',
    -                                  'log' => 'log10'
    +                                  'log' => 'log10',
    +                                  'sec' => 'sec',
    +                                  'csc' => 'csc',
    +                                  'cot' => 'cot',
    +                                  'asec' => 'asec',
    +                                  'acot' => 'acot',
    +                                  'acsc' => 'acsc',
                                       );
         public static $texmap = array('asin' => '\\sin^{-1}',
                                       'acos' => '\\cos^{-1}',
                                       'atan' => '\\tan^{-1}',
    +                                  'asec' => '\\sec^{-1}',
    +                                  'acsc' => '\\csc^{-1}',
    +                                  'acot' => '\\cot^{-1}',
                                       'sqrt' => '\\sqrt'
                                       );
         // List of functions requiring special brackets
    
  6. 增加 algebra 題型的函數定義。
    @@ -1398,6 +1417,13 @@
                                           'sin',
                                           'cos',
                                           'tan',
    +                                      'sec',
    +                                      'csc',
    +                                      'cot',
    +                                      'abs',
    +                                      'asec',
    +                                      'acsc',
    +                                      'acot',
                                           'asin',
                                           'acos',
                                           'atan'
    
  7. 結果測試輸入 $ \sec^2(x)$...
...$ \sec^2(x)$ $ \frac{1}{\cos^2(x)}$...
...$ \frac{1}{\cos^2(x)}$ 都對,但輸入 $ \frac{1}{\sin^2(x)}$...
...$ \frac{1}{\sin^2(x)}$ 就錯,表示驗證確時有經過計算。
    Image algebrasec2
    Image algebracos2
    Image algebrasin2



2017-08-04