php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #16 (permalink)  
Alt 05-11-2012, 10:59
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

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.
Mit Zitat antworten
  #17 (permalink)  
Alt 05-11-2012, 11:10
b1p
 Registrierter Benutzer
Links : Onlinestatus : b1p ist offline
Registriert seit: Oct 2012
Beiträge: 39
b1p befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #18 (permalink)  
Alt 05-11-2012, 11:21
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

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.
Mit Zitat antworten
  #19 (permalink)  
Alt 08-11-2012, 08:19
b1p
 Registrierter Benutzer
Links : Onlinestatus : b1p ist offline
Registriert seit: Oct 2012
Beiträge: 39
b1p befindet sich auf einem aufstrebenden Ast
Standard

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...

Geändert von b1p (08-11-2012 um 08:52 Uhr)
Mit Zitat antworten
  #20 (permalink)  
Alt 08-11-2012, 09:40
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #21 (permalink)  
Alt 08-11-2012, 14:23
b1p
 Registrierter Benutzer
Links : Onlinestatus : b1p ist offline
Registriert seit: Oct 2012
Beiträge: 39
b1p befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dreieck-Konstruktion Hexcode PHP Developer Forum 20 07-12-2009 16:31
Dreieck zeichnen erwin_lier PHP Developer Forum 7 17-09-2008 11:40
Bild aus Datenbank erzeugen aSkInG PHP Developer Forum 23 30-05-2008 12:02
bermuda-dreieck die x-te schmalle Fragen/Vorschläge zum Forum 3 21-03-2004 09:54

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:31 Uhr.