php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.02.2007, 15:23  
Erfahrener Benutzer
 
Registriert seit: 05.04.2005
Beiträge: 1.333
Freeaak ist zur Zeit noch ein unbeschriebenes Blatt
Standard Bei Fehler nicht fortfahren...

Hallo!
Ich habe ein Script geschrieben, das Graphen aus mathematischen Funktionen erstellt. Ein kleines Problem habe ich noch:
Bei der Funktion sqrt(x) oder 1/x ist y für x<0 bzw. x = 0 nicht definiert. Wie kann ich es anstellen, dass das Script bei solchen Funktionen keine errors ausgibt, ohne dass ich error_reporting auf 0 setze?

Gruß Freeaak
__________________
"Wenn du nicht weißt, was du tust: Machs mit Eleganz!"

(Murphy's Gesetze)
Freeaak ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.02.2007, 15:32  
Erfahrener Benutzer
 
Registriert seit: 09.03.2005
Beiträge: 219
webbi
Standard

Verändere dein Script so, dass keine Fehler auftreten.
Wenn die Rechnung mit 0 nicht funktioniert, dann führe sie nicht durch.

if($x!=0)
{
1/x ....
}
else
{
// mach nix oder gibt Meldung aus, oder was anderes...
}

Natürlich könntest du den Fehler auch abfangen, aber warum kompliziert wenns auch einfach geht?

Oder kann der User die Funktionen frei eingeben und du führst sie dann aus? Wie sieht in dem Fall dein Script aus?
webbi ist offline  
Alt 16.02.2007, 15:37  
Erfahrener Benutzer
 
Registriert seit: 05.04.2005
Beiträge: 1.333
Freeaak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich suche nach einer dynamischen lösung. deine funktioniert ja nur bei 1/x
wenn der benutzer die funktion 1/(x-1) eingibt, gehts schon nicht mehr.
__________________
"Wenn du nicht weißt, was du tust: Machs mit Eleganz!"

(Murphy's Gesetze)
Freeaak ist offline  
Alt 16.02.2007, 16:38  
Erfahrener Benutzer
 
Registriert seit: 06.04.2006
Beiträge: 128
ruferp
Standard

Dann berechne doch erst den Wert, prüfe ob >0 und führe dann die Funktion aus.

Oder hab ich da was falsch verstanden?

Der Fehler kommt doch weil sqrt() keinen Wert unter 0 haben darf. Oder?

Also:
PHP-Code:

$z 
1/(x-1);

if ( 
$z>) {
  
$result sqrt($z);

ruferp ist offline  
Alt 16.02.2007, 17:09  
Erfahrener Benutzer
 
Registriert seit: 09.03.2005
Beiträge: 219
webbi
Standard

$z = 1/(x-1); gibt aber auch einen Error wenn x in dem Fall 1 ist

Vielleicht kann man dir besser helfen wenn man dein System kennen würde.
Was passiert denn? Der Nutzer gibt eine Funktion ein, schreibt also z.B. "1/(x-2)" in ein Feld und danach? Wird alles per Eval ausgeführt oder nimmst du es einzeln auseinander?
webbi ist offline  
Alt 16.02.2007, 17:31  
Erfahrener Benutzer
 
Registriert seit: 05.04.2005
Beiträge: 1.333
Freeaak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich nehme es einzeln auseinander... habe jetzt eingebaut, dass beim teilen überprüft wird, ob der zweite Operand != null ist und beim wurzelieren, ob der wert über null ist...
Hier der Quelltext des gesamten Scripts:

PHP-Code:
<?php
error_reporting
(0);
header("Content-Type: image/gif");
class 
Graph
{
    
// Die Funktion __construct wird beim initialisieren eines neuen Objektes von Typ Graph ausgeführt. Hier werden die Zustandsvariablen für die Klasse Graph initialisiert.
    /*
    $this->img ist das Bild, auf das die Funktionskurve gezeichnet wird
    $this->f ist der String, der die Funktion enthält
    $this->x ist die länge der x-achse zu jeder seite
    $this->y ist die länge der y-achse nach oben und unten
    $this->schritt-x/y die anzahl der pixel zwischen den Einheiten
    Dann mehrere Farben für die Darstellung
    */
    
public function __construct($funktion$x$y)
    {
      
$this->img imagecreatetruecolor(500,500);
      
$this->$funktion;
      
$this->$x;
      
$this->$y;
      
$this->schrittx 250/$this->x;
      
$this->schritty 250/$this->y;
      
$this->black imagecolorallocate($this->img,0,0,0);
      
$this->white imagecolorallocate($this->img,255,255,255);
      
$this->grey imagecolorallocate($this->img,230,230,230);
      
$this->red imagecolorallocate($this->img,255,0,0);
    }
    
    
// Diese Funktion rechnet strings aus, indem sie sie aufsplittet und rekursiv weiter berechnet
    
public function rechne($str)
    {
      
// berechnen von Klammern ohne buchstaben davor
      
if(preg_match("~([^a-zA-Z]+)\(~",$str))
      {
        
$str preg_replace("~([^a-zA-Z]*)\((.+)\)~Ue","'$1'.\$this->rechne('$2')",$str);
      }
      
// Ersetzen von Konstanten E und PI durch die in PHP vorgegebenen Konstanten M_E und M_PI
      
$str str_replace("pi",(double)M_PI,$str);
      
$str str_replace("e",(double)M_E,$str);
      
// Nun werden Sinusfunktionen & CO berechnet. Durch einen regulären Ausdruck wird das innere der Klammern ausgefiltert und einzeln berechnet. Dann wird die spezielle Funktion (Sinus, Logarithmus, ...) auf den Wert angewandt.
      
$str preg_replace("~sin\((.+)\)~Uie","round(sin(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~cos\((.+)\)~Uie","round(cos(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~tan\((.+)\)~Uie","round(tan(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~ln\((.+)\)~Uie","round(log(\$this->rechne('$1')),10)",$str);
      
$str preg_replace("~sqrt\((.+)\)~Uie","(\$this->rechne('$1') >= 0) ? round(sqrt(\$this->rechne('$1')),10) : 0",$str);
      
// Suchen nach einem "+"-Zeichen und Aufteilen des Strings an den passenden Stellen. Fragmente weiter rekursiv berechnen
      
if(strstr($str,"+"))
      {
        
$plus explode("+",$str);
        for(
$i 0$i count($plus); $i++)
        {
          
$plus[$i] = $this->rechne($plus[$i]);
        }
        foreach(
$plus as $temp)
        {
          
$ergebnis += $temp;
        }
      }
      
// Das gleiche mit "-". Vor Minus darf kein anderes Rechenzeichen stehen, da es sonst kein operator ist.
      
elseif(strstr($str,"-") && $str[0] != "-" && !preg_match("~[\/\*\+\^]\-~",$str))
      {
        
$minus explode("-",$str);
        for(
$i 0$i count($minus); $i++)
        {
          
$minus[$i] = $this->rechne($minus[$i]);
        }
        
$ergebnis $minus[0];
        for(
$i 1$i count($minus); $i++)
        {
          
$ergebnis -= $minus[$i];
        }
      }
      
// das gleiche mit "*" (Mal)
      
elseif(strstr($str,"*"))
      {
        
$ergebnis 1;
        
$mal explode("*",$str);
        for(
$i 0$i count($mal); $i++)
        {
          
$mal[$i] = $this->rechne($mal[$i]);
        }
        foreach(
$mal as $temp)
        {
          
$ergebnis *= $temp;
        }
      }
      
// ... und geteilt durch
      
elseif(strstr($str,"/"))
      {
        
$geteilt explode("/",$str);
        for(
$i 0$i count($geteilt); $i++)
        {
          
$geteilt[$i] = $this->rechne($geteilt[$i]);
        }
        
$ergebnis $geteilt[0];
        for(
$i 1$i count($geteilt); $i++)
        {
          
$ergebnis $geteilt[$i] != $geteilt[$i] : "0";
        }
      }
      
// als letztes "hoch"
      
elseif(strstr($str,"^"))
      {
        
$hoch explode("^",$str);
        return 
pow($hoch[0],$hoch[1]);
      }
      
// wenn kein Rechenzeichen vorhanden ist, wird die Zahl einfach zurückgeben
      
else
      {
        
$ergebnis $str;
      }
      return 
$ergebnis;
    }
    
    
// diese Funktion zeichnet das koordinatensystem
    
public function zeichneKoord()
    {
      
imagefill($this->img,0,0,$this->white);
      
      for(
$i = -$this->x$i <= 2*$this->x$i++)
      {
        
imageline($this->img,$i*$this->schrittx,0,$i*$this->schrittx,500,$this->grey);
        
imageline($this->img,$i*$this->schrittx,248,$i*$this->schrittx,252,$this->black);
      }
      for(
$i = -$this->y$i <= 2*$this->y$i++)
      {
        
imageline($this->img,0,$i*$this->schritty,500,$i*$this->schritty,$this->grey);
        
imageline($this->img,248,$i*$this->schritty,252,$i*$this->schritty,$this->black);
      }
      
      
imageline($this->img,0,250,500,250,$this->black);
      
imageline($this->img,250,0,250,500,$this->black);
    }
    
    public function 
zeichneGraph()
    
// Diese funktion ersetzt x in der funktion ($this->f) für jeden wert, der angezeigt werden soll.
    
{
      for(
$j = -250$j <= 250$j $j 0.1)
      {
        
imagesetpixel($this->img,250 $j/($this->x/$this->y), 250 $this->rechne(str_replace("x",$j/(250/$this->y),$this->f))*(250/$this->y),$this->red);
      }
    }

    public function 
rdyGraph()
    
// Hier wird alles ausgeführt.
    
{
      
$this->zeichneKoord();
      
$this->zeichneGraph();
      
imagegif($this->img);
    }
}
// Hier die Funktion (zB. x^2), den x-achsen und y-achsen bereich eingeben
$g = new Graph($_GET['f'],$_GET['x'],$_GET['y']);
$g->rdyGraph();
?>
__________________
"Wenn du nicht weißt, was du tust: Machs mit Eleganz!"

(Murphy's Gesetze)
Freeaak ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Fehler meines Projektes Darkbone PHP Tipps 2008 48 05.08.2008 16:55
bitte hilfe! mysql fehler meldung: basicx PHP Tipps 2008 2 22.07.2008 16:36
mysql fehler meldung: basicx Datenbanken 1 22.07.2008 09:48
[Erledigt] Mysql Syntax Fehler Datenbanken 3 06.07.2006 09:58
Frage: Suche Fehler in diesem Script... PHP Tipps 2005-2 14 25.10.2005 19:24
unerklärlicher fehler in der registrierungssite matthros PHP Tipps 2005-2 8 12.06.2005 18:08
[Erledigt] Seite wird nicht angezeigt, untersch. Fehler bei IE/FF/Safar PHP-Fortgeschrittene 19 31.05.2005 14:52
Blöder MySQL Fehler PHP Tipps 2005 3 15.05.2005 03:14
Fehlermeldung - aber kein fehler... Tschuu HTML, Usability und Barrierefreiheit 16 14.03.2005 15:56
Wo liegt der fehler?? PHP-Fortgeschrittene 5 22.12.2004 09:54
[Erledigt] mysql fehler PHP Tipps 2004 2 03.11.2004 00:32
Hilfe ich finde den Fehler nicht! PHP Tipps 2004 2 07.10.2004 17:40
array_push nur in begrenzter Anzahl ausführen ? PHP Tipps 2004 2 07.09.2004 09:05
mysql_real_escape_string - Fehler Schaelle Datenbanken 0 03.07.2004 23:32
Paradox, Fehler bei Berechnung in MySQL MrNiceGuy Datenbanken 0 23.06.2004 16:09


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:44 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.