代數題新增計算函式

  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