I) Grundlagen der Programmierung. II) Erweiterte Grundlagen der Programmierung

Ähnliche Dokumente
Allgemeines zu Programmieren I

Programmieren I. Administratives / Java Installation. Thomas Vetter, Brian Amberg, Andreas Forster. 21. September 2010 UNIVERSITÄT BASEL

Vorlesung Objektorientierte Softwareentwicklung. Kapitel 0. Java-Überblick

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Ein erstes Java-Programm

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

Einstieg in die Informatik mit Java

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Vorlesung Informatik II

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

J.5 Die Java Virtual Machine

Aufbau und Funktionsweise eines Computers

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Tutorium Java Ein Überblick. Helge Janicke

Übung zur Vorlesung Strukturiertes Programmieren WS 2014/15. Übungsblatt 1: JAVA - Erste Schritte Abgabe: Besprechung:

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Vorkurs Informatik WiSe 15/16

Programmiervorkurs. Organisation: Steffen Gebert, Alexander Wolff. Tutoren: Jürgen Zöller, Jonathan Stoll. Wintersemester 2012/2013

1. Formulieren Sie den Algorithmus <Bedienung eines Getränkeautomaten> nach den oben genannten Kriterien.

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Kopf und Rest einer Liste (head and tail): Trennung durch. Listenkopf: kann mehrere Elemente umfassen

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Prinzipielle Ausführungsvarianten I

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Übersicht. Vorstellung des OO-Paradigmas

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Grundlagen der Informatik Übungen 1.Termin

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Einführung in die Programmierung mit Java

3. Grundlegende Sprachkonstruktionen imperativer Programme

Java für C++ Programmierer

Java Einführung Programmcode

Java-Vorkurs Wintersemester 15/16

Javakurs für Anfänger

Die Programmiersprache C

Objektorientierte Programmierung OOP Programmieren mit Java

Berner Fachhochschule Hochschule für Technik und Informatik HTI. Kapitel 1. Einstieg in Java. Dr. Elham Firouzi

Softwareentwicklung 1

Übungen Informatik I. JAVA - Einführung. elga Gabler, Holger Vogelsang, Christian Pape. Übungen Informatik 1 Folie 1

Computeranwendung und Programmierung (CuP)

Programmieren lernen mit Groovy Allgemeines Programme und ihre Ausführung

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Primitive Datentypen

Java Programmierung auf der Konsole / unter Eclipse

Einführung in die C-Programmierung

Institut für Informatik

II.1.1. Erste Schritte - 1 -

Grundlagen der Programmierung

Repetitorium Informatik (Java)

16. März 2016 artb5-v1.1

Prof. Dr. Heinrich Müller. Informatik VII Universität Dortmund. Organisatorisches zum Vorkurs Informatik

1. Der Einstieg in Java. Was heißt Programmieren?

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Programmieren I. Die Programmiersprache Java. Institut für Angewandte Informatik

Einheit Variablen in der Programmiersprache C Variablen-Modell, Variablen-Vereinbarungen

Die Programmiersprache C Eine Einführung

Java Kurs für Anfänger LMU SS09 Einheit 1 Javaumgebung

Hochschule Niederrhein Grundlagen der Prof. Dr. Nitsche Fachbereich 03 Java Programmierung Bachelor Informatik SS 2015 Übung 1. Grundlagen von Java

Probeklausur: Programmierung WS04/05

Deklarationen in C. Prof. Dr. Margarita Esponda

Kapitel 11: Wiederholung und Zusammenfassung

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Grundlagen der Informatik I (Studiengang Medieninformatik)

Programmieren was ist das genau?

VBA-Programmierung: Zusammenfassung

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

OO Programmierung in Java

Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10. computer graphics & visualization

Einführung in Javadoc

Inhaltsverzeichnis. Was ist Informatik? 5. Programmierung 13. Einleitung. 1 Informatik Was ist Informatik? Teilgebiete der Informatik 8

Problemorientierte Programmiersprachen Nachteile von Programmen in Maschinensprache sehr aufwendig bei komplexeren Aufgabenstellungen fehleranfällig

Compiler: Vom Code zum Maschinen-Code. C Programmierung - Vorlesung 2 Hochschule Regensburg Universitätsstraße 31, Regensburg

Propädeutikum zur Programmierung

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Numerische Datentypen. Simon Weidmann

Erste Schritte zum lauffähigen Java Programm

Programmierung. Programme, Compiler, virtuelle Maschinen, Java

JAVA - Methoden

Coma I. Einleitung. Computer und Algorithmen. Programmiersprachen. Algorithmen versus Programmiersprachen. Literaturhinweise

Programmierung mit C Zeiger

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

1. Java Grundbegriffe

Distributed Computing Group

Objektorientierte Programmierung

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

Einführung in PHP. (mit Aufgaben)

Programmiertechnik. Prof. Dr. Oliver Haase Raum G124 Tel: 07531/ Oliver Haase Hochschule Konstanz 1

Java Einführung Klassendefinitionen

Einführung in die Java- Programmierung

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Seite Seite 2

C# im Vergleich zu Java

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

1. Übung zu "Numerik partieller Differentialgleichungen"

Kurze Einführung in die Programmiersprache C++ und in Root

CS1005 Objektorientierte Programmierung

1. Der Einstieg in Java

Einführung in die Programmierung mit Java

Transkript:

Allgemeines zu: I) Grundlagen der Programmierung VV-Nr.: 10890-01 II) Erweiterte Grundlagen der Programmierung VV-Nr.: 45398-01 Webseiten zur Vorlesung http://informatik.unibas.ch/hs2017/ ->Grundlagen der Programmierung hier gibt es alle Folien zur Vorlesung aber auch sonstige aktuelle Informationen -> Erweiterte Grundlagen der Programmierung Übungsblätter aber auch sonstige aktuelle Informationen Page 1

Lernziele A) Grundlagen der Programmierung Die Programmiersprache Java kennen. Kleine Programme lesen und verstehen können und kurze Programmteile selbst schreiben und entwickeln können. B) Erweiterte Grundlagen der Programmierung Ganze Programme in Java selbst schreiben können und Erfahrung in der Umsetzung von Problemstellungen zu lauffähigen Programmen sammeln. Überblick zur Vorlesung Inhalt: Anweisungen und Datenstrukturen Objektorientiertes Programmieren Programmentwurf Rekursion Fehlerbehandlung Generics Verwenden von Java-API Bibliotheksfunktionen Page 2

Durchführung der Übungen A) Grundlagen der Programmierung Alle Übungen werden über ein Web-Interface in einen Web-Browser durchgeführt. Die Auswertung und die Korrekturhilfen werden automatisch erstellt. Die vereinbarten Termine bei Tutoren können zu Fragen und Hilfestellungen genutzt werden B) Erweiterte Grundlagen der Programmierung Der vollständiger Programmkode muss auf einen Server geladen werden und dann einem Tutor vorgeführt werden. Detaillierte Anweisungen finden sie auf den Webseiten zu den Kursen. Literatur Folien zur Vorlesung werden im Web abgelegt Folien allein sind NICHT ausreichend!! Bücher: 1) Sprechen sie Java, Hanspeter Mössenböck dpunkt Verlag etwa sfr 48,- 5. Auflage ( 2.Auflage) Page 3

Das Buch der Entwickler Arnold, K., Gosling, J. und Holmes, D. (2005). The Java Programming Language. Addison-Wesley. Vierte (dritte) Auflage. Die originale Referenz, die auch einen kompakten Überblick und ein Nachschlagen während des Programmierens ermöglicht. Setzt aber oft schon Standardwissen der Informatik voraus. Gegen Ende der Vorlesung sehr geeignet!! Weitere Literaturempfehlungen Eine weitere Literaturempfehlung: "Thinking in Java" von Bruce Eckel kostenlos im Internet als pdf-datei http://www.mindview.net/books/tij/ Page 4

Einschub: Ein erstes Java Programm. Allgemeines zu Java Java ist eine objektorientierte Programmiersprache in der Tradition von C und C++. Die Java-Syntax lehnt sich an C an, nimmt aber einige deutliche Bereinigungen vor z. B. Abwesenheit von goto und dem Datentyp Zeiger (pointer). Die Erweiterung um Objekte geschieht ähnlich wie bei C++ Allerdings gibt es doch einige Unterschiede: In erster Näherung könnte man sagen, dass Java aus der riesigen Vielfalt der C++ Konstrukte eine sinnvolle Auswahl trifft und gleichzeitig einiges umstellt und bereinigt. Page 5

Home Page von Java Java wurde bei der Firma SUN Microsystems entwickelt Von James Gosling Ursprünglich für die Programmierung von in Haushaltselektronik eingebetteten Prozessoren Die zentrale Internet Site der Firma Oracle zum Thema Java ist http://www.oracle.com/technetwork/java/index.html Besonders empfehlenswert (und sehr empfohlen zur Ergänzung des Selbststudiums): Das offizielle Java-Tutorial: http://docs.oracle.com/javase/tutorial/ Pflicht für die Teilnehmer der Erweiterten Grundlagen der Programmierung Installation der Entwicklungsumgebung Die Standard-Entwicklungsumgebung von SUN (z. Z. Version 1.8) kann auch direkt im Internet unter der folgenden URL heruntergeladen werden http://www.oracle.com/technetwork/java/index.html Das Java Tutorial von Campione et al. (2001) enthält detaillierte Anleitungen zur Installation des SDK auf UNIX / LINUX, Apple Macintosh und Microsoft Windows Plattformen Hilfe zur Installation im Netz: ( muss Ende 2. Woche laufen ) http://www.torsten-horn.de/techdocs/java-install.htm http://de.wikibooks.org/wiki/java_standard:_einrichten_der_programmi erumgebung Page 6

Programmentwicklung : Editieren Der Quellcode eines Programms kann mit jedem beliebigen Editor erstellt werden. R. Manthey Editoren Programme zum Schreiben und Verändern (Editieren) von Text- Dateien heißen Editoren. Quellcode-Dateien von Java-Programmen sind Text-Dateien Benutzen Sie Ihren Lieblingseditor Windows: Notepad++, Geany, Jedit... Linux: vi, VIM, ( EMACS), Geany,... Max OSX: TextWrangler,. Page 7

Programmiervorgang für Java R. Manthey Java: Plattformunabhängiges Compilieren R. Manthey Page 8

Programmiervorgang für Java R. Manthey Programmiervorgang für Java R. Manthey Page 9

Java Bibliotheken Zu Java gehört außerdem eine Sammlung von standardisierten Bibliotheken, die häufige Programmieraufgaben stark erleichtern. Beipiele solcher Bibliotheken sind java.applet für Programme, die in Web-Browsern laufen sollen java.awt für das Erzeugen graphischer Benutzeroberflächen java.math für Arithmetik auf beliebig langen Zahlen (wichtig z. B. für die Kryptographie), java.net zum Betreiben von Verbindungen über das Internet java.rmi zum Aufrufen von Methoden auf entfernten Rechnern... Grundstruktur von Java- Programmen class ProgramName { public static void main (String[] arg) { Text muß in einer Datei namens ProgramName. java stehen... // Deklarationen... // Anweisungen } } Beispiel class MyFirstProgram{ public static void main (String[] arg) { System.out.println( Hallo World! ); } } Text steht in Datei MyfirstProgram. java Page 10

Übersetzen und Ausführen mit JDK class MyFirstProgram{ public static void main (String[] arg) { System.out.println( Hallo World! ); } } Text steht in Datei MyfirstProgram. java Übersetzen C:\ cd MySamples C:\ javac MyFirstProgram. java wechselt ins Verzeichnis mit der Quelldatei erzeugt Datei MyFirstProgram.class Ausführen C:\ java MyFirstProgram Hallo World! ruft main- Methode der Klasse MyFirstProgram auf Pragmatisches zur Programmierung in Java Page 11

Pragmatisches zur Programmierung in Java Pragmatisches zur Programmierung in Java obligatorischer Eingabeparameter (niemals weglassen). Array von Zeichenreihen Dient zur Übermittelung von Eingaben beim Aufruf der Klasse «von aussen». Kann innerhalb von main ignoriert werden Page 12

Beispiel: Kommandozeilenparameter class Program2{ public static void main (String[] arg) { System.out.println(arg[0] + _ + arg[1]); } } Ein Aufruf: java Program2 Hallo World Concatenation von Zeichenketten erzeugt dann Hallo_World Grundlagen der Programmierung: Programmieren in Java Page 13

Was heisst Programmieren? Exaktes Instruieren eines Computers, eine bestimmte Aufgabe zu lösen. Aufgabe Vorlesung Idee zur Vorgehensweise Algorithmus Mensch Maschienenlesbare Kodierung (Programm) Übersetzung in Maschinensprache Compiler Lösung der Aufgabe durch den Computer Hardware Organisation der Hardware Architektur eines einfachen Computersystems mit Bus Page 14

System-Architektur der Hardware Architektur eines PC Systems mit mehreren Bussen an Brücken Software wird unterschieden in Anwendersoftware erlaubt die Lösung allgemeinster Aufgabenstellungen. z. B. Textverarbeitung, Tabellenkalkulation, Bildbearbeitung, Buchhaltung, Produktionsplanung, Lohn und Gehaltsabrechnung, Spiele... Systemsoftware hilft beim Betrieb des Rechners und bei der Konstruktion der Anwendersoftware. Systemsoftware umfasst neben Datenbanksystemen, Übersetzern (compiler) etc. in jedem Fall das Betriebssystem. Page 15

Betriebssystem Das Betriebssystem (operating system) isoliert die Anwendersoftware von der Hardware: das Betriebssystem kommuniziert mit der Hardware und die Anwendersoftware auf dem Betriebssystem. Das Betriebssystem verwaltet die Ressourcen der Hardware (wie z. B. Geräte, Speicher und Rechenzeit) und es stellt der Anwendersoftware eine abstrakte Schnittstelle (die Systemaufrufschnittstelle) zu deren Nutzung zur Verfügung. Dadurch vereinfacht es die Nutzung der Ressourcen und schützt vor Fehlbedienungen. Betriebssysteme, die es mit diesem Schutz nicht so genau nehmen, führen zu häufigen Systemabstürzen (system crash). JAVA Kern aller heutigen Computer Grundsätzlicher Aufbau verschiedener Rechnersysteme ist ähnlich: CPU Speicher Steuerwerk Adresse Inhalt Wahlfreier Zugriff ALU Von Neumann Architektur Page 16

Speicher Kleinste Speichereinheit hat 2 Zustände 1 Bit Zustände werden i.a. mit 0 und 1 bezeichnet Mit 2 Speichereinheiten 2 2 =4 Zustände darstellbar Mit 8 Bit 2 8 =256 Zustände darstellbar 8 Bit = 1 Byte Heutzutage sind Bytes die kleinsten adressierbaren Speichereinheiten Kleinere Einheiten müssen aus einem Byte extrahiert werden z.b. 0010 0101 Speicher & Adressierung Von Neumann Architektur Adresse Inhalt (byte) CPU Steuerwerk ALU Adresse Speicher Inhalt 1. 2. 3. 4. 5. 6. 7... 0101 0010 1100 1100 1001 1000 0000 0100 1111 1001 0010 1011... Wieviel Speicheradressen hat ein Computer? Maximal soviel der Datenbus codieren kann. PC s mit 32 Bit Datenbus 2 32 = 4 *2 30 = 4 *2 10 *2 10 *2 10 = 4 Giga Zustände (Adressen) bei 64 Bit Datenbus 2 64 = 2 34 Giga 10 11 Giga Zustände (Adressen) Page 17

Daten und Befehle Daten Menge addressierbarer Speicherzellen Daten sind binär gespeichert (z.b. 17 = 10001) Binärspeicherung ist universel (Zahlen, Texte,Filme, Ton ) 1 Byte := 8 Bit 1 Wort := 2 Byte (z.t. auch 4 Byte) Befehle Operationen mit den Speicher Zellen Maschinensprache Hochsprache ACC x // Lade Zelle x z = x + y ACC ACC + y // Addiere y z ACC // Speichere Ergebnis in Zelle z Variablen und der Typ von Variablen Menschen benennen Dinge gerne mit Namen statt mit numerischen Adressen, so kennt jede Programmiersprache das Konzept einer Variablen als abstraktes Analogon zu einer Speicherstelle. Eine Variable hat einen symbolischen Namen, hinter dem eine Adresse verborgen ist, und der Wert (value) der Variable ist der Wert des dort gespeicherten Bitmusters. Um diesen erschließen zu können, hat die Variable einen Typ (type), der bei ihrer Vereinbarung angegeben werden muss. Page 18

Binärcodierung elementarer Datentypen Unterscheide Zahl-Wert Zahl-Bezeichner Zu ein- und demselben Zahl-Wert kann es verschiedene Bezeichner geben, z. B. Fünf, 5, V, 101 Da es unendlich viele Zahl-Werte gibt, ist es sinnvoll, sich eine Systematik zur Erzeugung von eindeutigen Bezeichnern zu schaffen Die auch das Rechnen mit Zahlen unterstützt Verwendung von römischen Zahlen bietet keine gute Unterstützung Binärcodierung elementarer Datentypen Ein Zahlsystem (number system) besteht aus endlich vielen Ziffern (digits) und einer Vorschrift, wie Zeichenreihen, die aus diesen Ziffern gebildet wurden, als Zahl-Werte zu interpretieren sind Arabische Zahlsysteme zur Basis b Natürliche Zahl z wird geschrieben als Polynom Dabei Page 19

Datentypen & Variable Adresse 1. 0000 0000 0000 0000 0000 0000 0000 0000 2. 0000 0000 0000 0000 0000 0000 0000 00001 3. 0000 0000 0000 0000 0000 0000 0000 00010 4. 0000 0000 0000 0000 0000 0000 0000 00011 5. 0000 0000 0000 0000 0000 0000 0000 00100 6. 0000 0000 0000 0000 0000 0000 0000 00101 7. 0000 0000 0000 0000 0000 0000 0000 00111.. Inhalt (byte) 0101 0010 1100 1100 1001 1000 0000 0100 1111 1001 0010 1011... Wie ist der Inhalt des Speichers zu interpretieren? Dem Bitmuster ist seine Bedeutung (Text, Zahlen oder Musik) nicht fest zugeordnet. Je nach Variablendefinition müssen unterschiedlich viele Bytes interpretiert werden und gleiche Bitmuster können unterschiedliche Bedeutungen haben! Variablen haben immer einen Datentypen Elementare Datentypen in Java byte 8 Bit Zahl -2 7... 2 7 1 ( -128,..., 127 ) short 16 Bit-Zahl -2 15... 2 15 1 ( -32768,..., 32767 ) int 32 Bit-Zahl -2 31... 2 31 1 ( -2 147 483 648,..., 2 147 483 647 ) long 64 Bit-Zahl -2 63... 2 63 1 float double 32 Bit IEEE-754-1985 Gleitkommazahl 64 Bit IEEE-754-1985 Gleitkommazahl char boolean 16 Bit Unicode Wahrheitswert, false oder true Page 20

Gleitkommazahlen engl. Floating-Point Darstellung einer Floating-Point-Zahl: Floating-Point-Zahlen nach IEEE 754-1985 32 Bit float 64 Bit double Algorithmus Schrittweises, präzises Verfahren zur Lösung eines Problems Problem: Summiere die Zahlen von 1 bis max. i max sum i i 1 Name Parameter SummiereZahlenVon1bismax ( max, sum) 1. sum 0 2. zahl 1 3. Wiederhole, solange zahl max 3.1 sum sum + zahl 3.2 zahl zahl + 1 Folge Programm = Beschreibung eines Algorithmus in einer Programmiersprache Page 21

Variablen Sind benannte Behälter für Werte x y 99 3 Können ihren Wert ändern x x + 1 x 100 Haben einen Datentyp = Menge erlaubter Werte Variablentyp Werte Zahl 17 54... - in eine Zahlenvariable passen nur Zahlen Zeichen 'a' 'x'... - in eine Zeichenvariable passen nur Zeichen Anweisungen Wertzuweisung x x + 1 1. Werte Ausdruck aus 2. Weise seinen Wert der Variablen zu: Variable Ausdruck Anweisungsfolge (auch Sequenz) x 2 y 4 x x + 1 z x + y "Ablaufdiagramm" x =3, y =4, z= 7 Assertion Assertion (Zusicherung) Aussage über den Zustand des Algorithmus an einer bestimmten Stelle Page 22

Anweisungen Auswahl (auch Verzweigung, Abfrage, Selektion) Beispiel: Suche das Minimum der zwei Zahlen x und y. j x < y? n x y min x min y min= Minimum von x und y Anweisungen Wiederholung (auch Schleife, Iteration) Beispiel: Suche die grösste ganze Zahl n mit 2 n kleiner oder gleich x. n 0 x > 1? ja x x / 2 n n + 1 nein n 0 x > 1 x x / 2 n n + 1 x 1 n = log2 x Alternative Darstellung x 1 n = log2 x Page 23

Beispiel: Vertausche zwei Variableninhalte Swap ( x, y) Schreibtischtest x y h h x x y y h 3 2 2 3 3 Beispiel: Bestimme Maximum dreier Zahlen Max ( a, b, c, max) j a > b? n a b j a > c? n c a > b j b > c? n c b a max a max c max b max c Page 24

Beispiel: Euklidscher Algorithmus Berechnet den größten gemeinsamen Teiler zweier Zahlen x und y GGT ( x, y, ggt) rest Rest von x / y rest 0 x y y rest rest Rest von x / y ggt y rest = 0 Schreibtischtest x y rest 28 20 8 20 8 4 8 4 0 Warum funktioniert dieser Algorithmus? (ggt teilt x) & (ggt teilt y) ggt teilt (x - y) ggt teilt (x - q* y) ggt teilt rest ggt( x, y) = ggt( y, rest) Beispiel: Berechne Quadratwurzel von x 0 a root x 1. Näherung: root x / 2 a root a x / root 2. Näherung: root (root + a) / 2 a x / root SquareRoot ( x, root) root x / 2 a x / root a = root * root (root + a) / 2 a x / root a * root = x a * root = x a * root = x & a = root root * root = x Schreibtischtest x root a 10 5 2 3,5 2,85471 3.17857 3,14607 3.16232 3,16223 3.16228 3,16228 Kommazahlen sind meist nicht exakt gleich, daher besser a- root > 0.0000001 Page 25