Eine Schleife ist eine Kontrollstruktur, mit der Code abhängig von einer Bedingung wiederholt ausgeführt werden kann.
Eine while-Schleife ist eine Kontrollstruktur, mit der Code abhängig von einer Bedingung wiederholt ausgeführt werden kann. Der Code innerhalb einer while-Schleife wird so lange ausgeführt, wie die Bedingung truthy ergibt. while-Schleifen werden oft verwendet, wenn die Anzahl der Iterationen im Voraus nicht bekannt ist; sie können in jeder Situation eingesetzt werden, in der eine Schleife gebraucht wird.
Die Bedingung wird ausgewertet, bevor der Code innerhalb der Schleife ausgeführt wird. Ist die Bedingung also falsch, wird der Code innerhalb der Schleife nie ausgeführt.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Wenn du über einen String iterieren möchtest, kannst du über die Länge des Strings schleifen.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until-Schleifen funktionieren genauso wie while-Schleifen, nur dass der Code innerhalb der Schleife so lange ausgeführt wird, bis die Bedingung truthy ergibt.
Das ist derselbe Unterschied wie zwischen if und unless.
i = 0
until i == 3
puts i
i += 1
end
Ein häufiger Fehler bei while-Schleifen ist eine „Endlosschleife“, die nie endet. Eine Endlosschleife kann entstehen, wenn eine Bedingung nie truthy oder falsey ergibt. Das liegt oft an einem Programmierfehler, zum Beispiel daran, dass man vergisst, die Schleifenvariable zu erhöhen. Manchmal ist eine Endlosschleife aber der klarste Weg, die Logik des Programms umzusetzen. Oder es ist unerlässlich, für immer zu schleifen. Ein HTTP-Server zum Beispiel wartet auf eine eingehende Verbindung, verarbeitet sie und wartet dann auf die nächste Verbindung.
Mit dem Schlüsselwort break kannst du eine Schleife vorzeitig verlassen.
Das ist praktisch, wenn du eine Schleife unter bestimmten Bedingungen vorzeitig verlassen möchtest.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
Mit dem Schlüsselwort next kannst du zur nächsten Iteration einer Schleife springen.
Das ist praktisch, wenn du bestimmte Iterationen einer Schleife überspringen möchtest.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
Der Typ einer Variable kann sich innerhalb einer Schleife ändern.
Im folgenden Beispiel ist der Typ von a gleich Int32 | String, weil er im ersten Teil der Schleife Int32 oder String sein kann.
Die Variable a hat nur im ersten Teil der Schleife den Typ Int32 | String, denn beim Start der Schleife enthält sie Int32 und in der zweiten Iteration einen String.
Dieses System mit mehreren Typen wird später ausführlich erklärt.
Da wir aber sicher sind, dass im zweiten Teil der Schleife nur String vorkommt, ist der Typ von a im zweiten Teil der Schleife String.
Zur Laufzeit enthält sie nie gleichzeitig Int32 und String.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
In Crystal gibt der letzte Ausdruck in einer Methode seinen Wert zurück.
Manchmal musst du aber einen Wert vor dem letzten Ausdruck zurückgeben.
Dafür kannst du das Schlüsselwort return verwenden, das den Wert des folgenden Ausdrucks zurückgibt.
Code, der nach einem return-Schlüsselwort steht, wird nicht ausgeführt.
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
Das Schlüsselwort return solltest du weglassen, wenn der letzte Ausdruck in einer Methode bereits der Wert ist, der zurückgegeben werden soll.
In dieser Übung arbeitest du mit Sparkonten. Jedes Jahr wird der Kontostand deines Sparkontos auf Basis seines Zinssatzes aktualisiert. Der Zinssatz, den deine Bank dir gibt, hängt vom Betrag auf deinem Konto ab (dem Kontostand):
1000 Dollar.1000 Dollar und weniger als 5000 Dollar.5000 Dollar.Du hast vier Aufgaben, von denen sich jede mit deinem Kontostand und seinem Zinssatz befasst.
Implementiere die Methode SavingsAccount.interest_rate(), die einen Kontostand als Argument entgegennimmt.
Die Methode soll den Zinssatz für den gegebenen Kontostand zurückgeben.
SavingsAccount.interest_rate(200.75)
# => 0.5
Implementiere die Methode SavingsAccount.interest(), die einen Kontostand als Argument entgegennimmt.
Die Methode soll die Zinsen für den gegebenen Kontostand zurückgeben.
SavingsAccount.interest(200.75)
# => 1.00375
Implementiere die Methode SavingsAccount.annual_balance_update(), die einen Kontostand als Argument entgegennimmt.
Die Methode soll den Kontostand nach einem Jahr zurückgeben.
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
Implementiere die Methode SavingsAccount.years_before_desired_balance(), die einen Kontostand und einen Zielkontostand als Argumente entgegennimmt.
Die Methode soll die Anzahl der Jahre zurückgeben, die es dauern würde, den Zielkontostand zu erreichen.
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Wenn du einfache Zinsen auf ein Kapital anwendest, wird das Kapital mit dem Zinssatz multipliziert, und das Produkt der beiden ist der Zinsbetrag.
Zinseszinsen hingegen entstehen dadurch, dass du Zinsen wiederholt anwendest. Bei jeder Anwendung berechnest du den Zinsbetrag und addierst ihn zum Kapital, sodass nachfolgende Zinsberechnungen auf ein größeres Kapital angewendet werden.
Melde dich bei Exercism an, um Crystal mit 26 Konzepte142 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.