Wie am besten für Programmier-Klausur vorbereiten?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Das, was du machst, nennt sich Tastenhacken (sprich es auch deutsch aus) und auf kurz oder lang produzierst du so Bananensoftware. Dies sei dir im Spaß gesagt, aber trifft es auch auf den Punkt. Programmierung bedeutet etwas anderes. Du musst lernen, wie man Probleme aufstellt, sie unterteilt und dann einen/mehrere Algorithmen dazu schreibt. Das Prinzip, wonach du dich zuerst einmal orientieren solltest, ist das Prinzip von Teile und Herrsche.

Das Problem wird zuerst in möglichst kurzer Form (max. 3 Sätze) beschrieben und dann in Teilprobleme aufgeteilt. Diese Teilprobleme werden erneut aufgeteilt, so lange, bis jedes Problem für dich lösbar ist.

Ganz simples Beispiel: Du kennst eine Funktion, die einen Pixel mit Farbe füllt und sollst nun einen großen Bereich mit verschiedenfarbigen Vierecken befüllen (größer als 1x1 Pixel). So könntest du dir nun die Frage stellen: Wie zeichne ich überhaupt ein Viereck?

  • Indem ich mehrere Reihen zeichne.
  • Wie zeichne ich eine Reihe?
  • Indem ich mehrere Zellen zeichne.

Dieses Prinzip musst du schlichtweg üben. Nur davon zu wissen, reicht nicht aus. Ganz gute Übungsaufgaben für so etwas sind:

  • Sortieralgorithmen (Bubblesort, Quicksort, Selectionsort, ...)
  • Suchalgorithmen (binäre Suche, lineare Suche)
  • Dijkstra-Algorithmus
  • Conways Game Of Life
  • Parsen einfacher Rechenaufgaben (Grundrechenarten reichen völlig aus)
  • Vierecke/Dreiecke anhand angegebener Punkte erkennen
  • Eigene Datenaggregate entwickeln (mit add, remove): Stack, doppelt verkettete Liste, circular list, ...

Zuerst einmal ist es wichtig, dass du dir den Ablauf eines Algorithmus zusammenschreiben kannst, der ein Problem wie eines der obigen löst. Ob du diesen Algorithmus nun in Pseudocode, Stichpunkten oder als Aktivität darstellst, ist völlig egal. Beim Erstellen eines Algorithmus teilt man Probleme nicht nur auf, sondern man versucht zu abstrahieren und Schritt für Schritt eine Überführung in Pseudocode zu finden, der letzten Endes problemlos in die gewünschte Programmiersprache überführt werden kann. Eine direkte Übersetzung von Problem zu Sprache hingegen ist nicht das Ziel. Das schränkt dich unter anderem bereits ein, da du eher darauf fokusiert bist, wie du dein aktuelles Problem denn nun sprachlich umsetzen kannst.

Eine Seite, die dir womöglich beim Üben noch helfen kann, ist diese: http://codingbat.com/. Löse diese Aufgaben aber nicht am Computer, sondern auf Papier.


Kingworld 
Beitragsersteller
 22.01.2018, 22:02

Danke, jetzt weiß ich wo mein Problem liegt. Kennen Sie eventuell gute Bücher zu diesem Thema oder würde es reichen einfach nur zu üben ? Kann man mit dieser Methode jedes Problem lösen, weil bei manchen Problemen fühle ich mich aufgrund der Komplexität schon fast verloren(nicht mal einen Ansatz kriege ich hin).

0
regex9  22.01.2018, 22:17
@Kingworld
Kennen Sie eventuell gute Bücher zu diesem Thema oder würde es reichen einfach nur zu üben ?

Übung sollte ausreichen.

Gute Bücher in dt. Sprache lassen sich zu diesem Thema eher schwer finden, weshalb du auf englische Literatur zurückgreifen müsstest. Ich habe hier schon einmal Literatur zu dem Thema gelistet: https://www.gutefrage.net/frage/wie-kann-ich-sowas-in-c-machen?foundIn=list-answers-by-user#answer-269803492

Kann man mit dieser Methode jedes Problem lösen, (...)

Wohl nicht jedes. Es ist aber stets für einen Einstieg geeignet.

(...) weil bei manchen Problemen fühle ich mich aufgrund der Komplexität schon fast verloren (...)

Vielleicht kannst du ein Beispiel nennen?

0
Kingworld 
Beitragsersteller
 23.01.2018, 00:22
@regex9

Eines was mir schwer fiel war Tic-Tac-Toe zu programmieren. Ich wusste einfach nicht wo ich anfangen soll. Oft ist es auch so, dass wenn ich den Lösungsweg auf dem Blatt habe, ich es irgendwie nicht schaffe, das zu implementieren. Z.b. bei so Aufgaben, wo man irgendwelche Funktionen rekursiv berechnen soll oder andere mathematische Formeln implementieren soll: Ich hab dann meistens eine Idee, die zu 100% funktioniert, weil ich sie auf dem Blatt teste. Ich weiß dann aber nicht, wie ich es schaffe, dass das Programm eben genau das macht, was ich will. Oft ist es dann so, dass ich ein "grobes" Programm erstelle, von dem ich weiß, dass es irgendwie "so in die Richtung" funktionieren muss. Und dann kommt mal ein falsches Ergebnis und ich suche den Fehler, dann kommt wieder irgendein Error und ich suche den Fehler... und nach einer gewissen Zeit läuft das Programm dann fehlerfrei. Bei einfachen Sachen brauche ich nicht lang und da geht es meistens auch ziemlich fehlerlos. Werden die Probleme aber komplexer, verliere ich meistens den Überblick und meine Lösungsfindung sieht wie oben beschrieben aus.

0
regex9  23.01.2018, 11:08
@Kingworld

Bei komplexer Software kann man objektorientiert herangehen oder zumindest das Prinzip weitertreiben. So ist im ersteren Fall das Problem / in dem Fall das Spiel, in wenigen Sätzen zu beschreiben. Die reinen Subjekte im Satz kann man als Objekt herausschreiben, die Verben beschreiben Methoden oder Beziehungen zueinander. Die ermittelten Akteure kann man in ein Use-case-Diagramm setzen, um das System näher zu beschreiben. Ein Objektdiagramm lässt sich aufstellen, um die relevanten Objekte aufzulösen und ihre Beziehungen zueinander zu beschreiben.

In jedem Fall würde ich empfehlen, ein Ablaufdiagramm (Aktivität) anzulegen. Bei einem Spiel beschreibt dieses erst einmal den Spielablauf. Einzelne Schritte wie das Setzen eines Kreuzes sind Subprobleme bzw. Subprogramme.

Bei Rekursion kann man erst aufdröseln, was wiederholt werden soll (dies abstrahieren) und was die Abbruchbedingung ist. Vielleicht hilft auch erst eine iterative Skizzierung.

Auch bei mathematischen Formeln wird zerlegt und abstrahiert. Für einzelne Terme / mathematische Ausdrücke (Summe, Fakultät, Integral,, usw.) lassen sich einzelne Funktionen schreiben, die am Ende nur noch nacheinander aufgerufen werden.

0
regex9  23.01.2018, 11:20
@Kingworld
Ich weiß dann aber nicht, wie ich es schaffe, dass das Programm eben genau das macht, was ich will.

Die Programmiersprache selbst musst du natürlich können, jedoch hört sich dies eher so danach an, als hättest du in solchen Momenten deine Lösung noch nicht wirklich ausformuliert. Eine Richtung zu haben, ist noch keine Lösung. Das Beschreiben eines Algorithmus bewahrt dich davor, Ausnahmefälle u.ä. mit einzubeziehen, an die du sonst nicht denken würdest (selbst bei deinen bisher gefundenen Lösungen sind womöglich Ausnahmefälle nicht mit einbezogen worden).

Außerdem sorgt der Algorithmus für eine geordnetere, strukturiertere Implementierung. Nach und nach Bugfixing zu betreiben, raubt unnötig viel Zeit und das nachträgliche Dranklatschen von Code begünstigt ebenso neue Fehler und mehr Chaos.

Nach Aufstellen des groben Algorithmus wird dieser nach und nach präzisiert. Dies kannst du nach Notwendigkeit in mehrere Schritte aufteilen. So lange, bis dein Pseudocode fast 1-1 übersetzbar / übertragbar ist.

0
Kingworld 
Beitragsersteller
 25.01.2018, 00:06
@regex9

Danke nochmal für Ihre Hilfe

0

Trial and Error ist nicht so wirklich programmieren, wie regex9 schon schrieb.

Natürlich bastelt man schnell mal einen Syntaxfehler, oder manchmal fällt einem noch eine Nebenbedingung ein, die man zunächst vergessen hatte. Aber eigentlich entwirft man die Lösung für ein Problem udn setzt sie dann erst programmatisch um.

Was wir zu Schulzeiten noch gemacht haben: immer 2 Zeilen frei lassen, um noch mal eine vergessene Zeile einfügen zu können.

Sonst gibt es eben Scratchpages, also Schmierblätter - So oder so, das was der 'Debugger' tut, solltest Du eigentlich selbst machen, um die Fehler zu finden.

Und sonst, wie regex9 auch schon schrieb, das Problem in klassischer Top-Down-Manier gliedern, dann die Teilfunktionen sauber umsetzen und zusammenfügen.

Meistens beschränken sich solche Aufgaben eher auf "Fingerübungen".

Ich denke mal ihr müsst nicht wirklichen Python Code schreiben sondern eher pseudocode. Da es um den Algorithmus geht war auf jeden Fall in meiner Ausbildung so. Und pseudocode ist normalerweise nich wirklich klar definiert du hast also etwas Spielraum. Außerdem benutzt du dort nur die Grundlegenden Operatoren und nicht irgendwelche Klassen und Bibliotheken bei denen man sich erstmal informieren muss wie man diese benutzt.


tavkomann  22.01.2018, 23:25

Es gibt durchaus auch viele Universitäten und HAWs, an denen in einer richtigen Sprache auf einem Blatt Papier entwickelt wird, also nicht in Pseudocode. Sogar im Abitur an Gymnasien ist dies oftmals der Fall.

1