Mathe Tool

Hallo,
ich habe ein kleines Programm erstellt, zum lösen von Mathe Aufgaben.
Momentan kann es:
-Die Nullstelle von Parabeln berechnen
-deren Scheitelpunkt berechnen
-den Lösungsweg anzeigen
-den Lösungsweg ausdrucken

Downloads und Source Code auf GitHub:
https://github.com/dav20011/Mathe-Tools

Lizenz:
https://github.com/dav20011/Mathe-Tools/blob/master/license.md

Wer will kann gerne mithelfen, entweder mit GitHub fork oder auf Nachfrage mit GitHub Berechtigung.

Nur überflogen, kenne mich mit JavaFX nicht aus, eher aus Neugier: Konventionen (Schreibweisen von Namen, Package-Struktur etc) gelten da nicht mehr…?

Naja, die Package Struktur ist nicht gerade so vorhanden, da es im Moment noch nicht nötig ist, die Funktionen des Programms sind recht überschaubar. Zum Thema JavaFX, bei mehreren Fenstern benutzt man als Layout fxml Dateien, also im XML Format, es gibt aber den Scene Builder von Oracle, jede fxml bzw jedes Layout hat eine Controller Class ,die die Buttons etc. steuern kann, ziemlich simpel.

Ich glaube es ging Marco eher darum das Coding Conventions eher missachtet wurden. Außerdem ist mir auch aufgefallen das du Sachen wie // fx:id="combo" drinne hast und noch als Assert assert menu != null : "fx:id=\"combo\" was not injected: check your FXML file 'ComboboxExample.fxml'."; aber diese Datei hab ich jetzt nicht gefunden und auch keine Komponente mit der id: combo. Die auch nirgends benutzt wird

Bis ich das gefunden hab:
https://github.com/dav20011/Mathe-Tools/blob/master/src/layout/parabel_nullstelle_layout.java
Zeile 99 ff.
, wo die Berechnung stattfindet… eine Ewigkeit.

Nur a, b, c? Nur Ganzrationale Funktionen 2. Grades? (Epsilon?)

Unabhängig davon, ich finde deine Idee gut! Hab nur im Moment keine Zeit.

Schöne Grüße

Das habe ich auf meinem PC schon gefixt, bin gerade beim “aufräumen”, nur noch nicht ganz fertig.

Also hier schon einmal zum Nachlesen:

Code Conventions for the Java Programming Language: Contents

Wenn man Klassen klein schreibt, ist das so eine Sache, kommt ja oft, wenn man von einer anderen Programmiersprache wechselt,
wo die Konventionen anders sind, oder wo es das Konzept OOP nicht gibt.
Klassen wie Methoden benennen, ist aber schon noch etwas heftiger in meinen Augen.

Ich habe das Projekt mal geclont und zum Laufen gebracht (musste mir noch diese PDF Lib besorgen).
Bei der GUI musst du auch noch ein paar Sachen überarbeiten (z.B. Resizing entweder sperren, oder Elemente ordentlich „mitwachsen/reorganisieren“ lassen).
Fehleingaben werden nicht abgefangen und wieso gehen keine Parabeln, wie z.B. 2x²?

Ansonsten Scheitelpunkt, x1, x2, das scheint zu funktionieren.

Wer Refactoring üben will, hätte hier seinen Spaß dran (oder auch nicht) :smiley:

So, kleines Update,
-d kann jetzt auch eingegeben werden, aber wird noch nicht in der Rechnung angezeigt (deswegen kein neues Release)
-Namen von Klassen und Methoden verbessert
-Alert Box bei Fehler in der Rechnung

Und weiß jemand wieso auf Ubuntu mit Oracle Java 8 das Fenster so angezeigt wird, dass der Start Button zu klein ist?
Zum Thema Java 8, nur noch mit Java 8 Update 40+ zu empfehlen, wegen Alert Boxes.
@BinaryLogic Refactoring muss man nicht üben, jedenfalls nicht mit einem vernünftigen IDE, IntelliJ erkennt automatisch Referenzen, nur GitHub sollte mal lernen, dass man änderungen von Groß-/Kleinschreibung in Dateinamen auch gerne commiten will.

Guck mal, das ist doch dast, was du versucht hast:

 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication3;

import java.io.*;

/**
 * @author CB
 */
public class Parabel {

    public static double calc(double x, double a, double b, double c) {
        return a * x * x + b * x + c;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("a:");
        double a = Double.parseDouble(in.readLine());
        System.out.println("b:");
        double b = Double.parseDouble(in.readLine());
        System.out.println("c:");
        double c = Double.parseDouble(in.readLine());

        System.out.println("x_1: " + (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a)); // abc, ziemlich genau
        System.out.println("x_2: " + (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a));

        double lo = -1000;
        double hi = 1000;
        while (hi - lo > 0.001) { // eine Halbierung, auch ziemlich genau
            if (calc(lo, a, b, c) <= calc(hi, a, b, c)) {
                hi -= (hi - lo) / 2;
            } else {
                lo += (hi - lo) / 2;
            }
        }
        System.out.println("Global minimum: " + lo); // -1000.0 deutet auf einen Fehler hin

        System.out.println("kontrolle:      "
                + ( ( (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a)
                    - (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a) ) / 2
                    + (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a) ) );
    }
}```
Nullstellen sind irgendwie schwieriger, als lokale Extremstellen, klar, davon gibt es zwei.
Bitte reißt mir nicht den Kopf ab.
Das Verfahren ist natürlich nicht neu.

0.001 ist der s.g. Epsilon-Wert. Dieser darf beliebig gewählt werden.

Hilft das bei einer Klassenarbeit? Nur bedingt.

Normalerweise hat man (in der Schule) immer die Form:
y=f(x)=ax²+bx+c
und dann bräuchte man f'(x), f' '(x) (und F(x)) und man kann alle Untersuchungen durchführen. In welchen Unterrichtsfachen/Kurse hbat ihr das dran?

Einen schönen Samstag.

[QUOTE=dav20011]Und weiß jemand wieso auf Ubuntu mit Oracle Java 8 das Fenster so angezeigt wird, dass der Start Button zu klein ist?
[/QUOTE]
Nicht nur auf Ubuntu, bei mir gerade auf fremdem Laptop mit Windows 8.1 das Gleiche.
Allgemein bin ich nicht so der Fan von der GridPane, habe es mal etwas umgeschrieben, wenn es dir gefällt, kannst du es übernehmen, wenn
nicht, ignorierst du es einfach:

[XML]<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.collections.FXCollections?> <?import javafx.geometry.Insets?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.CheckBox?> <?import javafx.scene.control.ComboBox?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.Separator?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.Text?> <?import java.lang.String?>




[/XML]

Also als Wireframe, wären das Schachteln in Schachteln sortiert, aber ich mag Schachteln. Die Frage ist, was jetzt hier besser wäre (allg. von der Performance), aber bei
so einem kleinen Programm eh vernachlässigbar. D ist da jetzt auch noch nicht dabei. Und evtl. solltest du die fx:ids nochmal überprüfen :wink: Vorschau:

@BinaryLogic Refactoring muss man nicht üben, jedenfalls nicht mit einem vernünftigen IDE, IntelliJ erkennt automatisch Referenzen, nur GitHub sollte mal lernen, dass man änderungen von Groß-/Kleinschreibung in Dateinamen auch gerne commiten will.

Klar, von den IDEs werden Refaktoring-Methoden bereitgestellt, wann man diese wie und in welchem Umfang (oder überhaupt) anwendet, kann die IDE aber nicht entscheiden. Außer man hat sowas wie ein RuleSet (Pmd), der einen bei Design-Entscheidungen Hinweise geben kann. Extract Method/Field, Pull Up Method/Field usw. geht zwar mit der IDE einfach, aber ob das im spez. Fall angebracht ist, muss der Entwickler wissen.

Edit:
Hier auch nochmal für die Rechnung (ist um einiges kürzer):
[XML]<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?> <?import javafx.scene.control.Button?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.Text?> <?import javafx.scene.control.Separator?>

<padding>
  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>

<Text fx:id="firstCalc" VBox.vgrow="ALWAYS" text="Also echt, nicht auf Start zu drücken geht gar nicht!

" />









[/XML]

Ich habe es auch noch mal frisch erstellt, habe ein ppar Dinge von dir übertragen, und noch etwas mit Seperators aufgeteilt, mit FLowPane als Hauptcontainer und 3 Anchor Panes. Jetzt ist klar, welcher Löschen Button zu was gehört.

Ist noch nicht eingestellt, aber habe es schon im Scene Builder.

Edit:
Schuld an der ganzen Sache war wohl eher die größeneinstellungen des Systems, sind diese auf dem 2. System anders, die Button länge wird vom System übernommen, passt aber nicht ins Fenster, weil die größe festgelegt ist.

Beta v0.2 ist fertig, Beschreibung und Download auf GitHub, funktioniert nur noch mit Java 8 richtig!
Es wäre nett wenn jemand das Programm etwas testen könnte.

Also Vollzitat wäre nicht nötig gewesen, so am Rande :stuck_out_tongue_winking_eye:

Gefällt mir schon einmal von der Aufteilung ganz gut, auch besser als mein Vorschlag :top:

Schuld an der ganzen Sache war wohl eher die größeneinstellungen des Systems, sind diese auf dem 2. System anders, die Button länge wird vom System übernommen, passt aber nicht ins Fenster, weil die größe festgelegt ist.

Ja, mit der festen Größenvorgabe in Pixeln ist das immer so ein Problem. Ansonsten auch CSS nutzen, und spezifische Settings laden, je nach Größe des Viewports (einfach mal ‚responsive viewports/layouts‘ googeln) und je nach Bildschirmauflösung entsprechende Designs beim Programmstart laden.
Weiterhin kann man im Controller mit dem in JavaFX & den Properties eingeführten Binding sicher auch einzelne Controller-Elemente dynamisch an die Größe ihres jeweiligen Parent-Nodes anpassen.

Edit:
Was mir beim Überfliegen noch so auffällt:

  • Fehleingaben werden nicht abgefangen (werfen Exception)
  • Druck wirft Exception, wenn kein Drucker ausgewählt (Exception abfangen, entsprechend reagieren)
  • einige Controller-Klassen (v.a. > 300 Zeilen) haben meiner Meinung nach zu viele Verantwortlichkeiten (Druck komplett auslagern, Berechnung komplett auslagern)
  • bei mir (jetzt Ubuntu 14.04), sind „Zum Druck hinzufügen“ und „Löschen“ zu dicht beieinander (ersterer zu schmal), a,b,c,d, Labels fehlen, linke obere Box könnte padding vertragen.

Weiterhin:
Lies dir die Grundlagen zu Maven oder Gradle an, gerade bei Code, der in öffentliche Repositories geladen wird, sind diese Build-Management-Systeme meiner Meinung nach sehr wichtig
um Abhängigkeiten richtig aufzulösen (und mit weniger Aufwand). Auch die grundlegende Projekt-Struktur sollte man sich (meiner Meinung nach) angewöhnen.
Auch wenn es am Anfang bei wenig Klassen mehr als Aufwand gesehen wird eine ordentliche Projekt- und Paketstruktur zu erstellen, kann sich das am Ende doch sehr auszahlen, wenn
weitere Klassen und Funktionalitäten hinzukommen (gerade Verschiebung von Dateien ist mit Git/Subversion manchmal so ein Problem, auch mit IDE und kann nur meistens nur sauber vom Terminal/Git-Shell erledigt werden).

Falls o.g. Projektstruktur umgesetzt wird, würde ich entsprechende FXML-Dateien in den Resources-Ordner, genauer in einen Subordner dessen Namens ‚fxml‘ verschieben.
Man möge mir widersprechen, habe leider nur Laien-Erfahrung.

Edit2:
Dazu zusätzlich noch mal: MVC (Entwurfsmuster)
Die meisten Controller-Klassen übernehmen imho zu viel Aufgaben, die im Bereich der Model ausgeführt werden sollten.
Falls du weitere Erweiterungen planst (z.B. andere Funktionen) kann sich das am Ende aufzahlen und den Aufwand stark veringern.

So, ein großes Update, genauere Infos auf GitHub.
Gradle!

Schon um einiges besser, aber ein paar Sachen könnte ich sicher noch aufzählen, wobei ich da auch Grenzen habe,
bin ja nur Amateur.

TextToPdfConverter z.B. die Methode ist sehr lang, die kann man gut splitten. Finde aber gut, dass du dafür
eine extra Klasse hast, bei meinem Fork hab ich das noch im PdfWriter drin.
Guck dir auch Try-With-Resources an: The try-with-resources Statement (The Java™ Tutorials > Essential Classes > Exceptions)
Schreib- und Lesezugriffe würde ich auch aufspalten. Sei ruhig schreibfreudig, wenn es um die Erstellung neuer Methoden geht :smiley:

Ansonsten: Das Menü ist überall gleich, eventuell lassen sich die versch. Kindelemente der GridPane austauschen (nehme aber an,
dass das komplizierter ist, als bei der VBox)

Ansonsten was bei so mathematischen Sachen hilfreich ist, wäre z.B. LaTeX zu benutzen,
habe auf die schnelle diese Lib gefunden: JLaTeXMath - A Java API to render LaTeX - A Java package to display LaTeX code in mathematical mode

Edit:
Aaaaachso: Und was Sprachen betrifft, bleib bei Englisch oder Deutsch, was Klassen-, Methoden-… ach eigentlich alles betrifft. In der GUI kann man ganz leicht untersch. Sprachunterstützung einsetzen
Bsp:: JavaFX- Internationalisierung / i18n in FXML Dateien - IT-Lobby