Was genau verstehst du da nicht?
Ich versuchs mal etwas zu erklären:
if( isset($_GET['a']) )
$a = (int) $_GET['a'];
else
$a = 0;
Ich hole die Parameter welche über Get übergeben wurden. Es gibt zwar mehrere Wege das ist aber mitunter die einfachste. Das funktioniert so:
Du gibst in der URL das hier ein:
http://blabla.bla/script.php?a=1&b=2&c=3
Dabei bedeutet das ? dass hinter dem Skript Variablen per Get Methode übermittelt werden und zwar nach dem Schema Variablenname = Variableninhalt. Die Variablen werden mit & voneinander getrennt. Man kann auch Text und ähnliches so übergeben aber Achtung, Sonderzeichen sind nicht erlaubt (dazu zählen auch Leerzeichen, &, Umlaute, usw.), dafür muss man das ganze escapen aber das ist gerade egal.
Die Variablen stehen dann im Skript selbst in dem Array $_GET['Variablenname'] zur verfügung. Mit isset prüfe ich ob diese existiert denn ich kann ja schlecht was nutzen was es gar nicht gibt. Und falls es diese Variable gibt dann weise ich den Inhalt der über URL kommt meiner Variablen $a zu, das (int) ist dabei ein Typecast und erzwingt sozusagen eine Umwandlung in eine Ganzzahl, so dass Kommazahlen Text und sonstiges so fern möglich in eine Ganze Zahl umgewandelt werden.
echo 'Zahl 1 = '.$a."<br />\n";
echo 'Zahl 2 = '.$b."<br />\n";
echo 'Größter gemeinsamer Teiler: ';
Das hier ist lediglich die Ausgabe. Hoffe du verstehst das alles. Kleine Info normale ' stehen für normalen Text es werden keine Ersetzungen durchgeführt ist auch die schnellste Art der Ausgabe (abgesehen von direktem HTML), auch wenn die Unterschiede nur messbar gering sind. Text in " wird jedoch ersetzt, so dass wenn man $X schreibt da der Inhalt der Variablen mit dem Namen X reinkopiert wird wohingegen bei ' direkt der Text $Variable und nicht der Inhalt der Variablen X ausgeben wird. Hinzu kommt dass man unter " escapesequenzen wie \n (Neue Zeile), \t (Tab) und ähnliches nutzen kann. Der Punkt dient zum verbinden von Zeichenketten, Zahlen werden da automatisch in Zeichenkettenumgewandelt, verbunden und dann ausgegeben.
if($a > 0 && $b > 0) {
while($a != $b) {
if($a < $b) {
$c = $a;
$a = $b;
$b = $c;
}
$a = $a - $b;
}
echo $b."<br />\n";
}
else
echo "Nicht definiert!<br />\n";
Das if($a > 0 && $b > 0) prüft ob beide Zahlen größer sind als 0 denn wenn sie es nicht sind haut die ganze Sache nicht hin und es wird Nicht definiert ausgeben! Wenn sie aber größer sind wird die Berechnung von deinem Programm durchgeführt.
ich nutze while (Bedingung) { ... } was eine Kopfgesteuerte Schleife ist du nutzt do { ... } while (Bedingung) was eine Fußgesteuerte Schleife ist, der Unterschied ist der dass bei einer Kopfgesteuerten Schleife erst geprüft wird und dann die Anweisungen ausgeführt werden, so dass wenn die Bedingung am Anfang nicht stimmt diese niemals ausgeführt wird, wohingegen bei der Fußgesteuerten Schleife erst die Anweisungen ausgeführt werden und erst dann geprüft wird, so dass bei der Fußgesteuerten Schleife die Anweisungen immer mindestens einmal ausgeführt werden auch wenn die Bedingung falsch ist. Ich nutze die Kopfgesteuerte da wenn $a = $b bei mir der Code nicht ausgeführt wird da ja schon das Ergebnis da ist, würde der Code ausgefürht werden, würde er Mist bauen und sich aufhängen weil dann diese Bedingung nachher nicht mehr zutreffen wird (Endlosschleife).
Und ansonsten habe ich die Umstellungen vorgenommen wie ich vorher erwähnt hatte das Tauschen vor die Subtraktion und das Tauschen außerhalb der Schleife entfernt.
Ach und noch was {} sind bei if, while und sonstigen Dingen nicht immer nötig!
das hier ist zum Beispiel das gleiche:
PHP:
if (...) {
$a = 1;
}
else {
$a = 0;
}
wie das hier:
PHP:
if (...)
$a = 1;
else
$b = 1;
Jedoch sind die hier nicht gleich:
PHP:
if (...) {
$a = 1;
$b = 2;
}
else {
$a = 0;
$b = 3
}
PHP:
if (...)
$a = 1;
$b = 2;
else
$b = 1;
$b = 3;
Denn ein if oder ein while zum Beispiel führt
immer nur die nächste Anweisung durch niemals 2 oder 3. Will man jedoch mehrere Anweisungen zu einem if packen muss man das ganze mit {} gruppieren wodurch dann x-beliebige Anweisungen zu einer einzigen Anweisung werden (aus Sicht der Syntax). Diese Gruppierungen kann man sogar beliebig im Code durchführen (auch ohne if, while oder sonstigem) zum Beispiel so:
$a = 1;
{
$b = 2;
$c = 3;
}
$d = 4;
Hinzu kommt noch dass ein einzelnes ; an sich das Ende einer Anweisung bedeutet steht nix davor ist es die leere Anweisung.
So dass dann folgendes nicht identisch ist:
Wie gesagt führt ein if immer nur die nächste Anweisung durch, im oberen Fall ist es die leere Anweisung so dass das $a immer ausgeführt wird egal ob die Bedingung im if nun True oder False liefer. Im zweiten Fall ist die nächste Anweisung aber $a = 1; so dass es nur bei True in der Bedingung ausgeführt wird aber nicht bei False. Selbes gilt natürlich für Schleifen wie while.
Ach außerdem solltest du dir Gedanken um die Gestaltung deines Codes machen denn so wie dein Code bisher aussah wirst du sehr flott Probleme bekommen. Aber es gibt auch relativ viele Unterschiedliche Stile ich bevorzuge meinen. Was du aber aufjedenfall machen solltest ist Einrücken! Und ggf. leere Zeilen wenn was neues kommt, das ist einfach Pflicht!
Hier mal ein paar Stile:
http://de.wikipedia.org/wiki/Einr%C3%BCckungsstil
ist fehlerhaft, da sich wenn $a = $b das ganze aufhängt! Hier sollte man eine kopfgesteuerte und keine fußgesteuerte Schleife nehmen.
Nö. Das passt semantisch. Es ist kein schöner Stil, aber darum geht es ja wohl bei der Aufgabe, den gräßlichen Code in schönen Code umzubauen.
Es geht mir hier nicht um Schönheit sondern dass bei gewissen Konstellationen sich das Skript in einer Endlosschleife aufhängt! Teste es.
3. Muss das mit $a < $b nur vor der Subtraktion ausgeführt werden nicht aber danach
Wird es doch. $a und $b werden sortiert, bevor die nächste Subtraktion vorgenommen wird. Optimal ist es so nicht, aber korrekt schon.
Lies mal genau, ich sagte nicht dass es das nicht wird sondern dass es
nur also einmal ausgeführt werden muss. Hier ging es um eine Optimierung die eben von der Aufgabe verlangt ist!
Ach falls du die ganzen Skripte auch mal testen willst setz dir nen PHP Server auf, zum Beispiel den hier:
http://www.apachefriends.org/de/xampp.html Aber Achtung er ist nicht auf Sicherheit getrimmt am Besten versteckst du ihn hinter einer Firewall.