Kurvendiskussion
Entwickeln Sie ein Java-Programm, das eine Kurvendiskussion entsprechend des Mathematikunterrichtes erstellt. Dabei übergibt der Benutzer eine mathematische Funktion (bspw. x^2+2x+3 oder exp(x) oder x^3+2x^2+5x+4 etc.). Das Programm erstellt daraufhin eine Wertetabelle, berechnet Schnittpunkte mit der x- und y-Achse, Extrempunkte, Wendepunkte, Asymptoten, ggf. zeichnet Funktionsgraph (falls GUI verwendet wird). Alle berechneten Werte sollen textuell ausgegeben werden. Ein Export nach PDF und Excel soll möglich sein.
Hinweis (optional):
Das Programm darf gerne auch mithilfe von Swing oder Java FX umgesetzt werden.
In diesem Projekt verwenden wir Maven als Paketmanager, dies war jedoch nicht von Anfang an so. Die ersten 3 Wochen arbeiteten wir in einem normalem Intellij Projekt, hier entstanden nun aber die ersten Fehler. Wir mussten alle externen Pakete die wir verwenden wollten händisch hinzufügen und im gleichen Zug in der .gitignore excluden hiermit stellten wir sicher das es zu keinen merge Fehlern kommt.
Wir stellten uns die Frage ob das Projekt überhaupt in dem rahmen ohne große Erklärungen von jemand anderem hätte maintained werden können. Wir kamen zu dem Entschluss nein und recherchierten daraufhin.
Maven als Abhängigkeit Management Tool war das wonach wir suchten und starteten daher mit der Migration.
Um nun Packages Hinzufügen zu können muss die Abhängigkeit nur in der Pom.xml Datei deklariert werden, Maven erledigt nun den Rest und lädt alle Abhängigkeiten automatisch herunter.
JavaFx wird verwendet für die graphische Darstellung der generierten Daten
Apache POI wird verwendet für das Schreiben der Daten in ein Excel (*.xlsx) Dokument.
Apache PDFBox wird verwendet, um die Daten in einer PDF Datei zu speichern.
Durch die limitierte Bereitstellung der PDFBox API, konnten wir mit dem PDFBox Layout Package Abhilfe schaffen, um die PDF Dokumente vernünftig strukturieren zu können.
Ob wir eine GUI entwerfen war für uns keine Frage da ich in meiner Firma vor allem im Thema Frontend eingesetzt werde. Da ich normalerweise mit HTML, CSS und JS entwickle war JavaFx in der Theorie ein Heimspiel.
Die durch FXML dargestellte abgekapselte Logik erinnerte doch stark an HTML hier arbeitete ich mit Referenzen um im MainAppController die Programmatische Logik unterzubringen.
Um die Elemente zu stylen fügte ich ein Stylesheet (CSS) ein. Das FXML Dokument erstellte ich mit dem Scenebuilder der wie eine Art Baukasten Editor funktioniert.
Innerhalb unseres Java-Projektes habe ich ein Package erstellt, welches die Abfrage von den benötigten Ergebnissen stark vereinfacht. Die Klasse MathPower ist die überliegende Klasse, welche durch das Einbringen von Abhängigkeiten der Hauptakteur innerhalb des Projektes ist. Um an die Ergebnisse zu gelangen, muss innerhalb der Konstruktoren der jeweiligen Klasse die Abhängigkeiten von MathPower eingebracht werden, weshalb ich mich für eine globale Auslagerung der Getter von den Ergebnissen auf die Klasse MathPower beschränkt habe. Somit kann das User-Interface über eine einzige Deklarierung dieser Klasse, mit der eingebrachten mathematischen Formel als Eigenschaft, alle Informationen zu den Graphen erfahren. Jegliche nicht validierbare Eingaben werden von dem „Try and Catch“ Block abgefangen und resultieren in einen Hinweis in dem User-Interface für den Nutzer. Mögliche beziehungsweise validierbare Eingaben sind folgende:
Multiplikatoren | Exponenten | Vorzeichen | -------- Beispiele -------- |
---|---|---|---|
(1/3) (Zähler/Nenner) |
4 (ganzrationale Funktion) |
+ | (1/4)x^4+3x^2-10 |
1-99 (Ganze Zahlen) |
3 (kubische Funktion) |
- | -(1/3)x^3+(1/5)x^2-(1/6)x-3 |
2 (quadratische Funktion) |
3x^2-(1/2)x+3 | ||
1 (lineare Funktion) |
16x-2 |
- Schnittpunkte mit x- und y-Achse
- Extrempunkte
- Wendepunkte
- (Optional) Brüche
Durch die späte Einbindung können Abweichungen vorkommen. Dies bitte über Github Issues mitteilen.
- Asymptoten
Leider ist durch die manuelle Programmierung das Nachführen einer Validierung von gebrochenrationalen- und e-Funktionen nur schwierig möglich. Um ein möglichst gutes und richtiges Ergebnis zu erzielen, habe ich mich somit zuerst auf die ersten drei Punkte fokossiert, da zudem die mathematische Bearbeitung vollkommen von den oben genannten Funktionen abweichen würde.
Innerhalb von dem Package MathPower habe ich drei Java interne Utilities genutzt:
- java.util.ArrayList;
- Da vor allen Dingen die mathematischen Funktionen sehr unterschiedlich in ihrer Länge ausfallen können, habe ich mich für diese Alternative entschieden, um diese dynamisch aufnehmen und verarbeiten zu können.
- java.util.Arrays;
- Mitunter konnten fest definierte Bereiche genutzt werden, wodurch ein dynamische Array nicht von nöten war.
- java.util.List;
- Bei einzelnen Informationen, welche dynamisch bearbeitet werden sollen, habe ich mich für eine Liste entschieden.
- Entscheidener Unterschied zu dem Package .ArrayList ist, dass nur einzelne Informationen (Strings, Doubles) ohne Reihung eingefügt (außer einer weiteren Liste = List<List>) werden konnten. Die Einbindung der Daten in ein Array entfand ich somit deutlich leserlicher.