Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Description of your first forum.
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Code: Select all

<form method="post" action="funktionsplotter2.php">
<textarea name="plotinput" rows="1" cols="80">((2+3)*4+2)*9</textarea><br>
<input type="Submit" value="plot">
</form>
<?php
$i = 0;

echo expr ();

function expr () {
    global $i;
    $x = term ();
    if ($_POST ["plotinput"] [$i] == '+') {
        $i++;
        $y = expr ();
        return $x + $y;
    }
    else if ($_POST ["plotinput"] [$i] == '-') {
        $i++;
        $y = expr ();
        return $x - $y;
    }
    return $x;
}

function term () {
    global $i;
    $x = factor ();
    if ($_POST ["plotinput"] [$i] == '*') {
        $i++;
        $y = term ();
        return $x * $y;
    }
    else if ($_POST ["plotinput"] [$i] == '/') {
        $i++;
        $y = term ();
        return $x / $y;
    }
    return $x;
}

function factor () {
    global $i;
    if ($_POST ["plotinput"] [$i] == '(') {
        $i++;
        $x = expr ();
        if ($_POST ["plotinput"] [$i] == ')')
            $i++;
        else
            echo "error!";
        return $x;
    }
    else if (($_POST ["plotinput"] [$i] >= '0') && ($_POST ["plotinput"] [$i] <= '9')) {
        $x = ord($_POST ["plotinput"] [$i]) - ord('0');
        $i++;
        return $x;
    }
    else 
        echo "error";
}


?>
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Jetzt führen wir sin(x), cos(x), exp(x), .. ein. Danach die Variable x. Wir machen das so. Wir erlauben in unserem Funktionsplotter nur konstanten mit einer Ziffer - das tut uns nichts ab.

Wir schreiben trotzdem

Code: Select all

sin(2*x)*(cos(x)+3)
Wir schreben halt nicht

Code: Select all

sin(1.712871823*x)*(cos(x)+2.0018239312)
Aber mein Gott, egal.
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

OK, prima Nachrichten, und es ist nachweißlich richtig, es geht mit cos(x)

Code: Select all

<form method="post" action="funktionsplotter3.php">
<textarea name="plotinput" rows="1" cols="80">cos(cos(1+3)*4)</textarea><br>
<input type="Submit" value="plot">
</form>
<?php
$i = 0;

echo cos(cos(1+3)*4);

echo expr ();

function expr () {
    global $i;
    $x = term ();
    if ($_POST ["plotinput"] [$i] == '+') {
        $i++;
        $y = expr ();
        return $x + $y;
    }
    else if ($_POST ["plotinput"] [$i] == '-') {
        $i++;
        $y = expr ();
        return $x - $y;
    }
    return $x;
}

function term () {
    global $i;
    $x = factor ();
    if ($_POST ["plotinput"] [$i] == '*') {
        $i++;
        $y = term ();
        return $x * $y;
    }
    else if ($_POST ["plotinput"] [$i] == '/') {
        $i++;
        $y = term ();
        return $x / $y;
    }
    return $x;
}

function factor () {
    global $i;
    if ($_POST ["plotinput"] [$i] == '(') {
        $i++;
        $x = expr ();
        if ($_POST ["plotinput"] [$i] == ')')
            $i++;
        else
            echo "error!";
        return $x;
    }
    else if (($_POST ["plotinput"] [$i+0] == 'c') &&
            ($_POST ["plotinput"] [$i+1] == 'o') &&
            ($_POST ["plotinput"] [$i+2] == 's') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = cos ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i] >= '0') && ($_POST ["plotinput"] [$i] <= '9')) {
        $x = ord($_POST ["plotinput"] [$i]) - ord('0');
        $i++;
        return $x;
    }
    else 
        echo "error!!!";
}


?>
Die restlichen Funktionen sind schnell eingebaut.
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Funktioniert auch, jetzt kommt die Variable

Code: Select all


<form method="post" action="funktionsplotter4.php">
<textarea name="plotinput" rows="1" cols="80">exp(cos(1+3)*4)</textarea><br>
<input type="Submit" value="plot">
</form>
<?php
$i = 0;

echo exp(cos(1+3)*4);

echo expr ();

function expr () {
    global $i;
    $x = term ();
    if ($_POST ["plotinput"] [$i] == '+') {
        $i++;
        $y = expr ();
        return $x + $y;
    }
    else if ($_POST ["plotinput"] [$i] == '-') {
        $i++;
        $y = expr ();
        return $x - $y;
    }
    return $x;
}

function term () {
    global $i;
    $x = factor ();
    if ($_POST ["plotinput"] [$i] == '*') {
        $i++;
        $y = term ();
        return $x * $y;
    }
    else if ($_POST ["plotinput"] [$i] == '/') {
        $i++;
        $y = term ();
        return $x / $y;
    }
    return $x;
}

function factor () {
    global $i;
    if ($_POST ["plotinput"] [$i] == '(') {
        $i++;
        $x = expr ();
        if ($_POST ["plotinput"] [$i] == ')')
            $i++;
        else
            echo "error!";
        return $x;
    }
    else if (($_POST ["plotinput"] [$i+0] == 'c') &&
            ($_POST ["plotinput"] [$i+1] == 'o') &&
            ($_POST ["plotinput"] [$i+2] == 's') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = cos ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 's') &&
            ($_POST ["plotinput"] [$i+1] == 'i') &&
            ($_POST ["plotinput"] [$i+2] == 'n') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = sin ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 't') &&
            ($_POST ["plotinput"] [$i+1] == 'a') &&
            ($_POST ["plotinput"] [$i+2] == 'n') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = tan ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 'e') &&
            ($_POST ["plotinput"] [$i+1] == 'x') &&
            ($_POST ["plotinput"] [$i+2] == 'p') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = exp ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }

    else if (($_POST ["plotinput"] [$i] >= '0') && ($_POST ["plotinput"] [$i] <= '9')) {
        $x = ord($_POST ["plotinput"] [$i]) - ord('0');
        $i++;
        return $x;
    }
    else 
        echo "error!!!";
}


?>
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Jetzt führen wir die Variable x ein - ja, das ist ein Witz.

Zunächst ist unsere, Variable x eine globale Variable. Es ist gibt die Variable x einmal in unserem Ausdruck, für unseren Parser, also, was wir im Plotter eingeben - also, in Form vom String - das sind so zu sagen Daten, und ein Mal in PHP als globale Variable $x. Die hat global einen Wert. Der ist vom Typ float. Und sie kommt ein Wert rein. Da ist immer ein Wert drin.

Die Variable x in unserem String von unserem Parser, die wird da ausgewertet, wo unser Parser factor () hat. Da wertet er ja die Konstanten von '0' bis '9' aus und gibt entsprechend 0 bis 9 zurück. Hier wird mit einem weiteren if-then-else, also else-if festgestellt, kommt vielleicht 'x'. Wird 'x' gefunden wird vom factor (), der Wert der globalen Variable $x zurückgegeben.

Nachher tut unserer Funktionsplotter, die Variable $x einfach in kleinen Schritten 0.0001 einfach nach oben zählen, in einer Schleife. Ruft jedes Mal den Parser über expr() auf. Erhält den Funktionwert an der entsprechenden Stelle und erhält den Funktionwert. Und dann kommt der Plotter und verbindet die Funktionswerte.
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Das war mal das mit x,

Code: Select all

<form method="post" action="funktionsplotter4.php">
<textarea name="plotinput" rows="1" cols="80">exp(cos(1+3)*4)</textarea><br>
<input type="Submit" value="plot">
</form>
<?php
$i = 0;
$x = 0.001;

echo exp(cos(1+3)*4);

echo expr ();

function expr () {
    global $i;
    $x = term ();
    if ($_POST ["plotinput"] [$i] == '+') {
        $i++;
        $y = expr ();
        return $x + $y;
    }
    else if ($_POST ["plotinput"] [$i] == '-') {
        $i++;
        $y = expr ();
        return $x - $y;
    }
    return $x;
}

function term () {
    global $i;
    $x = factor ();
    if ($_POST ["plotinput"] [$i] == '*') {
        $i++;
        $y = term ();
        return $x * $y;
    }
    else if ($_POST ["plotinput"] [$i] == '/') {
        $i++;
        $y = term ();
        return $x / $y;
    }
    return $x;
}

function factor () {
    global $i;
    if ($_POST ["plotinput"] [$i] == '(') {
        $i++;
        $x = expr ();
        if ($_POST ["plotinput"] [$i] == ')')
            $i++;
        else
            echo "error!";
        return $x;
    }
    else if (($_POST ["plotinput"] [$i+0] == 'c') &&
            ($_POST ["plotinput"] [$i+1] == 'o') &&
            ($_POST ["plotinput"] [$i+2] == 's') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = cos ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 's') &&
            ($_POST ["plotinput"] [$i+1] == 'i') &&
            ($_POST ["plotinput"] [$i+2] == 'n') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = sin ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 't') &&
            ($_POST ["plotinput"] [$i+1] == 'a') &&
            ($_POST ["plotinput"] [$i+2] == 'n') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = tan ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 'e') &&
            ($_POST ["plotinput"] [$i+1] == 'x') &&
            ($_POST ["plotinput"] [$i+2] == 'p') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = exp ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }

    else if (($_POST ["plotinput"] [$i] >= '0') && ($_POST ["plotinput"] [$i] <= '9')) {
        $x = ord($_POST ["plotinput"] [$i]) - ord('0');
        $i++;
        return $x;
    }
    else if (($_POST ["plotinput"] [$i] == 'x')) {
        $i++;
        return $x;
    }

    else 
        echo "error!!!";
}


?>
Jetzt ein kleiner Test, x einer Schleife nach oben zählen.
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Halt, da ist noch ein Fehler drin, er macht keine automatische Umwandlung von integer nach float. Kein Cast - das Float wird als 0 in Integer aufgefasst. Deswegen müssen wir gucken, wie wir Integer nach Float umwandeln.

Nein! Entschuldigung, habe ich mir auch nicht vorstellen können, der Fehler ist, dass ich $x natürlich nicht global, das darf nicht global sein, weil jede Funktion ihr eigenes verwendet, $x in den Funktionen verwende und jetzt global. Das ist kein Problem - weil $x wird global eigentlich gar nicht verwendet. Ich nenne es einfach $v.
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Jetzt funktioniert es und es war noch ein Fehler, mal wieder das global vergessen, weil $v ist ja global

Code: Select all

<form method="post" action="funktionsplotter6.php">
<textarea name="plotinput" rows="1" cols="80">exp(cos(1+3)*4)</textarea><br>
<input type="Submit" value="plot">
</form>
<?php
$i = 0;
$v = 0.001;

echo expr ();

function expr () {
    global $i;
    $x = term ();
    if ($_POST ["plotinput"] [$i] == '+') {
        $i++;
        $y = expr ();
        return $x + $y;
    }
    else if ($_POST ["plotinput"] [$i] == '-') {
        $i++;
        $y = expr ();
        return $x - $y;
    }
    return $x;
}

function term () {
    global $i;
    $x = factor ();
    if ($_POST ["plotinput"] [$i] == '*') {
        $i++;
        $y = term ();
        return $x * $y;
    }
    else if ($_POST ["plotinput"] [$i] == '/') {
        $i++;
        $y = term ();
        return $x / $y;
    }
    return $x;
}

function factor () {
    global $i;
    global $v;
    if ($_POST ["plotinput"] [$i] == '(') {
        $i++;
        $x = expr ();
        if ($_POST ["plotinput"] [$i] == ')')
            $i++;
        else
            echo "error!";
        return $x;
    }
    else if (($_POST ["plotinput"] [$i+0] == 'c') &&
            ($_POST ["plotinput"] [$i+1] == 'o') &&
            ($_POST ["plotinput"] [$i+2] == 's') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = cos ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 's') &&
            ($_POST ["plotinput"] [$i+1] == 'i') &&
            ($_POST ["plotinput"] [$i+2] == 'n') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = sin ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 't') &&
            ($_POST ["plotinput"] [$i+1] == 'a') &&
            ($_POST ["plotinput"] [$i+2] == 'n') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = tan ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }
    else if (($_POST ["plotinput"] [$i+0] == 'e') &&
            ($_POST ["plotinput"] [$i+1] == 'x') &&
            ($_POST ["plotinput"] [$i+2] == 'p') && 
            ($_POST ["plotinput"] [$i+3] == '(')) {
            $i += 4;
            $x = expr ();
            $y = exp ($x);
            if ($_POST ["plotinput"] [$i] == ')') 
                $i++;
            else
                echo "error!!";
            return $y;
    }

    else if (($_POST ["plotinput"] [$i] >= '0') && ($_POST ["plotinput"] [$i] <= '9')) {
        $x = floatval(ord($_POST ["plotinput"] [$i]) - ord('0'));
        $i++;
        return $x;
    }
    else if (($_POST ["plotinput"] [$i] == 'x')) {
        $i++;
        return $v;
    }

    else 
        echo "error!!!";
}


?>
david
Site Admin
Posts: 562
Joined: Sun May 30, 2021 7:03 am

Re: Jetzt liefere ich ihnen etwas, die Darstellung von Bildern

Post by david »

Jetzt machen wir eine Zählschleife, und gucken ob gute Werte rauskommen. Wir machen ein kleines Intervall und *2+4
Post Reply