studyklar
GdI 1 · Beispielklausur · Aufgabe 4

Java-Aussagen beurteilen und Bedingungen mit %, && und || schreiben

Teil a prüft vier Aussagen über Java: Stimmt sie, oder nicht, und warum? Teil b übersetzt zwei deutsche Sätze in Bedingungen, wie sie in einem if stehen könnten. Rechts wächst je Teil eine Tabelle mit den Antworten. Mit Weiter geht es Schritt für Schritt voran. Ein Klick auf einen Schritt springt direkt dorthin.

Die Aufgabe

Aufgabe 4

a) Beurteilen Sie die Richtigkeit der folgenden Aussagen (wahr/falsch) auf der Grundlage der Programmiersprache Java. Geben Sie bei falschen Aussagen eine Begründung an!

  1. Eine Variable des Datentyps double lässt sich verlustfrei in eine Variable des Datentyps long umwandeln.
  2. Der Datentyp float dient zur Darstellung von Gleitkommazahlen.
  3. Das Ergebnis der Anweisung x / y ist vom Typ int, wenn x und y vom Typ int sind.
  4. Die Anweisung a[2] = a[3] prüft, ob die beiden Array-Elemente a[2] und a[3] denselben Wert besitzen.

b) Erstellen Sie die nachfolgend gegebenen Bedingungen in gültiger Java-Syntax! Alle betrachteten Zahlen seien ganze Zahlen.

  1. Das Dreifache der Zahl x größer als 100 oder Zahl x ungerade und durch 3 teilbar
  2. Mindestens eine der beiden Zahlen a und b ist ungerade und die jeweils andere ist größer als 10.

Teil a verlangt zu jeder Aussage ein Urteil: wahr oder falsch. Bei einer falschen Aussage gehört eine Begründung dazu. In der Klausur reicht ein Satz, aber er muss den Grund nennen, etwa die Regel aus der Vorlesung oder ein kleines Gegenbeispiel.

Teil b verlangt zwei Bedingungen in gültiger Java-Syntax. Gültig heißt: Der Compiler (das Programm, das Java-Code übersetzt) nimmt sie an, und sie liefert true genau dann, wenn der Satz zutrifft. Alle Zahlen sind ganze Zahlen, in Java also vom Typ int, und sie dürfen auch negativ sein.

In der Klausur gibt es keinen Rechner und keinen Compiler. Hier laufen die Beispiele trotzdem als echte Programme, damit jede Behauptung überprüft ist. Die Klausur nennt bei dieser Aufgabe keine Punkte.

  1. Aussage i bis iv einzeln beurteilen, je mit Regel und Beispiel.
  2. Bedingung i in Bausteine zerlegen, jeden Baustein in Java schreiben, verbinden.
  3. Bedingung ii in zwei Fälle zerlegen und verbinden.
  4. Beide Bedingungen an Testwerten prüfen.

i: double in long umwandeln

double d = 3.7;long n = (long) d;Out.println("(long) 3.7 ergibt " + n);double e = -3.7;Out.println("(long) -3.7 ergibt " + (long) e);double g = 1e20;Out.println("(long) 1e20 ergibt " + (long) g);
(long) 3.7 ergibt 3
(long) -3.7 ergibt -3
(long) 1e20 ergibt 9223372036854775807

Ohne Umwandlung, also mit der Zeile

long n = d;

meldet der Compiler:

Fehler: Inkompatible Typen: Möglicher Verlust bei Konvertierung von double in long

double ist ein Gleitkomma-Typ: Er speichert Zahlen mit Nachkommastellen, etwa 3.7, und sehr große Werte bis etwa 1,8⋅103081{,}8 \cdot 10^{308}. long ist ein Ganzzahl-Typ: nur ganze Zahlen, und höchstens 263−1≈9,2⋅10182^{63} - 1 \approx 9{,}2 \cdot 10^{18}.

Beim Umwandeln mit (long) geht darum zweierlei verloren. Die Nachkommastellen werden abgeschnitten, nicht gerundet: aus 3.7 wird 3, aus -3.7 wird −3. Und ein zu großer Wert wie 102010^{20} passt nicht hinein; Java setzt dann den größten long-Wert ein. 1e20 ist Javas Schreibweise für 102010^{20} (1 mal 10 hoch 20).

Ohne (long) lehnt der Compiler die Zuweisung long n = d; sogar ab. Er meldet genau den möglichen Verlust.

Im Beispielcode rechts gibt Out.println(…) eine Zeile auf dem Bildschirm aus. Out ist eine Hilfsklasse der Vorlesung, keine Java-Standardklasse; ihre Datei Out.java liegt im selben Ordner wie das Programm. Das + zwischen Text und Wert hängt den Wert an den Text an.

Aus Blatt 4, Aufgabe 4 („Gültige Java-Bezeichner und warum x = y mit long scheitert“): Eine Zuweisung klappt ohne Weiteres nur vom kleineren in den größeren Typ: double ⊇ float ⊇ long ⊇ int ⊇ short ⊇ byte. Dabei heißt ⊇: Der linke Typ fasst alle Werte des rechten. In die andere Richtung braucht es eine Typumwandlung (type cast) wie (long) d, und dabei kann Information verloren gehen (Skript 4, Folie 4-21).
Urteil i: falsch. Beim Umwandeln von double in long gehen die Nachkommastellen verloren, und Werte über 263−12^{63} - 1 passen nicht hinein.

ii: wozu float dient

TypBitsgrößter Betrag etwa
float323,4⋅10383{,}4 \cdot 10^{38}
double641,8⋅103081{,}8 \cdot 10^{308}

Aus Skript 4, Folie 4-16 („Gleitkomma-Typen“). Ein Beispiel:

float f = 3.14f;Out.println("float f = " + f);
float f = 3.14

Java hat zwei Gleitkomma-Typen: float mit 32 Bit und double mit 64 Bit. Gleitkommazahl heißt: Die Zahl wird als Vorzeichen, Exponent und Mantisse gespeichert, so wie im Standard IEEE 754. Damit lassen sich Zahlen mit Nachkommastellen darstellen, sehr kleine wie sehr große.

float ist die einfache Genauigkeit, double die doppelte. Ein Komma-Literal wie 3.14 ist in Java vom Typ double; für float hängt man ein f an.

Aus Blatt 2, Aufgabe 1 („Gleitkommazahlen nach IEEE 754 lesen und die nächstkleinere finden“): Einfache Genauigkeit nach IEEE 754: 1 Bit Vorzeichen, 8 Bit Exponent, 23 Bit Mantisse, zusammen 32 Bit. Genau so speichert Java einen float.
Urteil ii: wahr. float ist ein Gleitkomma-Typ (32 Bit, IEEE 754).
Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1a) Aussagen beurteilen

wahr oder falsch, mit Grund

AussageUrteilGrund
idouble → long verlustfrei??
iifloat für Gleitkommazahlen??
iiiint / int ergibt int??
iva[2] = a[3] prüft auf Gleichheit??
LegendeDie vier Aussagen aus Teil a.