Wirtschaftsinformatik (Bachelor-Studiengang): Programmierung (1. Semester)

Sie sind hier: StartseiteWirtschaftsinformatikProgrammierung Java (Kurs 1): Anweisungen

HB / CM, Kurs vom 01.04.2002 - 30.09.2002

Programmierung Java (Kurs 1): Anweisungen: Wertzuweisungsanweisungen, Auswahlanweisungen (Die if-Anweisung, Die switch-Anweisung), Wiederholungsanweisungen (Die do-while-Anweisung, Die while-Anweisung, Die for-Anweisung, Die return-Anweisung).

  1. Wertzuweisungsanweisungen
  2. Auswahlanweisungen
  3. Wiederholungsanweisungen

Wertzuweisungsanweisungen

Eine Wertzuweisungsanweisung muss folgende Gestalt haben:

Beispiel: Wird durch Semikolon zur Anweisung!
Wertzuweisung;

Eine einfache Wertzuweisung muss folgende Gestalt haben:

  1. lokale Variable = Zuweisungsausdruck
  2. Attribut = Zuweisungsausdruck

Bei komplexen Wertzuweisungen kann

Programmierregel: Links und rechts des Zuweisungsoperators mindestens ein Leerzeichen!

Bei einer Wertzuweisung wird

  1. der Wert des Zuweisungsausdrucks ermittelt
  2. der so ermittelte / dieser als neuer Wert der linken Seite gespeichert.

Der Zuweisungsausdruck auf der "rechten" Seite muss zuweisungskompatibel zur "linken" Seite sein. Datentypen sind zuweisungskompatibel immer dann, wenn sie identisch sind.

Für die primitiven Datentypen ist außerdem zulässig (19 Fälle):

  1. "links":
    short
    int
    long
    float
    double
  2. "rechts":
    byte
    byte, short, char
    byte, short, char, int
    byte, short, char, int, long
    byte, short, char, int, long, float

Falls auf der rechten Seite eine Konstante oder ein konstanter Ausdruck steht, ist folgendes ferner zulässig:

  1. "links":
    byte
    short
  2. "rechts":
    short, char, int
    char, int

Dies aber nur, wenn der (Konstante-)Wert der rechten Seite zum Wertebereich der linken Seite gehört.

Wenn die Werte nicht zuweisungskompatibel sind, wird das Programm nicht ausgeführt (Sicherheitsaspekt).

Der Zuweisungsausdruck auf der rechten Seite kann von

Welche Operatoren gibt es für die primitiven Datentypen?

Für die ganzzahligen Datentypen:
  1. die unären Vorzeichenoperatoren + und
  2. die binären additiven Operatoren + und
  3. die binären multiplikativen Operatoren
    ×: ganzzahlige Multiplikation
    ÷: ganzzahlige Division
    %: ganzzahliger Rest bei der ganzzahligen Division

    Achtung: Bei den Operatoren ÷ oder % muss der rechte Operand immer ≠ 0 sein!

    Es gilt immer die folgende Regel:
    (n ÷ m) × + (n % m) = n
  4. unäre Präfix-Inkrement-Operator ++
    • Der Operand muss Variable, Attribut oder Array-Komponente sein, keine Konstante oder "Zahl" z.B. ++7.
    • Der Wert des Operanden wird um eins erhöht.
    • Der Wert der Operation, d.h. das Ergebnis, ist identisch mit dem um eins erhöhten Wert ds Operanden.
  5. unäre Postfix-Inkrement-Operator ++
    • Der Operand muss Variable, Attribut oder Array-Komponente sein, keine Konstante oder "Zahl" z.B. ++7.
    • Der Wert des Operanden wird um eins erhöht.
    • Der Wert der Operation ist identisch mit dem der ursprünglichen Operation.
    Beispiel: ... int n = 10;
    System.out.println(++n + " " + n++ + " " + n)
    Ausgabe: 11 __ 11 __ 12
  6. unäre Präfix-Dekrement-Operator
    Beispiel: −−n
    Funktionsweise analog 4.
  7. unäre Postfix-Dekrement-Operator
    Beispiel: n−−
    Funktionsweise analog 5.
  8. Die Vergleichsoperatoren ==; !=; <; <=; >; >=; liefern immer ein Ergebnis vom Datentyp boolean, d.h. true / false
    Beispiel: 7 = 10 (= false)

Für alle Inkrement- oder Dekrement-Operatoren gilt:

Für alle bisherigen Operatoren gilt:

Beispiel: Ausgabe ist −−129 496 7296
int a = 10.000.000.000;
int b = 3 × a;
System.out.print(b);

Hinweis: Die Datentypen müssen so gewählt werden, dass auch das Ergebnis sämtlicher beabsichtigten Operationen auch zum Wertebereich gehört!

Mit Hilfe des unären cast-Operators kann der Datentyp des Operanden (zwischenzeitlich) verändert werden.

(Zieldatentyp) Operator

Hinweis: Bei unvorsichtigem Gebrauch kann es zu Verlust von Informationen kommen!

Quelltext überspringen

Beispiel: Java-Notationen
int x = 100;
byte y = x; // Fehler, weil auf rechter Seite keine Konstante
System.out.print(y);
int x =100;
byte y = (byte) x;
System.out.print(y); // 100
int x = 1000;
byte y = (byte) x; // Okay, aber ...
System.out.print(y); // -24
int x = 65;
char zeichen = (char) x;
System.out.print(zeichen); // A

Die Shift-Operatoren:

«, »,

Die bitweisen Operatoren

(Selbststudium)

Die Operatoren für Gleitkommadatentypen float und double

Zu beachten ist die Arithmetik für spezielle Werte (+8, −8, NaN).

Der Unterschied zwischen strikter und nicht strikter Gleitkommarithmetik » Selbststudium

Für den Datentyp boolean gibt es folgende Operatoren

Hinweis: Damit wird in Java die Aussagenlogik realisiert!

Neben dem einfachen Wertzuweisungsoperator = gibt es in Java elf zusammengesetzte Wertzuweisungsoperatoren.

  1. +=
  2. −=
  3. *=
  4. /=
  5. %=
  6. «=
  7. »=
  8. >=
  9. &=
  10. |=
  11. ^=

Sie funktionieren alle nach demselben Muster:

Beispiel Wertzuweisung:

byte x = 10;
...
x ×= 3;

Ergebnis ist 30!

dasselbe wie

byte x = 10;
...
x = (byte) ((x) × (3));

Ergebnis ist auch hier 30!

Dabei sind die Klammern wichtig:

byte x = 10;
byte y = 2;
...
x *= y + 3;

ist dasselbe wie:

x = (byte) ((x) × (y + 3));
Ergebnis ist 50!

und nicht dasselbe wie

x = (byte) ((x × y) + 3);
Ergebnis ist 23!

Zum Menü Wirtschaftsinformatik | Zum Seitenanfang

Auswahlanweisungen

Die Auswahlanweisungen

dienen zur Auswahl zwischen Alternativen (2: if-Anweisung; mehrere: switch-Anweisung).

Die if-Anweisung

... hat folgende Gestalt:

if (Ausdruck)
Anweisung1
else
Anweisung2

Sie funktioniert so:

Zuerst wird der Ausdruck ausgewertet. Er muss einen Wert vom Datentyp boolean haben.

Falls true wird Anweisung 1 ausgeführt, falls false wird Anweisung 2 ausgeführt.

int a, b, c;
...
if (b != 0)
c = a / b;
else
System.out.print("Fehler Division durch 0!");

Bei Anweisung 1 und bei Anweisung 2 kann es sich um eine einzelne Anweisung handeln oder um einen ganzen Block.

int a, b, c;
...
if (b != 0)
{
c = a / b;
System.out.print(c);
}
else
System.out.print("Fehler Division durch 0!");

Der else-Teil einer if-Anweisung kann fehlen.

int a, b, c;
...
if (b != 0)
{
c = a / b;
System.out.print(c);
}

Im if-Teil und auch im else-Teil können weitere if-Anweisungen auftreten.

int a, b, c;
...
if (a > b)
d = c / a - b;
else
if (a < b)
d = c ÷ (-1 × (a - b));
else
System.out.print("Fehler Division durch 0!");

Die switch-Anweisung

Quelltext-Beispiel 2 überspringen

Beispielschema: Ist zur Auswahl zwischen mehreren Alternativen da
switch (Ausdruck)
{
case Fallausdruck_1 :
Anweisungen
case Fallausdruck_2 :
Anweisungen
...
case Fallausdruck_N :
Anweisungen
default: kann fehlen
Anweisungen
}

Wird so ausgeführt:

Zuerst wird Ausdruck ausgewertet. Der Wert des Ausdrucks von von einem der folgenden Datentypen sein: char, byte, short, int, nicht boolean und nicht long. Anschließend wird überprüft, ob der Wert von Ausdruck, identisch mit einem der Werte von Fallausdruck 1 bis Fallausdruck N.

Falls ja, werden die Anweisungen dieses Falls ausgeführt und sämtliche folgenden Anweisungen.

Falls nein, werden die hinter default stehenden Anweisungen ausgeführt und alle folgenden. Falls es kein default-Label gibt, wird keine Anweisung ausgeführt.

Die Fallausdrücke müssen entweder Konstanten oder Konstantenausdrücke sein. Ihre Werte müssen zuweisungskompatibel sein zum Datentyp des Wertes von Ausdruck. Keine zwei Fallausdrücke dürfen denselben Wert haben.

Es darf nur ein oder kein default-Label vorkommen.

Zum rechtzeitigen Verlassen der switch-Anweisung ist die break-Anweisung einzusetzen. Sie führt zum sofortigen Verlassen der switch-Anweisung.

Quelltext-Beispiel 3 überspringen

Beispiel: Hinter case müssen keine Anweisungen stehen.
int wert;
...
switch (wert)
{
case 0 :
case 4 :
case 6 :
case 8 :
System.out.print("gerade");
break;
case 2 :
System.out.print("gerade und prim");
break;
case 1 :
case 9 :
System.out.print("ungerade");
break;
case 3 :
case 5 :
case 7 :
System.out.print("ungerade und prim");
break;
default:
System.out.print("Gehoert nicht zum Wertebereich");
break;
}

Programmierregel: break nie zu anderen Zwecken einsetzen!

Zum Menü Wirtschaftsinformatik | Zum Seitenanfang

Wiederholungsanweisungen

In Java gibt es drei Wiederholungs-Anweisungen:

Die do-while-Anweisung

... hat folgende Gestalt:

do
Anweisung
while (Ausdruck);

Bei Anweisung kann es sich um genau eine Anweisung handeln oder um einen ganzen Block:

do
{
Anweisung1
...
AnweisungN
} while (Ausdruck);

Auch wenn es nur eine Anweisung ist, ist es üblich, sie als Block zu schreiben.

Der Wert des Ausdrucks muss boolean sein.

Die do-while-Anweisung wird wie folgt ausgeführt:

  1. Es wird die Anweisung bzw. der Block ausgeführt.
  2. Danach wird der Ausdruck ausgewertet.
  3. Ist der Wert von Ausdruck true, geht es weiter mit 1.
  4. Ist der Wert von Ausdruck false, wird die Ausführung beendet.

Hinweis: Anweisung wird immer mindestens einmal ausgeführt ("fußgesteuerte Schleife")!

Quelltext-Beispiel 4 überspringen

int intEingabe(int min, int max) throws IOException
{
BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
int eingabeZahl;
boolean eingabeOK;
do
{
eingabeZahl = Integer.parseInt(eingabe.readLine());
eingabeOK = (eingabeZahl >= min) && (eingabeZahl <= max);
if (!eingabeOK)
System.out.Print(" geeigneter Hinweis ");
} while (!eingabeOK);
return eingabeZahl;
}

Die while-Anweisung

... hat folgende Gestalt

while (Ausdruck)
Anweisung

Bei Anweisung kann es sich um nur eine Anweisung handeln oder einen ganzen Block.

while (Ausdruck)
{
Anweisung1
...
AnweisungN
}

Der Wert von Ausdruck muss vom Typ boolean sein.

Die while-Anweisung wird wie folgt ausgeführt:

  1. Zuerst wird Ausdruck ausgewertet.
  2. Falls der Wert true ist, wird Anweisung bzw. der Block ausgeführt. Danach geht es mit 1. weiter.
  3. Falls der Wert false ist, wird die Ausführung beendet.

Hinweis: Es kann passieren, dass Anweisung nie ausgeführt wird ("kopfgesteuerte Schleife")!

Quelltext-Beispiel 5 überspringen

Beispiel 1:
void schreibeZeichen(int anzahl, char zeichen)
{
while (anzahl --> 0)
System.out.print(zeichen);
}

Quelltext-Beispiel 6 überspringen

Beispiel 2:
int x = 1;
int summe = 0;
while (x <= 100)
{
summe += x;
x++;
}
System.out.print(summe); // 5050

Die for-Anweisung

... hat folgende Gestalt:

for (Initialisierungsausdruck; Testausdruck; Inkrementierungsausdruck)
Anweisung

Bei Anweisung handelt es sich um genau eine Anweisung oder um einen Block.

for (...)
{
Anweisung1
...
AnweisungN
}

Der Testausdruck muss einen Wert vom Datentyp boolean haben, d.h. true oder false.

Die for-Anweisung wird wie folgt ausgeführt:

  1. Es wird der Initialisierungsausdruck ausgewertet.
  2. Es wird der Testausdruck ausgewertet.
  3. Ist der Wert des Testausdrucks true,(3a) dann wird Anweisung ausgeführt. (3b) Danach wird der Inkrementierungsausdruck ausgewertet. Anschließend geht es mit 2. weiter.
  4. Wenn der Wert des Testausdrucks false ist, wird die Ausführung der for-Anweisung beendet.

Quelltext-Beispiel 7 überspringen

int i;
int summe = 0;
...
for (i = 1; i <= 100; i++)
summe += i;
i = 1 1.
i <= 100 2.
summe += i 3a
i++ 3b

Beim Initialisierungsausdruck kann es sich auch um eine Liste, von durch Kommata getrennten, Ausdrücken handeln, die von links nach rechts ausgewertet werden.

int i, summe;
...
for (i = 1, summe = 0; i <= 100, i++)
summe += i;

Dasselbe gilt für den Inkrementierungsausdruck.

int i, summe;
...
for (i = 1, summe = 0; i <= 100; summe += i, i++)
;

Eine nützliche Besonderheit von Java (und C++, nicht C) besteht darin, dass der Initialisierungsausdruck aus einer Variablendeklaration mit Initialisierung bestehen kann.

Quelltext-Beispiel 8 überspringen

int summe = 0;
for (int i = 1; i <= 100; i++)
summe += I;
for (int i = 5; i > 0; i--)
System.out.print("\n");

int i = 1 kann sofort genutzt werden, aber nur innerhalb der for-Anweisung.

Hinweis: Im Initialisierungsausdruck können sogar mehrere Variablen gleichen Datentyps deklariert und initialisiert werden, nicht verschiedener Datentypen!

for (int i = 1, summe = 0; i <= 100; summe += i, i++)
System.out.println(summe);

Das Fehlen des Initialisierungsausdrucks bzw. Inkrementierungsausdrucks kann durch Operationen &außerhalb& der for-Anweisung bzw. geeignete Operatoren ausgeglichen werden.

int i = 1, summe = 0;
for ( ; i <= 100; )
summe += i++;

Das Fehlen des Testausdrucks bedeutet Endlosschleifen.

for ( ; ; )
System.out.print(".");

Die return-Anweisung

... hat folgende Gestalt:

return Ausdruck;

";" muss sein, "Ausdruck" kann fehlen.

Sie wird wie folgt ausgeführt:

  1. Zuerst wird Ausdruck ausgewertet. Das Ergebnis muss einen Datentyp haben, der zuweisungskompatibel ist zum Datentyp des Rückgabewertes der Methode.
  2. Anschließend wird die Ausführung der Methode unmittelbar abgebrochen und der Wert von Ausdruck dem Aufrufer der Methode als Rückgabewert übergeben.

Methoden, die keinen Rückgabewert liefern (d.h. als void deklariert wurden), brauchen keine return-Anweisung zu haben. Sie können aber eine haben und zwar ohne Ausdruck (Beispiel: return;), was aber nicht empfohlen wird.

In der Strukturierten Programmierung wird unter anderem verlangt, dass jede Methode nur genau einen Eingang und genau einen Ausgang hat.

Hinweis: Bei Strukturierter Programmierung muss daher die return-Anweisung immer Teil der letzten Anweisung sein!

Quelltext-Beispiel 9 überspringen

int vergleiche() throws IOException
{
BufferedReader eingabe = new BufferedReader(new InsputStreamReader(System.in);
int rateZahl = Integer.parseInt(eingabe.readLine());
if (rateZahl == zielZahl)
return 0;
else
if (rateZahl < zielZahl)
return -1;
else
return 1;
}

nicht:
if (rateZahl == zielZahl)
return 0;
if (rateZahl < zielZahl)
return -1;
if (rateZahl > zielZahl)
return 1;

Hinweis: Die continue-Anweisung ist in der Strukturierten Programmierung nicht erlaubt!

Exkurs:

Manche if-Anweisungen können elegant durch den ternären Bedingungsoperator ersetzt werden:

Bedingungsausdruck ? Ausdruck1 : Ausdruck2

Bedingungsausdruck muss vom Typ boolean sein, wenn true, wird Ausdruck 1 ausgewertet, bei false Ausdruck 2.

Ausdruck 1 und Ausdruck 2 müssen immer von der gleichen Art sein, also beispielsweise numerischer Datentyp, boolean oder Referenzdatentyp.

Quelltext-Beispiel 10 überspringen

if (rateZahl == zielZahl)
return 0;
else
return (rateZahl < Zielzahl) ? -1 : 1;

oder:
return (rateZahl == zielZahl) ? 0 : (rateZahl < zielZahl) ? -1 : 1;