Dreieck aus Zeichen erzeugen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Schade, dass du aufgibst. Ist eigentlich eine wirklich nette Aufgabe

    Hiermal meine Lösung inklusive Kommentare. Es wäre bestimmt für manch andere Anfänger hilfreich, wenn du kurz kommentierst, woran genau du bei dem Problem (im Vergleich zur Lösung) gescheitert bist.

    Für mich wäre es auch interessant, damit ich weiß, womit Anfänger eher Probleme haben.

    PHP-Code:
    <?php 

    function replaceCharsAtRow($line$rowNum$char) {
        
        
    // Erstmal brauchen wir die Länge der zu verarbeitenden Zeile.
        // Die ist zwar eigentlich immer gleich, aber damit die Funktion schön
        // dynamisch bleibt, sollte davon erstmal nicht ausgegangen werden
        
    $length strlen($line);

        
    // Nun berechnen wird, wo wir etwas ersetzen müssen, abhänging von
        // der Länge der Stufe. Zunächst brauchen wir den Mittelpunkt.
        // Da wir von einem 0-Index ausgehen, ist dieser mit der unten
        // stehenden Formel direkt berechnet. Nehmen wir z.B. an, dass die Zeile
        // 5 lang ist, so ist die "mitte" der Index "2". Also ziehen wir eins ab
        // und halbieren den Rest. Somit kommen wir zuverlässig auf den Mittelpunktindex
        
    $positionCenter = ($length 1) / 2;
        
        
    // Nun brauchen wir noch die Indizes der rechten und linken Ersetzungen.
        // Diese hängen natürlich vom Mittelpunkt ab, denn dieser "wandert" ja,
        // je länger die Zeile wird, immer weiter nach rechts.
        // Da wir den Index der aktuellen Stufe haben (rowNum), können wir
        // diesen relativ schön dafür benutzen, um je nach Stufe und je nach
        // Mittelpunkt den genauen Index zu erhalten, an dem wir links (minus)
        // und rechts (plus) ersetzen müssen
        
    $positionLeft $positionCenter $rowNum;
        
    $positionRight $positionCenter $rowNum;

        
    // Wenn die aktuelle Stufe die erste ist (Index 0) müssn wir nur eine
        // Ersetzung durchführen, da dort ja nur ein Pyramidenzeichen vorhanden ist
        
    if ($rowNum == 0) {
            return 
    substr_replace($line$char$positionCenter1);
        } else {
            
    // Sind wir aber irgendwo mitten in der Pyramide, müssen wir sowohl links
            // als auch rechts ersetzen
            
    $tmp substr_replace($line$char$positionLeft1);
            return 
    substr_replace($tmp$char$positionRight1);
        }
    }

    function 
    pyramid($amount$filler$char) {
        
        
    // Da wir nur mit ungeraden Anzahlen umgehen können, prüfen wir zunächst darauf
        // und steigen ansonsten sofort aus dem Skript aus
        
    if ($amount == 0)
            throw new \
    Exception("Only odd numbers of characters are supported!");
        
        
    // Dies berechnet die Höhe der Pyramide. Diese ergibt sich aus der Überlegung,
        // dass auf jeder Stufe (ausgenommen der ersten) genau zwei Zeichen vorhanden sind.
        // Will man also die Gesamthöhe der Pyramide mit X Zeichen, braucht man mindestens
        // einmal X / 2 Stufen. Die + 1 bringt dann die erste Stufe mit, da diese ja nur
        // ein Zeichen braucht. Um Rundungsfehler (ungerade Zahlen) auszugleichen, ziehen
        // wir dieses eine Zeichen vorher ab.
        
    $height + (($amount 1) / 2);
        
        
    // Die Breite der Pyramide ergibt sich dann daraus, dass mit jeder neuen Stufe
        // (Höhe) der Pyramide, zwei neue Zeichen hinzukommen. Die - 1 zieht wieder
        // die erste Stufe ab, da diese ja bereits in der Höhe berechnet wurde
        
    $width $height 1;

        
    // Hier wird die gesamte Pyramide reingeschrieben und später zurückgegeben
        
    $pyramid '';

        
    // Nun erstellen wir die eigentliche Pyramide, indem alle Stufen der Pyramide
        // nacheinander "gebaut" werden und einzeln verarbeitet werden
        
    for ($currentRow 0$currentRow $height$currentRow++) {
            
            
    // Zunächst erstellen wir eine "leere" Zeile, die nur das Füllzeichen enthält
            // und zwar genau so oft, wie die Breite der Pyramide angibt
            
    $currentLine str_repeat($filler$width);
            
            
    // Nun ersetzen wir, abhänging von der aktuellen Stufe, die Pyramidenzeichen
            // in dieser leeren Stufe mit einer eigenen Funktion
            
    $pyramid .= replaceCharsAtRow($currentLine$currentRow$char);
            
            
    // Dann noch ein Zeilenumbruch, damit es auch eine Pyramide wird ;-)
            
    $pyramid .= '<br/>';
        }

        
    // Und zurück damit
        
    return $pyramid;
    }

    echo 
    pyramid(5'-''#');
    Ist sehr "sprechend" programmiert. Das kann man bis zur absolute Unkenntlichkeit kürzen und optimieren, aber darum gehts hier eher weniger denke ich.
    This is what happens when an unstoppable force meets an immovable object.

    Kommentar


    • #17
      Also ich hing lange an der Lösung, wie ich denn nun die Position der zu setzenden Zeichen rausfinde!
      Derweil ist es so einfach, wenn man nur einmal nicht so kompliziert denkt

      aber um das zu lernen hab ich ja noch paar Monate...

      So wie du es gelöst hast, wäre ich niemals drauf gekommen! Vor allem, da du mir unbekannte Befehle wie substr_replace o.ä. benutzt.

      Kommentar


      • #18
        Die waren mir, bis ich das Problem lösen wollte, auch unbekannt. Das sind nur Google-Skills.

        Einmal suchen nach "PHP fill string with characters" führt zu -> str_repeat

        Und die Suche nach "PHP replace substring" führt zu -> substr_replace

        90% meiner Zeit beim Programmieren verbringe ich mit googlen. Denn man ist in 99% der Fälle nicht der erste, der ein Problem hat. Andere haben das schon gelöst, also warum selbst nochmal lösen? (Außer, um etwas zu lernen)
        This is what happens when an unstoppable force meets an immovable object.

        Kommentar


        • #19
          Und ich mal wieder!

          Jemand eine Ahnung wie man nun um mein oben gebasteltes Dreieck einen Rahmen aus selbst eingegebenen Zeichen (z.B. "X") bastelt, der sich auch noch mit wachsender Größe des Dreiecks, selbst vergrößert?

          PHP-Code:
          <html>
          <center>
          <?php
          function pyramide($a,$b,$c)
          {
              
          $output "";
              for (
          $k 0$k $c$k++) //Zeilen
                  
          {
                  for (
          $i 1$i <= $a$i++) //Zeichenanzahl
                      
          {
                      
          $pos1 = (($a+1)/2)-$k;
                      
          $pos2 = (($a+1)/2)+$k;
              
                      if(
          $i == $pos1 || $i == $pos2//Zeichen setzen
                          
          {
                              echo 
          $b;
                          }
                      else
                          {
                              echo 
          "&emsp;"//Leerzeichen setzen
                          
          }
                      }
                      echo 
          "<br />";
                  }
          }
          $num = (isset($_POST["num"])) ? $_POST["num"] : 3// kein Wert, mind. 3 Zeichen
          $char1 = (isset($_POST["char1"])) ? $_POST["char1"] : "#"// kein Wert -> #
          $char2 = (isset($_POST["char2"])) ? $_POST["char2"] : "X"// kein Wert -> X 
           
          $rows round($num/2);
          $pos 1;

          if(
          $num%== 0//prüft ob die Zahl gerade ist
          {
              echo 
          "<h1>Please enter an odd number!</h1>";
          }
          elseif(
          $num 3//prüft ob die Anzahl der Zeichen kleiner als 3 ist.
          {
              echo 
          "<h1>A pyramide needs at least 3 signs!</h1>";
          }
          else
          {
              
          #for($x = 1; $x <= ($num+2); $x++)
              #{
              #    echo $char2;
              #}
              #echo "<br />";
              
          $a $num;
              
          $b $char1;
              
          $c $rows;
              
          pyramide($a,$b,$c);
          }
          ?>
          </center>
          </html>
          Dieses Dreieck soll also nach eingabe eines weiteren Zeichens (char2) von diesem umrahmt werden...
          Zuletzt geändert von b1p; 08.11.2012, 07:52.

          Kommentar


          • #20
            Zitat von b1p Beitrag anzeigen
            Jemand eine Ahnung wie man nun um mein oben gebasteltes Dreieck einen Rahmen aus selbst eingegebenen Zeichen (z.B. "X") bastelt, der sich auch noch mit wachsender Größe des Dreiecks, selbst vergrößert?
            Breite des Dreiecks berechnen, dann oben erst mal Breite + 2 mal 'X' ausgeben.
            In jeder Dreiecks-Zeile vorne und hinten ein 'X'.
            Und dann nochmal das gleiche wie oben.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #21
              endlich fertig!

              Formular:

              PHP-Code:
              <html
                  <
              head
                      <
              title>Pyramide</title
                  </
              head
                  <
              body
                      <
              br><br
                      <
              center
                          <
              form action="bom.php" method="post"
                              
              num: <input type="text" name="num" size="2"><br
                              
              char 1: <input type="text" name="char1" size="2"><br
                              
              char 2: <input type="text" name="char2" size="2"><br
                              <
              input type="submit" name="submit" value="build pyramide ..."
                          </
              form
                          <
              br><br
                  </
              body
              </
              html
              Programm:

              PHP-Code:
              <html>
                  <head>
                  <title>BOM's Pyramide</title>
                  </head>
              <body>
              <center>
              <?php
              function pyramide($a,$b,$c,$d)
              {
                  for (
              $k 0$k $c$k++) //Zeilen
                      
              {
                      for (
              $i 0$i <= ($a+1); $i++) //Zeichenanzahl
                          
              {
                          
              $pos1 = (($a+1)/2)-$k;
                          
              $pos2 = (($a+1)/2)+$k;
                  
                          if(
              $i == $pos1 || $i == $pos2//Zeichen setzen
                              
              {
                                  echo 
              $b;
                              }
                          elseif(
              $i == || $i == $a+1)
                              {
                              echo 
              $d;
                              }
                          else
                              {
                                  echo 
              "&ensp;"//Leerzeichen setzen
                              
              }
                              
                          }
                          echo 
              "<br />";
                      }
              }
              $num $_POST["num"]; 
              $char1 $_POST["char1"]; 
              $char2 $_POST["char2"]; 
               
              $rows round($num/2);
              $pos 1;

              if(
              $num%== 0//prüft ob die Zahl gerade ist
              {
                  echo 
              "<h1>Please enter an odd number!</h1>";
              }
              elseif(
              $num 3//prüft ob die Anzahl der Zeichen kleiner als 3 ist.
              {
                  echo 
              "<h1>A pyramide needs at least 3 signs!</h1>";
              }
              else
              {    
                  for(
              $x 0$x <= $num+1$x++)
                  {    
                      echo 
              "$char2";
                  }
                  echo 
              "<br />";
                  
              $a $num;
                  
              $b $char1;
                  
              $c $rows;
                  
              $d $char2;
                  
              pyramide($a,$b,$c,$d);
                  for(
              $x 0$x <= $num+1$x++)
                  {    
                      echo 
              "$char2";
                  }
              }
              ?>
              </center>
              </body>
              </html>
              Danke an alle die mir geholfen haben

              Kommentar

              Lädt...
              X