3. Algorithmenentwurf und JAVA Informatik II für Verkehrsingenieure
Schwerpunkt 1 ALGORITHMEN UND UMSETZUNG Aufgabe Algorithmus Programm Eigentliche Entwicklung der Verfahrensidee Codierung Algorithmenentwurf Konzeptionell getrennte Schritte (bei kleineren Aufgaben oft verschmolzen) ZIEL 1 VON INFORMATIK II von der Aufgabe zum Algorithmus 2
Definitionsversuch ALGORITHMUS Anleitung, wie ein bestimmtes Ziel zu einem Problem bzw. einer Aufgabe erreicht werden kann Anleitung ist dabei in der Art einer Liste von Anweisungen, die abgearbeitet werden müssen je Kontext sind die Anweisungen hinreichend primitiv zu halten eine Anweisung wie z.b. löse das Problem sind unzulässig BEACHTE Bei der Definition ist nicht festgeschrieben, wer die Anweisungen ausführt (kann sowohl Computer als auch Mensch sein) Wichtig - Es muss in jedem Fall klar definiert sein, was getan werden muss - Es muss klar sein, was die erste Anweisung ist - Es muss klar sein, welche Anweisung nach der Ausführung einer beliebigen Anweisung als nächstes auszuführen ist 3
Beispiel AUFGABE In einem Zimmer befindet sich ein Haufen Abfall (1m³), der in den Müllcontainer im Keller gebracht werden muss. 4
Schleifen-Konstrukt UM SCHREIBARBEIT ZU SPAREN, FASST MAN WIEDERHOLTE AKTIONEN HÄUFIG ZUSAMMEN Was vollkommen legitim ist Solange eindeutig bleibt, was genau getan werden muss 5
Verallgemeinerung WAS IST, WENN DER MÜLLBERG GRÖSER ALS 1M³ IST ODER DER MÜLLKORB MEHR FASST ALS ANGENOMMEN? 6
Weiteres Element WEITERES ELEMENT FÜR ALGORITHMEN Gewisse Sachen merken Wie das Merken genau aussieht, spielt dabei erst einmal keine Rolle - Mensch: Gedächtnis, Notizblock, sonstige Erinnerungsstütze - Computer: Arbeitsspeicher, Festplatte, Für jede Sache, die zu merken ist, müssen wir einen bestimmten Platz reservieren Wir wollen die Möglichkeit lassen, nach gewisser Zeit an dieser Stelle neue Informationen zu merken Merken ist dabei nichts Ergänzendes, sondern es wird immer die alte Information an dieser Stelle vergessen und überschrieben mit der neuen Information 7
Problem (2) AUFGABE Es soll berechnet werden, was n hoch k (n^k). n und k sollen dabei nicht negative, ganzen Zahlen (also ohne Nachkommastellen) sein. Dem Ausführer wird als Voraussetzung gegeben, dass er multiplizieren kann. 8
Algorithmus 9
Problem (3) AUFGABE Entwickeln Sie einen Algorithmus zur Addition zweier großen Zahlen (nicht negative, ganze Zahlen, also ohne Nachkommastelle), die im Dezimalsystem vorliegen. Ihnen ist bekannt, wie 2 Zahlen von 0 bis 9 inklusive einer 3. Zahl, die entweder 0 oder 1 ist, zu addieren ist. 10
Algorithmus 11
Problem (4) AUFGABE Algorithmus zur Berechnung des größten gemeinsamen Teilers (GGT) von zwei natürlichen Zahlen a und b. Beschrieben von Euklid von Alexandria (300 v.chr.) im Werk Die Elemente 12
Algorithmus 13
Nachfolgende Fragestellungen ES ERGEBEN SICH FOLGENDE INTERESSANTE FRAGEN: Ist der Algorithmus korrekt? - Also: berechnet er wirklich den GGT aus (a,b)? - Wieso funktioniert dieser Algorithmus überhaupt? Ist der Algorithmus vollständig? - Kann ich wirklich jedes Paar (a,b) eingeben? Ist der Algorithmus terminierend (evtl. Endlosschleife)? Ist der Algorithmus effizient? - Wie viel Speicher benötigt er? - Wie viel Zeit (d.h. Verarbeitungsschritte) benötigt er? - Wie hängt das von der Eingabe (a,b) ab? - Wir müssen solche Aussagen immer mathematisch beweisen. 14
Schwerpunkt 2 ALGORITHMEN UND UMSETZUNG Aufgabe Algorithmus Programm Eigentliche Entwicklung der Verfahrensidee Codierung ZIEL 2 VON INFORMATIK II Vom Algorithmus zum Programm Konzeptionell getrennte Schritte (bei kleineren Aufgaben oft verschmolzen) Algorithmusumsetzung 15
Java-Programm GRUNDSTRUKTUR EINES JAVA-PROGRAMMS auch wenn es befremdend am Anfang wirkt Struktur wird zum späteren Zeitpunkt genauer erläutert. Class MeinErstesProgramm { public static void main(string[] args) { // Hier ist der Anfang unseres Programmes // Jetzt ist hier der Platz für unsere eigenen // Anweisungen } } 16
Erläuterungen JAVA-PROGRAMM Muss immer in einer Klasse definiert sein. Wir haben sie MeinErstesProgramm genannt In geschweiften Klammern folgen benutzerdefinierte Methoden (Funktionen), die die Klasse anbietet METHODE Ist eine Sammlung von Anweisungen (Block) unter einem Namen Schlüsselwort main kennzeichnet die Hauptmethode, die zum Programmstart aufgerufen wird (per Definition) 17
Bezeichner DEFINITION Ein Bezeichner ist eine Folge von Buchstaben und Zahlen, die mit einem Buchstaben beginnt Verwendet für Variablen, Methoden (Funktionen),... Als Alphabet wird UNICODE zugrunde gelegt - 16 Bit lang à etwa 65.00 Zeichen können kodiert werden (Zeichen fast aller Schriftsprachen) - Beinhaltet die ASCII-Zeichen nach ISO-8859-1 (Latin-1) - Günther ist ein legaler Bezeichner, trotz Umlaut! UNTERSCHEIDUNG Selbstdefinierte Bezeichner Reservierte Bezeichner 18
Bezeichner SELBSTDEFINIERTE BEZEICHNER Selbstdefinierte Bezeichner sind Namen für im Programm deklarierte syntaktische Einheiten Beispiel: Variablen, Methoden,... Die meisten Bezeichner sind selbstdefiniert RESERVIERTE BEZEICHNER ( SCHLÜSSELWÖRTER ) Reservierte Bezeichner sind fester Teil der Programmiersprache Sie dürfen nicht als Namen eigener Deklarationen verwendet werden 19
Variablen VARIABLE dient zur Ablage von Daten typisch für imperative Programmiersprachen reservierter Speicherplatz belegt abhängig vom Typ eine feste Anzahl von Bytes VARIABLE HAT EINEN TYP Typ zur Übersetzungszeit bekannt (statisch typisiert) auch bezeichnet als Datentyp VARIABLE HAT EINEN DATENWERT Inhalt der Variable auch Datum genannt 20
Datentypen ZWEI KATEGORIEN IN JAVA Primitive Datentypen: sind die eingebauten Datentypen für Zahlen, Unicode-Zeichen und Wahrheitswerte Referenzdatentypen: damit lassen sich Objektverweise etwa auf Zeichenketten, Dialoge oder Datenstrukturen verwalten PRIMITIVE DATENTYPEN Arithmetische Typen & Wahrheitswerte Typ Belegung (Wertebereich) boolean true oder false char 16-Bit-Unicode byte -2^7 bis 2^7-1 (-128 127) short -2^15 bis 2^15-1 (-32.768 32.767) int -2^31 bis 2^31^-1 (-2.147.483.648 2.147.483.647) long -2^63 bis 2^63-1 float 1,40239846E-45f... 3,40282347E+38f double 4,94065645841246544E-324... 1,79769131486231570E+308 21
Variablendeklaration VARIABLEN Mit Variablen lassen sich Daten speichern, die vom Programm gelesen und geschrieben werden können Um Variablen zu nutzen, müssen sie deklariert werden DEKLARATION Immer die gleiche Form: [Modifikatoren] Typname Variablenname; Modifikatoren lernen wir später BEISPIEL Class Variablendeklaration { public static void main(string[] args) { String name; // Name int age; // Alter double income; // Einkommen } } 22
Variablendeklaration mit Initialisierung DEKLARATION MIT INITIALISIERUNG Variable mit initialemanfangswert belegen Form: [Modifikatoren] Typname Variablenname = Anfangswert; BEISPIEL Class Variablendeklaration2 { public static void main(string[] args) { String name = Dirk Habich ; // Name int age = 34; // Alter String job = Research Assistent // Beruf } } 23
Anweisungen in Java EINE ANWEISUNG (STATEMENT) WEIST DEN COMPUTER AN eine Berechnung vorzunehmen (expression statement) eine Variable einzurichten und zu initialisieren (declaration statement) einen Schritt im Programmfluss vorzunehmen (control flow statement) EINE ANWEISUNG WIRD DURCH EIN SEMIKOLON IN JAVA ABGESCHLOSSEN EIN LEERE ANWEISUNG BESTEHT AUS DEM ABSCHLIESENDEN SEMIKOLON ODER AUS EINEM PAAR GESCHWEIFTER KLAMMERN 24
Ausdrucks-Anweisungen (Expressions) EINE AUSDRUCKS-ANWEISUNG nimmt eine Berechnung vor besteht aus einem Ausdruck, der durch ein Semikolon abgeschlossen ist ES SIND ABER NUR BESTIMMTE AUSDRÜCKE ZUGELASSEN Zuweisungsausdrücke (mit =, += etc.) - Beispiele int i=5; x+=1; Präfix- oder Postfixformen von ++ oder -- - Beispiel i++; Methodenaufrufe - Beispiel System.out.println( hello ); Math.sin(Math.PI); 25
Kontrollfluss-Anweisungen (control flow) BLÖCKE (BLOCKS) Blöcke fassen durch Klammerung {} Anweisungssequenzen zu einer einzigen Anweisung zusammen VERZWEIGUNGEN (BRANCHES) Verzweigungen veranlassen Übergänge zu anderen Anweisungen im Kontrollfluss bedingte Übergänge: if, switch unbedingte Übergänge: break, continue ITERATIONEN, SCHLEIFEN (LOOPS) Iterationen organisieren strukturierte Wiederholungen im Kontrollfluss: while, do while, for 26
Bedingte Anweisungen: if - else DIE EINFACHE IF-ANWEISUNG HAT DIE FORM if (condition) statement1 DIE ALLGEMEINE IF-ELSE-ANWEISUNG HAT DIE FORM if (condition) statement1 else statement2 DABEI IST CONDITION EIN BOOLESCHER AUSDRUCK Falls condition zu true evaluiert wird statement1 ausgeführt Im Fall der if-else Anweisung wird sonst statment2 ausgeführt JEDES STATEMENT IST EINE ANWEISUNGEN Also evtl. ein Block oder wieder eine if-anweisung, oder die leere Anweisung, etc. 27
Bedingte Anweisungen - switch EINE WEITERE MÖGLICHKEIT EINER BEDINGTEN ANWEISUNG IST DIE FALLUNTERSCHEIDUNG (SWITCH CASE DEFAULT) switch(c) { case konst_1: {statement_1; break;} case konst_2: {statement_2; break;}... case konst_n: {statement_n; break;} default: {statement_d;} } statement_i wird ausgeführt, falls c == konst_i gilt konst_i müssen Konstanten sein DIE BREAK-ANWEISUNG AM ENDE JEDER CASE-ZEILE BEWIRKT DAS SOFORTIGE VERLASSEN DER SWITCH-ANWEISUNG Falls das break fehlt, wird der nachfolgende case-fall mit ausgeführt, ohne Test ob seine Bedingung zutrifft!!! 28
Schleifen-Anweisungen DAS KONSTRUKT while (condition) statement; DIE ANWEISUNG do statement while (condition); führt statement aus, solange der Ausdruck in condition zu true evaluiert führt statement aus und prüft danach anhand von condition, ob der Schleifendurchgang wiederholt werden soll. Oftmals wird es sich bei statment um einen Block handeln. Bei do-anweisungen ist statement fast immer ein Block 29
Unterschied WHILE-SCHLEIFE (KOPFGESTEUERTE ZEILE) vor der Ausführung des Anweisungsblocks wird die Bedingung (condition) gerüft, ob der Anweisungsblock überhaupt ausgeführt werden soll Anweisungsblock muss daher nicht unbedingt ausgeführt werden DO-WHILE-SCHLEIFE (FUSGESTEUERTE SCHLEIFE) nach der Ausführung des Anweisungsblocks wird die Bedingung (condition) geprüft, ob der Anweisungsblock nochmals ausgeführt werden soll Anweisungsblock wird mindestens einmal ausgeführt, selbst wenn die Bedingung falsch ist 30
Take-Home-Message ALGORITHMENENTWURF Aufgabe Algorithmus Programm Eigentliche Entwicklung der Verfahrensidee Codierung Konzeptionell getrennte Schritte (bei kleineren Aufgaben oft verschmolzen) ALGORITHMUS Anleitung, wie ein bestimmtes Ziel zu einem Problem bzw. einer Aufgabe erreicht werden kann Anleitung ist dabei in der Art einer Liste von Anweisungen, die abgearbeitet werden müssen je Kontext sind die Anweisungen hinreichend primitiv zu halten eine Anweisung wie z.b. löse das Problem sind unzulässig 31