Lehrzeit

Schule & Informatik

Monat: Dezember 2014 (Seite 2 von 3)

Learning by doing

Mein Lieblings-Professsor hat mal wieder etwas auf seinem Blog geschrieben, dass ich für sehr wichtig halte: Programmieren zu lernen ist schwierig, dauert lange und hört nie auf.

Eigentlich das nichts neues. Aber ich erlebe immer wieder Schüler, die nichts tun, weil sie es ja verstanden haben. Kommen dann die Prüfungen und Projekten, so scheitern die Schüler, weil sie es nie gemacht haben. Es ist einfach anders als in der Mathematik. In Mathematik – zumindest in der Schule – kann man viel auch durch „bloßes verstehen“ schon können. Hat man das Verfahren der Polynomdivision verstanden, kann man es auch ohne Übung anwenden. Vielleicht nicht in allen denkbaren Fällen hundertprozentig und immer richtig, aber ein 2er kann da schon rauskommen. In der Informatik ist das anders. Informatik hat für mich eher etwas von Musik. Ich versuch mal einen Vergleich:

  1. Datentypen würden den Noten ensprechen
  2. Klassen wären vielleicht so etwas die Tonarten
  3. Programmstrukturen (Schleifen, Verzweigungen) könnten Akkorde sein
  4. Entwurfsmuster könnte man mit bestimmten Liedstrukturen oder Akkordfolgen zuordnen.

Aber selbst, wenn ich diese drei Dinge verstanden habe, kann man weder programmieren noch eine Lied komponieren.

Möchte man ein trauriges Lied komponieren, nimmt man z.B. die Akkordfolge I-IV-V-V und eine Molltonart ( autochord.com ). Bei A-Moll, der Moll-Parallelen zu C-Dur, wäre das dann Am-Dm-Em-Em. Aber deswegen habe ich immer noch keinen Hit und schon gar nicht unbedingt etwas trauriges. Mit I-IV-V fängt nämlich auch Waterloo von ABBA an ( hooktheory.com ).

Und selbst wenn man eine passende Akkordfolge/Entwurfsmuster/Klassenstruktur gefunden hat, hat man noch nicht die Melodie bzw. die Klassen mit all ihren Attributen und Methoden umgesetzt.

Prof. Bry schreibt auf seinem Blog im Übrigen:

Programmieren und programmieren lernen ist nicht zeitaufwändig, sondern sehr zeitaufwändig.(…)Das gilt für alle, junge, ältere, erprobte Programmierer und Anfänger – ohne Ausnahme.

(…)

Die Welt der Informatiker ist wie eine Reise durch eine viel multikulturelle Galaxie,(…)Der Reisende in der Programmier-Galaxie muss aber ständig lernen, wenn er seine Reise fortsetzen können möchte – ein Leben lang.

Ein anderer passender Vergleich wäre im Übrigen Kunst. Nur weil ich weiß, wie man einen Pinsel zu halten hat, welche Farben zusammenpassen, wie ein Bild aufgebaut wird, bin ich noch kein van Gogh.

Fremdsprachen bringe ich immer nur ungern als Vergleich, da Fremdsprachen viel mehr Vokabeln und Grammatikregeln haben als Computersprachen.

Prioritätswarteschlange – Teil 2

Im nächsten Teil soll es jetzt um das Umsetzen der Prioritätwarteschlange mit Hilfe Strategie-Entwurfmusters gehen. Wer dieses Entwurfmuster noch nicht kennt, kann sich zunächst mal auf der Internetseite von Philipp Hauer  die Beschreibung mal durchlesen. Anschließend gibt vielleicht noch den folgenden Film bei youtube und man ist fit…

…. dachte ich zumindest. Ich musste aber merken, dass das nicht so einfach ist und ohne eine fast vollständige Neuprogrammierung nicht mit der bestehende Datenstruktur zu machen ist.

Im Moment sieht mein Projekt so aus:

Bildschirmfoto 2014-12-07 um 12.30.55

Oben rechts kann man das Interface I_Append erkennen, von dem ich die zwei speziellen Varianten bzw. Strategien NormalQueueBehaviour und PriorityQueueBehaviour abgeleitet habe. Aber wem gebe ich jetzt diese Information? Den Listenelementen? Macht eigentlich Sinn. Diese bekommen ein Attribut I_Append einfuegeStrategie, wobei die Strategie dann passend zur Warteschlange angepasst wird.

Da sich weiter Abschluss und Knoten unterschiedlich verhalten müssen, sollte man die Strategien noch nach weiter aufteilen:

NormalQueueBehaviour_Abschluss, NormalQueueBehaviour_Knoten

PriorityQueueBehaviour_Abschluss, PriorityQueueBehaviour_Knoten

Da die Behaviour-Klassen aber nicht auf die Attribute von Knoten und Abschluss zugreifen können, muss die append-Methode die jeweiligen Knoten als Parameter bekommen. Das hat dann bei mir zu folgenden fehlerhaften Ansatz geführt:

public class PriorityQueueBehaviour implements I_Append {
    public void append(
        Listenelement prevListenlenlement,
        Listenelement curListenlenlement, 
        Listenelement nextListenelement, 
        Inhalt neuerInhalt, 
        int priority) {
            Listenelement neuerKnoten = new Knoten(neuerInhalt,priority);
            if (nextListenelement == null) { //Der Abschluss hat keinen Nachfolger
                prevListenlenlement = neuerKnoten; //da first übergeben wurde
            } else { //Ich bin in einem Knoten
               int nextPriority = nextListenelement.getPriority(); 
               if (priority <= nextPriority) { 
                   //Ein neuer Knoten muss eingefügt werden
                   neuerKnoten.setNext(nextListenelement);
                   curListenlenlement.setNext(neuerKnoten);
                } else {
                    //Aufruf an next weitergeben.                
                    nextListenelement.append(prevListenlenlement, neuerInhalt, priority, this); //this gibt die Einfuegestrategie weiter
                }                                                
            }
    }
}

Da die Informationen aber perValue und nicht perReferenz übergeben werden, funktionieren die Zuweisungen der Form

curListenlenlement.setNext(neuerKnoten);

zum Beispiel nicht.

Ein neuer Ansatz ist aus meiner Sicht, dass ich zum einen die Liste als doppeltverkettete Liste implementiere und so von jedem Knoten auf den Vorgänger und Nachfolger zugreifen kann. Und zum zweiten werde ich nur die Vergleichsfunktion als Strategie umsetzen und nicht den ganzen Einfüge-Ablauf.

Wenn ich Zeit finde, werde ich das noch umsetzen. Ich werde das Zusammen mit den Generics dann umsetzen.

Programmieraufgabe 70

Und abschließend zu den beiden vorangegangenen Aufgaben (Vorgänger1 , Vorgänger 2) soll das Programm nun wie folgt verändert werden:

Aufgabe

Ergänze das Programm so, dass die gesuchte Zeichenkette im Klartext eingegeben werden kann, in Morsezeichen umgewandelt wird und dann erst in einem Strom von Morsezeichen gesucht wird.

Ergänzen lässt sich das dann wunderbar dadurch, dass auch der zu durchsuchende Strom im Klartext per Copy-n-Paste irgendwo eingegeben wird und dann erstmal in Morsezeichen umgewandelt wird.

Das Thema bietet sich auch zum einen für Referate an – zumindest wenn man eine kleine Gruppe hat wie ich. Zum anderen kann man aber auch die Laufzeitanalyse in 12/2 damit bewältigen.

Ältere Beiträge Neuere Beiträge

© 2018 Lehrzeit

Theme von Anders NorénHoch ↑