Java/Schleife: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
(akt)
Markierung: 2017-Quelltext-Bearbeitung
K (- ZUM2Edutags)
Markierung: 2017-Quelltext-Bearbeitung
 
(4 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 5: Zeile 5:


__TOC__
__TOC__
== for-Schleife ==


Häufig benötigt man beim Programmieren eine mehrfache Ausführung eines Teilbereichs. Denkbar ist, dass ein Programmierer dazu einfach Zeilen wiederholt. So lässt sich z.B. das kleine 1 x 1 von 3 wie folgt ausgeben:
Häufig benötigt man beim Programmieren eine mehrfache Ausführung eines Teilbereichs. Denkbar ist, dass ein Programmierer dazu einfach Zeilen wiederholt. So lässt sich z.B. das kleine 1 x 1 von 3 wie folgt ausgeben:
Zeile 20: Zeile 22:
</source>
</source>


== for-Schleife ==
Für genau diesen Fall gibt es aber auch eine Schleife: die for-Schleife.<br>
 
Sie ist immer dann sinnvoll einsetzbar,<br>
Für genau diesen Fall gibt es aber auch eine Schleife: die for-Schleife. Sie ist immer dann sinnvoll einsetzbar,
wenn eine '''bestimmte''' Anzahl von Wiederholungen durchgeführt werden soll.
* wenn eine bestimmte Anzahl von Wiederholungen durchgeführt werden soll.
* wenn eine Variable von einem bestimmten Wert bis zu einem anderen gezählt werden soll.
 
<source lang="java">
<source lang="java">
for ( int faktor = 1; faktor <= 9; faktor ++ ) {
for ( int faktor = 1; faktor <= 9; faktor ++ )  
{
       System.out.println("3 x " + faktor + " = " + 3*faktor );
       System.out.println("3 x " + faktor + " = " + 3*faktor );
}
}
</source>
</source>


=== Weitere Beispiele ===
=== Allgemeiner Aufbau ===
 
<source lang="java">
<source lang="java">
//allgemeiner Aufbau
// allgemeiner Aufbau
for ( Zählvariable mit Anfangswert; Anfangswert; Bedingung; Schrittweite) {
for ( int Zählvariable mit Initialisierung; Abbruchbedingung; Inkrementierung) {
       // Anweisung, die wiederholt werden soll
       // Anweisung, die wiederholt werden soll
}
}
</source>


// hochzählen in 1er-Schritten
=== Anwendungsbeispiele ===
for ( int zählvariable = Anfangswert; zählvariable <= Endwert; zählvariable++ ) {
<source lang="java">
      // Anweisung, die wiederholt werden soll
for ( int i = 1; i <= 10; i++ ) {} // Hochzählen von 1 bis 10
}
for ( int i = 1; i <= 10; i+=5 ) {} // Hochzählen in 5er-Schritten
 
for ( int i = 10; i >= 1; i-- ) {// Countdown von 10 bis 1
// hochzählen in 5er-Schritten
for ( int zählvariable = Anfangswert; zählvariable <= Endwert; zählvariable+=5 ) {
      // Anweisung, die wiederholt werden soll
}
 
// Countdown
for ( int zählvariable = Anfangswert; zählvariable > Endwert; zählvariable-- ) {
      // Anweisung, die wiederholt werden soll
}
</source>
</source>


 
=== Aufgaben ===
 
{{Aufgabe|* Lassen Sie die Zahlen von 1 bis 100 auf dem Bildschirm ausgeben.
{{Übung|
** Diesmal nur die geraden Zahlen.
* Nennen Sie Anwendungsgebiete der for-Schleife
** Diesmal von 100 bis -100.
* Lassen Sie die Zahlen von 1 bis 100 auf dem Bildschirm ausgeben
* Die ungeraden Zahlen von 200 bis -1000.}}
* Diesmal nur die geraden Zahlen
{{Aufgabe|* Lassen Sie 50 mal den Buchstaben "A" auf den Bildschirm schreiben.
* Diesmal von 100 bis -100
* Geben Sie alle Grossbuchstaben von A-Z durch <code>System.out.println((char)i)</code> aus.
* Die ungeraden von 200 bis -1000
** Informieren Sie sich dazu über die ASCII-Codierung.
* Lassen Sie 50 mal den Buchstaben "A" auf den Bildschirm schreiben
** Die Ausgabe soll nun in der Form '''ASCII(87) ergibt W''' usw. erfolgen.
* Die Zahlen von -10 bis 10 ohne die 0
* Implementieren Sie die '''Caesar-Verschlüsselung''',<br> d.h. eine Verschiebung des Klartextalphabets um eine frei wählbare Zahl von Buchstaben.
** Informieren Sie sich dazu über den Modula-Operator %.}}
{{Aufgabe|* Implementieren Sie die mathematische Funktion Fakultät n!: <code>public int fakultaet(int n)</code>
*Implementieren Sie die Berechnung des Binomialkoeffizienten: <code>public int binom(int n, int k)</code>
}}
}}


== while-Schleife ==
== while-Schleife ==
In den meisten Programmiersprachen gibt es die '''While-Schleife''' als '''Kontrollstruktur'''. Sie dient dazu, eine Abfolge von Anweisungen mehrfach auszuführen, solange eine Bedingung erfüllt ist. Diese Bedingung wird geprüft, bevor die Anweisungsfolge abgearbeitet wird. Es kann also auch sein, dass die Abfolge gar nicht ausgeführt wird. Wenn die Bedingung ständig erfüllt ist, dann wird die Schleife zur Endlosschleife.  
In den meisten Programmiersprachen gibt es die '''While-Schleife''' als '''Kontrollstruktur'''.  
* Sie dient dazu, eine Abfolge von Anweisungen mehrfach auszuführen, '''solange''' eine Bedingung erfüllt ist.  
* Diese Bedingung wird geprüft, '''bevor''' die Anweisungsfolge abgearbeitet wird.  
** Es kann also auch sein, dass die Abfolge gar nicht ausgeführt wird.  
** Wenn die Bedingung ständig erfüllt ist, dann wird die Schleife zur '''Endlosschleife'''.
* Die While-Schleife verwendet man bei '''dynamischen''' Abbruchbedingungen, die [[#for-Schleife|for-Schleife]] hingegen bei einer festen Anzahl von Durchläufen.  


 
=== Beispiel: Fakultät ===
Die While-Schleife verwendet man normalerweise bei dynamischen Abbruchbedingungen, die [[#for-Schleife|for-Schleife]] meistens, wenn man vorher definiert wie viele Durchläufe die Schleife hat. Zum Beispiel würde man für die Berechnung der Fakultät einer Zahl vorzugsweise die For-Schleife anwenden.
Das folgende Beispiel zeigt, wie sich die Berechnung der Fakultät n! durch eine while-Schleife realisieren lässt:
 
=== Versteckspiel ===
{{Idee|
Mit Hilfe des folgenden Beispiels lässt sich die while-Schleife einführen. Besser ist allerdings, wenn man es mit einer [[#for-Schleife|for-Schleife]] realisiert. D.h. falls man es nutzt, sollte man dieses Beispiel vor der for-Schleife behandeln.
 
;Versteckspiel: Als Suchender muss man zunächst bis 100 zählen, dann laut „Ich komme...“ rufen.  Erst dann darf man zum Suchen aufbrechen.
 
Dieses simple Spiel ist ein einfacher Algorithmus:
VERSTECKSPIELZÄHLUNG
Die erste Zahl ist 1.
Prüfe, ob die 100 erreicht wurde
Wenn das noch nicht erfüllt ist, sage die Zahl und erhöhe die Zahl um eins.
Wenn doch, dann rufe „Ich komme“
 
Mit while (engl. solange) lassen sich Programmabläufe abhängig von einer Bedingung wiederholen. Die Bedingung wird vor Ausführung der Anweisung abgefragt ("prechecked loop",  "kopfgesteuerte Schleife").
 
;Solange <Bedingung erfüllt> führe <Anweisung> aus.
;Java-Syntax:        
<source lang="java">
<source lang="java">
  while (Bedingung)  
public int fakultaet(int zaehler)
  {
{
      Anweisungsblock (was soll wiederholt werden?)
    int fakultaet = 1;
  }
    while (zaehler > 1) {
        fakultaet *= zaehler;
        zaehler--;
    }
    return fakultaet;
}
</source>
</source>
So sähe das Verstecken-Beispiel als Methode der Klasse Verstecken aus. Der Computer schreibt die Zahlen von 1 bis zahl in die Konsole.
;Hinweis: Wenn die oberen Zahlen nicht mehr zu sehen sind, liegt das an der Konsole, die nur begrenzt viele Zeilen zulässt. Das Problem kann man umgehen, indem man statt println ein print einsetzt. Dann wird nicht bei jeder Zahl eine neue Zeile begonnen.
<source lang="java">
public class Verstecken
{
      public void zaehleBisZahlundRufe(int zahl)
      {
        int x;                            // Eine Zählvariable x
        x=1;                              // Anfangswert für x
        while (x <= zahl) { 
            System.out.println (x);      // schreibe x auf die Konsole
            x++;                          // erhöhe x um 1
        }
        System.out.println ("Ich komme...!");
      }
}
</source>
=== Endlosschleife ===
Eine Schleife, die (eigentlich) niemals endet und dabei den Computer völlig auslastet ist eine typische Ursache für Abstürze.
Die folgende Methode ist eine Endlosschleife, die unendlich lange ausgeführt würde, wenn niemand die Ausführung stoppen würde. Typischer Fehler: Es wird x als Bedingung abgefragt: (x<100) , aber es wird x nicht innerhalb der Schleife verändert.
<source lang="java">
    public void führeEndlosschleifeAus(){
      int x; // Eine Zählvariable x
      x=1;  // Anfangswert für x
      while (x <= 100) { 
          System.out.println (x);      // schreibe x auf die Konsole
          // Typischer Fehler: x wird in der Schleife nicht erhöht.                   
      } 
    }
</source>
}}
Bevor Sie die Methode ausprobieren, lesen Sie zunächst, wie man in [[BlueJ]] Programmausführungen stoppt:
==== Notunterbrechungen bei BlueJ ====
Mit Strg+Umschalt+R setzen Sie die Virtuelle Maschine zurück, was eine Beendigung der aktuell ausgeührten Methode bewirkt. Sie können auch auf der rot-weißen Ausführungsnanzeige mit der rechten Maustaste das Kontextmenu hervorholen und die Ausführung damit stoppen.
{{Übung|
# Analysieren Sie die Methode zaehleBisZahlundRufe (int zahl), indem Sie folgende Dinge zunächst durchdenken und dann testen:
#* Was passiert, wenn Sie beim Methodenaufruf 1 als zahl übergeben.
#* Was passiert, wenn Sie beim Methodenaufruf negative Zahlen eingeben.
#* Was verändert sich, wenn die Zeile mit x++ über der System.out Zeile steht?
#* Wie können Sie in Zweierschritten zählen?
#* Warum wird „Ich komme“ nur ein mal ausgegeben?
# Verändern Sie die Methode so, dass ein Coutntdown heruntergezählt wird.
# Lassen Sie neben zahl auch die Variable schwrittweite übergeben. Sie soll bestimmen, in wie großen Schritten heraufgezählt werden soll (z.B. Schrittwete 3 ergibt: 1, 4, 7, 10...
}}


=== Übungen mit while und Zufallszahlen ===
=== Übungen mit while und Zufallszahlen ===
Übungen zu Zufallszahlen eignen sich, um die Interaktion zwischen verschiedenen Klassen zu demonstrieren. Die recht einfache Klasse Zufallszahl sieht wie folgt aus:
Übungen zu Zufallszahlen eignen sich, um die Interaktion zwischen verschiedenen Klassen zu demonstrieren. Die recht einfache Klasse Zufallszahl sieht wie folgt aus:


Zeile 175: Zeile 105:


<source lang="java">
<source lang="java">
public class Wuerfelexperiment1
public class Wuerfelexperiment
{
{


     private Zufallszahl wuerfel;
     private Zufallszahl wuerfel;
      
      
     public Wuerfelexperiment1 (){
     public Wuerfelexperiment (){
         wuerfel=new Zufallszahl();
         wuerfel=new Zufallszahl();
     }
     }
Zeile 212: Zeile 142:
</source>
</source>


{{Übung|
{{Aufgabe|
#Der Benutzer soll bei der Methode gibWuerfelAus selbst angeben können, wie viele Seiten der Würfel hat (es gibt z.B. auch 8-seitige oder 24-seitige Würfel).  
#Der Benutzer soll bei der Methode gibWuerfelAus selbst angeben können, wie viele Seiten der Würfel hat (es gibt z.B. auch 8-seitige oder 24-seitige Würfel).  
#Zusätzlich soll die Summe der Würfe ausgegeben werden.
#Zusätzlich soll die Summe der Würfe ausgegeben werden.
#Bestimmen Sie den Durchschnitt aller Würfe.
#Bestimmen Sie den Durchschnitt aller Würfe.
#Immer, wenn der vorherige Wurf gleich groß war, wie der aktuelle, soll „Gleich“ auf dem Bildschirm ausgegeben werden.
#Immer, wenn der vorherige Wurf gleich groß war, wie der aktuelle, soll „Gleich“ auf dem Bildschirm ausgegeben werden.
#Realisieren Sie eine Methode, die prüft, ob bei vielen Würfen jede Zahl annähernd gleich oft fällt (Kontrolle des Pseudozufallszahlgenerators).  
#Realisieren Sie eine Methode, die prüft, ob bei vielen Würfen jede Zahl annähernd gleich oft fällt (Kontrolle des Pseudozufallszahlgenerators).}}


Würfelexperiment2 – diesmal mit 2 Würfeln
{{Aufgabe|
#Legen Sie einen zweiten Würfel an und schreiben Sie wie oben gibWuerfelAus(...).
#Legen Sie einen zweiten Würfel an und schreiben Sie wie oben gibWuerfelAus(...).
#Lassen Sie immer zuerst den größeren Würfel ausgeben.
#Lassen Sie immer zuerst den größeren Würfel ausgeben.
Zeile 225: Zeile 155:
#Immer, wenn der vorherige Wurf von der Summe her gleich groß war, wie der aktuelle, soll „Gleich“ auf dem Bildschirm ausgegeben werden.
#Immer, wenn der vorherige Wurf von der Summe her gleich groß war, wie der aktuelle, soll „Gleich“ auf dem Bildschirm ausgegeben werden.
}}
}}
=== Fakultät ===
Das folgende Beispiel zeigt, wie sich die while-Schleife zur Berechnung der Fakultät einsetzen kann. Denkbar wäre auch ein Einsatz der for-Schleife.
<source lang="java">
public int fakultaet(int zaehler)
{
    int fakultaet = 1;
    while (zaehler > 1) {
        fakultaet *= zaehler;
        zaehler--;
    }
    return fakultaet;
}
</source>


== do-while-Schleife ==
== do-while-Schleife ==
Zeile 276: Zeile 192:
[[Kategorie:Unterrichtsidee]]
[[Kategorie:Unterrichtsidee]]
[[kategorie:Informatik]]
[[kategorie:Informatik]]
[[Kategorie:ZUM2Edutags]]
<metakeywords>ZUM2Edutags,ZUM-Wiki,Java/for-Schleife,Java,for-Schleife,for,Schleife,Informatik,Programmierung,Programmieren</metakeywords>

Aktuelle Version vom 11. August 2021, 19:33 Uhr

for-Schleife

Häufig benötigt man beim Programmieren eine mehrfache Ausführung eines Teilbereichs. Denkbar ist, dass ein Programmierer dazu einfach Zeilen wiederholt. So lässt sich z.B. das kleine 1 x 1 von 3 wie folgt ausgeben:

System.out.println("3 x 1 = 3");
System.out.println("3 x 2 = 6");
System.out.println("3 x 3 = 9");
System.out.println("3 x 4 = 12");
System.out.println("3 x 5 = 15");
System.out.println("3 x 6 = 18");
System.out.println("3 x 7 = 21");
System.out.println("3 x 8 = 24");
System.out.println("3 x 9 = 27");

Für genau diesen Fall gibt es aber auch eine Schleife: die for-Schleife.
Sie ist immer dann sinnvoll einsetzbar,
wenn eine bestimmte Anzahl von Wiederholungen durchgeführt werden soll.

for ( int faktor = 1; faktor <= 9; faktor ++ ) 
{
      System.out.println("3 x " + faktor + " = " + 3*faktor );
}

Allgemeiner Aufbau

// allgemeiner Aufbau
for ( int Zählvariable mit Initialisierung; Abbruchbedingung; Inkrementierung) {
      // Anweisung, die wiederholt werden soll
}

Anwendungsbeispiele

for ( int i = 1; i <= 10; i++ ) {}  // Hochzählen von 1 bis 10
for ( int i = 1; i <= 10; i+=5 ) {} // Hochzählen in 5er-Schritten
for ( int i = 10; i >= 1; i-- ) {}  // Countdown von 10 bis 1

Aufgaben

Aufgabe
  • Lassen Sie die Zahlen von 1 bis 100 auf dem Bildschirm ausgeben.
    • Diesmal nur die geraden Zahlen.
    • Diesmal von 100 bis -100.
  • Die ungeraden Zahlen von 200 bis -1000.

Aufgabe
  • Lassen Sie 50 mal den Buchstaben "A" auf den Bildschirm schreiben.
  • Geben Sie alle Grossbuchstaben von A-Z durch System.out.println((char)i) aus.
    • Informieren Sie sich dazu über die ASCII-Codierung.
    • Die Ausgabe soll nun in der Form ASCII(87) ergibt W usw. erfolgen.
  • Implementieren Sie die Caesar-Verschlüsselung,
    d.h. eine Verschiebung des Klartextalphabets um eine frei wählbare Zahl von Buchstaben.
    • Informieren Sie sich dazu über den Modula-Operator %.

Aufgabe
  • Implementieren Sie die mathematische Funktion Fakultät n!: public int fakultaet(int n)
  • Implementieren Sie die Berechnung des Binomialkoeffizienten: public int binom(int n, int k)

while-Schleife

In den meisten Programmiersprachen gibt es die While-Schleife als Kontrollstruktur.

  • Sie dient dazu, eine Abfolge von Anweisungen mehrfach auszuführen, solange eine Bedingung erfüllt ist.
  • Diese Bedingung wird geprüft, bevor die Anweisungsfolge abgearbeitet wird.
    • Es kann also auch sein, dass die Abfolge gar nicht ausgeführt wird.
    • Wenn die Bedingung ständig erfüllt ist, dann wird die Schleife zur Endlosschleife.
  • Die While-Schleife verwendet man bei dynamischen Abbruchbedingungen, die for-Schleife hingegen bei einer festen Anzahl von Durchläufen.

Beispiel: Fakultät

Das folgende Beispiel zeigt, wie sich die Berechnung der Fakultät n! durch eine while-Schleife realisieren lässt:

 public int fakultaet(int zaehler)
 {
     int fakultaet = 1;
     while (zaehler > 1) {
         fakultaet *= zaehler;
         zaehler--;
     }
     return fakultaet;
 }

Übungen mit while und Zufallszahlen

Übungen zu Zufallszahlen eignen sich, um die Interaktion zwischen verschiedenen Klassen zu demonstrieren. Die recht einfache Klasse Zufallszahl sieht wie folgt aus:

public class Zufallszahl
{
        private int zufallszahl;
    
        // gibt eine Zufallszahl zwischen 1 und maximum zurück
        public int getZufallszahl(int maximum)
        {               
                return (int) (Math.random()*maximum+1);
        }
}

Diese Klasse kann man nun auf einfache Weise in anderen Klassen verwenden. Eine Eigenschaft z.B. wuerfel vom Typ Zufallszahl wird vorbereitet (vgl. erste Zeilen).

Nun lassen sich mit wuerfel.getZufallszahl(6) Zufallszahlen zwischen 1 und 6 bestimmen, die man z.B. ausgeben kann (erste Methode) oder einer Variable zuweisen kann (zweite Methode).

public class Wuerfelexperiment
{

    private Zufallszahl wuerfel;
    
    public Wuerfelexperiment (){
        wuerfel=new Zufallszahl();
    }
 
    public void gibWuerfelAus(int anzahl)
    {
        int i=1;
        while (i<=anzahl){
            System.out.println("Wurf "+i+ " ist "+wuerfel.getZufallszahl(6));
            i++;
        }
    }
 
    public void wuerfeleBisZurSechs()
    {
        int i=1;
        
        // Erster Wurf muss auf jeden Fall durchgeführt werden
        int zwischenspeicher=wuerfel.getZufallszahl(6);
        System.out.println("Wurf "+i+ " ist "+zwischenspeicher);
 
        // weitere Würfe
        while (zwischenspeicher!=6){
            i++;
            zwischenspeicher=wuerfel.getZufallszahl(6);
            System.out.println("Wurf "+i+ " ist "+zwischenspeicher);  
        }
    }
    
}

Aufgabe
  1. Der Benutzer soll bei der Methode gibWuerfelAus selbst angeben können, wie viele Seiten der Würfel hat (es gibt z.B. auch 8-seitige oder 24-seitige Würfel).
  2. Zusätzlich soll die Summe der Würfe ausgegeben werden.
  3. Bestimmen Sie den Durchschnitt aller Würfe.
  4. Immer, wenn der vorherige Wurf gleich groß war, wie der aktuelle, soll „Gleich“ auf dem Bildschirm ausgegeben werden.
  5. Realisieren Sie eine Methode, die prüft, ob bei vielen Würfen jede Zahl annähernd gleich oft fällt (Kontrolle des Pseudozufallszahlgenerators).

Aufgabe
  1. Legen Sie einen zweiten Würfel an und schreiben Sie wie oben gibWuerfelAus(...).
  2. Lassen Sie immer zuerst den größeren Würfel ausgeben.
  3. Lassen Sie anzeigen, wenn ein Pasch gewürfelt wurde.
  4. Immer, wenn der vorherige Wurf von der Summe her gleich groß war, wie der aktuelle, soll „Gleich“ auf dem Bildschirm ausgegeben werden.

do-while-Schleife

Eine do-while-Schleife ist in der Programmierung eine „fußgesteuerte oder nachprüfende Schleife, bei der nach dem Durchlauf des Schleifenrumpfes die Abbruchbedingung überprüft wird“[1] (meist als DO-WHILE, das entspricht ausführen-während).

"Mensch ärgere dich nicht"

int wuerfel;
do {
  wuerfel=(int) (Math.random()*6+1);
} while (wuerfel!=6);

dh. würfele solange, bis eine 6 gefallen ist, bzw. andersherum: wiederhole das Würfeln solange, solange das Würfelergebnis nicht 6 ist.

Dabei muss mindestens einmal gewürfelt werden.

Quellen

Weblinks