1.8 Übungen

Duke als Boxer

1.7.1 Das erste Java Programm

class HelloWorld {
	public static void main(String[] args) {
	   System.out.println("Hello World!");
	}
}
  • Übersetzen Sie die Datei HelloWorld.java mit Hilfe des Kommandos javac in eine Bytecode-Datei mit dem Namen HelloWorld.class.
  • Führen Sie das Programm mit dem Kommando java aus.

1.7.2 Eine einfache grafische Oberfläche

Duke auf Schaukel

  1. Kopieren Sie den Quellcode des folgenden grafischen Programms DemoFrame in eine Datei mit dem Namen DemoFrame.java.
  2. Übersetzen Sie das Programm in Bytecode
  3. führen Sie das Programm aus
  4.  Ändern Sie durch experimentieren das Programm wie folgt ab:
  • Ändern Sie die den konstanten Text "Input Text:" zu einem anderen Text
  • Ändern Sie die Standardbelegung des Eingabetexts "Input" zu einer anderen Vorbelegung
  • Legen Sie das Ausgabefeld im Fenster über die Eingabezeile mt dem "Button" 

1.7.3 Swing Rechner

Diese Übung ist eine Gruppenübung. Sie ist wahrscheinlich zu schwer für das Selbststudium.

1. Quellcode erzeugen

Erzeugen Sie eine Datei mit dem Namen SwingRechner.java und dem folgendem Inhalt:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;

public class SwingRechner  extends javax.swing.JFrame {
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextFieldOut;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;

    private void initComponents() {
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jTextFieldOut = new javax.swing.JTextField();

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Swing Rechner");
        jTextField1.setText("0");
        jTextField1.setColumns(6);
        jTextField2.setText("0");
        jTextField2.setColumns(6);
        jTextFieldOut.setText("0");
        jTextFieldOut.setEditable(false);

        jButton1.setText("XXXX");
        jButton2.setText("YYYY");
        jButton3.setText("ZZZZ");

        JPanel radioPanel = new JPanel(new GridLayout(1, 0));
        radioPanel.add(jButton1);
        radioPanel.add(jButton2);
        radioPanel.add(jButton3);

        jButton1.addActionListener(new ActionListener()
                {
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == jButton1)
                        jTextFieldOut.setText(
                                executeOperation1(jTextField1.getText(),
                                jTextField2.getText()));
                    }
                }
          );
          jButton2.addActionListener(new ActionListener()
                {
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == jButton2)
                        jTextFieldOut.setText(
                                executeOperation2(jTextField1.getText(),
                                jTextField2.getText()));
                    }
                }
          );
          jButton3.addActionListener(new ActionListener()
                {
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == jButton3)
                        jTextFieldOut.setText(
                                executeOperation3(jTextField1.getText(),
                                jTextField2.getText()));
                    }
                }
          );

        this.setBounds(300, 300, 200, 30);
        setMinimumSize(new Dimension(200,30));
        getContentPane().add(jTextField1, BorderLayout.WEST);
        getContentPane().add(jTextField2, BorderLayout.EAST);
        getContentPane().add(radioPanel, BorderLayout.NORTH);
        getContentPane().add(jTextFieldOut, BorderLayout.SOUTH);
        pack();
   }
    public SwingRechner() {
        initComponents();
    }

    public static void main(String[] args) {

        SwingRechner f1 = new SwingRechner();
        f1.setVisible(true);

    }

    public String executeOperation1(String s1,String s2) {
        int op1= Integer.parseInt(s1);
        int op2= Integer.parseInt(s2);
        // Add Application logic here:
        int resultInt = 0;
        return (Integer.toString(resultInt)) ;
    }
    public String executeOperation2(String s1,String s2) {
        int op1= Integer.parseInt(s1);
        int op2= Integer.parseInt(s2);
        // Add Application logic here:
        int resultInt = 1;
        return (Integer.toString(resultInt)) ;
    }
    public String executeOperation3(String s1,String s2) {
        int op1= Integer.parseInt(s1);
        int op2= Integer.parseInt(s2);
        int resultInt = 2;
        return (Integer.toString(resultInt)) ;
    }
}

2. Erzeugen Sie die Javabytecodedatei SwingRechner.class

javac SwingRechner.java

3. Führen sie das Programm aus

 java SwingRechner

Das erscheinende Programmfenster sollte so aussehen

Programmvorlage Gelöste Aufgabe

4. Programmanpassung

Passen Sie das Programm an um einen Rechner für drei Grundrechenarten zu erhalten. Ersetzen sie in SwingRechner.java die folgenden Texte

  • XXXX durch ein Symbol einer Rechenart
  • YYYY durch eine Symbol einer Rechenart
  • ZZZZ durch ein Symbol einer Rechenart

Implementieren Sie die drei entsprechenden Grundrechenarten in den Methoden executeOperation1(), executeOperation2(), executeOperation3().

Ändern Sie hierfür die drei Zuweisungen sinngemäss und ersetzen sie die Zuweisungen von 0, 1, 2 durch den passenden mathematischen Term mit op1 und op2.

...
        int resultInt = 0;
...
        int resultInt = 1;
...
        int resultInt = 2;
...

Das Programm soll anschliesend die Operationen passend zu den Buttonbeschriftungen ausführen

5. Speichern, Übersetzen und Ausführen des Programms

1.7.4 Übersetzen und Ausführen eines Programms mit Konsoleneingaben

Erzeugen Sie eine Datei mit dem entsprechenden Namen. Setzen Sie den unten aufgeführten Quellcode ein. Übersetzen Sie ihn. Führen Sie ihn aus.

import java.util.Scanner;
public class GGT {
    public static void main(String[] args) {
        Scanner eingabe = new Scanner(System.in);
        System.out.print("Geben Sie die erste Zahl ein: ");
        int zahl1 = eingabe.nextInt();
        System.out.print("Geben Sie die zweite Zahl ein: ");
        int zahl2 = eingabe.nextInt();
        int ergebnis = ggT(zahl1, zahl2);
        System.out.println("Ergebnis: " + ergebnis);
    }
    /**
     * Euklidscher Algorithmus als Java-Methode
     */
    public static int ggT(int x, int y) {
        while (x != y) {
            System.out.println("Zwischenbelegung, x= " + x + ", y=" + y);
            if (x > y) {
                x = x - y;
            } else {
                y = y - x;
            }
        }
        return x;
    }
}

 1.7.8 Airline in Block 1

Warnung: Alle verwendeten Namen in Java sind sensitiv auf Klein- und Großschreibung! Dies bedeutet, dass für Java ein Name der wie in der deutschen Sprache mit einem Großbuchstaben beginnt, etwas anderes ist als ein Name mit der mit einem Kleinbuchstaben beginnt.

Legen Sie ein Projekt "javakurs1" für die erste Vorlesung an.

Benutzen Sie in Netbeans den Menüpunkt File->New Project

Neues Projekt

Sie erhalten dann einen modalen Dialog. Wählen Sie "Java Application" dann den Button "next".

modaler Dialog zur Projekt Erzeugung

Der Name des Projekts ist prinzipiell frei wählbar und hat keinen weiteren Einfluß für die Vorlesung (Sie müssen dieses Projekt nur wieder finden und sie sollten hier keine Klassen benutzen die noch in der Vorlesung kommen werden).

  • Tragen Sie nur im ersten Feld "Project Name" den Wert "javakurs1" ein.
  • Entfernen Sie in der Checkbox "Create Main Class" den Haken.
  • Clicken Sie auf "Finish"

Auswahl des Projektnamens

 

 Empfehlung: Ändern Sie in diesem keines der anderen Felder und einen wirklich guten Grund

2. Anlegen eines Pakets "Airline"

Pakete dienen zum Trennen und Gruppieren von Klassen in Java.

Bewegen Sie die Maus über das Projektsymbol (Kaffeetasse) mit dem Namen "javakurs1" und lassen Sie sich mit einem rechte Mausklick mit Halten das folgende Auswahlmenü anzeigen.

Wählen Sie hier "New"->"Java Package" aus:

Anlegen eines neuen Pakets

Es erscheint der folgende modale Dialog:

Package erzeugen

 Tragen Sie bei "Package Name" den Wert "Airline" ein un beenden Sie den Dialog mit dem "Finish" Button.

3. Erzeugen eines Unterpakets "Block1" im Paket "Airline"

In jeder Vorlesungsstunde(Block) wird in der Regel ein neues Paket verwenden.

Diese Aufgabe müssen Sie in jeder Vorlesungsstunde sinngemäß wiederholen.

In der linken Spalte kann man das Projekt "javakurs1" sehen. Diese Projekt hat eine Unterkategorie "Source packages". Hier sollte es jetzt einen Eintrag für ein Paket mit dem Namen "Airline" geben.

Man kann Unterpakte erzeugen, in dem man die Maus auf das Symbol von "Airline" bewegt. Führen Sie auf diesem Symbol einen Rechtsklick aus und halten Sie ihn.

Wählen Sie hier, wie zuvor "New"->"Java Package" aus

Auswahl eines Javapakets

Es erscheint ein modaler Dialog. Tragen Sie hier im Feld "Package Name" den Wert "Airline.Block1" ein.

Bennen des Pakets

Beenden Sie den Dialog mit "Finish"

Wichtig: Hier wird einer Unterpaket zum Paket Airline angelegt. Der Punkt zwischen "Airline" und "Block1" trennt die beiden Namen. Er ist notwendig. Hier darf kein anderes Zeichen (z.Bsp. Leerzeichen stehen).

 4. Anlegen der Klasse Flugzeug im Paket Airline.Block1

Gehen Sie link im Editor mit der Maus zum Paket "Airline.Block". Führen Sie einen Rechstklick aus und halten Sie ihn.

Anlegen einer Klasse

Es erscheint ein modaler Dialog.

Tragen Sie im Feld "Class Name" Flugzeug ein.

Ändern Sie die anderen Felder nicht.

Beenden Sie den Dialog mit dem Button "Finish"

Eintragen des Klassennamen

Sie haben jetzt eine leer Klasse Flugzeug im Paket Airline.Block1 angelegt.

Diese Klassen können Sie nun editieren. Der Editor sieht wie folgt aus:

leere Klasse Flugzeug

5. Erweitern der Klasse Flugzeug

Geben Sie Flugzeugen die Eigenschaft ein Kennzeichen zu haben. Kennzeichen sollen beliebige Zeichenketten sein. Zeichenketten sind in Java Klassen mit dem Namen String.

public class Flugzeug {
   String kennzeichen;
}

Sichern Sie diese Datei. Sie finden schon raus wie das geht :-)

Wenn die Syntax der Klasse korrekt ist, werden am rechten Rand keine roten Symbole erscheinen.

Hinweis: Sie können Javacode der Vorlesung mit Copy-und-Paste direkt in Eclipse oder Netbeans einfügen. Unter Windows kommt es vor, dass die Zeilenumbrüche von html verloren gehen. Nutzen Sie in diesem Fall die Windows Anwendungen Notepad oder Wordpad als "Zwischenlandeplatz".

6. Anlegen der Klasse Flughafen

Nutzen Sie Ihre neuen Kenntnisse und Erzeugen Sie eine Klasse Flughafen im Paket Airline.Block1.

7. Erweitern der Klasse Flughafen

Flughäfen sollen die folgenden Eigenschaften haben

  • einen Namen name der mit Zeichenketten verwaltet wird
  • Sechs Flugsteige gate1 bis gate6 an denen Flugzeuge andocken können
  • ein Treibstofflage treibstofflager in dem mit einer großen Fließkommazahl (double) der gelagerte Treibstoff verwaltet

Dies geschieht wenn Sie die Klasse Flugzeug mit dem fett gedruckten Text erweitern:

public class Flughafen {
     String name; 
     Flugzeug gate1; 
     Flugzeug gate2; 
     Flugzeug gate3; 
     Flugzeug gate4; 
     Flugzeug gate5; 
     Flugzeug gate6; 
     double treibstoffLager;
}

Es sollten nach Ihren Anpasssungen, links kein Fehler aufleuchten!

8. Schreiben eines Hauptprogramms in der Klasse Flughafen

Fügen Sie eine leer Methode mit dem Namen main() ein. Die Syntax muss exakt so aussehen wie im fett gedruckten Text

public class Flughafen {
   String name;
   Flugzeug gate1;
   Flugzeug gate2;
   Flugzeug gate3;
   Flugzeug gate4;
   Flugzeug gate5;
   Flugzeug gate6;
   double treibstoffLager;

   public static void main(String[] args) { 
   }
}

Nach dem Sichern der Datei Flughafen hat sich die Ikone in der linken Spalte verändert. Sie enthält jetzt eine grünes Dreieck.

Klasse mit main Methode in Netbeans Das grüne Dreick hat die Bedeutung der bekannten Starttaste. Diese Klasse kann man als Hauptprogramm ausführen!
Starten einer Klasse Diese Klasse können Sie ausführen indem Sie die Maus über das Symbol der Klasse bewegen
Konsolenausgabe Unten auf dem Bildschirm taucht eine Konsole auf. Es werden zunächst alle geänderten Klassen übersetzt und dann die gewünschte Klasse gestartet. Da die main() Methode der Klasse Flugzeug aber nichts macht, gibt es auch eine Ausgaben.

 Fügen Sie den folgenden Code innerhalb der geschweiften Klammern ein, die die Methode main() begrenzen.

public static void main(String[] args) {
   Flughafen pad = new Flughafen();
   pad.name="Paderborn";
   pad.treibstoffLager = 1000000;

   System.out.println("*** Unser Flughafen ***");
   System.out.println("Flughafen " + pad.name);
   System.out.println("Am Gate 1: " + pad.gate1);
   System.out.println("Am Gate 2: " + pad.gate2);
   System.out.println("Am Gate 3: " + pad.gate3);
   System.out.println("Treibstoff: " + pad.treibstoffLager);
   System.out.println("***********************");

}

Sichern Sie die Datei und starten Sie die Klasse Flughafen erneut an.

Sie sollten die folgende Konsolenausgabe sehen:

Konsolenausgabe

Was ist hier passiert?

Flughafen pad = new Flughafen();

 Eine Zeigervariable pad vom Typ Flughafen wird angelegt. Es wird ein neues Flughafenobjekt erzeugt und auf die Variable zugewiesen.

pad.name="Paderborn";

 Das Objekt pad bekommt seinen Namen "Paderborn" zugewiesen.

pad.treibstoffLager = 1000000;

 Das Treibstofflager des Objekt pad bekommt den Wert 1000000 zugewiesen.

System.out.println("*** Unser Flughafen ***");

 Die Methode System.out.println() druckt Zeichenketten auf der Konsole.
Drucke: *** Unser Flughafen ***

 

System.out.println("Flughafen " + pad.name);

Drucke den Namen des Objekt pad 

System.out.println("Am Gate 1: " + pad.gate1);

Drucke die Belegung von gate1

System.out.println("Am Gate 2: " + pad.gate2);

Drucke die Belegung von gate2 

 System.out.println("Am Gate 3: " + pad.gate3);

Drucke die Belegung von gate3

 System.out.println("Treibstoff: " + 
             pad.treibstoffLager);

Drucke die Treibstoffmenge

 

 System.out.println("***********************");

Drucke Sternchen...

9. Erzeugen eines Flugzeugs und Anlegen am Gate1 

Implementieren Sie die folgenden Befehle am Ende der main() Methode.

  • Legen Sie eine Zeigervariable vom Typ Flugzeug mit dem Namen lh1 and und Erzeugen Sie ein Flugzeugobjekt
  • Geben Sie dem Flugzeug das Kennzeichen D-ABTL
  • "Docken" Sie das Flugzeug am Gate 1 des Flughafens pad an.
  • Geben Sie den Namen des Flugzeugs an Gate aus
  • Wiederholen Sie all Druckbefehlee des vorhergenden Schritts.

Hierzu muss die folgende Codesequenz in der main() Methode vor der letzten geschwiften Klammer eingefügt werden:

        // Boeing 747, https://de.wikipedia.org/wiki/Boeing_747#747-400
        Flugzeug lh1 = new Flugzeug();
        lh1.kennzeichen ="D-ABTL";
        
        pad.gate1 = lh1;
        
        System.out.println("Flughafen " + pad.name);
        System.out.println("Am Gate 1: " + pad.gate1.kennzeichen);
  
        System.out.println("*** Unser Flughafen ***");
        System.out.println("Flughafen " + pad.name);
        System.out.println("Am Gate 1: " + pad.gate1);
        System.out.println("Am Gate 2: " + pad.gate2);
        System.out.println("Am Gate 3: " + pad.gate3);
        System.out.println("Treibstoff: " + pad.treibstoffLager);
        System.out.println("***********************");

Sichern Sie die Datei. Übersetzen Sie Datei und führen Sie sie wieder aus.

Die Ausgabe auf der Konsole ist:

*** Unser Flughafen ***
Flughafen Paderborn
Am Gate 1: null
Am Gate 2: null
Am Gate 3: null
Treibstoff: 1000000.0
***********************
Flughafen Paderborn
Am Gate 1: D-ABTL
*** Unser Flughafen ***
Flughafen Paderborn
Am Gate 1: AirlineSolution.Block1.Flugzeug@677327b6
Am Gate 2: null
Am Gate 3: null
Treibstoff: 1000000.0
***********************

10. Anlegen eines zweiten Flugzeugs

Fügen Sie in der main() Methode nach dem Anlegen des ersten Flugzeugs die folgenden Befehle ein:

  • Legen Sie eine Variable lh2 für ein zweites Flugzeug und erzeugen Sie ein Flugzeugobjekt wie beim ersten Flugzeug
  • Das Kennzeichen des Flugzeugs soll D-AIMA sein
  • Legen Sie das Flugzeug an Gate 2 des Flughafens pad 

Fügen Sie hinter den Befehl der das erste Flugzeug an Gate 1 ausgibt einen gleichartigen Befehl für Gate 2

Die main() Methode sieht jetzt wie folgt aus. Die neuen Befehle sind fett gedruckt:

    public static void main(String[] args) {
        Flughafen pad = new Flughafen();
        pad.name="Paderborn";
        pad.treibstoffLager = 1000000;
        
        System.out.println("*** Unser Flughafen ***");
        System.out.println("Flughafen " + pad.name);
        System.out.println("Am Gate 1: " + pad.gate1);
        System.out.println("Am Gate 2: " + pad.gate2);
        System.out.println("Am Gate 3: " + pad.gate3);
        System.out.println("Treibstoff: " + pad.treibstoffLager);
        System.out.println("***********************");
        
        // Boeing 747, https://de.wikipedia.org/wiki/Boeing_747#747-400
        Flugzeug lh1 = new Flugzeug();
        lh1.kennzeichen ="D-ABTL";
        
        pad.gate1 = lh1;
        
        // Airbus A380 https://de.wikipedia.org/wiki/Airbus_A380#A380-800
        Flugzeug lh2 = new Flugzeug();
        lh2.kennzeichen = "D-AIMA";
        
        pad.gate2 = lh2;
        
        System.out.println("Flughafen " + pad.name);
        System.out.println("Am Gate 1: " + pad.gate1.kennzeichen);
        System.out.println("Am Gate 2: " + pad.gate2.kennzeichen); 
        System.out.println("*** Unser Flughafen ***");
        System.out.println("Flughafen " + pad.name);
        System.out.println("Am Gate 1: " + pad.gate1);
        System.out.println("Am Gate 2: " + pad.gate2);
        System.out.println("Am Gate 3: " + pad.gate3);
        System.out.println("Treibstoff: " + pad.treibstoffLager);
        System.out.println("***********************");
           
    }    

Sichern Sie die Datei, übersetzen Sie sie, führen Sie die main() Methode der Klasse Flughafen aus.

*** Unser Flughafen ***
Flughafen Paderborn
Am Gate 1: null
Am Gate 2: null
Am Gate 3: null
Treibstoff: 1000000.0
***********************
Flughafen Paderborn
Am Gate 1: D-ABTL
Am Gate 2: D-AIMA
*** Unser Flughafen ***
Flughafen Paderborn
Am Gate 1: AirlineSolution.Block1.Flugzeug@677327b6
Am Gate 2: AirlineSolution.Block1.Flugzeug@14ae5a5
Am Gate 3: null
Treibstoff: 1000000.0
***********************