Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 2 Sprachbeschreibung
gp 2.1 Anweisungen und Programme
gp 2.2 Elemente der Programmiersprache Java
gp 2.2.1 Textkodierung durch Unicode-Zeichen
gp 2.2.2 Unicode-Tabellen unter Windows
gp 2.2.3 Literale
gp 2.2.4 Bezeichner
gp 2.2.5 Reservierte Schlüsselwörter
gp 2.2.6 Token
gp 2.2.7 Semantik
gp 2.2.8 Kommentare
gp 2.2.9 Funktionsaufrufe als Anweisungen
gp 2.2.10 Die leere Anweisung
gp 2.2.11 Der Block
gp 2.3 Datentypen
gp 2.3.1 Primitive Datentypen
gp 2.3.2 Wahrheitswerte
gp 2.3.3 Variablendeklarationen
gp 2.3.4 Ganzzahlige Datentypen
gp 2.3.5 Die Fließkommazahlen
gp 2.3.6 Alphanumerische Zeichen
gp 2.3.7 Die Typanpassung (das Casting)
gp 2.3.8 Lokale Variablen, Blöcke und Sichtbarkeit
gp 2.3.9 Initialisierung von lokalen Variablen
gp 2.4 Ausdrücke, Operanden und Operatoren
gp 2.4.1 Zuweisungsoperator und Verbundoperator
gp 2.4.2 Präfix- oder Postfix-Inkrement und -Dekrement
gp 2.4.3 Unäres Minus und Plus
gp 2.4.4 Arithmetische Operatoren
gp 2.4.5 Die relationalen Operatoren
gp 2.4.6 Logische Operatoren
gp 2.4.7 Reihenfolge und Rang der Operatoren in der Auswertungsreihenfolge
gp 2.4.8 Überladenes Plus für Strings
gp 2.4.9 Was C(++)-Programmierer vermissen könnten
gp 2.5 Bedingte Anweisungen oder Fallunterscheidungen
gp 2.5.1 Die if-Anweisung
gp 2.5.2 Die Alternative wählen mit einer if/else-Anweisung
gp 2.5.3 Die switch-Anweisung bietet die Alternative
gp 2.6 Schleifen
gp 2.6.1 Die while-Schleife
gp 2.6.2 Schleifenbedingungen und Vergleiche mit ==
gp 2.6.3 Die do/while-Schleife
gp 2.6.4 Die for-Schleife
gp 2.6.5 Ausbruch planen mit break und Wiedereinstieg mit continue
gp 2.6.6 break und continue mit Sprungmarken
gp 2.7 Methoden einer Klasse
gp 2.7.1 Bestandteil einer Funktion
gp 2.7.2 Aufruf
gp 2.7.3 Methoden ohne Parameter
gp 2.7.4 Statische Methoden (Klassenmethoden)
gp 2.7.5 Parameter und Wertübergabe
gp 2.7.6 Methoden vorzeitig mit return beenden
gp 2.7.7 Nicht erreichbarer Quellcode bei Funktionen
gp 2.7.8 Rückgabewerte
gp 2.7.9 Methoden überladen
gp 2.7.10 Vorinitialisierte Parameter bei Funktionen
gp 2.7.11 Finale lokale Variablen
gp 2.7.12 Finale Referenzen in Objekten und das fehlende const
gp 2.7.13 Rekursive Funktionen
gp 2.7.14 Die Ackermann-Funktion
gp 2.7.15 Die Türme von Hanoi
gp 2.8 Weitere Operatoren
gp 2.8.1 Bitoperationen
gp 2.8.2 Vorzeichenlose Bytes in ein Integer und Char konvertieren
gp 2.8.3 Variablen mit Xor vertauschen
gp 2.8.4 Die Verschiebeoperatoren
gp 2.8.5 Setzen, Löschen, Umdrehen und Testen von Bits
gp 2.8.6 Der Bedingungsoperator
gp 2.9 Einfache Benutzereingaben


Galileo Computing

2.6 Schleifendowntop

Schleifen dienen dazu, bestimmte Anweisungen immer wieder abzuarbeiten. Zu einer Schleife gehören die Schleifenbedingung und der Rumpf. Die Schleifenbedingung entscheidet darüber, unter welcher Bedingung die Wiederholung ausgeführt wird. Sie muss ein boolescher Ausdruck sein. In Abhängigkeit von der Schleifenbedingung kann der Rumpf mehrmals ausgeführt werden. Dazu wird bei jedem Schleifendurchgang die Schleifenbedingung geprüft. Das Ergebnis entscheidet, ob der Rumpf ein weiteres Mal durchlaufen (true) oder die Schleife beendet wird (false).


Galileo Computing

2.6.1 Die while-Schleifedowntop

Die while-Schleife ist eine abweisende Schleife, da sie vor jedem Schleifeneintritt die Schleifenbedingung prüft:

while ( Ausdruck )
  Anweisung

Vor jedem Schleifendurchgang wird der Ausdruck neu ausgewertet und ist das Ergebnis true, so wird der Rumpf ausgeführt. Die Schleife ist beendet, wenn das Ergebnis false ist. Ist die Bedingung schon vor dem ersten Eintritt in den Rumpf nicht wahr, so wird der Rumpf erst gar nicht durchlaufen. Der Typ der Bedingung muss boolean sein.

Wird innerhalb des Schleifenkopfs schon alles Interessante erledigt, so muss trotzdem eine Anweisung folgen. Dies ist der passende Einsatz für die leere Anweisung. Etwa

while ( leseWeiterBisZumEnde() )
  ;                              // Rumpf ist leer

Die Methode leseWeiterBisZumEnde() gibt true zurück, falls noch Zeichen gelesen werden können. Wenn der Rückgabewert false ist, so wird die Schleife beendet.

Da der Typ wiederum boolean sein muss, sehen die Anweisungen in Java im Gegensatz zu C(++) etwas präziser aus:

while ( i != 0 ) {               // und nicht while ( i ) wie in C(++)
  ...
}

Endlosschleifen

Ist die Bedingung einer while-Schleife immer wahr, dann handelt es sich um eine Endlosschleife. Die Konsequenz ist, dass die Schleife endlos wiederholt wird:

while ( true )
{
  // immer wieder und immer wieder
}

<eclipse: StoppProgramm.png In Eclipse lassen sich Programme von außen beenden. Dazu bietet die Ansicht Console eine Schaltfläche in Form eines Quadrats, welches nach der Aktivierung im Fall eines laufenden Programms die JVM mit den laufenden Programmen beendet.>

Endlosschleifen bedeuten normalerweise das Aus für jedes Programm. Doch es gibt Hilfe! Aus dieser Endlosschleife lässt sich mittels break entkommen. Genau genommen beenden aber auch nicht aufgefangene Exceptions oder auch System.exit()die Programme.


Galileo Computing

2.6.2 Schleifenbedingungen und Vergleiche mit ==downtop

Eine Schleifenabbruchbedingung kann ganz unterschiedlich aussehen. Beim Zählen ist es häufig der Vergleich auf einen Endwert. Oft steckt an dieser Stelle ein absoluter Vergleich mit ==, der aus zwei Gründen problematisch werden kann.

Lange, lange durchhalten


Beispiel Sehen wir uns das erste Problem an einigen Programmzeilen an:
int i = Wert;
while ( i != 9 )
  i++;

Ist der Wert der Variablen i kleiner als 9, so haben wir beim Zählen kein Problem, denn dann ist anschließend spätestens bei 9 Schluss. Ist der Wert allerdings echt größer als 9, so ist die Bedingung ebenso wahr, und der Schleifenrumpf wird ziemlich lange durchlaufen. Genau genommen so weit, bis wir durch einen Überlauf1 wieder bei 0 beginnen und dann auch bei 9 landen. Die Absicht ist sicherlich eine andere gewesen. Die Schleife sollte nur solange zählen, wie i kleiner 9 ist und sonst nicht. Daher passt Folgendes besser:

int i = Wert;
while ( i < 9 )
  i++;

Jetzt rennt der Interpreter bei Zahlen größer 9 nicht endlos weiter, sondern stoppt die Schleife sofort.

Rechenungenauigkeiten

Das zweite Problem ergibt sich bei Gleitkommazahlen. Es ist sehr problematisch, echte Vergleiche zu fordern.

double d = 0.0;
 while ( d != 1.0 )
{
  d += 0.1;
  System.out.println( d );
}

Lassen wir das Programmsegment laufen, so sehen wir, dass die Schleife hurtig über das Ziel hinausschießt:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
1.2
1.3

... bis das Auge müde wird ...

Bei Fließkommawerten bietet es sich daher immer an, mit den relationalen Operatoren < oder > zu arbeiten.

Eine zweite Möglichkeit neben dem echten Kleiner/Größer-Vergleich ist, eine erlaubte Abweichung zu definieren. Mathematiker bezeichnen die Abweichung von zwei Werten mit dem griechischen Kleinbuchstaben Epsilon. Wenn wir einen Vergleich von zwei Fließkommazahlen anstreben und bei einem Gleichheitsvergleich die Abweichung mit betrachten wollen, so schreiben wir einfach:

if ( Math.abs(a - b) <= epsilon )
  ...

Epsilon ist die erlaubte Abweichung. Math.abs(x) berechnet von einer Zahl x den Absolutwert.


Galileo Computing

2.6.3 Die do/while-Schleifedowntop

Dieser Schleifentyp ist eine annehmende Schleife, da die Schleifenbedingung erst nach jedem Schleifendurchgang geprüft wird. Bevor es zum ersten Test kommt, ist der Rumpf also schon einmal durchlaufen:

do
  Anweisung
while ( Ausdruck );                  // Bemerke das Semikolon

Es ist wichtig, auf das Semikolon hinter der while-Anweisung zu achten. Liefert die Bedingung ein true, so wird der Rumpf erneut ausgeführt. Andernfalls wird die Schleife beendet, und das Programm wird mit der nächsten Anweisung nach der Schleife fortgesetzt.


Beispiel Eine Zählschleife
int pos = 1;
do
{
  System.out.println( pos );
  pos++;
} while ( pos < 10 );

Äquivalenz einer while- und einer do/while-Schleife

Die do-Schleife wird seltener gebraucht als die while-Schleife. Dennoch lassen sich beide ineinander überführen. Zunächst der erste Fall. Wir ersetzen eine while-Schleife durch eine do/while-Schleife:

while ( Ausdruck )
  Anweisung

Führen wir uns noch einmal vor Augen, was hier passiert. In Abhängigkeit vom Ausdruck wird der Rumpf ausgeführt. Da zunächst ein Test kommt, wäre die do/while-Schleife schon eine Blockausführung weiter. So fragen wir in einem ersten Schritt mit einer if-Anweisung ab, ob die Bedingung wahr ist oder nicht. Wenn ja, dann lassen wir den Programmcode in einer do/while-Schleife abarbeiten. Die äquivalente do/while-Schleife sieht also wie folgt aus:

if ( Ausdruck )
  do
    Anweisung
  while ( Ausdruck ) ;

Nun der zweite Fall. Wir ersetzen die do/while-Schleife durch eine while-Schleife:

do
  Anweisung
while ( Ausdruck ) ;

Da zunächst die Anweisungen ausgeführt werden und anschließend der Test, schreiben wir für die while-Variante die Ausdrücke einfach vor den Test. So ist sichergestellt, dass diese zumindest einmal abgearbeitet werden.

Anweisung
while ( Ausdruck )
  Anweisung

Galileo Computing

2.6.4 Die for-Schleifedowntop

Die for-Schleife ist eine spezielle Variante einer while-Schleife und wird typischerweise zum Zählen benutzt. Genauso wie while-Schleifen sind for-Schleifen abweisend, der Rumpf wird also erst dann ausgeführt, wenn die Bedingung wahr ist.


Beispiel Gebe die Zahlen von 1 bis 10 auf dem Bildschirm aus
for ( int i = 1; i <= 10; i++ )
  System.out.println( i );

Eine genauere Betrachtung der Schleife zeigt die unterschiedlichen Segmente:

gp Initialisierung der Schleife
Der erste Teil der for-Schleife ist ein Ausdruck wie i = 1, der vor der Durchführung der Schleife genau einmal ausgeführt wird. Dann wird das Ergebnis verworfen. Tritt in der Auswertung ein Fehler auf, so wird die Abarbeitung unterbrochen und die Schleife kann nicht vollständig ausgeführt werden. Der erste Teil kann lokale Variablen definieren und initialisieren. Diese Zählvariable ist dann außerhalb des Blocks nicht mehr gültig.2 Es darf noch keine lokale Variable mit dem gleichen Namen geben.
gp Schleifentest/Schleifenbedingung
Der mittlere Teil, wie i <= 10, wird vor dem Durchlaufen des Schleifenrumpfs - also vor jedem Schleifeneintritt - getestet. Ergibt der Ausdruck false, wird die Schleife nicht durchlaufen und beendet. Das Ergebnis muss, wie bei einer while-Schleife, vom Typ boolean sein. Ist kein Test angegeben, so ist das Ergebnis automatisch true.
gp Schleifen-Inkrement durch einen Fortschaltausdruck
Der letzte Teil, wie i++, wird immer am Ende jedes Schleifendurchlaufs, aber noch vor dem nächsten Schleifeneintritt ausgeführt. Das Ergebnis wird nicht weiter verwendet. Ergibt die Bedingung des Tests true, dann befindet sich beim nächsten Betreten des Rumpfs der veränderte Wert im Rumpf.

Betrachten wir das Beispiel, so ist die Auswertungsreihenfolge folgender Art:

1. Initialisiere i mit 1
2. Teste, ob i <= 10 gilt 3. Ergibt sich true, dann führe den Block aus, sonst ist es das Ende der Schleife 4. Erhöhe i um 1 5. Gehe zu Schritt 2

Schleifenzähler

Wird die for-Schleife zum Durchlaufen einer Variablen genutzt, so heißt der Schleifenzähler entweder Zählvariable oder Laufvariable.

// Zahlen von 1 bis 10 ausgeben
for ( int i = 1; i <= 10; i++ )            // i ist Schleifenzähler
  System.out.println( i );

Wichtig ist die Initialisierung und die korrekte Abfrage am Ende. Schnell läuft die Schleife einmal zu oft durch und führt so zu falschen Ergebnissen. Die Fehler bei der Abfrage werden auch »off-by-one error» genannt, wenn zum Beispiel anstatt <= der Operator < steht. Dann nämlich läuft die Schleife nur bis 9. Ein anderer Name für den Schleifenfehler heißt »fencepost error». Es geht um die Frage, wie viele Pfähle nötig sind, um 100 m einzuzäumen, sodass alle Pfähle einen Abstand von 10 m haben: 9, 10, 11?

Wann for und wann while?

Da sich while- und for-Schleife sehr ähnlich sind, besteht die berechtigte Frage, wann die eine und wann die andere zu nutzen ist. Leider verführt die kompakte for-Schleife sehr schnell zu einer Überladung. Manche Programmierer packen gerne alles in den Schleifenkopf hinein, und der Rumpf besteht nur aus einer leeren Anweisung. Dies ist ein schlechter Stil und muss vermieden werden. Die for-Schleife sollte dort eingesetzt werden, wo sich alle drei Ausdrücke im Schleifenkopf auf dieselbe Variable beziehen. Vermieden werden sollten unzusammenhängende Ausdrücke im Schleifenkopf.

Eine Endlosschleife

Da alle drei Ausdrücke im Kopf der Schleife optional sind, können sie weggelassen werden und es ergibt sich eine Endlosschleife. Diese Schreibweise ist somit semantisch äquivalent mit while(true):

for ( ; ; )
  ;

Die trennenden Semikolons dürfen nicht verschwinden. Falls demnach keine Schleifenbedingung angegeben ist, ist der Ausdruck immer wahr. Es folgt keine Initialisierung und keine Auswertung des Fortschaltausdrucks.

Geschachtelte Schleifen

Schleifen, und das gilt insbesondere für for-Schleifen, können geschachtelt werden. Syntaktisch ist das auch logisch, da sich innerhalb des Schleifenrumpfs beliebige Anweisungen aufhalten dürfen.


Beispiel Gib fünf Zeilen von Sternchen aus, wobei in jeder Zeile immer ein Stern mehr erscheinen soll. Als besonderes Element ist die Abhängigkeit des Schleifenzählers j von i zu werten.
for( int i = 1; i <= 5; i++ )
{ 
  for ( int j = 1; j <= i; j++ ) 
    System.out.print( "*" ); 
  System.out.println();
}
Es folgt die Ausgabe:
*
**
***
****
*****

Die übergeordnete Schleife nennt sich äußere Schleife, die untergeordnete innere Schleife. In unserem Beispiel wird die äußere Schleife die Zeilen zählen und die innere die Sternchen in eine Zeile ausgeben, also für die Spalte verantwortlich sein.

Da Schleifen beliebig tief geschachtelt werden können, muss besonders ein Auge auf die Laufzeit geworfen werden. Die inneren Schleifen werden immer so oft ausgeführt, wie die äußere Schleife durchlaufen wird.

for-Schleifen und ihr Komma-Operator

Im ersten und letzen Teil einer for-Schleife lässt sich ein Komma einsetzen. Damit lassen sich entweder mehrere Variablen gleichen Typs deklarieren - wie wir es schon kennen - oder mehrere Ausdrücke nebeneinander schreiben.3


Beispiel Schleife mit zwei Zählern:
for ( int i = 1, j = 9; i <= j; i++, j-- )
  System.out.println( i + "*" + j + " = " + i*j );

Dann ist die Ausgabe:

1*9 = 9
2*8 = 16
3*7 = 21
4*6 = 24
5*5 = 25


Beispiel Berechne vor dem Schleifendurchlauf den Startwert für die Variablen x und y. Erhöhe dann x und y und führe die Schleife aus, bis x und y beide 10 sind.
int x, y;
for ( x = initX(), y = initY(), x++, y++;
      x == 10 && y == 10;
      x += xinc(), y += yinc() )
{
  // ...
}


Tipp Komplizierte for-Schleifen sind lesbarer, wenn die drei for-Teile in getrennten Zeilen stehen.

Wird das Komma für die Deklaration mehrerer Variablen verwendet, so kann dahinter kein Ausdruck mit Komma abgetrennt werden. Wenn der Compiler mit einer Deklaration beginnt, könnte er gar nicht zwischen einer zweiten Deklaration für eine Variable und dem folgenden Ausdruck unterscheiden, da das Komma die Variablennamen abtrennt.


Beispiel Folgende for-Schleife ergibt einen Fehler:
int i;
for ( int cnt = 0, i = 1; cnt < 10; cnt++ )
  ;

Der erste Teil leitet eine Anweisung ein. Nach dem Komma folgt für den Compiler aber die Deklaration einer zweiten Variablen. Da sie jedoch schon eine Zeile vorher definiert wurde, meldet der Compiler einen Fehler.

Auch umgekehrt funktioniert das nicht, denn eine Variablendeklaration ist kein Ausdruck, sie ist formal betrachtet eine Anweisung.


Beispiel Einer Anweisung kann keine Variablendeklaration folgen. Daher ist auch Folgendes falsch:
for ( i = 0, int j = 0; ; )
  ;

Im letzten Teil von for, dem Fortschaltausdruck, darf keine Variablendeklaration stehen. Wozu sollte das auch gut sein?

Zu den weiteren Einschränkungen gehört, dass es nicht möglich ist, Variablen unterschiedlicher Typen zu deklarieren, wie es etwa for (int i = 0, double d = 0.0;;) zeigt. Hier muss eine Variable außerhalb der for-Schleife definiert werden. Das Deklarieren einer äußeren Variable bringt vielleicht aber auch den unerwünschten Effekt mit sich, dass eine Variable, die eigentlich nur in der Schleife gültig sein soll, eine zu große Sichtbarkeit bekommt. Dann lässt sich ein Block aufspannen, in dem dann nur eine Variable gültig ist.


Beispiel Deklariere ein double und eine Ganzzahl-Variable für die Schleife
{
  double d = 12;
  for ( int i = 0; i < 20; i++ )
    ;
}
// jetzt sind i und d wieder frei
double d = 12;


Galileo Computing

2.6.5 Ausbruch planen mit break und Wiedereinstieg mit continuedowntop

Wird innerhalb einer for-, while- oder do/while-Schleife eine break-Anweisung eingesetzt, so wird der Schleifendurchlauf beendet.


Beispiel Führe die Schleife so lange durch, bis i den Wert 0 hat
int i = 10;
while ( true )
  if ( i-- == 0 )
    break;

Die Anweisung ist nützlich, um im Programmblock festzustellen, ob die Schleife noch einmal durchlaufen werden soll. Sie entlastet den Schleifenkopf, der sonst die Bedingung testen würde. Da ein kleines break jedoch im Programmtext verschwinden könnte, die Bedeutung aber groß ist, sollte ein kleiner Hinweis auf diese Anweisung gesetzt werden.

Innerhalb einer for-, while- oder do/while-Schleife lässt sich eine continue-Anweisung einsetzen, die nicht wie break die Schleife beendet, sondern zum Schleifenkopf zurückgeht, sodass dort eine neue Prüfung durchgeführt werden kann, ob die Schleife weiter durchlaufen werden soll. Ein häufiges Einsatzfeld sind Schleifen, die im Rumpf immer wieder Werte so lange holen und testen, bis sie passend zur Weiterverarbeitung sind.


Beispiel Gebe die geraden Zahlen von 0 bis 10 aus
for ( int i = 0; i <= 10; i++ )
{
  if ( i%2 == 1 )
    continue;

  System.out.println( i + " ist eine gerade Zahl" );
}

Abbildung
Hier klicken, um das Bild zu Vergrößern


Galileo Computing

2.6.6 break und continue mit Sprungmarkentoptop

Obwohl das Schlüsselwort goto in der Liste der reservierten Wörter auftaucht, ist diese Operation nicht erlaubt. Programmieren mit goto sollte vermieden werden. Mit dem Konzept von break lässt sich gut leben, und es kann auch noch ruhigen Gewissens eingesetzt werden. Doch zum Schrecken vieler kann break noch schmutziger eingesetzt werden, nämlich mit einer Sprungmarke. Das bringt Java verdächtig nahe in die goto-Welt der unstrukturierten Programmiersprachen, was die Entwickler eigentlich vermeiden wollten. Da jedoch Abbruchbedingungen - der häufigste Einsatzort eines goto - vereinzelt auftreten, wurden in Java break und continue mit Sprungmarken eingeführt.


Beispiel Der Einsatz von break oder continue:
one:
  while ( condition )
  {
    ...
  two:
    while ( condition )
    {
    ...
    // break oder continue
    }
  // nach two
  }
// nach one

Wird innerhalb der zweiten while-Schleife ein break platziert, dann würde es beim Aufruf die while-Schleife beenden. Das continue würde zur Fortführung der while-Schleife führen. Dieses Verhalten entspräche C, aber in Java ist es erlaubt, hinter den Schlüsselworten break und continue Sprungmarken zu setzen. Das C-Verhalten kann in Java mit break two oder continue two beschrieben werden. Dass aber auch beispielsweise break one möglich ist, zeigt die Mächtigkeit dieses Befehls. Durch break und continue mit Marken ist daher ein goto nahezu überflüssig.






1 Integer.MAX_VALUE + Integer.MAX_VALUE + 2 ist wieder gleich 0. Die Schleife muss also »nur« 4.294.967.296 Mal durchlaufen werden.

2 Im Gegensatz zu C++ ist das Verhalten klar definiert, und es gibt kein hin und her. In C++ implementierten Compilerbauer die Variante einmal so, dass die Variable nur im Block gilt, andere interpretierten die Sprachspezifikation so, dass diese auch außerhalb gültig blieb. Die aktuelle C++-Definition schreibt nun vor, dass die Variable außerhalb des Blocks nicht mehr gültig ist. Da es jedoch noch alten Programmcode gibt, haben viele Compilerbauer eine Option eingebaut, mit der das Verhalten der lokalen Variablen bestimmt werden kann.

3 Wenn Java eine ausdrucksorientierte Sprache wäre, dann könnten wir hier beliebige Programme hineinlegen.





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de