Hochschule RheinMain - Fachbereich DCSM
Algorithmen und Datenstrukturen Praktikum
Angewandte Informatik: LV 2122
Wirtschaftsinformatik: LV 2122
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 2
Hochschule RheinMain - Fachbereich DCSM
Organisatorisches
Organisatorisches
• ADS-Vorlesung
– Gemeinsam für AI und WI
– Verwendet Pseudo-Code (sprach-neutral, an „C“ angelehnt) – Erwartet Einführung einer zweiten Computersprache für
Praktikumsaufgaben
• Praktikumsgruppen Angewandte Informatik
– Konkrete Implementierungssprache: „C“
– Bereitet u.a. auf LV „Betriebssysteme“, „Computergrafik“ u.a.
hardware-nahe Einsatzgebiete vor
• Praktikumsgruppen Wirtschaftsinformatik
– Konkrete Implementierungssprache: „Ruby“
– Bereitet auf LV „Webbasierte Anwendungen“ und einige Wahlpflicht-
Fächer vor
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 4
Organisatorisches
• Die Sprache Ruby
– Eigenwerbung: „A programmer‘s best friend“
– Eine der ca. 10 am meisten verbreiteten Computersprachen
– Konzeptionell besonders „sauber“, daher zum Lernen besonders geeignet
– Grundlage des bekannten Frameworks „Rails“ zur Erzeugung Web- basierter Anwendungen LV „WBA“ im kommenden Semester!
– Eine Skriptsprache
• Keine Compilerläufe notwendig, besonders kurzer Entwicklungs-Zyklus
• Auf Entwickler-Effizienz, nicht Hardware-Effizienz optimiert:
Programme laufen nicht so schnell wie C- oder Java-Programme, aber sie lassen sich erheblich leichter schreiben!
– Eine Hochsprache
• Viele komfortable Features bereits eingebaut
• Aufgaben-orientierte, nicht maschinen-orientierte Arbeitsweise
– Eine „multi-paradigm“-Sprache: Im Kern objekt-orientiert, aber mit
imperativen, funktionalen und deklarativen Möglichkeiten!
Organisatorisches
• Spielregeln zum Praktikum
– Eigene Studienleistung, geht zu 30% in die Modulnote ein – Ca. 12 Termine (Vorsicht – Feiertage)
– 75%-Regel: Wer mehr als 25% der Termine verpasst, kann das Praktikum nicht bestehen – unabhängig vom Grund.
• Auch Atteste nützen deshalb nichts
• Versäumen Sie daher nicht mehr als 2 Termine!
– Es wird 10 Übungsblätter geben
• Einzeln bearbeiten (keine Gruppenarbeit)
• Abnahmen erfolgen durch Tutoren & Dozenten
– Lösungen werden vorgeführt
• Jede(r) kommt ca. 3 x an die Reihe
• Das Los entscheidet, wer welche Aufgabe erhält
• (n+1)-tes Vorrechnen erst wenn alle n-mal an der Reihe waren
• Die Leistungen werden bepunktet Grundlage der Pr.-Note!
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 6
Hochschule RheinMain - Fachbereich DCSM
Ruby
Ruby
• Aktuelle Version:
– Ruby 2.1
– Für den Kurs ausreichend: Ruby 2.0
• Auf allen Plattformen verfügbar
– Auf i/OS standardmäßig installiert
– Unter Linux bei Bedarf leicht als Paket nachinstallierbar – Auch unter Windows, aber dort nicht empfohlen
• Empfehlung für Windows-Anwender
– Virtuelle Maschine mit Linux installieren
– Beispiel: Ihr Dozent verwendet Oracle VirtualBox unter Windows 7/64
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 8
Ruby
• Hilfreiche Werkzeuge (Teile der Ruby-Installation)
– irb Interactive Ruby Shell – ri Online Manual
– gem Rubys Paketverwaltung
– rdoc Zur Erzeugung von Online-Dokumentation (vgl. javadoc)
Ruby
• Zum Selbststudium
– https://www.ruby-lang.org/de/documentation/ruby-from-other-languages/
– https://www.ruby-lang.org/de/documentation/ruby-from-other-languages/to- ruby-from-java
– https://www.ruby-lang.org/de/documentation/quickstart
• Sprach-Referenz
– https://www.ruby-lang.org/de/documentation/
• Standard-Lehrbuch
– „Programming Ruby 1.9 & 2.0“, Dave Thomas, Andy Hunt, Chad Fowler, Pragmatic Bookshelf, 2013. ISBN 978-1-93778-549-9
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 10
Ruby vs. Pseudo-Code
• Sequenz
Anweisung1;
Anweisung2;
Anweisung3;
• Verzweigung if (B) {
ja-Teilalgorithmus;
} else {
nein-Teilalgorithmus;
}
• Sequenz
Anweisung1; Anweisung2 Anweisung3
(Mehrere Anweisungen pro Zeile erlaubt, Komma darf am
Zeilenende fehlen)
• Verzweigung if B
ja-Teilalgorithmus else
nein-Teilalgorithmus end
(Runde Klammern um B optional, geschweifte Klammern entfallen, Schlüsselwort „end“ am Block- Ende)
Ruby vs. Pseudo-Code
• Fallunterscheidung switch (A) {
case1:
{Teilalgorithmus1;}
break;
case2:
{Teilalgorithmus2;}
break;
default:
{Default-Teil- algorithmus;}
}
• Fallunterscheidung case A
when cond1
Teilalgorithmus1
when cond2, cond2a, cond2b Teilalgorithmus2
else
Default-Teilalgorithmus end
(Runde Klammern um B optional,
„case“ statt „switch“, „when“ statt
„case“, KEIN „break“ (implizit!), Aufzählungen von Bedingungen möglich, „else“ statt „default“, geschweifte Klammern entfallen, Schlüsselwort „end“ am Block- Ende)
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 12
Ruby vs. Pseudo-Code
• Abweisende Schleife while (B) {
TeilalgorithmusS;
}
• Nicht abweisende Schleife do {
TeilalgorithmusS;
} while (B);
• Abweisende Schleife while B do
TeilalgorithmusS end
(Runde Klammern um B optional, do…end statt geschweifte
Klammern)
• Nicht abweisende Schleife begin
TeilalgorithmusS end while B
(Runde Klammern um B optional, begin…end statt geschweifte Klammern)
• Bem.:
– Ruby kennt auch „until“
Ruby vs. Pseudo-Code
• Zählschleife
for (i = Start to Ende) { TeilalgorithmusS;
}
• Zählschleife
for i in Start..Ende TeilalgorithmusS end
(„Start..Ende“ ist ein „Bereich“ engl.
„Range“. „Range“ ist in Ruby eine eigene Klasse)
• Zählschleife (Iterator)
(Start..Ende).each do |i|
TeilalgorithmusS end
(Start..Ende).each { |i|
TeilalgorithmusS }
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 14
Ruby vs. Pseudo-Code
• Vorlesungsbeispiel „merge-Op.“, Pseudo-Code
F = leere Folge;
while ((F1 nicht leer) && (F2 nicht leer)) { if (Anfangselement von F1 ist kleiner als
Anfangselement von F2) { t = Anfangselement von F1;
lösche Anfangselement von F1;
}
else {
t = Anfangselement von F2;
lösche Anfangselement von F2;
}
hänge t an F an;
}
hänge eine evtl. verbliebene Restfolge an F an;
return F;
Ruby vs. Pseudo-Code
• Vorlesungsbeispiel „merge-Op.“, Ruby-Code
# Eingabe: Zwei sortierte Folgen f1 und f2
# Ergebnis: Sortierte Folge f, bestehend aus den Elementen von f1 u. f2
f = [] # Variablen in Kleinbuchstaben, []=Array
while !f1.empty? && !f2.empty? # Hilfreiche Array-Methode „empty?“
if f1.first < f2.first # auch: if f1[0] < f2[0]
t = f1.shift # „shift“ liefert und entfernt erstes Element von f1 else
t = f2.shift end
f << t # Hängt Element t an Array f hinten an end
f += f1 + f2 # „+“ von Klasse „Array“ verkettet Arrays return f # optional
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 16
Ruby vs. Pseudo-Code
• Vorlesungsbeispiel „merge-Op.“, Ruby-Code (Variante)
# Eingabe: Zwei sortierte Folgen f1 und f2
# Ergebnis: Sortierte Folge f, bestehend aus den Elementen von f1 u. f2
f = []
while !f1.empty? && !f2.empty?
f << (f1.first < f2.first) ? f1.shift : f2.shift end
f += f1 + f2
• Freiwillige Übung
Implementieren Sie „merge“ in Java
Aufgabe
• Ziel
– Prozedurales, zahlenorientiertes Arbeiten mit Ruby und der Kommandozeile lernen
– Hier: Ermittlung von Einkommensteuer-Werten
• Material, Hinweise:
– Angaben aus der Kommandozeile erhalten Sie im Programm über die Array-artige Konstante ARGV
– Berechnungsgrundlagen zum Einkommensteuertarif finden Sie z.B.
hier:
http://de.wikipedia.org/wiki/Einkommensteuertarif– Formal erhalten Sie die Einkommensteuer-Funktion durch Integration
des Grenzsteuersatzes. In der Praxis läuft das auf Addition von ein
paar Trapez- und Rechteckflächen hinaus.
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 18
Aufgabe
• Implementieren Sie folgende Methoden/Funktionen:
def grenzsteuersatz(zve) --> aFloat
# Berechnet den Grenzsteuersatz aus dem gegebenen
# zu versteuernden Einkommen
# Beispiele:
# grenzsteuersatz(8354.0) # --> 0.14
# grenzsteuersatz(10000.0) # --> 0.1722 end
def ek_steuer(zve) --> aFloat
# Berechnet die zu zahlende Einkommensteuer aus dem
# gegebenen zu versteuernden Einkommen
# Beispiele:
# ek_steuer(8354.0) # --> 0.0
# ek_steuer(10000.0) # --> 256.92 end
Aufgabe
Testen Sie nun diese Funktionen
• Ergänzen Sie Code, der ein, zwei oder drei Zahlen von der Kommandozeile entgegen nimmt und deutet als
– zvE bzw.
– zvE1, zvE2 bzw.
– zvE1, zvE2, zvE_increment
$ ./01-eksteuer.rb 10000
(Ausgabe von EK-Steuer und Grenzsteuersatz)
$ ./01-eksteuer.rb 10000 20000
(Ausgabe von zvE, EK-Steuer und Grenzsteuersatz in Tabellenform, hier:
zwei Zeilen)
$ ./01-eksteuer.rb 10000 30000 2000
(Ausgabe von zvE, EK-Steuer und Grenzsteuersatz in Tabellenform, hier:
11 Zeilen)
21.03.2014 © 2014 H. Werntges, FB Design Informatik Medien (DCSM), Hochschule RheinMain 20
Aufgabe
Abschlussteil
• Jemand weist 2000 € Werbungskosten (über Pauschale) nach, z.B. für diverse Ausgaben für Fahrtkosten, Fachbücher und Rechner-Hardware.
• Berechnen Sie, wie viel Einkommensteuer er spart bzw. wie viel er
„netto“ (also unter Berücksichtigung der eingesparten EK-Steuer) bezahlt
– bei 5000, 10000, 20000, und 50000 EUR zu versteuerndem Einkommen
• Hinweis:
– Ihr Programm soll diese Angaben in einer each-Schleife ausgeben, die eine Liste der o.g. zvE-Werte iteriert.
Organisatorisches
• Die Aufgabe dient Ihnen als Ziel während Ihrer Einarbeitung in Ruby
• Sie wird nicht bepunktet, aber es wird eine kurze Abnahme geben
– Sie sollten also nach einer Woche (mehr oder weniger) lauffähigen Code vorzeigen können