Programmierbeispiel DB 2

Das Programm über die Bahnhöfe der DB  noch in Python 3.5:

from tkinter import *

#Klasse Bahnhof
class Bahnhof(object):
    def __init__(self, name, breite, laenge):
        self.name = name
        self.breite = float(breite)
        self.laenge = float(laenge)

    def isHbf(self):
        if self.name.find("Hbf")>-1:
            return True
        return False


#Parsen der csv-Datei und Erzeugen der Bahnhöfe
import csv
alleBahnhoefe = []
reader = csv.reader(open("DB_2016.csv"),delimiter=';')
for row in reader:
    alleBahnhoefe.append(Bahnhof(row[2],row[4],row[5]))

#Bestimmen der max/min Breiten und Längen
maxLaenge = 0
for curBahnhof in alleBahnhoefe:
    if curBahnhof.laenge>maxLaenge:
        maxLaenge=curBahnhof.laenge

minLaenge = 10000000
for curBahnhof in alleBahnhoefe:
    if curBahnhof.laenge<minLaenge:
        minLaenge=curBahnhof.laenge

maxBreite = 0
for curBahnhof in alleBahnhoefe:
    if curBahnhof.breite>maxBreite:
        maxBreite=curBahnhof.breite

minBreite = 10000000
for curBahnhof in alleBahnhoefe:
    if curBahnhof.breite<minBreite:
        minBreite=curBahnhof.breite


#Zeichnen der Punkte
master = Tk()
canvas_width = 600
canvas_height = 600
w = Canvas(master, width=canvas_width,height=canvas_height)
w.pack()

#Normale Bahnhöfe in Blau
for curBahnhof in alleBahnhoefe:
    actLaenge = (canvas_width) / (maxLaenge-minLaenge) * (curBahnhof.laenge-minLaenge);
    actBreite = (canvas_height) / (maxBreite-minBreite) * (curBahnhof.breite-minBreite);
    actX = int(actBreite);
    actY = int(canvas_height-actLaenge);
    w.create_oval(actX,actY, actX+5,actY+5, fill="#000000")

#Hauptbahnhöfe in Rot mit Namen (Ersten beiden Buchstaben)
for curBahnhof in alleBahnhoefe:
    actLaenge = (canvas_width) / (maxLaenge-minLaenge) * (curBahnhof.laenge-minLaenge);
    actBreite = (canvas_height) / (maxBreite-minBreite) * (curBahnhof.breite-minBreite);
    actX = int(actBreite);
    actY = int(canvas_height-actLaenge);
    if curBahnhof.isHbf():
        w.create_oval(actX,actY, actX+5,actY+5, fill="#ff0000")
        w.create_text(actX+5,actY+5,text=curBahnhof.name[:2], fill="#ff0000")

mainloop()

Programmieren lernen

Da in der Schule das Programmieren selten über den Stand des Anfangsunterricht herauskommt, spielen reduzierte Entwicklungsumgebungen eine große Rolle im Unterricht. Bei diesen IDEs muss man sich oft nicht um irgendeinen syntaktischen Kleinkram kümmern, sondern kann ganz einfach die gewünschten Elemente hin und her ziehen oder es werden entsprechende Element automatisch ergänzt.

Ein typischer Vertreter ist seit Jahren das Programm Karol. Das Programm ist bereits so alt, dass als Mindestanforderung immer noch Win95 genannt wird. Dennoch wird es immer noch in allen bayerischen Schulen eingesetzt und ist auch ein fester Bestandteil in jedem Informatikbuch in Bayern.

Später tauchte dann Scratch auf und es entbrand ein Streit zwischen den Informatiklehrern in Bayern, welches Programm denn nun besser sei. Gewonnen hat diesen Streit keiner. Die Uni Passau hat aber mal herausgefunden, dass die Reihenfolge “erst Karol und dann Scratch” besser sei als andersrum. Nach Scratch hat einfach keiner mehr Lust auf das dröge Karol.

Ich für meinen Teil benutze ganz gerne noch Kara von der ETH Zürich, da der Käfer nicht nur in Java, Ruby oder JavaScript programmiert werden kann, sondern auch mit Hilfe von endlichen Automaten und damit quasi grafisch. Außerdem sind in die Software viele Aufgaben mit Lösungen integriert, so das der Lehrer kaum was zu tun hat. Er schlendert im Computerraum herum und hilft den Schüler bei der Löung der Aufgaben.
Und man kann mehrere Karas gleichzeitig laufen lassen und so das Steuern von parallelen Prozessen üben.

Lego kann man ebenfalls grafisch programmieren, wobei ich von der normalen grafischen Programmieroberfläche nur abraten kann. Die Programmierumgebung basiert, glaube ich, auf der Software LabVIEW und ist kaum vernünftig zu benutzen. Meistens werden die Programme sehr schnell sehr groß und Fehler sind nur schlecht zu finden. Zumindest tun sich meine Schüler in der Lego AG da sehr schwer. Auch ich kämpfe mit der Verschaltung der Elemente und hoffe, dass die Anbindung der open-Roberta-Initiative des Fraunhofers-Instituts an die Lego-Roboter bald stabiler wird. Open-Roberta orientiert sich einfach viel stärker an der erfolgreichen Oberfläche von Scratch.

Aber wie der der Titel des Beitrags schon angedeutet hat, kann man nicht nur Roboter  programmieren. Ein verhältnismäßig neues Feld ist das Erstellen bzw. Programmieren von Musik. Vor ein paar Wochen entdeckte ich da für mich die Software SonicPI und jetzt noch PureData.

PureData halte ich dabei nicht wirklich für den Anfangsunterricht geeignet, da das Konzept mit der Vedrahtung von Oszillatoren, Amplifiern, Filtern etc. dann doch recht merkwürdig ist. SonicPI ist da ein wenig einfacher gestrickt, aber auch alles andere als trivial – leider. Immerhin kann man einfach Töne, Lautstärke und Pausen einfach eingeben und so versuchen neue Melodien zu erzeugen oder bekannte Melodien nachzuprogrammieren. Wer Entwicklungsumgebungen noch nicht kennt, sollte diese unbedingt mal ausprobieren. Denn immerhin hätte man so die Möglichkeit die unterschiedlichsten Interessen der Schüler abzudecken.

Später kann man dann alles kreativ miteinander verbinden:

Programmierbeispiel DB

Diese Woche sah ich von einem meiner Lieblingsinformatikprofessoren Jörn Loviscach ein Video bei dem er die Bahnhöfe der DB grafisch darstellte.

Allein die Tatsache, dass die DB solche Daten rausgibt, finde ich spannend. Ich hätte gedacht, dass so etwas geheim ist, weil sogar die genauen geografischen Koordinaten mit angegeben werden. Und nicht nur die Bahnhöfe werden publik gemacht, es gibt auch noch weitere Daten in den unterschiedlichsten Formaten zum Herunterladen . Vielleicht kann ich davon etwas in der 11. Klasse Informatik (Thema Bäume und Graphen) ja verwenden: data.deutschebahn.com/datasets/

Am liebsten hätte ich ja das Streckennetz für Graphen-Algorithmen genommen, aber das liegt nur im XML bzw. GEOjson-Format vor. Da ich diese Formate in Java noch nie eingelesen habe, habe ich auch “nur” die Bahnhöfe genommen. Für die anderen Dateiformate gibt es bestimmt irgendwelche Libraries, die ich mir aber erst mal selber zusammengoogeln muss.

Mein Ergebnis sieht dann so aus:

Bildschirmfoto 2016-04-23 um 10.51.56

Leider hatte ich Probleme die Umlaute der Namen richtig darzustellen. Ich habe alles an Formaten (UTF-8, UTF-16, Iso Latin 1, Windows Latin 1, …) probiert, was mein Programm TextWrangler hergibt, aber ich fand kein passendes Format.

Zum Darstellen habe ich wieder die Klasse ZEICHENFENSTER benutzt, die ich mal irgendwann bei einer Forbildung bekommen habe. Warum hat sich eigentich keiner an die Konvention gehalten nur Konstanten in reine Großbuchstaben zu schreiben? Naja, ich habe mich im Quelltext auch nicht dran gehalten, da in der csv-Datei die Spaltenbeschriftungen in Großbuchstaben waren und ich keine Lust zum Abtippen hatte.

Anders als im Video muss die Berechnung der Koordinaten der Bildpunkte anders erfolgen, da der Ursprung meines Koordinatensystems oben links liegt. Auch Tooltipps habe ich nicht umgesetzt.

Hier der Code zum Herunterladen und weiterspielen. Die csv-Datei habe ich direkt in den Ordner gelegt gehabt und in “DB_2016.csv” umbenannt. Die erste Zeile muss dabei gelöscht werden, da dort die Spaltenbeschriftungen drin stehen. (Aus rechtlichen Gründen, habe ich diese Datei nicht mitgezippt): DB_Haltestellen

Durch die weitere Nutzung der Seite (Scrollen, Navigieren) stimmen Sie der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen