Ergebnis 1 bis 10 von 10

Thema: Pascallsches Dreieck in PHP programmiert, kleiner FEHLER

  1. #1
    Meister(in)
    Registriert seit
    20.05.2005
    Ort
    Rheinland-Pfalz
    Beiträge
    275
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard Pascallsches Dreieck in PHP programmiert, kleiner FEHLER

    Hallo Leute,

    vor nen paar Tagenmeinte ich zu meiner Mathelehrerin ich würd noch ein Referat über das pascallsche Dreieck halten, so mit allem möglichem drum und dran, und so, dass die Mitschüler selbst ausprobieren können was für Muster dran kommen usw.. Hat alles funkltioniert, das Dreieck ist dynamisch aufgebaut (mit PHP ohne Db). Ausrechnen tut er mir auch alles bis ins unermessliche, kein Thema, aber sobald ich Durch x Teilbare Zahlen markieren lassen möchte macht er Probleme. Bis in die 30igste Reihe funktioniert alles wunderbar(oder n paar mehr). Anschließend setzen markierte Felder aus. betrachtet man es sich genau entsteht eine Parabel. Die aufm Kopf steht O.o ... Man sieht es aber nur wenn man die Einstellung auf Minimal stellt. Sja am besten mal selbst anschauen: http://pascal.topfkuchration.de . Wisst ihr woran das liegen könnte? Evtl. Serverleistung? Aber ausrechnen tut ers ja, und während es ausgerechnet wird, wird auch überprüft ob Farbig oder nicht ...

    Naja, guckt mal falls interessiert.

    Mfg, Felix.



    Quellcode(Kompletter Inhalt in dieser Datei!):

    Code:
    <?
    $tab=$_GET&#91;"tab"&#93;;// Übergabe der Aktuellen Pascal-Einstellungen
    $pascal=$_GET&#91;"pascal"&#93;;// Übergabe der Aktuellen Seite
    $c = $_POST&#91;"faktor"&#93;;// Übergabe der "Durch x Teilbare Zahl"
    //Links &#40;Wird immer ausgegeben&#41;
    echo "
    <table border=0 width=$table_width><tr><td>
    <body bgcolor=black link=#FFFFFF alink=#FFFFFF vlink=#FFFFFF text=#FFFFFF>
     | <a href=?pascal=faktorium&tab=$tab>Durch x Teilbare Zahlen markieren | 2er Potenz | <a href=?pascal=einstellungen&tab=$tab>Einstellungen</a>
    
    ";
    //  !!--!! Links
    //Faktorium
    if &#40;$pascal == "faktorium"&#41;
       &#123;
    echo"
    <form action='' method='POST'>Durch <input type=text name=faktor size=5> Teilbare Zahlen &#40;Natürliche&#41;
    <input type= \"submit\">
    </form>
    ";
       &#125;
    //  !!--!! Faktorium
    //Einstellungen
    if &#40;$pascal=="einstellungen"&#41;
       &#123;
    echo"
    <form action='' method='GET'>Größe&#58;<select name=tab><option value=0>Minimalverbrauch</option><option value=1>Klein</option><option value=2>Normal</option></select>
    <input type= \"submit\">
    </form>
    ";
       &#125;
    if &#40;$tab==""&#41;
       &#123;
       $a=42;//Tabellenhöhe/breite
       $d=3;//Schriftgröße
       $e=22;//Reihenanzahl
       $b = $a;//Tabellenhöhe/breite
       $table_width = "1180";
       $f = 1;
       &#125;
    if &#40;$tab=="0"&#41;
       &#123;
       $a=15;//Tabellenhöhe/breite
       $d=1;//Schriftgröße
       $e=60;//Reihenanzahl
       $b = $a;//Tabellenhöhe/breite
       $table_width = "100%";
       $f = 0;
       &#125;
    if &#40;$tab=="1"&#41;
       &#123;
       $a=42;//Tabellenhöhe/breite
       $d=1;//Schriftgröße
       $e=30;//Reihenanzahl
       $b = $a;//Tabellenhöhe/breite
       $table_width = "1510";
       $f = 1;
       &#125;
    if &#40;$tab=="2"&#41;
       &#123;
       $a=42;//Tabellenhöhe/breite
       $d=3;//Schriftgröße
       $e=22;//Reihenanzahl
       $b = $a;//Tabellenhöhe/breite
       $table_width = "1180";
       $f = 1;
       &#125;
    //  !!--!! Einstellungen
    //
    //Pascal
    //
    //Angezeigtes pascallsches Dreieck mit normalen Einstellungen
    if&#40;$tab == "" OR $tab == "1" OR $tab == "2"&#41;
       &#123;
    $id = 1;
    $wert = 1;
    $reihe = 1;
    $platz = 1;
    $zahl&#91;$reihe&#93;&#91;$platz&#93; = $wert;
    if&#40;$f==0&#41;&#123;$wert=0;&#125;
    echo "
    <div align=center><table border=1><tr width=100%><td width=$a height=$b align=center><font color=white size=$d>".$f*$wert."</td></tr></table>";
    while &#40;$platz == $reihe&#41; 
       &#123;
       $id++;
       $reihe++;
       $platz=1;
       $wert=1;
       $zahl&#91;$reihe&#93;&#91;$platz&#93; = $wert;
       $zahl&#91;$reihe&#93;&#91;0&#93; = 0;
       if&#40;$f==0&#41;&#123;$wert=0;&#125;
       echo "<table border=1><tr width=100%><td width=$a height=$b align=center><font color=white size=$d>".$wert*$f."</td>";
       while &#40;$platz < $reihe&#41;
          &#123;
          $id++;
          $Nreihe = $reihe;
          $Nreihe--;
          $Aplatz = $platz;
          $platz++;
          $Bplatz = $platz;
          $Azahl = $zahl&#91;$Nreihe&#93;&#91;$Aplatz&#93;;
          $Bzahl= $zahl&#91;$Nreihe&#93;&#91;$Bplatz&#93;;
          $wert = $Azahl+$Bzahl;
          if&#40;$Aplatz == '0' OR $Bplatz == '0'&#41; $wert=1;
          $zahl&#91;$reihe&#93;&#91;$platz&#93; = $wert;
          if&#40;$f==0&#41;&#123;$wert=0;&#125;
          if &#40;$c == ""&#41; &#123;$color="white";&#125;else&#123;$x = $zahl&#91;$reihe&#93;&#91;$platz&#93; / $c; $y = &#40;int&#41;$x; if&#40;$x==$y&#41;&#123;$color="red";&#125;else&#123;$color="white";&#125;&#125;
          echo "<td width=$a height=$b align=center><font color=".$color." size=$d> ".$wert*$f." </font></td>";
          &#125;
       echo "</tr></table>";if&#40;$reihe > $e&#41; exit;
       &#125;
    echo "</td></tr></table>";
       &#125;
    
    
    //Angezeigtes pascallsches Dreieck bei "Minimal-Einstellungen"
    if &#40;$tab == "0"&#41;
       &#123;
    $id = 1;
    $wert = 1;
    $reihe = 1;
    $platz = 1;
    $zahl&#91;$reihe&#93;&#91;$platz&#93; = $wert;
    if&#40;$f==0&#41;&#123;$wert=0;&#125;
    echo "
    <div align=center><font color=white size=$d>".$f*$wert."
    ";
    while &#40;$platz == $reihe&#41; 
       &#123;
       $id++;
       $reihe++;
       $platz=1;
       $wert=1;
       $zahl&#91;$reihe&#93;&#91;$platz&#93; = $wert;
       $zahl&#91;$reihe&#93;&#91;0&#93; = 0;
       if&#40;$f==0&#41;&#123;$wert=0;&#125;
       echo "<font color=white size=$d>".$wert*$f."";
       while &#40;$platz < $reihe&#41;
          &#123;
          $id++;
          $Nreihe = $reihe;
          $Nreihe--;
          $Aplatz = $platz;
          $platz++;
          $Bplatz = $platz;
          $Azahl = $zahl&#91;$Nreihe&#93;&#91;$Aplatz&#93;;
          $Bzahl= $zahl&#91;$Nreihe&#93;&#91;$Bplatz&#93;;
          $wert = $Azahl+$Bzahl;
          if&#40;$Aplatz == '0' OR $Bplatz == '0'&#41; $wert=1;
          $zahl&#91;$reihe&#93;&#91;$platz&#93; = $wert;
          if&#40;$f==0&#41;&#123;$wert=0;&#125;
          if &#40;$c == ""&#41; &#123;$color="white";&#125;else&#123;$x = $zahl&#91;$reihe&#93;&#91;$platz&#93; / $c; $y = &#40;int&#41;$x; if&#40;$x==$y&#41;&#123;$color="red";&#125;else&#123;$color="white";&#125;&#125;
          echo "<font color=".$color." size=$d> ".$wert*$f." </font>";
          &#125;
       echo "
    ";if&#40;$reihe > $e&#41; exit;
       &#125;
    echo "
    ";
    &#125;
    //
    //  !!--!!  Pascal
    //
    ?>
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Interessierte/r
    Registriert seit
    13.05.2007
    Ort
    Sachsen
    Beiträge
    127
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Das Problem liegt daran, dass die Zahlen zu groß für php sind. Bereits in der 35. Zeile überschreiten die Werte von "$zahl[$reihe][$platz]" die Zahl 2147483647. Dies ist der größte Integerwert.
    Man müsste nur noch herausfinden wie man mit noch größeren Werten rechnen kann.

    PS: Als Codeänderung (für meine Verhältnisse eindeutiger zu verstehen) in der 105. und 148. Zeile:
    Code:
    $color = &#40;$c != "" AND $zahl&#91;$reihe&#93;&#91;$platz&#93;%$c == 0&#41; ? "red" &#58; "white";
    Sollte eigentlich genauso funktionieren (Wenn nicht gar noch besser, weil die Zehlen nicht dividiert werden müssen)(Ist aber trotzdem noch nicht die gesamte Lösung, da bei einigen Zahlen trotzdem noch modulo rumzickt).

    PSS: Ich werde mal schauen, ob nicht doch irgendwie größere Zahlen zu verarbeiten gehen.

    [EDIT]
    Da und da sind jeweils noch ein paar Beiträge, zu einer Ähnlichen Problematik (Modulo lässt sich halt nur auf Integers anwenden und dieser reicht leider nicht aus).

    [EDIT]
    http://de3.php.net/manual/de/ref.gmp.php Dies ist eine externe LIB, mit der man große Integers berechnen kann. Damit sollte es eigentlich funktionieren. Vielleicht ist bei deinem Hoster ja bereits diese LIB installiert.

    Viel Glück, Boman.
    Es gibt zwei Regeln fuer Erfolg im Leben:
    1. Erzaehle den Leuten nie alles, was Du weisst ...

  3. #3
    Meister(in)
    Themenstarter

    Registriert seit
    20.05.2005
    Ort
    Rheinland-Pfalz
    Beiträge
    275
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Code:
    $color = &#40;$c != "" AND $zahl&#91;$reihe&#93;&#91;$platz&#93;%$c == 0&#41; ? "red" &#58; "white";
    Die Art kenne ich gar nicht ...


    das mit der Library könnte funktionieren, aber leider ist die nicht installiert.. Kann man die installieren lassen/selbst installieren? Bin bei strato.de



    Edit: mti den den 2 anderen Links komm ich nich klar, wüsste nicht in welcher art ich das übernehmen könnte..

  4. #4
    Interessierte/r
    Registriert seit
    13.05.2007
    Ort
    Sachsen
    Beiträge
    127
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Code:
    $color = &#40;$c != "" AND $zahl&#91;$reihe&#93;&#91;$platz&#93;%$c == 0&#41; ? "red" &#58; "white";
    Das ist eine Art, um einer Variablen einen Wert in abhängigkeit eines boolean zuweisen zu können.
    Code:
    &#40;$boolean&#41; ? $wert_1 &#58; wert_2;
    Der Rückgabewert dieser Zeile ist, wenn ($boolean == true) $wert_1 und bei ($boolean == false) $wert_2.
    Demzufolge wird bei ($c == "") direkt "white" zurückgegeben, denn dann ergibt der boolean immer false, egal welchen wert der Rest hinter AND auch annehmen würde.
    Bei ($c != "") steht es offen, was zurückgegeben wird, es hängt halt von ($zahl[$reihe][$platz]%$c == 0) ab und jenachdem, ob es true oder false ist wird "red" oder auch wieder "white" zurückgegeben.
    Das % in $zahl[$reihe][$platz]%$c == 0 ist Modulo, also der Rest, der Ganzzahligen Division der beiden Zahlen. Und wenn der Rest 0 ist, dann ist $c ein Teiler von $zahl[$reihe][$platz].

    Wegen der Klasse habe ich auch noch nichts weiteres Herausgefunden. Du kannst ja bei strato ja einmal anfragen ob die Klasse installiert werden kann.

    Die beiden anderen Links sind nicht so wichtig.
    Es gibt zwei Regeln fuer Erfolg im Leben:
    1. Erzaehle den Leuten nie alles, was Du weisst ...

  5. #5
    Meister(in)
    Themenstarter

    Registriert seit
    20.05.2005
    Ort
    Rheinland-Pfalz
    Beiträge
    275
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    int() funktioniert ja nur bis zu einer speziellen zahl. kann man nicht anhand des restes (%) überprüfen ob die rechnung aufgegangen ist? wir rbauchen ja keine ergebnisse, sondern nur "rot" oder "weiß" als ergebniss. (Frage führt auf ausgängliche Problematik zurück.)


    Edit: Das ist durch den von dir geschreibenen Code ja schon geschehen, funktioniert aber leider immer noch nich :/

  6. #6
    Meister(in)
    Themenstarter

    Registriert seit
    20.05.2005
    Ort
    Rheinland-Pfalz
    Beiträge
    275
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Jetzt hab ich tatsächlich nur noch diesen einen blöden Fehler drin... echt blöde!!!!!

  7. #7
    Interessierte/r
    Registriert seit
    13.05.2007
    Ort
    Sachsen
    Beiträge
    127
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Das Problem ist, dass wenn die Zahl größer als der spezielle Wert ist, dann wird sie nicht mehr als Integer gespeichert, sondern als Float.
    Das Problem an dem Daten-Typ Float ist, dass er die Zahl nicht genau abspeichert, sondern nur ungefähr: 2357745285661 wird beispielsweise zu 2357745285660. Mit diesen Zahlen lassen sich dann natürlich keine fehlerlosen Modulo-berechnungen durchführen, weil ja die letzte Zahl nicht übereinstimmt.
    Eine Möglichkeit, die Zahlen in voller 'Auflösung' zu speichern und auszuwerten wäre der Daten-Typ String. Allerdings fehlt hierzu der benötigte Modulo-Operator, um zwie Zeichenketten zu 'dividieren'. Dies so eine Funktion könnte man aber auch selber schreiben. Ich hab dafür gerade aber keinen Nerv . Vielleicht mag es auch noch andere Lösungsvarianten geben, aber diese sollte funktionieren.
    Es gibt zwei Regeln fuer Erfolg im Leben:
    1. Erzaehle den Leuten nie alles, was Du weisst ...

  8. #8
    Gast

    Standard

    Spontan denk ich mal, dass es mit einer Array-Lösung zu machen wäre, aber das würde den ganzen code nur verkomplizieren.

  9. #9
    Meister(in)
    Themenstarter

    Registriert seit
    20.05.2005
    Ort
    Rheinland-Pfalz
    Beiträge
    275
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    hmh, wie meinen?

  10. #10
    Interessierte/r
    Registriert seit
    13.05.2007
    Ort
    Sachsen
    Beiträge
    127
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Habe mich jetzt doch mal hin gesetzt, weil ich grad mal Lust hatte. Und folgendes kam dabei raus:
    Code:
    function modulo&#40;$string_1,$string_2&#41;
    &#123;
      $zahl =$string_2;
      settype&#40;$zahl,"integer"&#41;;
      if&#40;strlen&#40;$string_1&#41; < strlen&#40;$string_2&#41;&#41;
        return $string_1;
      else
      &#123;
        $zusatz = 0;
        for&#40;$i=0;$i < strlen&#40;$string_1&#41;;++$i&#41;
        &#123;
          $zusatz = &#40;$zusatz > 0&#41; ? $zusatz."".substr&#40;$string_1,$i,1&#41; &#58; "".substr&#40;$string_1,$i,1&#41;;
          settype&#40;$zusatz,"integer"&#41;;
          $zusatz = $zusatz%$zahl;
        &#125;
        return $zusatz;
      &#125;
    &#125;
    
    function summe&#40;$string_1,$string_2&#41;
    &#123;
      $laenge = &#40;strlen&#40;$string_1&#41; > strlen&#40;$string_2&#41;&#41; ? strlen&#40;$string_1&#41; &#58; strlen&#40;$string_2&#41;;
      $zahl = "";
      $tmp = 0;
      for&#40;$i=0;$i < $laenge;++$i&#41;
      &#123;
        if&#40;$i >= strlen&#40;$string_1&#41;&#41;
        &#123;
          $tmp_2 = substr&#40;$string_2,strlen&#40;$string_2&#41;-1-$i,1&#41;;
          settype&#40;$tmp_2,"integer"&#41;;
          $zahl_tmp = &#40;$tmp+$tmp_2&#41;."";
          if&#40;strlen&#40;$zahl_tmp&#41; > 1&#41;
          &#123;
            $tmp = substr&#40;$zahl_tmp,0,1&#41;;
            settype&#40;$zahl_temp,"integer"&#41;;
          &#125;
          $zahl = $zahl_tmp.$zahl;
        &#125;
        if&#40;$i >= strlen&#40;$string_2&#41;&#41;
        &#123;
          $tmp_1 = substr&#40;$string_1,strlen&#40;$string_1&#41;-1-$i,1&#41;;
          settype&#40;$tmp_1,"integer"&#41;;
          $zahl_tmp = &#40;$tmp+$tmp_1&#41;."";
          if&#40;strlen&#40;$zahl_tmp&#41; > 1&#41;
          &#123;
            $tmp = substr&#40;$zahl_tmp,0,1&#41;;
            settype&#40;$zahl_temp,"integer"&#41;;
          &#125;
          $zahl = $zahl_tmp.$zahl;
        &#125;
        else
        &#123;
          $tmp_1 = substr&#40;$string_1,strlen&#40;$string_1&#41;-1-$i,1&#41;;
          settype&#40;$tmp_1,"integer"&#41;;
          $tmp_2 = substr&#40;$string_2,strlen&#40;$string_2&#41;-1-$i,1&#41;;
          settype&#40;$tmp_2,"integer"&#41;;
          $zahl_tmp = &#40;$tmp+$tmp_1+$tmp_2&#41;."";
          if&#40;strlen&#40;$zahl_tmp&#41; > 1&#41;
          &#123;
            $tmp = substr&#40;$zahl_tmp,0,1&#41;;
            settype&#40;$tmp,"integer"&#41;;
            $zahl_temp = substr&#40;$zahl_tmp,1,1&#41;;
          &#125;
          $zahl = $zahl_tmp.$zahl;
        &#125;
      &#125;
      return $zahl;
    &#125;
    Die Funktion summe bildet die summe von 2 Strings und liefert sie als String zurück.
    Die Funktion modulo errechnet den Rest der Division, der Zahl $string_1 durch $string_2. Und sie liefert das Ergebnis ebenfalls als String zurück. Allerdings ist noch ein Problem bei dieser Funktion vorhanden (welches für die Anwendung in deinem Fall nicht stört): Der Wert $string_2 darf nicht höher als 2147483647 sein.

    Was du jetzt noch machen musst ist, dass du die Werte der einzelnen Felder immer mit summe() zusammenrechnest und als String abspeicherts und dann per modulo()-Funktion vergleichst.
    Falls du die Zahlen, welche ja nun als Daten-Typ String vorliegen, doch noch als double brauchst (was eigentlich Schwachsinn wäre weil dies ungenauer ist) kannst du folgende Zeilen benutzen:
    Code:
    $zahl_als_double = $zahl&#91;$reihe&#93;&#91;$platz&#93;;
    settype&#40;$zahl_als_double,"double"&#41;; //Jetzt ist $zahl_als_double der Double-Wert von $zahl&#91;$reihe&#93;&#91;$platz&#93;
    Es gibt zwei Regeln fuer Erfolg im Leben:
    1. Erzaehle den Leuten nie alles, was Du weisst ...

Ähnliche Themen

  1. Rotes Dreieck
    Von sven080980 im Forum Computer - Internet Forum
    Antworten: 7
    Letzter Beitrag: 30.04.2008, 20:19
  2. Was wird Programmiert
    Von Greg10 im Forum Off Topic und Quasselbox
    Antworten: 3
    Letzter Beitrag: 27.07.2007, 08:59
  3. Kleiner fehler oder Problem und grosse Wirkung
    Von Greenhorn007 im Forum HTML & CSS Forum
    Antworten: 9
    Letzter Beitrag: 10.10.2006, 10:44
  4. Browser kleiner ziehen und bild wird auch kleiner
    Von visual im Forum HTML & CSS Forum
    Antworten: 3
    Letzter Beitrag: 01.09.2005, 09:24
  5. Kleiner Fehler.......Wer entdeckt ihn und kann mir helfen?
    Von Baschti im Forum HTML & CSS Forum
    Antworten: 5
    Letzter Beitrag: 31.07.2005, 19:58

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •