Zu diesem Thema gibt es ein Tutorial!

Wiederholung mit Laufvariable: Unterschied zwischen den Versionen

Aus KGS-Wiki
({{Taste|Strg C Strg V}})
 
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Eine [[bedingte Wiederholung]] ist eine [[Anweisung]] oder eine [[Sequenz]] von Anweisungen, die immer wieder ausgeführt wird, solange eine angegebene [[Wahrheitswert|Bedingung]] erfüllt ist. Im Unterschied zur [[Bedingte Anweisung|bedingten Anweisung]] wird die bedingte Wiederholung nicht nur einmal, sondern immer wieder ausgeführt.
Eine [[Wiederholung mit Laufvariable]] ist eine nützliche [[Kontrollstruktur]] beim Programmieren.
Hierbei wird eine [[Anweisung]] oder eine [[Sequenz]] von Anweisungen wiederholt ausgeführt, wobei mit jedem Durchgang eine so genannte [[Laufvariable]] verändert wird. Auf den Wert der [[Variable (Informatik)|Variable]]n können die Anweisungen in der Wiederholung zugreifen.  


Bedingungen können mit [[Boolesche Operatoren|Operatoren]] wie '''NICHT''', '''UND''' und '''ODER''' miteinander verbunden werden. Beispiele:
Es gibt zwei Arten von Wiederholungen mit Laufvariablen: solche, bei denen die Variable nach einem festen Muster hochgezählt wird, und solche, die eine [[Datenstruktur]] wie eine Liste oder ein Wörterbuch Element für Element durchgehen.  
 
*"Solange es regnet, bleibe ich im Haus."
* "Solange ich '''nicht''' 18 bin, trinke ich keinen Schnaps."


==Beschreibungen von Algorithmen==
==Beschreibungen von Algorithmen==


===Programmablaufpläne===
In [[Programmablaufplan|Programmablaufplänen]] gibt es kein explizites Syntaxelement, um Wiederholungen mit Laufvariablen darzustellen. Diese können aber mit geringem Aufwand als [[Bedingte Wiederholung]]en modelliert werden.
 
In [[Programmablaufplan|Programmablaufplänen]] wird eine Raute verwendet, um eine bedingte Anweisung bzw. bedingte Verzweigung zu beginnen:
{{Hinweisbaustein
| style = border: none; padding: none
| INHALT = {{Thumbnailbox|ALIGN=left|CLASS=noclear|INHALT=<mermaid>
graph TD
start(["Start"]) --> bedingung{"Regnet es?"} --ja--> anweisung["Warte"] --> bedingung --nein--> ende(["Ende"])
</mermaid>
|CAPTION=Eine bedingte Wiederholung}}
}}
 
===Pseudocode===


Im [[Pseudocode]] werden die Schlüsselwörter <code>while</code>, <code>do</code> und <code>endwhile</code> verwendet, um die bedingte Wiederholung umzusetzen.
Im [[Pseudocode]] werden die Schlüsselwörter <code>for</code>, <code>from</code>, <code>to</code>, <code>step</code>, <code>do</code> und <code>endfor</code> verwendet, um die Wiederholung mit Laufvariable umzusetzen.
<syntaxhighlight lang="text" line="1">
<syntaxhighlight lang="text" line="1">
while es regnet
summe := 0
do warte
for x from 1 to 7 step 2 do
endwhile
  summe := summe + x
endfor
</syntaxhighlight>
</syntaxhighlight>
Die Variable <code>x</code> nimmt hier nacheinander die Werte 1, 3, 5 und 7 an. <code>summe</code> wird ebenfalls mit jedem Durchlauf erhöht und nimmt die Werte 1, 4, 9 und schließlich 16 an.


==Visuelle Programmierung==
==Visuelle Programmierung==


===Scratch===
In [[Scratch]] gibt es keine Wiederholung mit Laufvariable. Diese Kontrollstruktur muss hier anders umgesetzt werden, etwa mit einer [[Wiederholung mit fester Anzahl]].
In [[Scratch]] gibt es den Wiederhole-Bis-Block, um bedingte Wiederholungen umzusetzen:
<scratchblocks>
wiederhole bis <wird [andere Figur v] berührt>
gehe [10] er Schritt
ende
sage [Entschuldigung!]
</scratchblocks>
 
{{Achtung|In Scratch wird die bedingte Anweisung nicht ausgeführt, '''solange''' die Bedingung erfüllt ist, sondern '''bis''' sie erfüllt ist, also solange sie '''nicht''' erfüllt ist. Das ist in anderen Sprachen anders!}}


===AppInventor===
===AppInventor===
Im [[AppInventor]] gibt es in der Kategorie ''Steuerung'' die Blöcke ''Wenn-Dann'', ''Wenn-Dann-Sonst'' und ''Wenn-Dann-Sonst-Wenn''. Tatsächlich ist das alles derselbe Block, der mit einem blauen Zahnrad-Button beliebig erweitert oder verkleinert werden kann, um beliebig viele Bedingungen zu überprüfen.<gallery widths="360" heights="100">
[[Datei:Blockly Wiederholung mit Laufvariablen.png|thumb|rechts|Dieser Block zählt eine Variable namens <code>Zahl</code> von <code>1</code> bis <code>5</code> hoch. ]]
Datei:Blockly while.png|Der Block ''"während _ mache _"'' aus dem [[AppInventor]]
Im [[AppInventor]] gibt es in der Kategorie ''Steuerung'' den Block ''"Für jede <code>Zahl</code> von ... bis ... um ... mache ..."''. Die Laufvariable <code>Zahl</code> kann dabei im Rumpf der Wiederholung - und nur dort - verwendet werden. Als Start- und Endwert sowie Schrittweite können beliebige [[Ausdruck|Ausdrücke]] angehängt werden.
Datei:Blockly while Beispiel.png|Ein Anwendungsbeispiel für diesen Block
{{Tipp|Die Laufvariable kannst (und solltest) du umbenennen, damit dein Programm leichter lesbar ist.}}
</gallery>


===NEPO===
===NEPO===
In [[NEPO]] sehen die entsprechenden Blöcke so ähnlich aus wie im AppInventor. Sie befinden sich in der Kategorie ''Kontrolle''. In NEPO hat man die Wahl, ob man die Anweisungen wiederholen möchte, ''bis'' die Bedingung erfüllt ist oder ''solange'' sie erfüllt ist.<gallery widths="360" heights="100">
[[Datei:NEPO Wiederholung mit Laufvariable.svg|thumb|rechts|Dieser Block zählt eine Variable namens <code>i</code> von <code>0</code> bis <code>5</code> hoch]]
Datei:NEPO While.svg|Der Text "Flossen weg!" wird angezeigt, '''''solange''''' die Taste A gedrückt wird.
In [[NEPO]] sehen die entsprechenden Blöcke so ähnlich aus wie im AppInventor. Sie befinden sich in der Kategorie ''Kontrolle''.
Datei:NEPO Repeat Until.svg|Der Text "Drück mich!" wird angezeigt, '''''bis''''' die Taste A gedrückt wird.
</gallery>


==Textuelle Programmierung ==
==Textuelle Programmierung ==


===Python ===
===Python ===
In [[Python (Programmiersprache)|Python]] wird das Schlüsselwort <code>while</code> benutzt, um bedingte Wiederholungen umzusetzen.<syntaxhighlight lang="python" line="1">
In [[Python (Programmiersprache)|Python]] wird das Schlüsselwort <code>for ''x'' in ''y''</code> benutzt, um bedingte Wiederholungen umzusetzen. x ist die Laufvariable und y muss eine [[Datenstruktur]] sein, durch die iteriert werden kann, z.B. eine [[Liste]], ein [[String (Datentyp)|String]] oder eine Range.<syntaxhighlight lang="python" line="1">
name = ''
wort = "INFORMATIK"


while name == '':
for buchstabe in wort:
  name = input('Wie heißt du?')
    print("Gebt mir ein " + buchstabe + "!")
    print(buchstabe + "!!!"


print('Hallo ') + name
print("Was ist das?!")
print(wort + "!!!")
</syntaxhighlight>
</syntaxhighlight>


===Java, JavaScript, C usw. ===
===Java, C, JavaScript usw.===
In den "Curly-Bracket-Sprachen" gibt es zwei Möglichkeiten, bedingte Wiederholungem umzusetzen: <code>while</code> und <code>do-while</code>. Der Unterschied ist, dass bei der Wiederholung mit <code>do-while</code> die Anweisungen bereits ausgeführt werden, bevor die Bedingung zum ersten Mal überprüft wird: <syntaxhighlight lang="javascript" line="1">
In den "Curly-Bracket-Sprachen" kann eine Wiederholung mit Laufvariable auf beide Arten implementiert werden.
while (name == '') {
 
  name = prompt('Wie heißt du?');
;Option 1:Es wird eine Variable angegeben, eine Abbruchbedingung und eine Anweisung, diese Variable hochzuzählen. Diese drei Dinge stehen hinter dem Schlüsselwort <code>for</code> in runden Klammern, getrennt mit Semikola. In Java oder C sieht das etwa so aus: <syntaxhighlight lang="java" line="1">
for (int i = 1; i <= 10; i = i + 1) {
    // do stuff...
}
}
alert('Hallo ' + name);


do {
// Dasselbe mit einer while-Wiederholung:
  name = prompt('Wie heißt du?')
 
} while (name == '');
int i = 1;
alert('Hallo ' + name);
while (i <= 10) {
    // do stuff...
    i = i + 1;
}
</syntaxhighlight>Im Unterschied zum AppInventor-Block hat man hier wesentlich mehr Freiheit, weil die Bedingung und die Anweisung zum Hochzählen völlig frei formuliert werden können.
:
:Einfache [[bedingte Wiederholung]]en können sogar mit einem leeren <code>for</code> implementiert werden. Als Beispiel ist hier das [[Heron-Verfahren]] mit einer leeren <code>for</code>-Wiederholung in Java implementiert: <syntaxhighlight lang="java" line>
public void root(double x, double y) {
    double z;
for (z = x/2; z*z - x > y; z = (z + x/z) / 2);
return z;
}</syntaxhighlight>
;Option 2:Es wird eine Datenstruktur angegeben, durch die iteriert wird. Hier steht hinter dem Schlüsselwort <code>for</code> in runden Klammern zunächst der [[Datentyp]] und Name der Laufvariablen und dann die Datenstruktur, über die iteriert werden soll. In Java und C++<ref>In C++ existiert die Syntax mit Doppelpunkt erst seit 2011</ref> steht dazwischen ein Doppelpunkt: <syntaxhighlight lang="java" line>
ArrayList<String> names = new ArrayList<String>();
names.add("Jan");
names.add("Hein");
names.add("Klaas");
names.add("Pit");
 
for (String name : names) {
    System.out.print(name + ", ");
}
System.out.println("die haben Bärte, die fahren mit");
</syntaxhighlight>
</syntaxhighlight>
 
: In JavaScript wird das Schlüsselwort <code>of</code> bei [[Array]]s bzw. <code>in</code> bei [[Objekt (Informatik)|Objekt]]en verwendet: <syntaxhighlight lang="javascript" line>
for (link of document.getElementsByTagName("a")) {
    link.classList = "external";
}</syntaxhighlight>
: {{Achtung|In C♯ steht das Schlüsselwort <code>in</code> für die Iteration durch ein Array. Das <code>in</code> von C♯ entspricht also dem <code>of</code> von JavaScript!}}
== Weblinks ==
== Weblinks ==
 
* {{Hinweis Tutorial|Programmieren_mit_Python/Kontrollstrukturen#Wiederholungen_%C3%BCber_eine_Datenstruktur_(for)}}
* {{W3Schools|java/java_for_loop.asp|<code>for</code>-Wiederholungen in Java}}
* {{W3Schools|python/python_for_loops.asp|<code>for</code>-Wiederholungen in Python}}
* [https://www.python-lernen.de/while-schleife.htm <nowiki>"While-Schleifen" [sic!] auf python-lernen.de </nowiki>{{Flagge|DE}}]
* [https://www.python-lernen.de/while-schleife.htm <nowiki>"While-Schleifen" [sic!] auf python-lernen.de </nowiki>{{Flagge|DE}}]
{{Navigationsleiste Bestandteile von Algorithmen}}
{{Navigationsleiste Bestandteile von Algorithmen}}
[[Kategorie:Programmierung]]
[[Kategorie:Programmierung]]
[[Kategorie:Algorithmen]]
[[Kategorie:Algorithmen]]

Aktuelle Version vom 7. Juni 2024, 22:20 Uhr

Eine Wiederholung mit Laufvariable ist eine nützliche Kontrollstruktur beim Programmieren. Hierbei wird eine Anweisung oder eine Sequenz von Anweisungen wiederholt ausgeführt, wobei mit jedem Durchgang eine so genannte Laufvariable verändert wird. Auf den Wert der Variablen können die Anweisungen in der Wiederholung zugreifen.

Es gibt zwei Arten von Wiederholungen mit Laufvariablen: solche, bei denen die Variable nach einem festen Muster hochgezählt wird, und solche, die eine Datenstruktur wie eine Liste oder ein Wörterbuch Element für Element durchgehen.

Beschreibungen von Algorithmen

In Programmablaufplänen gibt es kein explizites Syntaxelement, um Wiederholungen mit Laufvariablen darzustellen. Diese können aber mit geringem Aufwand als Bedingte Wiederholungen modelliert werden.

Im Pseudocode werden die Schlüsselwörter for, from, to, step, do und endfor verwendet, um die Wiederholung mit Laufvariable umzusetzen.

summe := 0
for x from 1 to 7 step 2 do
  summe := summe + x
endfor

Die Variable x nimmt hier nacheinander die Werte 1, 3, 5 und 7 an. summe wird ebenfalls mit jedem Durchlauf erhöht und nimmt die Werte 1, 4, 9 und schließlich 16 an.

Visuelle Programmierung

In Scratch gibt es keine Wiederholung mit Laufvariable. Diese Kontrollstruktur muss hier anders umgesetzt werden, etwa mit einer Wiederholung mit fester Anzahl.

AppInventor

Dieser Block zählt eine Variable namens Zahl von 1 bis 5 hoch.

Im AppInventor gibt es in der Kategorie Steuerung den Block "Für jede Zahl von ... bis ... um ... mache ...". Die Laufvariable Zahl kann dabei im Rumpf der Wiederholung - und nur dort - verwendet werden. Als Start- und Endwert sowie Schrittweite können beliebige Ausdrücke angehängt werden.

💡
Tipp

Die Laufvariable kannst (und solltest) du umbenennen, damit dein Programm leichter lesbar ist.

NEPO

Dieser Block zählt eine Variable namens i von 0 bis 5 hoch

In NEPO sehen die entsprechenden Blöcke so ähnlich aus wie im AppInventor. Sie befinden sich in der Kategorie Kontrolle.

Textuelle Programmierung

Python

In Python wird das Schlüsselwort for x in y benutzt, um bedingte Wiederholungen umzusetzen. x ist die Laufvariable und y muss eine Datenstruktur sein, durch die iteriert werden kann, z.B. eine Liste, ein String oder eine Range.

wort = "INFORMATIK"

for buchstabe in wort:
    print("Gebt mir ein " + buchstabe + "!")
    print(buchstabe + "!!!"

print("Was ist das?!")
print(wort + "!!!")

Java, C, JavaScript usw.

In den "Curly-Bracket-Sprachen" kann eine Wiederholung mit Laufvariable auf beide Arten implementiert werden.

Option 1
Es wird eine Variable angegeben, eine Abbruchbedingung und eine Anweisung, diese Variable hochzuzählen. Diese drei Dinge stehen hinter dem Schlüsselwort for in runden Klammern, getrennt mit Semikola. In Java oder C sieht das etwa so aus:
for (int i = 1; i <= 10; i = i + 1) {
    // do stuff...
}

// Dasselbe mit einer while-Wiederholung:

int i = 1;
while (i <= 10) {
    // do stuff...
    i = i + 1;
}
Im Unterschied zum AppInventor-Block hat man hier wesentlich mehr Freiheit, weil die Bedingung und die Anweisung zum Hochzählen völlig frei formuliert werden können.
Einfache bedingte Wiederholungen können sogar mit einem leeren for implementiert werden. Als Beispiel ist hier das Heron-Verfahren mit einer leeren for-Wiederholung in Java implementiert:
public void root(double x, double y) {
    double z;
	for (z = x/2; z*z - x > y; z = (z + x/z) / 2);
	return z;
}
Option 2
Es wird eine Datenstruktur angegeben, durch die iteriert wird. Hier steht hinter dem Schlüsselwort for in runden Klammern zunächst der Datentyp und Name der Laufvariablen und dann die Datenstruktur, über die iteriert werden soll. In Java und C++[1] steht dazwischen ein Doppelpunkt:
ArrayList<String> names = new ArrayList<String>();
names.add("Jan");
names.add("Hein");
names.add("Klaas");
names.add("Pit");

for (String name : names) {
    System.out.print(name + ", ");
}
System.out.println("die haben Bärte, die fahren mit");
In JavaScript wird das Schlüsselwort of bei Arrays bzw. in bei Objekten verwendet:
for (link of document.getElementsByTagName("a")) {
    link.classList = "external";
}
⚠️
Achtung

In C♯ steht das Schlüsselwort in für die Iteration durch ein Array. Das in von C♯ entspricht also dem of von JavaScript!

Weblinks

  1. In C++ existiert die Syntax mit Doppelpunkt erst seit 2011