DOC

Grundelemente von JAVA

By Harold Washington,2014-04-24 14:24
13 views 0
Grundelemente von JAVA

     Inhalt

    Inhaltsverzeichnis

    Inhaltsverzeichnis ........................................................................................................................... 1 Grundelemente von JAVA .............................................................................................................. 3 1 Grundstruktur ........................................................................................................................... 3 2 Datentypen ............................................................................................................................... 3 3 Kontrollstrukturen .................................................................................................................... 4 4 Eingabekonvertierung .............................................................................................................. 5 Klassen und Objekte ....................................................................................................................... 6 1 Konzepte .................................................................................................................................. 6 2 Konstruktoren .......................................................................................................................... 6 3 Erben und Überschreiben ......................................................................................................... 6 4 Objekterzeugung ...................................................................................................................... 7 5 Programmbeispiel .................................................................................................................... 7 Globale Elemente ............................................................................................................................ 9 1 Klassenvariablen und -methoden .............................................................................................. 9 2 Zugriffsproblematik ................................................................................................................. 9 Dungeon Grundstruktur................................................................................................................. 10 1 Die zentralen Klassen ............................................................................................................. 10 2 Die Hilfsklassen ..................................................................................................................... 10 3 Gewölbegenerierung .............................................................................................................. 10 4 Klassendetails ........................................................................................................................ 11 Das Advanced Window Toolkit (AWT) ........................................................................................ 13

    1 Grundlagen ............................................................................................................................ 13 2 Fenster ................................................................................................................................... 13 3 Texte ...................................................................................................................................... 13 4 Textbereiche ........................................................................................................................... 13 5 Die Landkarte......................................................................................................................... 14 Events ........................................................................................................................................... 15 1 Ereignisfluss........................................................................................................................... 15 2 Ereignisse von Knöpfen ......................................................................................................... 15 3 Mausereignisse ....................................................................................................................... 15 Threads und Monitore ................................................................................................................... 17 1 Threads .................................................................................................................................. 17 2 Monitore ................................................................................................................................ 18 Das Schatzkontzept von "Dungeon" .............................................................................................. 20 1 Konzeption ............................................................................................................................. 20 2 Die Schlüssel .......................................................................................................................... 20 3 Änderungen am Rahmenprogramm ........................................................................................ 20

    Die Schatzverwaltung ................................................................................................................... 24 1 Bedienelemente ...................................................................................................................... 24 2 Die Klasse List ....................................................................................................................... 24 3 Die Schatzverwaltung ............................................................................................................. 24 Eigenschaften der Schätze ............................................................................................................. 27 1 Klassenbaum .......................................................................................................................... 27 2 Konzepte beim Spieler ........................................................................................................... 27 3 Änderungen ............................................................................................................................ 28 Beispielschätze ............................................................................................................................. 30 1 Waffen ................................................................................................................................... 30 2 Sprüche und sonstige Schätze ................................................................................................. 30 3 Änderungen ............................................................................................................................ 30 Das Monsterkontzept von "Dungeon" ........................................................................................... 32 1 Konzeption ............................................................................................................................. 32 1

     Inhalt

    2 Das leere Monster .................................................................................................................. 32 3 Änderungen ............................................................................................................................ 33 Die Monsterverwaltung ................................................................................................................. 34 1 Bedienelemente ...................................................................................................................... 34 2 Die Methode Kampfentscheid ................................................................................................ 34 3 Sonstige Umbauten ................................................................................................................ 35 Beispielmonster ............................................................................................................................ 36 1 Die Monster ........................................................................................................................... 36 2 Änderungen ............................................................................................................................ 39 Zufälliger Zufall ............................................................................................................................ 41 1 Zufallsgenerator initialisieren ................................................................................................. 41 2 Zufällige Raumnummern ........................................................................................................ 41 Client-Server-Prinzip .................................................................................................................... 42 1 TCP / IP - Verbindungen ........................................................................................................ 42 2 TCP / IP - Unterstützung in Java ............................................................................................ 42 3 Die Klasse ServerSocket ........................................................................................................ 42 4 Die Klasse Socket .................................................................................................................. 42 5 Typische Serverkonfiguration ................................................................................................. 42 6 Typischer Client ..................................................................................................................... 44 Applets ......................................................................................................................................... 45 1 Das Applet-Konzept ............................................................................................................... 45 2 Die Klasse Applet .................................................................................................................. 45 3 Client-Beispiel ....................................................................................................................... 45 4 Applet und Application .......................................................................................................... 46 Object Streams .............................................................................................................................. 48 1 Grundkonzept ......................................................................................................................... 48 2 Serialisierbare Objekte ........................................................................................................... 48 3 Objektströme .......................................................................................................................... 48 Aus eins mach Zwei ...................................................................................................................... 49 1 Aufteilung .............................................................................................................................. 49 2 Info - Kommandos ................................................................................................................. 49 Mehrere Benutzer.......................................................................................................................... 58 1 Prinzip.................................................................................................................................... 58 2 Benutzerverwaltung ............................................................................................................... 58 3 Gegnerkampf.......................................................................................................................... 58 Prozesssynchronisation ................................................................................................................. 60 1 Grundproblematik .................................................................................................................. 60 2 Benötigte Unterstützung ......................................................................................................... 60 3 Semaphore ............................................................................................................................. 60 4 Monitore ................................................................................................................................ 60 5 Monitore in Java ..................................................................................................................... 61 6 Monitore bei Dungeon ............................................................................................................ 61 Mehrere Spiele .............................................................................................................................. 62 1 Der erste Schritt ..................................................................................................................... 62 2 Umbauten im Client-Programm .............................................................................................. 62 3 Umbauten im Kommando-Interface........................................................................................ 68

    3 Umbauten im Sever-Programm .............................................................................................. 70

     2

     Arbeitsblatt 1

    Grundelemente von JAVA 1 Grundstruktur

    Die Grundprogrammeinheit von Java ist die Klasse. Eine Klasse besteht aus Methoden und

    Attributen. Besonderheiten sind statische Methoden und statische Attribute, die nicht bei jedem Objekt neu angelegt werden, sondern nur ein mal für die Klasse existieren. Sie haben genau die

    gleiche Funktion, wie die (globalen) Prozeduren und Variablen in Oberon.

    Syntax:

    class Klassenname {

     <Attribute>

     <Methoden>

    }

Methoden werden grundsätzlich als Funktionen vereinbart, wobei der Ergebnistyp "void" ein

    "leeres" Ergebnis bedeutet, d. h. eine Prozedur im Sinn von Oberon.

    Syntax:

    <Rückgabetyp> Methodenname (param1, param2, ..., paramn) {

     <Variablen>

     <Anweisungen>

    }

    Attribute, Variable und Parameter werden alle in der Form "<Datentyp> name" vereinbart, wobei Attibut- bzw. Variablendeklarationen durch ";" getrennt werden. Parameter sind immer

    Wertparameter, d. h. Methoden können Ergebnisse nur als Funktionsergebnisse abliefern (wobei

    zusammengesetzte Ergebnisse eigene Klassen sein müssen) oder (typischerweise) die Attribute des

    eigenen Objekts ändern.

2 Datentypen

    Folgende Grund-Datentypen stehen zur Verfügung:

    Name Bedeutung

    byte ganze Zahl [-128; 127|

    short ganze Zahl [-32768; 32767| 3131int ganze Zahl [-2; 2 - 1| 6363long ganze Zahl [-2; 2 - 1|

    boolean Wahrheitswerte true, false

    char Unicode-Zeichen

    float Gleitkommazahl (4 Byte IEEE 754, entsprechend REAL in Oberon) double Gleitkommazahl (8 Byte IEEE 754, entsprechend LONGREAL in Oberon)

Konstante Werte:

    Characterkonstanten stehen in Einfachhochkomma "'", mit "\" beginnende Zeichen haben Sonderbe-

    deutung.

    Ganzzahlen sind vom Typ "int", wenn die Zahl nicht von "l" oder "L" (für "long") gefolgt wird; mit

    "0x" beginnende Zahlen sind hexadezimaler, mit "0" beginnende Zahlen oktaler Kodierung.

    Gleitkommazahlen ohne Endung bzw. mit Endung "d" oder "D" sind von Typ "double", die Endung

    "f" oder "F" definiert Zahlen des Typs "float".

    Die Gleitkommaarithmetik entspricht IEEE 754, d. h. ?infinity und NaN (Not a Number) sind

    mögliche Werte.

Auf diesen Datentypen gibt es eine Reihe von Operatoren.

    Gruppe Symbole Bermerkungen

    Vergleiche ==, !=, <, <=, >, >= auf "boolean" nur die beiden ersten Arithmetik +, -, *, /, % nur auf Zahltypen, "%" (Modulo) auch bei Gleitkomma

    Auto ++, -- nur auf Zahltypen 3

     Arbeitsblatt 1

    Logisch !, &, |, ^, &&, || nur boolean, &&, || mit Shortcut Shift <<, >>, >>> nur Ganzzahl

    Bitops ~, &, |, ^ nur Ganzzahl

    Zuweisung =, op= op steht für alle zulässigen Operationen

Wrapper-Klassen:

    Für alle Grunddatentypen gibt es in dem Paket "java.lang" (immer sichtbar) sogenannte "Wrapper-

    Klassen", d. h. Klassen, die jeweils ein Element des entsprechenden Typs als Attribut haben und

    darüber hinaus eine Reihe nützlicher Methoden (Stringkonvertierung etc.) und gegebenenfalls

    mehrere Informationsattribute besitzen. Insbesondere enthalten die Wrapper-Klassen die Stringkon-

    vertierungen wie "public static int Integer. parseInt (String s)" für die Konvertierung eines Strings

    in den Datentyp "int". Alle Wrapper-Klassen besitzen auch die Methode "toString ()", mit der für

    alle Grunddatentypen die Stringrepäsentation erzeugt wird.

Die Klasse "String":

    Die Kasse "String" repräsentiert konstante Stringwerte. Stringliterale der Form '"Zeichenfolge"' sind automatisch Objekte dieser Klasse mit allen Methoden. Für die Klasse "string" ist der Operator

    "+" überladen und repäsentiert Stringkonkatenation. Wichtige Methoden sind

    char charAt (int index) Zeichen an Position "index", zählt ab 0 int compareTo (String other) lexikalischer Vergleich boolean equals (Object o) wahr, wenn "o" ein String und gleich ist boolean equalsIgnoreCase (Object o) s.o. nicht casesensitive int length () Länge des Strings String substring (int start) Teilstring ab Position "start" String substring (int start, int end) s. o., endet vor "end" char [] toCharArray () Konvertiert in ein Characterfeld static String valueOf (anytype) Konvertiert alles nach String

Die Klasse "System":

    Enthält unter anderem den Standardeingabestrom "System.in" und die Ausgabeströme "System.out"

    und "System.err" der Klasse "PrintStream" mit den Methoden "print (<irgendwas>)" und "println

    (<irgendwasOderNix>)"

    3 Kontrollstrukturen

    Die grundlegenden Kontrollstrukturen haben in Java die folgende Syntax:

    Zweiseitige Auswahl:

    if (<bedingung>) { <sequenz 1> } else { <sequenz 2> };

Mehrfachauswahl:

    switch (<value>) { <Varianten> };

    Varianten:

    case <value>: <Sequenz> break;

    bzw.

    default: <Sequenz> break;

Wiederholung mit Eingangsbedingung:

    while (<bedingung>) { <sequenz> };

Wiederholung mit Ausgangsbedingung:

    do { <sequenz> } while (<bedingung>);

Wiederholung mit Abbruchbedingung:

    while (true) { <sequenz 1> if (<bedingung>) break; <Sequenz 2>};

Zählwiederholung: 4

     Arbeitsblatt 1

    Eine Zählwiederholung im eigentlichen Sinn existiert nicht,

    for (<start>; <ende>; <increment>) { <sequenz> };

    ist eine Abkürzung für:

    <start>; while (<ende>) { <sequenz> ; <increment> };

Rückgabeanweisung:

    Rückkehr aus einer Methode, gegebenenfalls mit Rückgabewert:

    return <value>;

4 Eingabekonvertierung

    int ReadNumber ()

    {

     int read;

     String input;

     byte buffer [] = new byte [80];

     try {

     read = System. in. read (buffer, 0, 80); // Zeichen lesen

     if (read <= 0) return Integer. MIN_VALUE; // Weniger als 1 Zeichen

     input = new String (buffer, 0, read - 1); // In String verwandeln

     }

     catch (IOException e) { return Integer. MIN_VALUE};

     return Integer. parseInt (input); // Und konvertieren

    };

     5

     Arbeitsblatt 2

    Klassen und Objekte

    1 Konzepte

    Das Objektkonzept von JAVA ist wesentlich konsequenter und auch mächtiger als von Oberon-2. Folgende Eigenschaften müssen beachtet werden:

     Variablen und Attribute eines Objekttyps enthalten grundsätzlich eine Referenz auf das betref-fende Objekt (Referenzmodel).

     Klassen haben immer einen (u. U. leeren) Konstruktor, der beim Anlegen eines Objekts ausge-führt wird.

     Methoden werden nicht allein durch den Namen, sondern auch durch die Parametertypen unter-schieden ("Überladen"). Die Methoden mit den Köpfen "int Addiere (int i1, int i2)" und "int Addiere (int i1, int i2, int i3)" bezeichnen also zwei verschiedene Methoden. Es gibt in JAVA keine anderen Referenzen als Objektreferenzen, d. h. insbesondere auch keine "VAR"- Parameter. Sollen Methoden mehrere Ergebnisse abliefern, können sie die Attribute ihres Objektes ändern oder ein Objekt mit allen Resultaten als Funktionsergebnis haben (hängt davon ab, was modelliert werden soll).

     In den Methoden können alle Attribute der Klasse direkt verwendet werden. Die Variable "this" enthält die Referenz auf das aktuelle Objekt.

2 Konstruktoren

    Konstruktoren sind Methoden, die beim Anlegen eines Objekts, und nur dort, automatisch aufge-rufen werden (siehe 3). Sie unterscheiden sich von einer "normalen" Methode dadurch, dass sie den "leeren Namen" haben und grundsätzlich die eigene Klasse als Rückgabetyp, z. B.

    class Zaehler {

     int stand;

void Increment () {

     stand ++;

    }

int Zaehlerstand () {

     return stand;

    }

Zaehler () { // Konstruktor

     stand = 0;

    }

    }

    Genau so wie verschiedene Methoden gleichen Namens aber unterschiedlicher Parameterliste kann es verschiedene Konstruktoren unterschiedlicher Parameterliste geben. Die Klasse "Zaehler" könnte einen zweiten Konstruktor besitzen, der den Startwert nicht auf "0", sondern auf einen angegebenen Wert setzt.

    Zaehler (int start) { // zweiter Konstruktor

     stand = start;

    }

3 Erben und Überschreiben

    Soll eine Klasse von einer anderen erben, so wird das im Klassenkopf durch den Zusatz "extends" angegeben:

    class Sohn extends Vater {

    Die Klasse "Sohn" erbt alle Attribute und Methoden, einschließlich der Konstruktoren. Sie kann neue Attribute und Methoden hinzufügen und ererbte Methoden überschreiben. Methoden werden einfach dadurch überschrieben, dass eine Methode mit gleichem Namen und gleicher Parameterliste wie eine ererbte Methode vereinbart wird. Achtung: im Gegensatz zu z. B. Modula-2 gibt es keine Möglichkeit dem Compiler mitzuteilen, ob man eine Methode überschreiben will. Man kann also 6

     Arbeitsblatt 2

    versehentlich eine Methode überscheiben oder versehentlich eine Methode nicht überschreiben (Tippfehleri m Namen, falsche Parameterliste). Auch Konstruktoren können überschrieben bzw. neue hinzugefügt werden.

    Will man in einer Sohnklasse eine überschriebene Methode der Vaterklasse verwenden, so erreicht man dies durch voranstellen von "super" vor den Methodennamen (gilt auch für den leeren Namen von Konstruktoren).

    class ZaehlerMitAufrufkontrolle {

     int aufrufAnzahl; // neues Attribut

void Increment () {

     super Increment (); // Originalmethode ausführen

     aufrufAnzahl++; // Aufrufe mitzählen

    }

int Zaehlerstand () {

     aufrufAnzahl++; // Aufrufe mitzählen

     return super Zaehlerstand ();

    }

ZaehlerMitAufrufkontrolle () { // Konstruktor

     super (); // Originalkonstruktor

     aufrufAnzahl = 0;

    }

ZaehlerMitAufrufkontrolle (int start) { // zweiter Konstruktor

     super (start); // zweiter Originalkonstruktor

     aufrufAnzahl = 0;

    }

}

    Wenn ein überschiebener Konstruktor keinen Vaterkonstruktor aufruft, wird automatisch der (immer vorhandene) Konstruktor mit leerer Parameterliste aufgerufen.

    4 Objekterzeugung

    Ein Objekt wird mit dem Operator "new", gefolgt von der Klassen des zu erzeugenden Objekts und den Parametern des gewünschten Konstruktors erzeugt:

    Zaehler z1 = new Zaehler (); // Originalzähler mit Startwert "0"

    Zaehler z2 = new Zaehler (-3); // Originalzähler mit Startwert "-3"

    ZaehlerMitAufrufkontrolle z3 = new ZaehlerMitAufrufkontrolle ();

5 Programmbeispiel

    In einem Auslieferungslager werden Waren gespeichert. Jede Warenart wird als Objekt mit folgen-den Attributen realisiert: "Artikelnummer" (ganze Zahl), "Stückpreis" (Kommazahl), "Platzbedarf" (ganze Zahl: interne Lagereinheit) und "Anzahl" (ganze Zahl): im Lager vorhandene Stückzahl). Weiter existiert ein Objekt "lager" Der Klasse "Lager" mit dem Attribut "belegterPlatz", das enthält, wieviele Platzeinheiten aktuell belegt sind und einer Konstante "maximalerPlatz", die die Lagergröße enthält.

Die Klasse "Lager" hat 2 Methoden:

     Konstruktor: setzt den Wert von " belegterPlatz" auf 0.

     BelegePlaetze: hat als Parameter die Anzahl der zu belegenden Platzeinheiten. Falls die gewünschtne Plätze noch verfügbar sind, wird " belegterPlatz" entsprechend erniedrigt und das

    Funktionsergebnis "true" zurückgemeldet, Wenn nicht mehr genügend Platz verfügbar ist, wird

    "false" zurückgemeldet.

     GibPlaetzeFrei: hat als Parameter die Anzahl der freizugebenden Platzeinheiten. Keine Plausibi-litätskontrolle!

Die Klasse "Warenart" hat vier Methoden:

     7

     Arbeitsblatt 2

     Konstruktor: legt Artikelnummer, Stückpreis und Platzbedarf (als Parameter übergaben) fest und setzt Anzahl auf den Wert "0".

     Anlieferung: hat als Parameter die angelieferte Stückzahl und das Objekt "lager". Prüft mit lager. BelegterPlatz, ob noch genügend Platz ist und meldet als Funktionsergebnis, ob dieWare gespei-chert werden kann.

     Auslieferung: hat als Parameter die auszuliefernde Stückzahl und das Objekt "lager". Als Funk-tionsergebnis wird der Gesamtpreis der Ware gemeldet, wenn nicht mehr genügend Vorrat vorhanden ist, wird "- (float) fehlendeStueckZahl" zurückgemeldet. Gegebenenfalls werden die Lagerplätze freigegeben.

Für manche Artikel gibt es ab einem bestimmten Warenwert (Attribut des Objekts) einen Rabatt

    von 5,0%. Diese Waren werden als Sohnobjekte von "Warenart" verwaltet. Realisieren Sie auch

    diese Klasse.

     8

     Arbeitsblatt 3

    Globale Elemente

    1 Klassenvariablen und -methoden

    Da JAVA als generellen Scope die Klasse hat, existieren auf den ersten Blick weder globale Variab-le noch globale Prozeduren. Sie sind aber, wenn auch aus anderem Blickwinkel modelliert, dennoch vorhanden. Mit dem Schlüsselwort "static" können Attribute und Methoden als "zur Klasse" und nicht zu einem instanziierten Objekt gehörend vereinbart werden, z. B.:

    class MyClass {

    static int objektAnzahl;

    static MyClass erstes;

    MyClass globalLink;

static TraversiereAlle () {

     for (MyClass akt = erstes; akt != null; akt = akt. globalLink)

     //mac hwas mit den Objekten dieser Klasse

     }

MyClass () {

     objektAnzahl ++;

     globalLink = erstes;

     erstes = this;

    }

    }

    Alle Objekte dieser Klasse sind miteinander verkettet, Beginn der Kette ist die Klassenvariable "erstes". In "objektAnzahl" wird die Anzahl instanziierter Objekte mitgezählt. Die Klassenmethode "TraversiereAlle" erlaubt ein Bearbeiten aller Objekte der Klasse. Der Konstruktor fürgt jedes neu angelegte Objekt automatisch in diese Struktur ein.

    Von außen werden Klassenvariablen und -methoden über "KlassenName. Name" angesprochen, also "MyClass. objektAnzahl" oder "MyClass. TraversiereAlle".

2 Zugriffsproblematik

    Wenn man sich vor Augen hält, dass Klassenvariablen und -methoden globale Einheiten sind, dann ist auch klar, dass in normalen Methoden Klassenvariablen und -methoden ohne weiteres verwendet werden können. Umgekehrt aber können aus Klassenmethoden keine "normalen" Attribute oder Methoden angesprochen werden, da diese immer an ein instanziiertes Objekt gebunden sind. Diese Problematik tritt insbesondere bei Java-Programmen auf, da die globale Prozedur "main" nur als Klassenmethode vereinbart werden kann, obwohl sie logisch gesehen eigentlich zu gar keiner Klasse gehört. Wenn man in der umgebenden Klasse Methoden und Attribute vereinbart, kann man diese erst verwenden, wenn man ein entsprechendes Objekt geschaffen hat. Alternativ kann man alle Methoden und Attribue global machen.

     9

     Arbeitsblatt 4

    Dungeon Grundstruktur

1 Die zentralen Klassen

    Die Spielwelt, das Gewölbe, besteht aus Räumen, die durch Türen miteinander verbunden sind. Einziger ausgezeichneter Raum ist der "Ausgang". Die Räume sind in einer ebenen Karte angeord-net, in der die durch die Türen definierten Verbindungen kreuzungsfrei dargestellt werden können.

Die Klasse Raum

    Jeder Raum hat als Attribute seine Nummer, die Lagekoordinaten, eine Markierung, ob der Spieler den Raum bereits betreten hat und eine Referenz auf die erste Tür. Methoden sind "TuerNach" zum Test, ob eine Verbindung zum Raum mit der angegebenen Nummer existiert, "Betreten", und das Betreten des Raums durch den Spieler zu signalisieren und "NeueTuer" zum definieren einer neuen Tuer beim Gewölbeaufbau.

Die Klasse Tuer

    Eine Tuer hat als Attribute eine Referenz des Raums, zu dem sie führt und eine Rferenz auf die nächste Tür. Einzige Methode ist "TuerNach", auf die sich "Raum. TuerNach" abstützt.

Die Klasse Gewoelbe

    Das Gewölbe hat als Attribute den Ausgang, vorläufig den Zufallsgenerator und ein Hilfsfeld zur Markierung bearbeiteter Räume bei der Suche. Neben dem lokalen Hilfsmethoden zur Gewölbege-nerierung stellt es die Methoden "Generiere" zum Anlegeneines neuen Gewölbes, "Karte" zum Zeichnen des Lageplans, "StartRaum" zum Bestimmen des Startraums für einen Spieler und "TesteAusgang" zur Verfügung

Die Klasse Spieler

    Vorläufig einziges Attribut des Spieler ist der Raum, in dem er sich befindet. Die Methode "GeheNach" bringt den Spieler, falls möglich, in den Raum mit der angegebenen Nummer.

Die Klasse DunMain

    Sie enthält die zentrale Spielsteuerung mit Kommandoeingabe und Hauptschleife und den Attribu-ten Spieler udn Gewölbe.

2 Die Hilfsklassen

    Die Klasse Random2

    Diese Klasse ist eine Erweiterung des aus dem Paket "java. util" importierten Zufallsgenerators. Sie stellt zusätzlich die Methode "naechster" zur Verfügung, die eine ganzzahlige Zufallszahl aus dem Interval [0, max[ liefert.

Die Klasse Raster

    Sie wird bei der Gewölbegenerierung als Hilfsklasse verwendet, um bereits für Räume oder Wege vergebene Plätze der Landkarte zu markieren.

Die Klasse RasterGross

    Sie ist eine Variante von Raster zum erzeugen der zeichenbaren Landkarte.

3 Gewölbegenerierung

    Bei der Gewölbegenerierung werden in einem unten beschriebenen Objekt der Klasse "Raster" alle Räume und Wege während der Generierung bereits eingetragen. So wird für jeden neu zu plazieren-den Raum oder Weg sofort abgesichert, dass er überschneidungsfrei gezeichnet werden kann. 10

Report this document

For any questions or suggestions please email
cust-service@docsford.com