Ich habe mir gedacht, eine Reihe mit kleinen Aufgaben herauszubringen, die sich auch/gerade von Anfängern gut bewältigen lassen (und sich speziell an diese richten ) und auch eine schöne Übung für die "frischerlernte" Programmiersprache darstellen sollten.
Die Aufgaben bauen aufeinander auf und werden am Ende zusammengesetzt, so dass scheinbar aus "Nichtigkeiten" ein doch recht solides Programm entsteht, worauf man dann als Programmieranfänger durchaus stolz sein kann .
Das bringt 1) ein bisschen Motivation und 2) verdeutlicht nochtmal das Prinzip von "divide and conquer".
http://de.wikipedia.org/wiki/Teile_und_herrsche
Teilaufgabe1: setze einen Stack um.
Stack ist eine Struktur, die Informationen speichern und ausgeben kann - und zwar nach dem Prinzip "Zuerst rein, zuletzt raus". Bildlich kann man es sich mit einem Stapel Karten vorstellen: man nimmt eine Karte, legt sie auf den Tisch, legt die nächste darauf usw. Um jetzt an eine bestimmte Karte zu kommen, muss man alle vorherigen vom Stapel wegnehmen.
http://de.wikipedia.org/wiki/Stapelspeicher
Es klingt komplizierter als es ist
Vorgabe:
für Freunde der prozeduralen Programmierung (C,Pascal oder wer prozedural mit Java/C++/C# programmiert):
setze folgende Funktionen um (Parameternamen sowie Übergabe nur als Vorschlag):
push(ein_stack,elem) - legt ein übergebenes Element "elem" auf dem Stack "ein_stack" ab.
pop (ein_stack) - gibt das zuletzt auf dem Stack "ein_stack" abgelegte Element zurück. Dabei wird dieses Element vom Stack entfernt
top(ein_stack) - gibt das zuletzt auf dem Stack "ein_stack" abgelegte Element zurück, ohne dieses Element zu entfernen.
isEmpty - gibt zurück, ob der Stack leer ist (z.B als Boolean Wert)
Es sollte also möglich sein, ein Element in einen bestimmten Stack einzufügen und wieder abzufragen/entfernen.
Die Objectorientierten unter euch sollten dann eine Klasse Stack umsetzen, die dieselben Methoden bietet (also Element einfügen, wegnehmen usw.)
Es sollte aufjedenfall möglich sein, mehrere Stacks gleichzeitig im Programm zu benutzen.
Versucht dabei möglichst allgemein zu bleiben, so dass der "Stackinhalt" Datentypunabhängig ist bzw. schnell an einen neuen Typ angepasst werden kann.
Wenn es noch zu schwer ist: Im Stack sollten Ziffern abgelegt werden können.
Als Test sollte euere Anwendung eine kleine Zahlenreihe einlesen und dann rückwärts ausgeben können.
Bsp:
1,2,3,4,5 Einlesen
5,4,3,2,1 Ausgeben
Die Aufgaben bauen aufeinander auf und werden am Ende zusammengesetzt, so dass scheinbar aus "Nichtigkeiten" ein doch recht solides Programm entsteht, worauf man dann als Programmieranfänger durchaus stolz sein kann .
Das bringt 1) ein bisschen Motivation und 2) verdeutlicht nochtmal das Prinzip von "divide and conquer".
http://de.wikipedia.org/wiki/Teile_und_herrsche
Teilaufgabe1: setze einen Stack um.
Stack ist eine Struktur, die Informationen speichern und ausgeben kann - und zwar nach dem Prinzip "Zuerst rein, zuletzt raus". Bildlich kann man es sich mit einem Stapel Karten vorstellen: man nimmt eine Karte, legt sie auf den Tisch, legt die nächste darauf usw. Um jetzt an eine bestimmte Karte zu kommen, muss man alle vorherigen vom Stapel wegnehmen.
http://de.wikipedia.org/wiki/Stapelspeicher
Es klingt komplizierter als es ist
Vorgabe:
für Freunde der prozeduralen Programmierung (C,Pascal oder wer prozedural mit Java/C++/C# programmiert):
setze folgende Funktionen um (Parameternamen sowie Übergabe nur als Vorschlag):
push(ein_stack,elem) - legt ein übergebenes Element "elem" auf dem Stack "ein_stack" ab.
pop (ein_stack) - gibt das zuletzt auf dem Stack "ein_stack" abgelegte Element zurück. Dabei wird dieses Element vom Stack entfernt
top(ein_stack) - gibt das zuletzt auf dem Stack "ein_stack" abgelegte Element zurück, ohne dieses Element zu entfernen.
isEmpty - gibt zurück, ob der Stack leer ist (z.B als Boolean Wert)
Es sollte also möglich sein, ein Element in einen bestimmten Stack einzufügen und wieder abzufragen/entfernen.
Die Objectorientierten unter euch sollten dann eine Klasse Stack umsetzen, die dieselben Methoden bietet (also Element einfügen, wegnehmen usw.)
Es sollte aufjedenfall möglich sein, mehrere Stacks gleichzeitig im Programm zu benutzen.
Versucht dabei möglichst allgemein zu bleiben, so dass der "Stackinhalt" Datentypunabhängig ist bzw. schnell an einen neuen Typ angepasst werden kann.
Wenn es noch zu schwer ist: Im Stack sollten Ziffern abgelegt werden können.
Eine einfache Möglichkeit wäre es, einen Array zu betrachten:
Code:
Anfang Ende
| |
v v
+--+--+--+--+--+---+
|L |E |E |R | | |
+--+--+--+--+--+---+
Wir können in einem Array Daten ablegen. Wenn wir einen Zähler
haben, können wir z.B mitzählen wie oft etwas eingefügt bzw. wieder entnommen
wurde und gleichzeitig würde dieser auch auf die Position im Array zeigen, in dem
das aktuell oberste Element zu finden ist. Also bei jedem Push den Zahler um 1
erhöhen und bei jedem Pop um 1 erniedrigen. Beim "Top" machen wir nichts mit dem
Zähler und beim "isEmpty" müssen wir nachschauen, ob der Zähler >0 ist (oder einer
bestimmten Zahl ;) )
Bsp:
Programmstart:
setzte zaehler=-1;
push(6) -> zaehler=zaehler+1 (also Zaehler=0);
array[zaehler]=6;
+--+--+--+--+--+---+
|6 | | | | | |
+--+--+--+--+--+---+
^
| Zähler
Push(8) -> Zaehler=Zaehler+1 (also = 1);
array[zaehler]=8
Push(9)-> Zaehler=Zaehler+1 (also = 2)
array[zaehler]=9
+--+--+--+--+--+---+
|6 |8 |9 | | | |
+--+--+--+--+--+---+
^
pop(); ->Zaehler=Zaehler-1 (also wieder 1);
+--+--+--+--+--+---+
|6 |8 |9 | | | |
+--+--+--+--+--+---+
^
top() -> rückgabe=array[zaehler] (also array[1]=rückgabe = 8)
Allerdings - hier müsstet ihr noch unbedingt eine Übrprüfung einbauen, um micht mehr
Elemente einfügen zu können, als Plätze im Array vorhanden sind.
z.B per isFull() abfragen können oder in der Push() Funktion eine Überprüfung
durchführen (if (Zaehler<Array_size) zaehler=zaehler+1;
Als Test sollte euere Anwendung eine kleine Zahlenreihe einlesen und dann rückwärts ausgeben können.
Bsp:
1,2,3,4,5 Einlesen
5,4,3,2,1 Ausgeben