Hallo zusammen,

das hier ist meine erste Abgabe, weil ich meistens nicht fertig werde...wie auch dieses Mal... :-/
aber ich dachte ich gebe meinen Code trotzdem zum Abschuss frei...

ich hatte dieses mal noch weniger Zeit als sonst, deshalb hab ich nur einige Funktionen geschrieben und mir auch nicht viel Mühe bei deren Namen gegeben...
Ich hab auch nur einfache Regeln abgedeckt... also das "normale" Ableiten und die Kettenregel...
Auch ist bei mir das "Eingabeformat" der Formeln nicht wirklich flexibel, wie man am letzten Beispiel erkennen kann...

Ich hab meine Lösung trotzdem eingereicht, weil ich vielleicht hoffe, dass mir jemand helfen/sagen kann meine Regular Expressions zu verbessern...

mfg,
enne

PHP-Code:
<?php 
  
function derivate($term$var) {
      
    
$search "~((([0-9+\-\*/a-z\(\)]+|[0-9a-z]+))\^(.+?))~ie";
    
#echo "{$search}<br>";
    
if(preg_match($search$term)) { # contains a circumflex "^"
        
$term preg_replace($search"derivateComplex(array('\\3', '\\4'), $var)"$term);
    } else {
        
//echo "Not Matched<br>";
        
$search_s "~([0-9]|[a-z])*\**".$var."*([\+\-\*/a-z0-9]+)~ie";
        if(
preg_match($search_s$term)) {
            
$term preg_replace($search_s"derivateSimple(array('\\1', '\\3', '\\3', '\\4'), $var)"$term);
        }
    }
    return 
simplify($term);  
  }
  
  function 
derivateSimple($array$var) {
    
#echo "<br>Parse Simple<pre>".print_r($array, true)."</pre><br>";    
    
return $array[0];
  }
  
  function 
derivateComplex($array$var) {
    list(
$base$exp) = $array;
    
    
#echo "<pre>".print_r($array, true)."</pre>";
    
      
$derivate " ";
    
#echo "PREG MATCH: ".$base."^".$exp." == {$exp} * {$pot}^".($exp-1)."<br>";
      
if(strlen($base) > 1)
        return 
$exp." * ".$base."^".(--$exp)." * ".derivate($base$var);
    else
        return 
$exp." * ".$base."^".(--$exp);
  }
  
  function 
simplify($term) {
      
#echo "TERM before simplification: ".$term."<br>";
    
$pattern "~([0-9]).\*.([0-9])+~ie";
    do {
          
$term preg_replace($pattern"mul('$1', '$2')"$term);
    } while(
preg_match($pattern$term));
    
// remove "^1"
    
$term preg_replace("~\^1~"""$term);
    
// remove unnecessary brackets. Example: x * (1)
    
$term preg_replace("~\((.)\)~""\\1"$term);
    
    return 
$term;
  }
  
  function 
mul($one$two 1) {
      
#DEBUG: echo "MUL: $one * $two<br />";
      
return $one $two." ";
  }
  
  
$term "5 * a^2 + b + a^3";
  
$x "a";
  
  
$result derivate($term$x);
    
  echo 
"<hr />\n";
  echo 
"&gt; {$term}<br />\n";
  echo 
"&gt; {$x}<br />\n";
  echo 
"&lt; {$result}<br />\n";
  
  
  echo 
"<h1>2. Formel</h1>\n";  
  
$term "5 * (3*x+a)^2";
  
$x "x";
  
$result derivate($term$x);
  
  echo 
"<hr />\n";
  echo 
"&gt; {$term}<br />\n";
  echo 
"&gt; {$x}<br />\n";
  echo 
"&lt; {$result}<br />\n";
  
  
   echo 
"<h1>3. Formel</h1>\n";  
  
$term "5 * (3x+a)^2";
  
$x "x";
  
$result derivate($term$x);
  
  echo 
"<hr />\n";
  echo 
"&gt; {$term}<br />\n";
  echo 
"&gt; {$x}<br />\n";
  echo 
"&lt; {$result}<br />\n";
  
?>