Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Ähnliche Dokumente
Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Grundlagen der Informatik I (Studiengang Medieninformatik)

1. Übung zu "Numerik partieller Differentialgleichungen"

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

Modul 122 VBA Scribt.docx

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

Tutorium Rechnerorganisation

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Einführung in die Informatik I

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Großübung zu Einführung in die Programmierung

Komplexität von Algorithmen

Einführung in die Informatik 1

Die Programmiersprache C

Rechnerorganisation Tutorium Nr. 1

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

Entwurf von Algorithmen - Kontrollstrukturen

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

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

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

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Deklarationen in C. Prof. Dr. Margarita Esponda

VBA-Programmierung: Zusammenfassung

16. März 2016 artb5-v1.1

1.8 Kontrollstrukturen 73. default : ziffer = 0; if (ziffer > 0) { cout << "Ziffer = " << ziffer; else { cout << "keine römische Ziffer!

Propädeutikum zur Programmierung

Programmierkurs: Delphi: Einstieg

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

Numerische Datentypen. Simon Weidmann

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper

Projekt Systementwicklung

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Programmieren für Wirtschaftswissenschaftler SS 2015

Einführung in die C-Programmierung

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

4.Grundsätzliche Programmentwicklungsmethoden

Die Programmiersprache C Eine Einführung

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Primitive Datentypen

Algorithmen zur Datenanalyse in C++

Einführung in die Programmiersprache C

Übung 9 - Lösungsvorschlag

Inhalt. 4.7 Funktionen

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Programmierung in C++

Java Einführung Operatoren Kapitel 2 und 3

Java Kurs für Anfänger Einheit 2 Datentypen und Operationen

Einführung in die C++ Programmierung für Ingenieure

2 Einfache Rechnungen

IT-Basics 2. DI Gerhard Fließ

Klausur: Grundlagen der Informatik I, am 05. Februar 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Funktionale Programmierung. Funktionale Programmierung: Vorlesungsüberblick. Eigenschaften rein funktionaler Programmierung

Modellierung und Programmierung

Erster Kontakt mit Java und Pseudocode

Programmierkurs Java

Übungen zur Vorlesung Wissenschaftliches Rechnen I. Grundelemente von Java. Eine Anweisung. wird mit dem Wertzuweisungsoperator = geschrieben.

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

Grundlagen der Programmierung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Klausur in Programmieren

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

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

C++ Einführung. und Datenanalyse mit ROOT. Jörg Marks, Physikalisches Institut, INF 226

Java-Vorkurs Wintersemester 15/16

Eine Einführung in C-Funktionen

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

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

5.4 Klassen und Objekte

Lösung zur Klausur zu Krypographie Sommersemester 2005

Hello world. Sebastian Dyroff. 21. September 2009

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Prinzipieller Grundaufbau eines einfachen C-Programmes

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmierung in Python

Programmieren in C/C++ und MATLAB

Funktionale Programmierung mit Haskell

Grundlagen der Programmierung

Praktische Übungen im Labor Automatisierungstechnik. Versuch Nr. 6. Einführung in das Bussystem FlexRay am Beispiel Steer-by-Wire. Kurzanleitung CAPL

4. Datentypen. Einleitung Eingebaute Datentypen. Konversion / Type-Cast. Operatoren. Übersicht Die Datentypen char, float und double Standardwerte

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Übung zur Vorlesung Multimedia im Netz

JAVA - Methoden

Java-Programmierung mit NetBeans

Einführung in die Programmierung

Thomas Behr. 17. November 2011

Logische Verknüpfungen. while-schleifen. Zahlendarstellung auf dem Computer. Formatierung von Zahlen in MATLAB.

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Jede der folgenden Richtlinien erlaubt Ausnahmen, die ganz im Ermessen der Autoren sind.

Schritt 1. Schritt 1. Schritt 3. - Analysieren des Problems und Spezifizierung einer Lösung.

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Algorithmen und ihre Programmierung

Erwin Grüner

Transkript:

Übung zu Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2018 Mai Bui Computer Aided Medical Procedures Technische Universität München

Administratives Zentralübung (Mittwoch, 09:45 11:15) Programmierbeispiele zur Vorlesung Besprechung allgemeiner Fragen zu den Übungsblättern Probeklausur Tutorübungen Besprechung der Übungsblätter Besprechung der Probeklausur Kontakt-E-Mail: algods@mailnavab.in.tum.de Sprechstunde (Termin per E-Mail) Moodle https://www.moodle.tum.de/course/view.php?id=38846 Diskussionsforum & Bekanntmachungen http://campar.in.tum.de/chair/teachingss18aud 2/44

Warum C und C++? C ist die Grundlage, aber einige Konzepte fehlen. C++ ist eine Erweiterung von C, grösstenteils kompatibel. Aus C/C++ Quellcode kann sehr effizienter Maschinencode erzeugt werden. 3/44

C/C++ Compiler MinGW für Windows http://www.mingw.org/ GCC für Mac OS X über Xcode https://itunes.apple.com/de/app/xcode/id497799835 GCC für GNU/Linux Meist schon vorinstalliert https://gcc.gnu.org/install/ Beispiel Tutorial: https://www.tutorialspoint.com/cprogramming/c_ environment_setup.htm 4/44

Entwicklungsumgebungen Microsoft Visual Studio für Windows Express-Version über https://www.visualstudio.com/vs/express/ Vollversion über DreamSparks: https://www.studisoft.de Xcode für Mac OS X https://itunes.apple.com/de/app/xcode/id497799835 CLion für Windows, Mac OS X, GNU/Linux Vollversion für Studenten https://www.jetbrains.com/student/ Eclipse für Windows, Mac OS X, GNU/Linux http://www.eclipse.org/downloads/packages/ eclipse-ide-cc-developers/oxygen3 5/44

Heute: Online C/C++ Compiler https://www.onlinegdb.com/online_c_compiler 6/44

Euklidischer Algorithmus Wenn CD aber AB nicht misst, und man nimmt bei AB, CD abwechselnd immer das kleinere vom größeren weg, dann muss (schließlich) eine Zahl übrig bleiben, die die vorangehende misst. aus Euklid: Die Elemente, Buch VII (Clemens Thaer) Vorschrift zur Berechnung des größten gemeinsamen Teilers Keine Definition des ggt im mathematischen Sinn Verschiedene Algorithmen mit gleichem Ziel ( Sortierung!) 7/44

Größter gemeinsamer Teiler Wie lautet der größte gemeinsame Teiler von 11 und 4, ggt (11,4)? 8/44

Euklidischer Algorithmus - Originalformulierung Input: natürliche Zahlen AB, CD Output: größte gemeinsame Teiler von AB, CD 1. Setze m := AB und n := CD 2. Falls m < n, vertausche m und n 3. Berechne r := m n 4. Setze m := n und n := r 5. Falls r > 0, gehe zu Schritt 2. 6. Der Output ist m 9/44

Ablauf nach Originalformulierung m = AB = 11 n = CD = 4 0 Rechenschritte 10/44

Ablauf nach Originalformulierung r = 7 = 11 n n = CD = 4 1 Rechenschritt 10/44

Ablauf nach Originalformulierung r = 3 = 7 n n = CD = 4 2 Rechenschritte 10/44

Ablauf nach Originalformulierung m = 3 r = 1 = 4 m 3 Rechenschritte 10/44

Ablauf nach Originalformulierung r = 2 = 3 n r = 1 4 Rechenschritte 10/44

Ablauf nach Originalformulierung r = 1 = 2 n r = 1 5 Rechenschritte 10/44

Ablauf nach Originalformulierung r = 1 r = 1 ggt (11, 4) = 1 11 ist eine Primzahl! 5 Rechenschritte 10/44

Algorithmus präzise/eindeutige, endliche Beschreibung Bausteine: Elementarer Verarbeitungsschritt Sequenz (Abfolge elementarer Schritte) Bedingter Verarbeitungsschritt Wiederholung 11/44

Variablen Speicherung von Werten mittels Typ-behafteter, eindeutig benannter Variablen int für ganze Zahlen (Integer) double für Fließkommazahlen (Double Precision Floating Point) char für Zeichen (Character)... Zuweisung über = Kurze Schreibweise für Updates i *= 4; statt i = i * 4; (ebenso +=, -=, *=, /=,...) i++; statt i = i + 1; (ebenso --) int i = 23; int j = 2 * (i -2); // Klammerung! char s = a ; 12/44

Elementarer Verarbeitungsschritt Mathematische Operatoren +, -, *, /,... Zuweisungen =, +=, -=, *=, /=,...... 13/44

Sequenz int i = 10; i = i +2; // Wert von i ist 12 14/44

Bedingter Verarbeitungsschritt if (b) {...} if (b) {...} else {...} if (b) {...} else if (...) {...} else {...} Klammern {...} zur Sicherheit immer schreiben b steht für einen logischen Ausdruck oder eine logische (boolsche) Variable: 15/44

Logische Ausdrücke Logischer Typ (bool) mit Werten true (wahr, 1) und false (unwahr, 0) Vergleichs-Operatoren: == (gleich),!= (ungleich), <, <=,... Verknüpfungen: && (AND; beide wahr), (OR; mindestens eines von beiden wahr),... Negation:!a (NOT) 16/44

Wiederholung Schleifen für Wiederholungen while (b) {...} (Test vor jeder Iteration) do {...} while (b); (Test nach jeder Iteration) for i = 1...100 {...} (Gewisse Anzahl an Iterationen) 17/44

Pseudocode Informelle Veranschaulichung eines Algorithmus Identifizierung der elementaren Bausteine nicht offensichtlich Input: Natürliche Zahlen a,b Output: ggt(a,b) euklid(a,b): Falls a = 0, liefere b zurück Solange b > 0 wiederhole Falls a > b setze a = a b sonst setze b = b a Liefere a zurück 18/44

Beispiel Programmiersprache: C Kompilierte Sprache, sehr effizient int euklid ( int a, int b) { if (a ==0) return b; while (b >0) { } if (a>b) a = a - b; else b = b - a; } return a; 19/44

Konvention der Vorlesung Pseudocode + C Syntax Input: Natürliche Zahlen a,b Output: ggt(a,b) euklid(a,b): { if (a ==0) return b; while (b >0) { } if (a>b) a = a - b; else b = b - a; } return a; 20/44

Konvention der Vorlesung Funktionsdefinition Input: Natürliche Zahlen a,b // Einsprungspunkt Output: ggt(a,b) // Aus -/ Rückgabe euklid(a,b): // Funktionsname { if (a ==0) return b; while (b >0) { if (a>b) a = a - b; else b = b - a; } return a; } Aufruf mittels euklid(a,b) (z.b. euklid(6,3)) 21/44

Konvention der Vorlesung Identifikation der Bausteine Input: Natürliche Zahlen a,b Output: ggt(a,b) euklid(a,b): { // Beginn einer Sequenz if (a ==0) // Bedingter Verarbeitungsschritt return b; // Elementarer Verarbeitungsschritt while ( b >0) // Wiederholung { // Beginn einer Sequenz if (a>b) // Bedingter Verarbeitungsschritt a=a-b; // Elementarer Verarbeitungsschritt else // Bedingter Verarbeitungsschritt b=b-a; // Elementarer Verarbeitungsschritt } // Ende einer Sequenz return a; // Elementarer Verarbeitungsschritt } // Ende einer Sequenz 22/44

Code 23/44

Alternativer Ablauf nach Originalformulierung m = AB = 11 n = CD = 4 0 Rechenschritte 24/44

Alternativer Ablauf nach Originalformulierung r = 7 = 11 n n = CD = 4 1 Rechenschritt 24/44

Alternativer Ablauf nach Originalformulierung r = 3 = 7 n n = CD = 4 2 Rechenschritte 24/44

Alternativer Ablauf nach Originalformulierung m = 3 r = 1 = 4 m 3 Rechenschritte... 24/44

Beobachtung AB = 11 = 2 CD + 3 AB : CD = 11 : 4 = 2 8 3 Die Modulo-Berechnung liefert den Rest nach Teilung. Wir schreiben 11 mod 4 = 3...... und programmieren int rest = 11 % 4; 25/44

Ablauf mit Modulo m = AB = 11 n = CD = 4 0 Rechenschritte 26/44

Ablauf mit Modulo r = 3 = 11 mod n n = CD = 4 1 Rechenschritt 26/44

Ablauf mit Modulo m = 3 r = 1 = 4 mod m 2 Rechenschritte 26/44

Ablauf mit Modulo r = 0 = 3 mod n = m = n = 1 n = 1 ggt (11, 4) = 1 Abbruch bei Rest 0! 3 Rechenschritte 26/44

Caveat Die Zählung von Rechenschritten ist stark vereinfachend! Tatsächlich dauert die Berechnung einer Teilung (bzw. einer Modulo-Operation) erheblich länger als eine Differenz! 27/44

Implementierung via Modulo Input: Natürliche Zahlen a,b Output: ggt(a,b) euklid modulo(a,b): { while ( b!= 0) { int rest = a%b; a = b; b = rest ; } return a; } 28/44

Code 29/44

Rekursion Funktionen rufen sich selbst wieder auf, nachdem die Parameter geändert wurden. Abbruchbedingungen beenden diese Kette von Aufrufen. Beispiel: Addition der Zahlen m bis n 30/44

Iterative Variante Input: Natürliche Zahlen m,n Output: Summe der Zahlen m bis n summe iterativ(m,n): { int wert = 0; for ( int i = m; i <= n; ++i) wert += i; return wert ; } 31/44

Rekursive Variante Input: Natürliche Zahlen m,n Output: Summe der Zahlen m bis n summe rekursiv(m,n): { if (m > n) return 0; else return m + summe_rekursiv ( m +1, n); } 32/44

Aufrufkette summe rekursiv(2, 4) +(0) 2 + summe rekursiv(3, 4) 2 + 3 + summe rekursiv(4, 4) 2 + 3 + 4 + summe rekursiv(5, 4) 2 + 3 + 4 + 0 +(0) 2 + 3 + 4 +(0) 2 + 7 +(0) 9 +(0) 33/44

ggt mit Rekursion Mittels dreier Eigenschaften läßt sich der ggt rekursiv berechnen: ggt(ab, cd) = ggt(cd, ab) (1) ggt(ab, cd) = ggt(ab, cd mod ab) (2) ggt(ab, cd) = ggt(ab, cd + λ ab) (3) 34/44

Implementierung via Rekursion Input: Natürliche Zahlen a,b Output: ggt(a,b) euklid rekursiv(a,b): { if (b ==0) return a; else if (a ==0) return b; else if (a>b) return euklid_rekursiv (a-b, b); else return euklid_rekursiv (a, b-a); } 35/44

Implementierung via Rekursion und Modulo Input: Natürliche Zahlen a,b Output: ggt(a,b) euklid rekursiv modulo(a,b): { if (b ==0) return a; else return euklid_rekursiv_modulo (b, a%b); } 36/44

Apropos... ggt via Primfaktorzerlegung? 37/44

Code 38/44

Zusammenfassung Feststellung: Unterschiedliche Algorithmen für die selbe Aufgabe Angenommen eine Aufgabe sei gegeben (z.b.: Automatisierte Sortierung von Paketen) Welche Algorithmen eignen sich hierzu? Welche Unterschiede gibt es Welcher Algorithmus eigenen sich am besten? 39/44

Natürliche Zahlen in C-ähnlichen Sprachen Natürliche Zahlen In Computern verwendet man Binärdarstellung mit einer fixen Anzahl Ziffern (genannt Bits). Die primitiven Datentypen für natürliche Zahlen sind: 8 Bits (ein Byte), darstellbare Zahlen: {0,..., 255} in C: unsigned char 16 Bits, darstellbare Zahlen: {0,..., 65535} in C: unsigned short 32 Bits, darstellbare Zahlen: {0,..., 4294967295} in C: unsigned long 64 Bits, darstellbare Zahlen: {0,..., 2 64 1} in C: unsigned long long 40/44

Ganze Zahlen in C-ähnlichen Sprachen Ganze Zahlen Die primitiven Datentypen für ganze Zahlen sind: 8 Bits: unsigned char {0,..., 255} signed char { 128,..., 127} 16 Bits: unsigned short {0,..., 65535} signed short { 32768,..., 32767} 32 Bits: unsigned long {0,..., 2 32 1} signed long { 2 31,..., 2 31 1} 64 Bits: unsigned long long {0,..., 2 64 1} signed long long { 2 63,..., 2 63 1} signed kann weggelassen werden (ausser bei char!) unsigned int und signed int sind je nach System 16, 32 oder 64 Bit 41/44

Überlauf Überschreitung des für einen Datentyp definierten Bereichs zum Beispiel durch Addition zweier Zahlen: 8 Bit signed char a und b a = 120 (01111000), b = 8 (0001000) a + b = 128(10000000) > 127 Ergebnis: a + b = 128 da 128 = (128 modulo 256) 256 42/44

Überlauf Am 4. Juni 1996 startete die ESA eine unbemannte Rakete. 40 Sekunden nach dem Start explodierte die Ariane 5. Verlust ca. 500 Millionen Dollar. Entwicklungskosten ca. 7 Milliarden Dollar. Ursache für den Absturz: Der Bordcomputer stürzte 36.7 Sek. nach dem Start ab als er versuchte, den Wert der horizont. Geschwindigkeit von 64 Bit Gleitkommadarstellung in 16 Bit signed Integer umzuwandeln. Die entsprechende Zahl war grösser als 2 15 = 32768 und erzeugte einen Overflow. https://www5.in.tum.de/~huckle/bugs.html 43/44

Code 44/44