# Hilfe für Schulprojekt



## CptCookielike (29. Dezember 2016)

Hallo 
ich komme gleich zum Thema ich habe Informatikleistungskurs in der Schule und brauche nun ein Projekt für eine Klausurersatzleistung. Ich finde einfach keine Ideen für die vorgegebenen Bedingungen..
Vielleicht kann mir hier ja einer helfen. 

Hier sind die Anforderungen:
- Es müssen mindestens zwei verschiedene komplexe Datenstrukturen (Array != Datenstruktur) zur Speicherung von Daten verwendet werden. Die Datenstrukturen sollten dabei den Anforderungen entsprechend gewählt werden.
- Das Programm sollte eine grafische Benutzeroberfläche bieten. Diese sollte möglichst einfach gestaltet sein und den Benutzer alle Ein- und Ausgaben ermöglichen.

Was die Möglichkeiten natürlich eingrenzt ist die Tatsache, dass wir an komplexen Datenstrukturen im Unterricht bisher nur Lineare Liste, Schlange und Stack hatten. :/
Ich hoffe es findet sich dennoch jemand mit einer Idee und sonst wünsch ich euch allen noch einen schönen Tag 
Cookie | Tabs


----------



## melmager (29. Dezember 2016)

eine Ideen quelle  
https://wiki.freitagsrunde.org/Javakurs/Übungsaufgaben

ansonsten z.B für stack : erstelle einen  upn rechner
siehe https://de.wikipedia.org/wiki/Umgekehrte_polnische_Notation
ev mit möglichkeit Formeln zu speichern  (für die komplexe datenstruktur  )


----------



## CptCookielike (31. Dezember 2016)

danke ich werd mal reinschauen 
eine Idee wie man eine Schlange oder eine lineare Liste in den upn rechner integrieren kann?


----------



## cwriter (31. Dezember 2016)

CptCookielike hat gesagt.:


> ich komme gleich zum Thema ich habe Informatikleistungskurs in der Schule und brauche nun ein Projekt für eine Klausurersatzleistung.


Wie viel Zeit willst du denn investieren?



CptCookielike hat gesagt.:


> Es müssen mindestens zwei verschiedene komplexe Datenstrukturen (Array != Datenstruktur) zur Speicherung von Daten verwendet werden. Die Datenstrukturen sollten dabei den Anforderungen entsprechend gewählt werden.


Ein Array ist sehr wohl eine Datenstruktur (aber nicht wirklich komplex  ). Ein Stack ist allerdings schon eher einfacher als ein Array.


CptCookielike hat gesagt.:


> Das Programm sollte eine grafische Benutzeroberfläche bieten. Diese sollte möglichst einfach gestaltet sein und den Benutzer alle Ein- und Ausgaben ermöglichen.


Also doch eher viel Zeit?



CptCookielike hat gesagt.:


> danke ich werd mal reinschauen
> eine Idee wie man eine Schlange oder eine lineare Liste in den upn rechner integrieren kann?


Mh. Bei Rechnern sind Bäume eigentlich besser geeignet als lineare Listen.
Mit Bäumen könntest du aber auch Kurvendiskussionen machen.

Gruss
cwriter


----------



## CptCookielike (31. Dezember 2016)

cwriter hat gesagt.:


> Wie viel Zeit willst du denn investieren?



also viel mehr zeit als ne woche hab ich nich mehr hehe.. .-.




cwriter hat gesagt.:


> Ein Array ist sehr wohl eine Datenstruktur (aber nicht wirklich komplex  ). Ein Stack ist allerdings schon eher einfacher als ein Array.



unser lehrer meinte damit, dass das array in diesem falle nicht als komplexe datenstruktur gilt und ich somit zwei brauche ohne array.

Hättest du sonst eine andere idee?  bin bei sowas echt unkreativ...


----------



## ComFreek (1. Januar 2017)

cwriter hat gesagt.:


> Mit Bäumen könntest du aber auch Kurvendiskussionen machen.


Da könntest du zum Beispiel schön einfach Ableitungen errechnen. Sagt dir AST etwas?
Aber das zu realisieren wird wohl länger dauern, weil du dann auf der Eingabeseite auch einen Parser benötigst/einbinden musst. Zumindest Mitte 2014 konnte ich für mich keine zufriedenstellende fertige Java-Bibliothek finden, siehe meinen Post hier: Java library to transform a math formula into an AST. Damals habe ich dann JavaScript-Code in Java ausführen lassen, da es dank Math.js eine tolle JavaScript-Bibliothek für den Anwendungszweck gab 

Wie wäre es mit einer Save/Restore Funktion im Taschenrechner, sodass du Zwischenergebnisse in Variablen abspeichern kannst und diese per Klick auch wieder laden kannst?
Der Einfachheit halber kannst du das Laden darauf beschränken, die gespeicherte Zahl einfach als Benutzereingabe zu simulieren.
Den Variablennamen kann der Nutzer per Eingabefeld eingeben, intern hast du dann die Zuordnung Name (String) -> gespeicherter Wert (int/double). Nach welcher Datenstruktur klingt das?


----------



## cwriter (1. Januar 2017)

ComFreek hat gesagt.:


> Aber das zu realisieren wird wohl länger dauern, weil du dann auf der Eingabeseite auch einen Parser benötigst/einbinden musst.


Ja, eine Woche ist sehr kurz für sowas...



ComFreek hat gesagt.:


> Wie wäre es mit einer Save/Restore Funktion im Taschenrechner, sodass du Zwischenergebnisse in Variablen abspeichern kannst und diese per Klick auch wieder laden kannst?


Normale "M"-Funktionalität wäre aber allerhöchstens ein Stack mit peek(), eher nur ein einfacher 1-Wert-Speicher.



ComFreek hat gesagt.:


> Der Einfachheit halber kannst du das Laden darauf beschränken, die gespeicherte Zahl einfach als Benutzereingabe zu simulieren.


Wird doch auch von Taschenrechnern so gemacht? 



ComFreek hat gesagt.:


> Den Variablennamen kann der Nutzer per Eingabefeld eingeben, intern hast du dann die Zuordnung Name (String) -> gespeicherter Wert (int/double). Nach welcher Datenstruktur klingt das?


Ehrlich gesagt (zumindest für mich): Sicher nicht nach Liste, die in O sucht. Eher Baum (O(log) oder Array (O(log)), was aber nicht erlaubt ist...

Gruss
cwriter


----------



## CptCookielike (1. Januar 2017)

Oje langsam hab ich das Gefühl, ich bin zu dumm dafür D:


----------



## cwriter (1. Januar 2017)

CptCookielike hat gesagt.:


> Oje langsam hab ich das Gefühl, ich bin zu dumm dafür D:


Wofür?
Gewisse Datenstrukturen sind für gewisse Applikationen besser als andere.
Falls du die Landau-Notation nicht verstehst:

Man unterscheidet Algorithmen nach Güte.
Ich mache es mal am Beispiel des Arrays:
Sagen wir, du hast den Array int[] arr.
Wenn du eine Position i darin füllen willst, dann schreibst du arr[i]_ = _x;
Nun ist die Frage, wie lange ein Computer dafür braucht.
Ein Array ist schlicht ein Speicherblock, und heutzutage im RAM (Random Access Memory). Dieses Random heisst, dass du jedes Wort (meist 4/8 Bytes, Maschinenabhängig) direkt auslesen kannst (also random, nicht in einer bestimmten Reihenfolge).
Daher ist jeder Zugriff in konstanter Zeit machbar ( O(1) ), schreiben wie lesen. O(1) ist dabei dasselbe wie O(100000), da man ja nicht definiert hat, wie gross die Zeiteinheiten sind. Es sind nur qualitative Angaben.
Eine Liste hingegen hat das Problem, dass du nur weisst, wo das erste Element ist. Um auf das letzte Element einer Liste mit n Elementen zuzugreifen, brauchst du n Schritte, also eine Laufzeit von O.
Sagen wir, du hast eine sortierte Datenstruktur. Mittels binärer Suche kommst du dann beim Array auf eine Suchzeit von O(log), bei der Liste geht das nicht, da du ja immer wieder von vorne beginnen müsstest.

Zum Projekt: Du könntest eine kleine Zugsimulation schreiben. Dort sind Listen (Züge) und Stacks (Passagiere) besser möglich.
Aber es ist schwierig, die Sache so anzugehen. Normalerweise weiss man, was man will, und nimmt dann die passende Struktur.

Gruss
cwriter


----------



## CptCookielike (1. Januar 2017)

cwriter hat gesagt.:


> Man unterscheidet Algorithmen nach Güte.
> Ich mache es mal am Beispiel des Arrays:
> Sagen wir, du hast den Array int[] arr.
> Wenn du eine Position i darin füllen willst, dann schreibst du arr[i]_ = _x;
> ...



Das hab ich sogar verstanden 



cwriter hat gesagt.:


> Aber es ist schwierig, die Sache so anzugehen. Normalerweise weiss man, was man will, und nimmt dann die passende Struktur.



Genau das ist mein Problem mir fällt eben kein Projekt ein, was auf die Anforderungen passt :/


----------



## ComFreek (1. Januar 2017)

cwriter hat gesagt.:


> Normale "M"-Funktionalität wäre aber allerhöchstens ein Stack mit peek(), eher nur ein einfacher 1-Wert-Speicher.


Ich meinte, dass man mehrere Werte unter verschiedenen benutzerdefinierten (Eingabefeld!) Namen speichern kann



cwriter hat gesagt.:


> Wird doch auch von Taschenrechnern so gemacht?


Die klassische M-Funktionalität macht das, stimmt  Aber es gibt auch welche, die im Term dann den Variablennamen stehen lassen und erst bei der Auswertung diese ersetzen. Das hat den Vorteil, dass du den Variablenwert danach ändern kannst, in der Historie hochscrollen kannst und reevaluieren lassen kannst.

Also wenn du Speichern drückst, passiert _map.put(inputField.getText(), accumulator.getValue())_. @CptCookielike Akkumulator ist der aktuell errechnete Wert, der dann auch angezeigt wird.
Wenn du Laden drückst, passiert _accumulator.setValue(map.getOrDefault(inputField.getText(), 0))_.



cwriter hat gesagt.:


> Ehrlich gesagt (zumindest für mich): Sicher nicht nach Liste, die in O sucht. Eher Baum (O(log) oder Array (O(log)), was aber nicht erlaubt ist...


Ich dachte da an Map<String, Double>. Sicherlich kannst du das intern als TrieMap realisieren, aber ich glaube, du hast mich schon oben bei der M-Funktionalität missverstanden 


@CptCookielike: Wie programmiert ihr die GUI an sich? Habt ihr da ein schulinternes Framework z. B.?


----------



## CptCookielike (1. Januar 2017)

Also im Moment programmieren wir mit NetBeans und haben bisher nur mit solchen drag&drop GUIs gearbeitet. Nichts Aufwendigeres..


----------



## cwriter (1. Januar 2017)

ComFreek hat gesagt.:


> Ich dachte da an Map<String, Double>. Sicherlich kannst du das intern als TreeMap realisieren, aber ich glaube, du hast mich schon oben bei der M-Funktionalität missverstanden


Ah, du gehst von der Map aus.
Ich weiss aber nicht, ob der TE die Strukturen nicht selbst schreiben muss - einfach Standardbibliotheken benutzen scheint mir ein bisschen zu simpel (bis zu einem gewissen Grad sind die Interfaces ja ähnlich bis dieselben), speziell daher:


CptCookielike hat gesagt.:


> Was die Möglichkeiten natürlich eingrenzt ist die Tatsache, dass wir an komplexen Datenstrukturen im Unterricht bisher nur Lineare Liste, Schlange und Stack hatten. :/



Aber klar, wenn die Standard-Map erlaubt ist, dann ist es sicher besser, diese zu nehmen, statt alles selbst zu schreiben 



CptCookielike hat gesagt.:


> Das hab ich sogar verstanden


Na dann bist du ja nicht zu dumm dafür 



CptCookielike hat gesagt.:


> Genau das ist mein Problem mir fällt eben kein Projekt ein, was auf die Anforderungen passt :/


Mhm. Mir fielen nur noch Zahlenberechnungen ein, die aber als Array besser gingen (Sieb des Eratosthenes usw.). Aber möglicherweise kann man argumentieren, dass eine Liste besser ist, da es weniger Platz braucht.
Mit Listen gingen auch einige Graphenalgorithmen, aber die hattet ihr wohl noch nicht.
Stacks/Queues sind halt sehr spezifische Dinge, die man nicht einfach mal so braucht.
(Genaugenommen braucht man halt meist Arrays, weil sie schlicht in fast allen Belangen (einzige Ausnahme: Starke Veränderungen der Struktur (bspw. Grössenwechel)) den meisten anderen Strukturen überlegen sind; und man sie auch zu Hashtabellen pimpen kann, wodurch sie noch mächtiger werden.

Aber ich muss sagen, dass ich ratlos bin, wofür man eine Liste _und_ einen Stack gleichzeitig brauchen sollte :/

Darfst du eigentlich Standardstrukturen (eben bspw. Map) verwenden?

Gruss
cwriter


----------



## CptCookielike (1. Januar 2017)

Maps darf ich bestimmt nur hatten wir das noch nich im Unterricht..



cwriter hat gesagt.:


> Aber ich muss sagen, dass ich ratlos bin, wofür man eine Liste _und_ einen Stack gleichzeitig brauchen sollte :/



Das is wie gesagt auch mein Hauptproblem..


----------

