next up previous contents
Next: 新增絕對值計算及顯示 Up: 代數題 Algebra Previous: 代數題 Algebra   Contents

新增計算函式

  1. 代數題答案計算比對是使用 PHP 計算函數,PHP 三角函數只有 sin,cos,tan,atan 四個函數,其他三角函數則由函數關係計算取得,例如: cot 可以使用 cos/sin 取代。然而對於學生考試作答,限制只能使用這四個函數並不合理,因此必須於題型程式中加入 cot,sec,csc,acot,asec,acsc 等函數。另外,PHP 雖有 abs 函數,但 algebra 題型中並沒有將此函數定義進來,再此也一併加入,不過 abs(x) 函數在顯示還無法對應到 $ \vert x\vert$...
...$ \vert x\vert$ ,但並不影響答案的判斷。
    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-09 08:46:41.213567215 +0800
    
  4. 轉換這些函數成 php 預設的函數來處理。
    @@ -1251,7 +1251,17 @@
             // 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,15 +1291,25 @@
         // 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}',
    -                                  'sqrt' => '\\sqrt'
    +                                  'asec' => '\\sec^{-1}',
    +                                  'acsc' => '\\csc^{-1}',
    +                                  'acot' => '\\cot^{-1}',
    +                                  'sqrt' => '\\sqrt',
    +                                  'abs' => '\\abs'
                                       );
    
  6. 增加 abs 函數在 LATEX編譯上的處理。
         // List of functions requiring special brackets
    -    public static $bracketmap = array ('sqrt'
    +    public static $bracketmap = array ('sqrt','abs'
                                            );
     }
    
  7. 增加 algebra 題型的函數定義。
    @@ -1398,6 +1417,13 @@
                                           'sin',
                                           'cos',
                                           'tan',
    +                                      'sec',
    +                                      'csc',
    +                                      'cot',
    +                                      'abs',
    +                                      'asec',
    +                                      'acsc',
    +                                      'acot',
                                           'asin',
                                           'acos',
                                           'atan'
    
  8. 結果測試輸入 $ \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



2018-08-14