Gruppe 2 Carina Fuss cfuss@student.ethz.ch 21.3.2018 Informatik II – Übung 4 Gruppe 2 Carina Fuss cfuss@student.ethz.ch 21.3.2018 Carina Fuss 21.3.2018.

Slides:



Advertisements
Ähnliche Präsentationen
Objektorientierte Programmierung
Advertisements

der Universität Oldenburg
Sortieren I - Bubblesort -
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
Imperative Programmierung -Entwicklungswerkzeuge
Java: Dynamische Datentypen
Listen Richard Göbel.
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Referenzen und Zeichenketten
Konstruktoren.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (06 - Anwendungen von Stapeln und Schlangen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 2 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
DVG Klassen und Objekte
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sitzung 3: Klassen, Objekte, Arrays und Kontrollstrukturen
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
1.6 Die Datenstruktur Stapel Ein Stapel (Stack) ist ein Sonderfall einer Liste. Die Elemente werden nach dem Prinzip LIFO (Last In First Out) angefügt.
Variablenkonzept Klassisch, in Java Basistyp
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
se_5_liste_stack_etc.ppt1 Softwareengineering Listenstrukturen und ähnliches Prof. Dr.-Ing. Axel Benz, Berlin School of Economics and Law.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Robuste Programme durch Ausnahmebehandlung
Übung Informatik I exercise01. 2 Inhaltsübersicht Nachbesprechung Übung 1 Individuelle Fragen/Bemerkungen.
A Workshop About this chapter General description Units Time Schedule
Java-Kurs Übung Besprechung der Hausaufgabe
Einführung. Ziel der Veranstaltung  Vermittlung von Grundkenntnissen in C++  Solide Basis für anschließende Weiterentwicklung  Fähigkeit, kleine Programme.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Objektorientiertes Modellieren und Programmieren mit Java
Anforderungen an die neue Datenstruktur
Informatik II – Übung 4 Gruppe 3
Konstruktoren.
Klausur „Diskrete Mathematik II“
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Java-Kurs - 4. Übung weitere Kontrollstrukturen
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Einführung in die Programmierung mit Java
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Java-Kurs - 2. Übung primitive Datentypen, Konstanten
Grundkurs Informatik 11-13
Raphael Fischer Informatik II - Übung 04 Raphael Fischer
6. Wiederholungen und Zählschleifen
Raphael Fischer Informatik II - Übung 03 Raphael Fischer
Raphael Fischer Informatik II - Übung 06 Raphael Fischer
SS 04 Christiane Rauh Christian Hellinger
Raphael Fischer Informatik II - Übung 05 Raphael Fischer
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
1. Die rekursive Datenstruktur Liste 1.3 Rekursive Funktionen
2. Vererbung und Kapselung
1. Die rekursive Datenstruktur Liste 1
Datenstrukturen und Softwareentwicklung
9. Vererbung und Polymorphie
Implementieren von Klassen
Felder in der Informatik
Statische und Nichtstatische Methoden Properties / Eigenschaften
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen
3. Die Datenstruktur Graph 3.2 Repräsentation von Graphen
1. Die rekursive Datenstruktur Liste 1.6 Die Datenstruktur Stapel
Informatik II – Übung 4 Gruppe 3
 Präsentation transkript:

Gruppe 2 Carina Fuss cfuss@student.ethz.ch 21.3.2018 Informatik II – Übung 4 Gruppe 2 Carina Fuss cfuss@student.ethz.ch 21.3.2018 Carina Fuss 21.3.2018

Übung 4 Administratives Nachbesprechung Übung 3 Vorbesprechung Übung 4 Stack, Bytecode, (Ackermann-Funktion) Carina Fuss 21.3.2018

Übung 4 Code-Samples auf der Vorlesung sind auf CodeExpert verfügbar. alte Prüfungen auf der amiv-Website (aber Achtung: Es wird betont, dass man aus alten Prüfungen nicht auf die nächste schliessen kann!) Tests benutzen! Man sieht auch seine falschen Ausgaben und kann damit korrigieren. Demo Carina Fuss 21.3.2018

Nachbesprechung Übung 3 Carina Fuss 21.3.2018

Übung 3 – Aufgabe 1 – String vs. StringBuffer Verschlüsseln mit String Entschlüsseln mit StringBuffer Carina Fuss 21.3.2018

Übung 3 – Aufgabe 1 Main bestimmt die Zeit, die es für die Ver-/Entschlüsselung braucht Warum gibt es Laufzeitunterschiede? Strings sind immutable und müssen jedes Mal kopiert werden, an StringBuffer kann man ohne Kopie neue Zeichen anhängen (append) Carina Fuss 21.3.2018

Übung 3 – Aufgabe 2 – Syntaxdiagramme Clause: Expr: Carina Fuss 21.3.2018

Übung 3 – Aufgabe 3 – Syntaxchecker Knoten: Baum: Unterbäume: Bäume in Klammerdarstellung Wie kann man auch leere Bäume und Teilbäume ‘-’ darstellen? Carina Fuss 21.3.2018

Übung 3 – Aufgabe 3 – Syntaxchecker Carina Fuss 21.3.2018

checkNext() Hilfsmethode: checkNext() überprüft, ob das nächste Zeichen einem bestimmten (erwarteten) Zeichen entspricht und ob wir noch im String sind Carina Fuss 21.3.2018

Knoten Carina Fuss 21.3.2018

Baum Carina Fuss 21.3.2018

Unterbaum Carina Fuss 21.3.2018

Methode parse() public, kann mit einem String aufgerufen werden Carina Fuss 21.3.2018

Übung 4 – Aufgabe 4 – Programmverifikation Schleifeninvariante: z + u * j – i * j = 0  Schleifeninvariante gilt nach n Schleifendurchläufen immer noch vor und nach der Schleife Carina Fuss 21.3.2018

Übung 3 – Aufgabe 4 Korrektheitsbeweis mittels Schleifeninvariante: I gilt vor dem Schleifenkörper, I ist Schleifeninvariante (gilt während der Schleife)  I gilt auch nach dem Schleifenkörper Schleifenbedingung C gilt vor der Schleife, aber nach der Schleife nicht mehr Hoare-Kalkül (Aussage über dem Strich impliziert die darunter) Carina Fuss 21.3.2018

Übung 4 – Aufgabe 4 Dummy-Implementierung: Schleifeninvariante gilt immer noch…  Programm ist partiell korrekt Terminierung? Programm terminiert nie, da u immer grösser als 0 bleibt  keine totale Korrektheit Carina Fuss 21.3.2018

Vorbesprechung Übung 4 Carina Fuss 21.3.2018

Übung 4 – Aufgabe 1 – Stack siehe Informatik I…  LIFO (last in first out) Java arbeitet mit Stacks Demo Carina Fuss 21.3.2018

Konstruktor des Stacks Initialisieren der Klassenvariablen: private int[] buffer private int size size momentane Grösse des Stacks capacity Kapazität des Stacks (wenn sie aus- gelastet ist, muss der Stack wachsen) Mit dem Konstruktor erstellt man eine neue Instanz der Klasse Stack: Stack s = new Stack(100); Carina Fuss 21.3.2018

toString() und grow() Verwendung von StringBuffer und der Methode append(String str) Konvertierung von int zu String mittels static String Integer.toString(int i) Stack soll wachsen, sobald seine Kapazitätsgrenze erreicht ist: neuen buffer mit doppelter Grösse anlegen alle Werte vom alten in den neuen buffer kopieren einfache, aber aufwendige (!) Methode, dynamisch wachsende Stacks zu ermöglichen Carina Fuss 21.3.2018

Funktionen zum Arbeiten mit dem Stack push() Kontrolliert, ob die Kapazität des Stacks ausreichend ist. Ansonsten  grow() pop(), peek() Kontrolliert, ob überhaupt etwas auf dem Stack liegt. size(), capacity() Gibt die aktuelle Anzahl an Elementen auf dem Stack und seine Kapazität zurück. Carina Fuss 21.3.2018

Übung 4 – Aufgabe 2 – Ackermann-Funktion A(0, m) = m+1 A(n, 0) = A(n-1, 1) A(n, m) = A(n-1, A(n, m-1)) extrem schnell wachsende Funktion: Carina Fuss 21.3.2018

Ackermann – Stack A(0, m) = m+1 A(n, 0) = A(n-1, 1) Push Start A(1,1) A(1,1) A(1,0) A(0, 1) <- 2 A(0, 2) <- 3 Iteration m = 1 m = 0 m = 1 m = 2 Pop size > 2? No. n = 0 n = 0 n = 1 n = 1 A(0, m) = m+1 A(n, 0) = A(n-1, 1) A(n, m) = A(n-1, A(n, m-1)) Push n == 0? m + 1 No. n - 1 Push m == 0? No. 1 n - 1 m = 1 m = 0 Push else n m = 2 n = 0 n = 1 m = 1 m - 1 m = 3 n = 0 n = 1 Berechnung von A(2,1)? Stack Pop End A(1,1) = 3 Carina Fuss 21.3.2018

Iterative Ackermann Wie eben gezeigt mithilfe von Stack implementieren. Verwendet die Methoden vom Stack aus Aufgabe 1! Achtung: CodeExpert: eure Klasse Stack kopieren! Bei Schwierigkeiten: String-Repräsentation des Stacks ausgeben, um Fehler zu analysieren… Carina Fuss 21.3.2018

Übung 4 – Aufgabe 3 – Java-Bytecode Maschinensprache (Inhalt der class-Datei) in der Konsole anzeigen mit javap -c Demo Carina Fuss 21.3.2018

Bytecode – Beispiel Code: 0: iload_0 1: ifne 6 4: iconst_1 5: ireturn static boolean gerade(int); Code: 0: iload_0 1: ifne 6 4: iconst_1 5: ireturn 6: iload_0 7: iconst_1 8: isub 9: invokestatic #2 // Method gerade:(I)Z 12: ifne 19 15: iconst_1 16: goto 20 19: iconst_0 20: ireturn Carina Fuss 21.3.2018

Bytecode – Beispiel static int verdopple(int); Code: 0: iload_0 1: ifne 6 4: iconst_0 5: ireturn 6: iconst_2 7: iload_0 8: iconst_1 9: isub 10: invokestatic #3 // Method verdopple:(I)I 13: iadd 14: ireturn Carina Fuss 21.3.2018

Bytecode – Beispiel static int halbiere(int); Code: 0: iload_0 1: ifne 6 4: iconst_0 5: ireturn 6: iload_0 7: iconst_1 8: if_icmpne 13 11: iconst_0 12: ireturn 13: iconst_1 14: iload_0 15: iconst_2 16: isub 17: invokestatic #4 // Method halbiere:(I)I 20: iadd 21: ireturn Carina Fuss 21.3.2018

Bytecode – wichtige Befehle iload/aload: lädt lokale Variable/Referenz aus dem Speicher iconst: lädt Konstante (z.B. 0 oder 1) iadd: addiert die zwei obersten Variablen auf dem Stack isub: subtrahiert die zwei obersten Variablen auf dem Stack ireturn: Rückgabe (oberster Wert auf dem Stack) goto: springt zu bestimmter Zeile ifne: springt, wenn der Vergleich mit Null negativ ausfällt invokevirtual: ruft eine neue Instanz der Methode auf Carina Fuss 21.3.2018

Fragen? Carina Fuss 7.3.2018