Folgen von Ausgabeanweisungen in Java
Einfügen von Ausgabeanweisungen
Regel Vor oder hinter eine Ausgabeanweisung darf in unserem Programm eine andere Ausgabeanweisung eingefügt werden, und es entsteht so wieder ein korrektes Programm. (In späteren Kapiteln gilt diese Regel nicht mehr immer.)
Durch Einfügen einer weiteren Ausgabeanweisung hinter der Ausgabeanweisung, welche »2« ausgibt, kommen wir zum nächsten Programmbeispiel, das zwei direkt aufeinanderfolgende Ausgabeanweisungen (also eine Folge von zwei Ausgabeanweisungen) enthält.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 );
java.lang.System.out.println
( 3 ); }}transcript
2
3
Das obenstehende Programm kann nun nicht mehr durch Einsetzen eines Ausdrucks in den bisher verwendeten Ausdruckrahmen erhalten werden.
Durch Einfügen einer weiteren Ausgabeanweisung hinter der Ausgabeanweisung, welche »2« ausgibt, kommen wir zum nächsten Programmbeispiel, das drei direkt aufeinanderfolgende Ausgabeanweisungen enthält.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 );
java.lang.System.out.println
( 9 );
java.lang.System.out.println
( 3 ); }}transcript
2
9
3
Regel Eine Ausgabeanweisung darf in unserem Programm gelöscht werden, und es entsteht so wieder ein korrektes Programm. (In späteren Kapiteln gilt diese Regel nicht mehr immer.)
Durch Löschen der ersten Ausgabeanweisung kommen wir zu dem folgenden Programm.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 9 );
java.lang.System.out.println
( 3 ); }}transcript
9
3
Die Bedeutung von Ausgabeanweisungsfolgen
Bei der Ausführung eines Programmes mit einer Folge von Ausgabeanweisungen werden die Ausgabeanweisungen in der durch den Quelltext gegebenen Reihenfolge hintereinander ausgeführt. Die Ausführung beginnt mit der ersten Ausgabeanweisung. Die Ausführung jeder weiteren Ausgabeanweisung beginnt nach dem Ende der Ausführung der direkt vor ihr stehenden Ausgabeanweisung.
Die Wirkungen der Ausführungen der einzelnen Ausgabeanweisungen treten hintereinander in der Reihenfolge jener Ausgabeanweisungen ein.
Anweisungen erlauben es, zeitliche Abläufe zu bestimmen.
Der Lauf der Kontrolle ⃗
Bei der Ausführung des obenstehenden Programms wird zuerst die erste Ausgabeanweisung mit der »7« ausgeführt, dann die zweite mit der »8« und schließlich die dritte mit der »9«.
Man sagt auch, daß zuerst die erste Ausgabeanweisung mit der »7« die Kontrolle (über den Rechner) habe, dann die zweite mit der »8« und schließlich die dritte mit der »9«.
Entsprechend spricht man auch vom „Lauf der Kontrolle “ und sagt, daß die Kontrolle sich bei diesem Programm zuerst bei der Ausgabeanweisung mit der »7« befindet, sich dann von dort zur zweiten mit der »8« bewegt und schließlich die dritte mit der »9« erreicht.
Rückgabe und Ausgabe
(Dieses Thema wurde zuvor schon in einer Übungsfrage behandelt, wird hier aber noch einmal aufgegriffen.)
Man beachte die unterschiedliche Bedeutung von „Rückgabe“ und „Ausgabe“ sowie von „zurückgeben“ und „ausgeben“: Eine Methode gibt einen Wert zurück. Eine Ausgabeanweisung gibt einen Wert aus. Anfänger verwechseln gerne noch die Begriffe „Rückgabe “ und „Ausgabe “. In der folgenden Beispielprogrammausführung geschieht auch beides gemeinsam, so daß es wirklich nicht einfach ist, dies auseinanderzuhalten.
Main.java
public class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.Math.random() ); }}java.lang.System.out
0.8550395425903289
Der Unterschied ist jedoch folgender: Der Wert 0,8550395425903289 wird in der obigen Ausführung zuerst von der Operation/Methode »java.lang.Math.random()« zurückgegeben. Dann wird er von dem Ausdruckrahmen ausgegeben (beispielsweise auf einen Bildschirm oder Drucker). Ein bloß zurückgegebener Wert ist aber im allgemeinen nicht von außen sichtbar, weil die Rückgabe eines Wertes ein programminterner Vorgang ist, welcher keine Außenwirkung entfaltet. (Deswegen gilt die bloße Festlegung eines Rückgabewertes auch nicht als eine Wirkung.) Die Rückgabe besteht ja darin, daß ein Wert für eine Auswertung eines Ausdrucks festgelegt wird, der Wert wird damit aber nicht ausgegeben. Die Ausgabe erfolgt nur, wenn dieses Aufrufausdruck in den runden Klammern am Ende des Ausdruckrahmens steht. Die Ausgabe ist die Sichtbarmachung, Zugänglichmachung oder das Abspielen eines Textes, Bildes, Klangs oder einer anderen Form der Informationswiedergabe durch das Programm.
Die Rückgabe eines Wertes ist ein programminterner Vorgang, der nicht als eine Wirkung angesehen wird. Bei der Ausgabe eines Wertes wird eine Information vom Programm nach außen gegeben, und die Ausgabe wird als Wirkung angesehen.
Das folgende Beispielprogramm zeigt nun den umkehrten Fall: Der Wert 1 wird zwar ausgegeben, aber nicht zurückgegeben.
Main.java
public class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1 ); }}java.lang.System.out
1
Bei einem Literal, wie dem Literal »1«, spricht man nämlich nicht davon, daß diese ihren Wert „zurückgeben“. Ein Literal hat seinen Wert. Im obigen Beispiel hat das Literal »1« den Wert 1, welcher dann ausgegeben, aber nicht zurückgegeben wird. Zurückgegeben werden kann ein Wert ja nur von etwas, das vorher auch aufgerufen wurde. Ein Literal ist aber kein Aufrufausdruck.
In dem folgenden Programmbeispiel wird ein Wert von dem ersten Aufruf »java.lang.Math.random()« zurückgegeben. Aber dieser Wert wird nicht ausgegeben. (Vielmehr wird seine Summe mit einem anderen Wert ausgegeben.)
Main.java
public class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.Math.random() + java.lang.Math.random() ); }}transcript
1.668040400394999
Daneben gibt es noch das Wort „angeben“: Eine Wertausdruck, der keine Methode ist, gibt seinen Wert an, aber nicht zurück. So gibt der Ausdruck »7_2« beispielsweise den Wert »72« an. Neben „angeben“ verwendet man aber auch andere Verben dafür. Man sagt beispielsweise auch einfach, daß der Ausdruck »7_2« den Wert »72« habe, darstelle oder notiere.
Übungsaufgaben _
/ Übungsaufgabe _
Löschen Sie die erste Ausgabeanweisung aus dem folgenden Programm und fügen Sie eine Ausgabeanweisung hinter die derzeit letzte Ausgabeanweisung ein.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 9 );
java.lang.System.out.println
( 3 ); }}
/ Übungsaufgabe (1) _
Schreiben Sie ein Programm, das genau vier Ausgabeanweisungen hintereinander enthält.
Zusatzaufgaben *
/ Würfelsimulation *
Schreiben Sie eine Ausgabeanweisung, welche mit annähernd gleicher Wahrscheinlichkeit eine der folgenden sechs Ausgaben erzeugt: »1.0«, »2.0«, »3.0«, »4.0«, »5.0« oder »6.0«.
Kopieren Sie diese Ausgabeanweisung dann so in ein Programm, daß dieses Programm dann insgesamt fünf hintereinanderstehende Kopien dieser Ausgabeanweisung enthält. Starten Sie das Programm anschließend, um fünf Würfelzahlen zu erhalten.
Jede Kopie der Ausgabeanweisung soll also eine Zahl ausgegeben werden, deren Vorkommastelle zwischen 1 (einschließlich) und 6 (einschließlich) liegt, wobei jeder der Werte 1, 2, 3, 4, 5 und 6 mit gleicher Wahrscheinlichkeit als Vorkommastelle vorkommt.
Anmerkung Diese Übungsaufgabe gehört zum roten Faden „Würfeln“.