Programmieren mit php und mySQL (Schleifen, Teil 2) - Guru 2.0
Programmieren mit php und mySQL (Schleifen, Teil 2)

Programmieren mit php und mySQL (Schleifen, Teil 2)

Die Hausaufgabe, die Übung 3.3, war sicher eine Herausforderung für Dich. Daher werde ich Dir auch gleich die Lösung zeigen. Aber unser heutiges Thema wird eine zweite Gruppe von Schleifen sein. Sei schon mal gespannt was auf Dich zukommt.

Lösung zu Übung 3.3

Du solltest die Tage der Monate das zweiten Quartals in je einer Zeile ausgeben, zum Beispiel: 1. April 2009, 2. April 2009, und so fort.

Update
Also kleiner_Baum hat in seinem Kommentar wirklick recht: So geht das ganz und gar nicht! Ich stelle Dir eine Aufgabe und mache dann ein einfache Lösung und schummle mich durch. Daher habe ich eine Variante C angefügt. Dies ist natürlich ein wenig komplizierter und Du wirst sicher mehr wie 22 Sekunden zum durchdenken brauchen.

Variante A

[php]<?php
/******************
* Ausgabe der Tage von drei Monaten
* Dateiname: uebung_3_3_a.php
* Funktion: Alle Daten der Monate des 2. Quartals ausgeben
* erstellt am: 20. Mai 2009, 06:23
* Copyright: Clemens Gull
*/

//Zuweisen der Basiswerte
$monat = ""; //Monatsname
$maxTage = 0; //maximale Tage im Monat

//for-Schleife fuer die drei Monate
for ($i = 4; $i <=6; $i++) {
//feststellen welches Monat ist
//Name des Monats speichern
//maximale Tage speichern
switch ($i) {
case 4:
$monat = "April";
$maxTage = 30;
break;
case 5:
$monat = "Mai";
$maxTage = 31;
break;
case 6:
$monat = "Juni";
$maxTage = 30;
break;
} //end switch $i
//Tage des Monats ausgeben
for ($j = 1; $j <= $maxTage; $j++) {
echo $j.". ".$monat." 2009<br/>";
} //end of $j
} //end for $i
?>[/php]

Variante B

[php]<?php
/******************
* Ausgabe der Tage von drei Monaten
* Dateiname: uebung_3_3_b.php
* Funktion: Alle Daten der Monate des 2. Quartals ausgeben
* erstellt am: 20. Mai 2009, 06:25
* Copyright: Clemens Gull
*/

//Zuweisen der Basiswerte
$monat = ""; //Monatsname
$maxTage = 0; //maximale Tage im Monat

//for-Schleife fuer die drei Monate
for ($i = 4; $i <=6; $i++) {
if ($i == 4) {
$monat = "April";
$maxTage = 30;
}
if ($i == 5) {
$monat = "Mai";
$maxTage = 31;
}
if ($i == 6) {
$monat = "Juni";
$maxTage = 30;
}
//Tage des Monats ausgeben
for ($j = 1; $j <= $maxTage; $j++) {
echo $j.". ".$monat." 2009<br/>";
} //end of $j
} //end for $i
?>[/php]

Variante C

[php]<?php
/******************
* Ausgabe der Tage von drei Monaten
* Dateiname: uebung_3_3_c.php
* Funktion: Alle Daten der Monate des 2. Quartals ausgeben
* erstellt am: 20. Mai 2009, 15:07
* Copyright: Clemens Gull
*/

//Zuweisen der Basiswerte
$monat = "April"; //Monatsname
$maxTage = 30; //maximale Tage im Monat
$monNummer = 4; //Zaehlvariable fuer die Monate

//for-Schleife fuer die drei Monate
for ($i = 1; $i <= 40; $i++) {
if ($i <= $maxTage) {
echo $i.". ".$monat." 2009<br/>";
} else {
$monNummer++;
$i = 0;
if ($monNummer == 5) {
$monat = "Mai";
$maxTage = 31;
}
if ($monNummer == 6) {
$monat = "Juni";
$maxTage = 30;
}
if ($i == 0 && $monNummer > 6) {
break;
}
} //end of if
} //end for $i
?>[/php]

In dieser Hausübung war einiges verpackt. Du hast Dein bisher gesammeltes Wissen einsetzen müssen um sie lösen zu können. Da es diesmal wirklich mehrere Lösungen gibt, habe ich Dir die zwei üblichsten angeboten

Programmierstil

Auch heute erlaube ich mir, ein wenig abzuschweifen. Du hast sicher bei den Lösungen bemerkt, dass ich immer wieder Leerzeichen vor und nach den Operatoren mache und auch die Blockoperatoren immer an derselben Stelle zu finden sind. Dies ist mein persönlicher Programmierstil. Wenn man sich als Programmierer soetwas angewöhnt, ist es einfach leichter den eigenen SourceCode zu lesen und auch nach Wochen und Monaten zu verstehen.

Auch hast Du sicher die Kommentare hinter den Variablen und hinter dem schliessenden Blockoperator bemerkt. Bei den Variablen ist es so einfach leichter, zu sehen für welchen Zweck sie bestimmt sind. Der Kommentar hinter dem Blockoperator hat auch rein praktische Gründe. Wenn der Code länger wird und über eine Bildschirmseite geht, ist er schwieriger zu lesen. Besonders wenn Du dann verschachtelte Blockoperatoren (Schleifen und Entscheidungen) einsetzt, hast Du auf einmal drei, vier oder mehr schliessende Klammer hintereinander. Dann kannst Du einfach nicht mehr sagen, welche Klammer zu welchen Anfang gehört. Dann ist es einfacher, wenn man hinter der schliessen Klammer eine kleine Bemerkung oder einen Hinweis dazu hat.

Schleifen

Die erste Schleife, die for-Schleife, hast Du erfolgreich gemeistert. Jetzt kann es aber vorkommen, dass Du etwas wiederholen willst ohne die genaue Anzahl der Durchgänge während der Programmierung zu kennen. Stell Dir einfach wieder ein Beispiel aus dem Leben vor: Ich lasse den Regenschirm so lange offen wie es regnet. Du kannst bei diesem Beispiel die Dauer nicht bestimmen. Sie ist nämlich nicht von Dir, sondern von der Natur abhängig. Auch für diesen Fall hat php vorgesorgt.

while

while-Schleifen werden dann eingesetzt, wenn die Anzahl der Durchgänge nicht bekannt ist.

Syntax

while (Bedingung) {
. . .
. . .
}

Parameter

Die Bedingung ist genau gleich, wie bei der if-Anweisung. Die Schleife wird solange durchgeführt, wie die Bedingung mit true ausgewertet wird. Sobald sie false ist, setzt das Programm mit der ersten Anweisung nach dem Schleifenende fort.

Beispiele

[php light=”true”]<?php
//10 numerierte Zeilen ausgeben
$i = 1;
while ($i != 10) {
echo $i.". Zeile<br/>";
$i++;
}
//10 numerierte Zeilen ausgeben
$i = 1;
while ($i <= 10) {
echo $i.". Zeile<br/>";
$i++;
}
//10 numerierte Zeilen ausgeben
$i = 1;
while ($i < 11) {
echo $i.". Zeile<br/>";
$i++;
}[/php]

Du siehst an den obigen Beispielen wie unterschiedlich Du eine while-Schleife programmieren kannst. Kopiere die Beispiele und schau Dir einmal die Ergebnisse an.

while-Schleifen sind eigentlich ganz einfach und es gibt nur eine Frage zu klären. Was passiert wenn die Bedingung bereits vor dem ersten Durchgang false ist? Die Antwort ist genau so einfach: Die Schleife wird nie durchgeführt, sondern übersprungen. Willst Du die Schleife auf jeden Fall und mindestens einmal durchlaufen, benötigtst Du ein Abwandlung der while-Schleife.

Dies hat einen einfachen Grund. Es ist die gleiche Überlegung wie bei der for-Schleife: Wann und wo wird die Bedingung geprüft? Bei der for-Schleife wird sie ja am Anfang (man kann auch sagen im Kopf der Schleife) geprüft. Bei der while-Schleife ist es genau das Gleiche. Die Überprüfung der Bedingung erfolgt auch sofort im Kopf der Schleife. Ist sie daher schon zu Beginn false, wird der Codeblock innerhalb der Schleife auch nie ausgeführt. Daher spricht man bei diesen beiden Schleifen auch von kopfgesteuerten Schleifen.

do-while

do-while-Schleifen werden dann eingesetzt, wenn die Anzahl der Durchgänge nicht bekannt ist, aber der Codeblock innerhalb der Schleife zumindest einmal ausgeführt werden soll. Hier wird die Prüfung der Bedingung am Ende der Schleife (Du kannst auch Fuß dazu sagen) durchgeführt. Daher ist klar: Bis das Programm zur Überprüfung kommt, ist der Codeblock der Schleife schon einmal ausgeführt worden

Syntax

do {
. . .
. . .
} while (Bedingung)

Parameter

Die Bedingung ist genau gleich, wie bei der if-Anweisung. Die Schleife wird solange durchgeführt, wie die Bedingung mit true ausgewertet wird. Sobald sie false ist, setzt das Programm mit der ersten Anweisung nach dem Schleifenende fort. Da hier die Bedingung erst am Ende des Durchgangs geprüft wird, muss der Code bis zum Ende der Schleife mindestens einmal durhlaufen worden und erst dann erfolgt das erstemal eine Überprüfung. Man spricht bei dieser Schleife auch von einer fußgesteuerten Schleife.

Beispiele

[php light=”true”]<?php
//10 numerierte Zeilen ausgeben
$i = 1;
do {
echo $i.". Zeile<br/>";
} while ($i != 10)
//10 numerierte Zeilen ausgeben?
$i = 11;
do {
echo $i.". Zeile<br/>";
} while ($i <= 10)
//10 numerierte Zeilen ausgeben
$i = 1;
do {
echo $i.". Zeile<br/>";
} while ($i < 11)
[/php]

Du siehst an den obigen Beispielen wie unterschiedlich Du eine do-while-Schleife programmieren kannst. Kopiere die Beispiele und schau Dir einmal die Ergebnisse an. Überlege auch was im zweiten Beispiel passiert.

Übung 3.4

Natürlich musst Du die while-Schleife auch üben. Du nimmst dazu die Lösung A der Übung 3.3 und speicherst sie unter dem Namen uebung_3_4.php ab. Jetzt ersetzt Du die inner for-Schleife durch ein while-Konstrukt. Es ist wie immer, jetzt bist Du ja schon daran gewöhnt: Zuerst selber probieren und erst dann den Code anschauen.

[php collapse=”true” highlight=”34,35″]<?php
/******************
* Ausgabe der Tage von drei Monaten
* Dateiname: uebung_3_4.php
* Funktion: Alle Tage der Monate des 2. Quartals ausgeben
* erstellt am: 20. Mai 2009, 07:03
* Copyright: Clemens Gull
*/

//Zuweisen der Basiswerte
$monat = ""; //Monatsname
$maxTage = 0; //maximale Tage im Monat

//for-Schleife fuer die drei Monate
for ($i = 4; $i <=6; $i++) {
//feststellen welches Monat ist
//Name des Monats speichern
//maximale Tage speichern
switch ($i) {
case 4:
$monat = "April";
$maxTage = 30;
break;
case 5:
$monat = "Mai";
$maxTage = 31;
break;
case 6:
$monat = "Juni";
$maxTage = 30;
break;
} //end switch $i
//Tage des Monats ausgeben
$j = 1;
while ($j <= $maxTage) {
echo $j.". ".$monat." 2009<br/>";
} //end of $j (while)
} //end of $i (for)
?>[/php]

Ja, die Kontrollstrukturen – die Entscheidungen und Schleifen – sind mit diesem Teil des Kurses abgeschlossen. Um diesen Schritt gebührend zu begehen, gibt es diesmal keine Hausübung. Super, nicht? Im nächsten Teil wird es einfach: Wir werden uns einerseits mit Konstanten beschäftigen.

In eigener Sache

Schreib ruhig, dass Du die Übungen machst und auch wie es Dir dabei geht. Der Kurs kann für Dich ein riesiger Erfolg werden, wenn Du mir eine Rückmeldung gibst. Denn dann kann ich die weiteren Artikel Deinen Wünschen anpassen.
Trotz meiner Vermutung, dass ich es heute nicht schaffe, gibt es trotzdem die Fortsetzung des Kurses. Morgen wirst Du dann etwas über die nächste Gruppe der Schleifen erfahren.

Information

Diese Artikelserie ist mit dem Tag phpMySQL@Kurs versehen. Damit kannst Du schnell alle Teile des Kurses finden: https://www.guru-20.info/tag/phpMySQL@Kurs

Startseite bzw. Inhaltsverzeichnis des Kurses

Es wurden 6 Kommentare zu diesem Beitrag geschrieben.

  • kleiner_Baum

    So geht das aber nicht. 🙂
    Die hier angegebeLösung – und zwar beide Varianten – zur letzten “Hausaufgabe” erfüllt aber nicht die Kriterien der Aufgabenstellung (Zitat:”…Die Schwierigkeit ist, dass Du nur EINE einzige for-Schleife verwenden darfst. Du wirst also Variablen und die eine oder andere if-Anweisung brauchen. …”) Ich zähle aber sowohl in Variante A als auch in Variante B jeweils 2 For-Schleifen.
    Auch ich habe 2 Varianten erarbeitet: a) Eine For-Schleife mit 3 If-Abfragen und b) Eine For-Schleife mit einer Case-Abfrage – und das alles nur mit Inhalten aus dem bereits gelernten.
    Zu der heutigen Übung werde ich allerdings erst heute Abend kommen.

  • Oliver Klee

    @Programmierstil: Ich denke das ist einen eigenen Artikel wert, in dem du verschiedene Stile mit deinem und anderen vergleichst? Nur mal so als Vorschlag. Die pear coding standards sind meiner Meinung nach für sowas eine gute anlaufstelle, auch wenn ich nicht alles was die machen Befürworte.
    Ein eigener Programmierstil ist eine feine Sache, er sollte sich aber an “quasi standards” anlehnen.
    Vielleicht lassen sich bei den Schleifen noch ergänzen, das es sich bei einer for Schleife um eine Kopfgesteuerte Schleife mit Eintrittsbedingung und bei do-While um eine Fußgesteuerte Schleife mit Austrittsbedingung handelt. Vielleicht passen diese durchaus sinnigen Wortkonstrukte in deine Erklärungen. Mir jedenfalls hallen die bis heute nach. 🙂

  • Guru 2.0 Autor

    @kleiner_Baum: Danke! Ich habe natürlich sofort eine dritte Variante eingearbeitet.

    @Oliver:
    Ich werde mir mal einen Artikel zu den verschiedenen Stilen überlegen. Den zweiten Teile habe ich auch eingearbeitet. Danke!

  • Anonym

    ähhh… Die erklärungen zur while Schleife “gebe 10 nummerierte Zeilen aus”, ergeben allesamt Endlosschleifen, da nicht in- bzw decrementiert wird.
    (Armer Server 😉 )

  • Aracher

    Oha falsce Grammatik 😛
    …Du wirst sicher mehr wie 22 Sekunden zum durchdenken brauchen.

Blogheim.at Logo
Diese Website verwendet Cookies - nähere Informationen dazu finden Sie in unserer „Datenschutzerklärung“. Klicken Sie auf „Ich stimme zu“, um Cookies zu akzeptieren und unsere Webseite zu besuchen, oder klicken Sie auf „Cookie-Einstellungen“, um Ihre Cookies selbst zu verwalten.