6 Variablen und Datentypen Die Programme, die wir bisher gesehen haben, sind ziemlich langweilig — sie arbeiten eine vorgegebene Folge von Befehlen ab und sind überhaupt nicht flexibel. Für flexible Programme, die bei jedem Aufruf etwas anderes tun, benötigt man Variablen“, etwas das bei jedem Programmablauf einen anderen Wert ” haben kann. 6.1 Variablen und ihr Typ Wir verwenden Variablen, wenn wir Objekten einen Namen geben wollen, oder wenn wir uns etwas merken möchten. Variablen sind Platzhalter für Zahlen, Zeichenketten, Turtles oder sonstirgendwelche Dinge. Auf der Hardwareebene entspricht jeder Variable ein gewisser Platz im Hauptspeicher des Computers. Jede Variable hat einen Namen, und dieser Name muß den Vorschriften für Bezeichner genügen. Beispiel: Angenommen, wir wollen in einem Programm einen Bruttopreis berechnen. Wenn wird dies für einen Preis von 10, − DM tun wollen, könnten wir den Bruttopreis als 15% · 10, − + 10, − berechnen. Der Nachteil der obigen Formel ist, daß sie nur für einen Nettopreis von 10,- DM korrekt ist. Wenn wir in unserem Programm auch mit anderen Preisen als 10,- DM rechnen wollen, würden wir daher lieber einen Platzhalter — eine Variable — für den Nettopreis verwenden. Möglicherweise würden wir schreiben: bruttopreis = 0.15 * nettopreis + nettopreis Diese Formel wäre für jeden Preis anwendbar. Dazu müsste der Platzhalter nettopreis den jeweils zu verwendenden Nettopreis enthalten. Das Ergebnis würden wir dann in einem anderen Platzhalter namens bruttopreis speichern. Wir können Variablen überall dort einsetzen, wo wir Werte hinschreiben würden. Natürlich müssen wir dabei ein bißchen aufpassen — es wäre sicher nicht sinnvoll, einen Platzhalter, der eine reelle Zahl enthält, an einer Stelle zu verwenden, an der nur Zeichenketten hinpassen. Damit man nicht ausversehen eine Variable an einer Stelle verwendet, wo sie keinen Sinn macht, hat in Java jede Variable einen Typ. Beispiel: Beispielsweise gibt es in Java den Datentyp int. Variablen dieses Typs können ganze Zahlen speichern. Variablen des Datentyps double Typs können reelle Zahlen speichern. Wenn Sie eine Variable des Typs double an einer Stelle verwenden, wo man nur ganze Zahlen verwenden darf, zeigt der Compiler bei der Übersetzung ihres Programms einen Fehler an. 35 Bevor eine Variable in Java das erste Mal verwendet wird, muß man Java daher Informationen darüber zukommen lassen, welchen Typ diese Variable haben soll. In Java geschieht dies, indem man eine Anweisung des Aufbaus TYP variablenname; verwendet. Sobald Java eine solche Anweisung gefunden wird, merkt sich Java: Aha, hier ist jetzt eine Variable namens variablenname definiert worden, und diese Variable darf nur Werte des Typs TYP aufnehmen. Beispiel: DemoVars.javaa 1 2 3 4 5 6 7 8 9 10 11 12 /* Demonstriert einfache Variablenverwendung */ class DemoVars { public static void main(String[] args) { int zaehler; zaehler = 10; double inversZaehler = 1.0 / zaehler; System.out.println("Zaehler = " + zaehler); System.out.println("inversZaehler = " + inversZaehler); } } a Siehe http://www.wire.tu-bs.de/lehre/eipclasses/KapVariablen/DemoVars.java In Zeile 6 wird eine Variable namens zaehler als int definiert. Von dieser Zeile an weiß Java, daß der Bezeichner zaehler für eine Variable steht und nur ganze Zahlen speichern kann. In Zeile 7 wird der Variable zaehler der Wert 10 zugewiesen. Vorher hatte zaehler keinen definierten Wert. In Zeile 8 wird eine weitere Variable namens inversZaehler definiert, die reelle Zahlen speichern kann. Außerdem wird dieser Variable gleich der inverse Wert von zaehler zugewiesen. In Zeile 9 und 10 werden beide Variablen ausgegeben. 6.1.1 Ganze Zahlen Java kennt mehrere ganzzahlige und mehrere reellwertige Datentypen. Der Grund hierfür ist folgender: Jede Variable belegt einen gewisse Anzahl von Bytes im Speicher des Computers. Aus Kapitel 2 wissen Sie, daß man mit n Bytes nur 28·n verschiedene Werte darstellen kann. Um den Typ einer Variable festzulegen, muß man sich darum vorher Gedanken machen, wieviele verschiedene Werte sie annehmen können soll und davon ausgehend, wieviele Bytes man im Computerspeicher dafür verwenden möchte. Da man normalerweise nicht mehr Speicherplatz als nötig verschwenden will, bietet Java ganzzahlige und reellwerige Datentypen verschiedener Längen an (die Länge des Datentyps gibt an, wieviele Bytes seine Variablen belegen). Java kennt die ganzzahligen Datentypen byte, short, int und long. Am häufigsten verwendet man den Datentyp int. 36 Typ byte short int long Länge 1 2 4 8 Wertebereich −27 , . . . , 27 − 1 −215 , . . . , 215 − 1 −231 , . . . , 231 − 1 −263 , . . . , 263 − 1 Das folgende Programm demonstriert die Verwendung von ganzen Zahlen: GanzZahl.javaa 1 2 3 4 5 6 7 8 public class GanzZahl { public static void main(String[] args) { short senseOfLife=42; long secondsInYear=365*24*60*60; byte secondsInMinute=60; int secondsInHour=secondsInMinute*secondsInMinute; } } a Siehe http://www.wire.tu-bs.de/lehre/eipclasses/KapVariablen/GanzZahl.java Was passiert, wenn eine Variable einen zu großen oder kleinen Wert enthält ? Um das zu demonstrieren, haben wir ein Programm geschrieben, das eine Zahl vom Benutzer einliest und anschließend ausgibt: GanzZahlInput.javaa 1 2 3 4 5 6 7 8 9 import eip.*; public class GanzZahlInput { public static void main( String[] args ) { Std.out.print("Bitte Zahl eingeben: "); int i = Std.in.readInt(); Std.out.println("i="+i); } } a Siehe http://www.wire.tu-bs.de/lehre/eipclasses/KapVariablen/GanzZahlInput.java Wenn Sie das Programm kompilieren und starten, werden Sie aufgefordert, eine Zahl einzugeben. Die eingegebene Zahl wird dann der int–Variable i zugewiesen. Probieren Sie es bitte selbst aus ! Wenn Sie die Zahl 231 − 1 eingeben (das ist die Zahl 2147483647), gibt das Programm sie korrekt wieder aus. Wenn Sie jedoch größere Zahlen eingeben, kommt es zu komischen Resultaten: statt der von Ihnen eingegebenen Zahl werden negative Zahlen ausgegeben. Zum Beispiel macht das Programm bei mir aus der Zahl 123456789012 die Zahl −1097262572. Diesen Effekt nennt man Overflow — eine Zahl läuft über, wenn man ihr einen zu großen oder einen zu kleinen Wert zuweist. Der Wert, den die Zahl dann enthält, ist nicht brauchbar. Sie müssen also immer darauf achten, daß der ausgewählte Datentyp zu den Daten passt, die Sie verarbeiten wollen. 37