Java-Zusatzmaterial Grundlagen der Programmkonstruktion 13S

[Übungsangaben (auf Homepage)]

Dieser Teil der Vorlesung verwendet das Skriptum als Unterlage, daher sind hier nur Beispielprogramme und einige Stichworte zu finden.

15.4.2013

Programme: fib, fib2

Syntax

Anweisungen (Statements), Ausdrücke, Deklarationen, Definitionen

Umgebung

Editor oder IDE (Netbeans oder Eclipse), Compiler javac, Laufzeitsystem java

Variablen

Wert, Name, Speicheradresse, Typ, Lebensdauer, Gültigkeitsbereich, Sichtbarkeit

Lebensdauer und Speicher von Variablen bei fib(3):

public static int fib(int n) {
	if (n<2)
		return n;
	else
		return fib(n-1)+fib(n-2);
}

Datentypen

Elementare Typen für Zahlen: int, long, float, double. Explizite und implizite Typumwandlungen.

Referenztypen behandeln wir später

Java API

Java™ Platform, Standard Edition 6 API Specification

Interessant ist dabei besonders java.lang und java.util.

18.04.2013

Wiederholung

Fakultät berechnen:

public class Fact { // Dateiname Fact.java

    public static int fact(int n) {
        if(n == 0) {
            return 1;
        } else {
            return n * fact(n - 1);
        }
    }

    public static void main(String[] args) {
        System.out.println(fact(Integer.parseInt(args[0])));
    }
}

Ein-/Ausgabe mit Scanner

Eingabe mit args beschränkt. Alternative: System.in.

Problem: Wie sollen Zeichen der Eingabe interpretiert werden? Lösung: Scanner

import java.util.Scanner;

public class Fact {

    public static int fact(int n) {
        /* ... */
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int i = sc.nextInt();

        System.out.println(i);
    }
}

Schleifen

while-Schleife

Fakultät von n! wird meist eher so berechnet, dass man bei 1 beginnend mit der nächst größeren Zahl multipliiert, bis man n erreicht.

10! = 1 * 2 * 3 * ... * 10

Als Programm: Beginne bei 1 und multipliziere auf, bis n erreicht wird.

    public static int fact(int n) {
        int i = 0;
        int result = 1;

        while(i <= n) {
            result *= i;
            i ++;
        }

        return result;
    }

while-Schleife immer bei "Solange Bedingung, wiederhole".

for-Schleife

Spezialfall von while-Schleife: For-Schleife mit Initialisierungsteil und Aktualisierungsteil.

for-Schleife

Spezialfall von while-Schleife: For-Schleife mit Initialisierungsteil und Aktualisierungsteil.

    public static int fact(int n) {
        int result = 1;

        for(int i = 0 ; i <= n ; i ++) {
            result *= i;
        }

        return result;
    }

Übungsaufgabe: Testen, ob eine Zahl eine Primzahl ist

do-while-Schleife

Unterschied zu while: Wird mindestens 1x durchlaufen.

    public static main(String[] args) {
        Scanner sc = new Scanner(System.in);

        do {
            /* ... */
            System.out.println("Noch einmal?");
        } while(sc.next().equals("ja"));
    }

Debuggen

Debuggen hilft beim Nachvollziehen des Programms. Je besser strukturiert das Programm, desto einfacher wird Debuggen. Debuggen ersetzt nicht den Designprozess!

Möglichkeiten zum Debuggen

Arrays

Arrays sind Objekte, die aus mehreren Elementen - alle vom selben Datentyp - zusammengesetzt sind. Arrays sind Referenztypen, das heißt, Variablen vom Typ Array enthalten das Array nicht, sondern zeigen auf ein Array. Wie alle Objekte müssen Arrays angelegt werden.

public class ArrayTest {
    public static void testSwapInts(int i0, int i1) {
        int tmp = i0;
        i0 = i1;
        i1 = tmp;
    }

    public static void swapInts(int[] arr) {
        int tmp = arr[0];
        arr[0] = arr[1];
        arr[1] = tmp;
    }

    public static void main(String[] args) {
        int i0 = 5;
        int i1 = 6;

        testSwapInts(i0, i1);

        System.out.printf("%d, %d\n", i0, i1); // Keine Änderung.

        int[] arr = new int[2]; // Erzeugt ein Array mit 10 Elementen.

        arr[0] = 5; // Erstes Element hat immer Index 0.
        arr[1] = 6;

        // Alternative: int[] arr = new int[]{5, 6};

        // Zugriff auf arr[2] fuehrt zu einem Fehler.

        swapInts(arr);

        // Neuer Schleifentyp: For-Each-Schleife. Gibt alle Elemente zurueck:

        for(int e : arr) {
            System.out.println(e);
        }

        /* Aequivalent zu
        for(int j = 0; j < arr.length; j++) {
            System.out.println(arr[j]);
        }
        */
    }
}

Übungsaufgabe: Sieb des Eratosthenes

Strings

Strings sind Zeichenketten, d.h., Datenstrukturen in denen man Text speichern kann.

Strings sind ein Referenztyp. Es gibt allerdings keine Methoden, mit denen man einen String inhaltlich ändern kann. Alle Methoden, die eine Zeichenkette zurückgeben, erzeugen eine neue Zeichenkette. Daher keine Seiteneffekte.

22.4.2013

Stoff: Datenstrukturen (Kap. 4) und Objekte (Kap. 3)

Datenstrukturen

Verkettete Liste (linked list):

nur ein Element bei der Implementierung von Datenstrukturen. Eine Datenstruktur enthält Daten und Operationen auf den Daten. Beispiel: Stack auf der Basis von linked lists. Andere naheliegende Datenstrukturen mit verketteten Listen: Menge, Sequenz.

Implementierung von Stack (oder Queue) mit Array

Gleiches Interface, (fast) gleiches Verhalten, unterschiedliche Implementierung: abstrakter Datentyp

Objekte

Gleiches Interface, teilweise unterschiedliches Verhalten. Dynamische Bindung von Methoden.

25.4.2013

Interfaces, Abstrakte Klassen, und Klassen

Beispiel: intstack mit Interface oder Abstrakter Klasse. Klassenhierarchie:

Methoden

Object

Ist oberste Klasse. Methoden: werden an alle Nachkommen vererbt.

Strings

"a"+b ist äquivalent zu "a"+b.toString();.

29.4.2013

Objektidentität

== vs. equals

Vererbung

am Beispiel toString, equals, hashCode, push, pop, isEmpty.

Beachte: Zusammenhang zwischen equals und hashCode muss man selbst sicherstellen

2.5.2013

Polymorphismus

Object hashCode
       toString
IntStackA hashCode
          toString
IntStackI hashCode
          toString

Verschiedene Variablen

lokale Variablen und Instanzvariablen, Lebensdauer

Information hiding

public und private

Zweck: Kommunikation mit anderen Programmierern (oder auch mit dem zukünftigen Ich): Auf welche Teile der Klasse kann man sich verlassen, und welche Teile können sich ändern; kann ich z.B. die Datenrepräsentation von Array auf verkettete Liste ändern?

Allgemeinere Stacks

Stack von Objekten oder generischer Stack

6.5.2013

Allgemeinere Stacks (Fortsetzung)

gebundene Generizität

Gutes Design? Klassenzusammenhalt (Cohesion): Man kann isIncreasing() ohne weiteres aus der Klasse entfernen, also geringer Zusammenhalt.

Assertions, Invarianten

13.5.2013

Testen (Skriptum 5.3). Black box test, white box test, unit test, integration test, regression test. "Tests können nur die Anwesenheit von Fehlern beweisen, nicht die Abwesenheit".

Debuggen (Skriptum 5.4) mittels Ausgabe-Anweisungen ("printf-Debugging"). Debuggen mit netbeans; bequemer, aber oft Zeitfresser.

Beweisen. Model Checking.

Containers, Collections

Iteratoren