Ablaufsteuerung
Hier werden wir nun einige Dinge zusammenführen. Auch wenn dieser Abschnitt kürzer und leichter ist als das Kapitel Mehr über Methoden, eröffnet es uns eine ganz große Welt von Programmier-Möglichkeiten. Nach diesem Kapitel kannst du echte interaktive Programme schreiben. Bisher hatten wir Programme, die in Abhängigkeit von der Tastatur-Eingabe verschiedene Dinge sagen, doch nach diesem Kapitel können sie auch noch unterschiedliche Dinge tun. Jedoch müssen wir vorher lernen, Objekte zu vergleichen. Wir brauchen ...
Vergleichs-Operatoren
Wir beeilen uns in diesem Teil, damit wir schnell zum nächsten Abschnitt kommen, in den all die coolen Dinge geschehen. Also, um zu überprüfen, ob ein Objekt kleiner oder größer einem anderen ist, verwenden wir > und <, also so:
puts 1>2 puts 1<2
false true
Kein Problem. Wenn wir herausfinden wollen, ob ein Objekt größer-oder-gleich oder kleiner-oder-gleich einem anderen Objekt ist, verwenden wir >= und <=, z.B.:
puts 5>=5 puts 5<=4
true false
Und schließlich, ob etwas gleich oder ungleich ist, verwenden wir == und !=. Dabei ist es wichtig, den Unterschied zwischen = und == zu verstehen: = sagt, dass eine Variable auf ein Objekt zeigen soll (Zuweisungsoperator), == fragt "Sind diese beiden Objekte gleich?"
puts 1==1 puts 2!=1
true true
Natürlich kann man ebenso Strings vergleichen. Wenn Strings verglichen werden, wird ihre lexikographische Ordnung verglichen, also ihre Reihenfolge im Wörterbuch:
puts 'cat'<'dog'
true
Aber Achtung: normalerweise sortieren Computer die Kleinbuchstaben nach den Großbuchstaben ein. (Weil sie ihre Buchstaben so sortiert haben.) Dies bedeutet, dass 'Zoo' vor 'albern' kommt. Wenn du also wissen willst, welches Wort in einem echten Wörterbuch zuerst kommen würde, musst du sicherstellen, dass beide Wörter erst in Großbuchstaben verwandelt und danach erst verglichen wurden (oder beide in Kleinbuchstaben).
Eine letzte Anmerkung: die Vergleichsmethoden geben uns nicht die Strings 'true' und 'false' zurück, sondern besondere Objekte true und false. (Natürlich ergibt true.to_s wiederum den String 'true'.) true und false werden oft verwendet in...
Verzweigungen
Verzweigungen sind ein einfaches Konzept, aber sehr wirkungsvoll. Ich denke sogar, dass es so einfach ist, dass ich es nicht erst erkläre, sondern einfach mal zeige:
puts 'Hallo, wie heißt du?' name=gets.chomp puts 'Hallo, '+name+'.' if name == 'Chris' puts 'Toller Name!' end
Hallo, wie heißt du?
Chris
Hallo, Chris.
Toller Name!
Aber wenn wir einen anderen Namen eingeben...
Hallo, wie heißt du?
Hillary
Hallo, Hillary.
... und das nennt man Verzweigung. Wenn die Bedingung, die nach dem if steht, wahr ist, wird der folgende Code bis zum end ausgeführt, sonst nicht. Ganz einfach.
Ich habe den Code zwischen dem if und dem end bewusst eingezogen, weil ich denke, dass es so übersichtlicher wirkt. So ziemlich alle Programmierer machen dies so, unabhängig von der verwendeten Programmiersprache. Der Nutzen mag in diesem kleinen Beispiel noch nicht sichtbar sein, aber in komplexeren Anwendungen macht diese Einrückung einen deutlichen Unterschied.
Oftmals möchte man ein Programm schreiben, das etwas tut, wenn die Bedingung wahr ist, und etwas anderes, wenn sie falsch ist. Dafür gibt es das Schlüsselwort else:
puts 'Ich kann hellsehen! Sag mir deinen Namen:' name = gets.chomp if name == 'Chris' puts 'Du wirst reich sein und Erfolg haben.' else puts 'Deine Zukunft ist... oh, wie spät es schon ist!' puts 'Ich muss jetzt wirklich gehen!' end
Ich kann hellsehen! Sag mir deinen Namen:
Chris
Du wirst reich sein und Erfolg haben.
... und mit einem anderen Namen:
Ich kann hellsehen! Sag mir deinen Namen:
Hillary
Deine Zukunft ist... oh, wie spät es schon ist!
Ich muss jetzt wirklich gehen!
Verzweigung ist im Code wie eine Abzweigung: nehmen wir den Pfad für name == 'Chris' oder den anderen?
Und wie bei Bäumen können hier Zweige auch wieder neue Zweige haben:
puts 'Hallo und willkommen im Kurs.'
puts 'Ich bin Frau Mahlzahn und wie heißt du?'
name = gets.chomp
if name==name.capitalize
puts 'Setz dich doch, '+name+'.'
else
puts name+'? Du meinst sicher: '+name.capitalize
puts 'Weißt du jetzt, wie man deinen Namen schreibt?'
reply = gets.chomp
if reply.downcase=='ja'
puts 'Ok, setz dich.'
else
puts 'RAUS HIER!'
end
end
Hallo und willkommen im Kurs. Ich bin Frau Mahlzahn und wie heißt du? chris chris? Du meinst sicher: Chris Weißt du jetzt, wie man deinen Namen schreibt? ja Ok, setz dich.Und wenn ich den Namen groß schreibe:
Hallo und willkommen im Kurs.
Ich bin Frau Mahlzahn und wie heißt du?
Chris
Setz dich doch, Chris.
Manchmal kann es verwirrend sein, zu überblicken, welche ifs, elses und ends zusammen gehören. Ich schreibe sie deshalb immer gleichzeitig. Als ich also das obige Programm geschrieben habe, sah es erst einmal so aus:
puts 'Hallo und willkommen im Kurs.' puts 'Ich bin Frau Mahlzahn und wie heißt du?' name = gets.chomp if name==name.capitalize else end
Dann füge ich Kommentare ein, das sind Bereiche, die der Compiler ignorieren wird:
if name == name.capitalize # sie ist freundlich. else # sie wird sauer. end
Alles nach dem #-Zeichen wird als Kommentar betrachtet (außer man ist in einem String). Danach ersetze ich die Kommentare mit funktionierendem Code. Manche Programmierer lassen gerne die Kommentare. Ich bin persönlich der Ansicht, dass gut geschriebener Code für dich selbst sprechen soll. Früher habe ich mehr Kommentare geschrieben, doch seit ich fließend Ruby 'spreche', werden es immer weniger. Manchmal finde ich sie auch verwirrend. Dies ist natürlich eine persönliche Einschätzung, und du findest sicher deinen eigenen Stil! Mein nächster Schritt sieht also so aus:
puts 'Hallo und willkommen im Kurs.' puts 'Ich bin Frau Mahlzahn und wie heißt du?' name = gets.chomp if name==name.capitalize puts 'Setz dich doch, '+name+'.' else puts name+'? Du meinst sicher: '+name.capitalize puts 'Weißt du jetzt, wie man deinen Namen schreibt?' reply = gets.chomp if reply.downcase=='ja' else end end
Du siehst: ich habe wieder erst mal das if-else-end fertig geschrieben. Das hilft mir, die Kontrolle über den Code zu bewahren. Es macht auch die Arbeit leichter, weil man sich immer auf kleine Bereiche konzentrieren kann, wie etwa das programmieren des if-Zweiges. Ein anderer Vorteil dieser Methode liegt darin, dass der Computer den Code zu jedem Zeitpunkt versteht und ausführen könnte. Jede der unfertigen Versionen, die ich vorgestellt habe, würde laufen. Sie sind nicht fertig, aber lauffähig. So kann man testen, während man programmiert, was hilft, Eindrücke vom Programm zu gewinnen. Wenn es all meine Tests erfüllt, weiß ich, dass ich fertig bin! Diese Tipps helfen dir, Verzweigungen zu programmieren, aber ebenso bei anderen Kontroll-Strukturen, wie den ...
Schleifen
Oft soll der Computer dasselbe immer und immer wiederholen � das ist ja auch das, worin Computer angeblich so gut sind!
Wenn du dem Computer sagst, er soll immer wiederholen, musst du ihm auch sagen, wann er damit aufhören soll! Computer langweilen sich nie, wenn du ihm also nicht sagst aufzuhören, wird er nie aufhören. Um dies zu vermeiden, sagen wir dem Computer, er solle wiederholen, solange eine Bedingung erfüllt ist. Das funktioniert so ähnlich wie die if-Anweisung:
command='' while command !='Ende' puts command command = gets.chomp end puts 'Komm mal wieder!'
Hallo? Hallo? Wer ist da? Wer ist da? Schön dich zu treffen! Schön dich zu treffen! Oh, wie niedlich! Oh, wie niedlich! Ende Komm mal wieder!
Und das ist eine Schleife! (Vielleicht ist dir die Leerzeile am Anfang der Ausgabe aufgefallen: die stammt vom ersten puts vor dem ersten gets. Wie würdest du das Programm abwandeln, damit sie nicht da ist? Probier es aus! Funktioniert ansonsten Dein Programm genauso wie das ursprüngliche Programm?)
Mit Schleifen kann man viele interessante Dinge tun, wie du dir sicher vorstellen kannst. Sie können aber auch Probleme bereiten, wenn du einen Fehler gemacht hast. Was passiert, wenn dein Computer in eine Endlos-Schleife geraten ist? In diesem Fall drücke einfach die Tastenkombination Strg-C. Bevor wir mit Schleifen rumspielen, lernen wir noch ein paar Dinge, die den Job leichter machen:
Ein bisschen Logik
Schauen wir noch einmal auf unser erstes Verzweigungs-programm. Was passiert, wenn meine Frau heimkommt, das Programm ausprobiert und es sagt ihr nicht, was für einen schönen Namen sie hat? Ich möchte sie nicht kränken (oder gar auf dem Sofa schlafen), so sollten wir es umschreiben:
puts 'Hallo, wie heißt du?' name=gets.chomp puts 'Hallo, '+name+'.' if (name=='Chris' or name=='Katy') puts 'Toller Name!' end
Hallo, wie heißt du?
Katy
Hallo, Katy.
Toller Name!
Viel besser. Dafür haben wir den or-/oder-Operator verwendet. Die anderen logischen Operatoren lauten and/und und not/nicht. Es ist immer hilfreich, zur Verdeutlichung Klammern zu verwenden. Schauen wir uns das einmal an:
ichBinChris =true ichBinLila =false ichEsseGerne =true ichEsseSteine =false puts (ichBinChris and ichEsseGerne) puts (ichEsseGerne and ichEsseSteine) puts (ichBinLila and ichEsseGerne) puts (ichBinLila and ichEsseSteine) puts puts (ichBinChris or ichEsseGerne) puts (ichEsseGerne or ichEsseSteine) puts (ichBinLila or ichEsseGerne) puts (ichBinLila or ichEsseSteine) puts (not ichBinLila) puts (not ichBinChris)
true false false false true true true false true false
Die einzige Operation, die verwirren könnte, ist or (dt.: oder): in der natürlichen Sprache verwendet man 'oder' in der Bedeutung 'das eine oder das andere, aber nicht beide!'. Wenn zum Beispiel deine Mutter sagt: �Was willst du als Nachtisch: Eis oder Kuchen?' so heißt dies nicht, dass du beides haben kannst... in der Computersprache heißt dieser Ausdruck aber 'das eine oder das andere oder beide' oder anders ausgedrückt 'mindestens eines'. Und darum sind Computer viel cooler als Mütter...
Selber ausprobieren
- Taube Oma
Schreib ein 'Taube-Oma'-Programm. Auf alle deine Eingaben reagiert sie mit 'WAS? ICH VERSTEHE NICHT! SPRICH LAUTER', außer du rufst es (=schreibst es in Großbuchstaben).
Wenn du schreist, kann sie dich hören (denkt sie jedenfalls) und antwortet immer mit 'NICHT SEIT 1938'.
Um das Programm wirklich realistisch zu gestalten, soll die Oma jedes Mal ein anderes Jahr nennen, zufällig zwischen 1930 und 1950.
Das Gespräch kann nur mit einem 'AUF WIEDERSEHEN' beendet werden.
Tipp 1: Vergiss die chomp-Methode nicht.
Tipp 2: überlege Dir, welche Teile des Programms wiederholt werden sollen. All das sollte in der Schleife stehen. - Liebe taube Oma:
Die Oma möchte nicht, dass du gehst und stellt sich taub, wenn du 'AUF WIEDERSEHEN' sagst. Du musst es drei mal hintereinander sagen, damit das Programm endet. Wandel das Programm entsprechend ab. -
Schaltjahr
Schreib ein Programm, das nach einem Start- und einem Endjahr fragt und alle Schaltjahre im angegebenen Zeitraum ausgibt. Es gilt:- ist ein Jahr durch 4 teilbar, ist es ein Schaltjahr
- aber: ist es durch 100 teilbar, ist es doch kein Schaltjahr
- aber: ist es durch 400 teilbar, so ist es wiederum ein Schaltjahr
Wenn du das geschafft hast, gönn' dir eine Pause! Du hast schon viel gelernt. Glückwunsch! Erstaunt es dich, wie viel du einem Computer schon anschaffen kannst? Noch ein paar Kapitel und du kannst so gut wie alles programmieren - ehrlich!
Sieh dir nur mal an, was du mit Verzweigungen und Schleifen alles bewirken kannst!
Wir lernen nun ein Objekt, das Listen anderer Objekte kontrolliert, kennen: ein Array.