![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Neuer Benutzer Registriert seit: 02.02.2008
Beiträge: 9
|
Hallo ich bin neu hier und begrüße an dieser Stelle erstmal alle User herzlich. Also es sieht so aus.. Für die Schule müssen wir einen Funktionen Plotter entwickeln (Mit Gui). Die Gleichungen werden durch ein Textfeld eingelesen und müssen dann berechnet werden. Ich habe nun ein Programm geschrieben, das schonmal die Potenzen, +, -, *, / und sin, cos und tan und außerdem Klammerrechnung erkennt. Der String muss ja aufgeteilt werden.. Jetzt habe ich das Problem, dass bei meiner sin, cos und tan funktion nur "sin(x^3+x^2+1)" eingegeben werden kann und nicht "sin(x^3+x^2+1) +1". Dabei ist die Art und Weise wie ich das aufteile gleich wie bei der normalen Klammersetzung und diese funktioniert! Dadurch, dass das Programm ein test Programm ist, kann es sein, dass es an manchen Stellen nicht schön aussieht. Das ist noch ein Prototyp Code: private static String sucheTrigo(String pGleichung, char pPixel) {
double ergebnis = 0;
Pattern klammer = Pattern.compile("[/.;]");
if (pGleichung.contains("sin")) {
pGleichung = pGleichung.replace("sin(", ";sin(");
pGleichung = pGleichung.replace(")", ");");
} else if (pGleichung.contains("cos")) {
pGleichung = pGleichung.replace("cos(", ";cos(");
pGleichung = pGleichung.replace(")", ");");
} else if (pGleichung.contains("tan")) {
pGleichung = pGleichung.replace("tan(", ";tan(");
pGleichung = pGleichung.replace(")", ");");
}
String[] pGleichungGeteilt = klammer.split(pGleichung);
for (int i = 0; i < pGleichungGeteilt.length; i++) {
if (pGleichungGeteilt[i].contains("sin(")
&& pGleichungGeteilt[i].contains(")")) {
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace("sin(", "");
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace(")", "");
ergebnis = std(pGleichungGeteilt[i], pPixel);
ergebnis = Math.sin(ergebnis);
pGleichungGeteilt[i] = String.valueOf(ergebnis);
} else if (pGleichungGeteilt[i].contains("cos(")
&& pGleichungGeteilt[i].contains(")")) {
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace("cos(", "");
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace(")", "");
ergebnis = std(pGleichungGeteilt[i], pPixel);
ergebnis = Math.cos(ergebnis);
pGleichungGeteilt[i] = String.valueOf(ergebnis);
} else if (pGleichungGeteilt[i].contains("tan(")
&& pGleichungGeteilt[i].contains(")")) {
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace("tan(", "");
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace(")", "");
ergebnis = std(pGleichungGeteilt[i], pPixel);
ergebnis = Math.tan(ergebnis);
pGleichungGeteilt[i] = String.valueOf(ergebnis);
}
}
if (ergebnis != 0) {
pGleichung = "";
for (int i = 0; i < pGleichungGeteilt.length; i++) {
pGleichung = pGleichung + pGleichungGeteilt[i];
}
}
return pGleichung;
}
Vielleicht fällt euch ja etwas auf. Zum Vergleich die Klammern: (Diese funktionieren perfekt) Code: private static String sucheKlammer(String pGleichung, char pPixel) {
double ergebnis = 0;
Pattern klammer = Pattern.compile("[/.;]");
pGleichung = pGleichung.replace("(", ";(");
pGleichung = pGleichung.replace(")", ");");
String[] pGleichungGeteilt = klammer.split(pGleichung);
for (int i = 0; i < pGleichungGeteilt.length; i++) {
if (pGleichungGeteilt[i].contains("(")
&& pGleichungGeteilt[i].contains(")")) {
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace("(", "");
pGleichungGeteilt[i] = pGleichungGeteilt[i].replace(")", "");
ergebnis = std(pGleichungGeteilt[i], pPixel);
pGleichungGeteilt[i] = String.valueOf(ergebnis);
}
}
if (ergebnis != 0) {
pGleichung = "";
for (int i = 0; i < pGleichungGeteilt.length; i++) {
pGleichung = pGleichung + pGleichungGeteilt[i];
}
}
return pGleichung;
}
Geändert von r2d2 (02.02.2008 um 13:07 Uhr) |
| | |
| | Nach oben #2 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.133
|
Wenn du dir sicher bist, dass das wirklich das ist, was du tun sollst (ich kann's mir ehrlich gesagt nur schwer vorstellen - also das Input-Format), dann würde ich dir das hier als Lektüre empfehlen: [Java] Parser Generierung mit JavaCC - Eine Einführung Dein Ansatz ist ziemlich begrenzt von dem her, was man damit tun kann. |
| | |
| | Nach oben #3 |
| Neuer Benutzer Registriert seit: 02.02.2008
Beiträge: 9
|
Kann ich denn, ein anderes Input-Format für Textfelder wählen? Wenns einfacher geht würde ich natürlich das machen.. Das Problem ist nur wenn ich über das normale Eingabefeld die Gleichung einlese ist es nunmal ein String. Edit: Also ich habe mir jetzt mal das JavaCC angeschaut, weiss jedoch nciht wie ich das bei mir einbinden soll... Ich will ja über ein Textfeld etwas einlesen, wie kann ich das eingelesene dann über JavaCC parsen? Geändert von r2d2 (02.02.2008 um 16:04 Uhr) |
| | |
| | Nach oben #4 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.133
|
Ich dachte eher an sowas wie "keine Funktionen" oder so. Na ja, im Prinzip müsstest du nach ()+-*/^ splitten, brauchst aber die matches (ich glaub da musste man die einfach nur in Klammern packen beim regex). Und dann kannst du dir die token, die du noch brauchst (ich denke das jeweils nächste reicht), ansehen und anhand dessen Entscheiden, was passieren soll. Ist aber trotzdem noch relativ kompliziert. Wenn du's brauchst bastel ich dir'n Beispiel. |
| | |
| | Nach oben #5 |
| Neuer Benutzer Registriert seit: 02.02.2008
Beiträge: 9
|
Wie das JavaCC funktioniert, hab ich shcon verstanden, ich weiss nur nicht wie ich die Gleichung, die ich in mein Textfeld eingebe an das JavaCC übergebe und dann mein Ergebnis als Wert zurückbekomme. Ich möchte ja die Eingabe nicht über JavaCC machen sondern separat in einer Gui-Klasse....
|
| | |
| | Nach oben #6 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.133
|
Beim Beispiel aus'm Tutorial würdest du 'ne neue Instanz erzeugen und dann parse aufrufen. Liefert dir das Ergebnis. Einfach den String aus'm Textfeld an den Konstruktur übergeben. Eventuell musst du's noch in nen StringReader verschachteln.
|
| | |
| | Nach oben #8 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.133
| Code: MathParse parser = new MathParse(textarea.getText());
// oder:
// MathParse parser = new MathParse(new StringReader(textarea.getText()));
try {
outputLabel.setText(parser.parse());
} catch(ParseException e) {
e.printStackTrace();
}
|
| | |
| | Nach oben #9 |
| Neuer Benutzer Registriert seit: 02.02.2008
Beiträge: 9
|
Ahh, ok alles klar, ein Objekt vom Parser erzeugen ^^ Hätte ich eigentlich auch drauf kommen müssen :-/ Edit: Also ich benutze Eclpise und habe mir das JavaCC plugin runtergeladen. Mit der vorgenerierten JavaCC Klasse komme ich irgendwie nicht klar, dabei hat sie auch diese ganzen Funktionen... Weisst du wie man die anwendet? Bzw. von welcher Klasse unter den vielen man das Objekt erstellen muss? Geändert von r2d2 (02.02.2008 um 22:22 Uhr) |
| | |
| | Nach oben #10 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.133
|
Nein, von Eclipse hab ich keine Ahnung - das meide ich so gut ich kann. Generell entspricht der Name der Klasse dem, was in der JavaCC-Datei bei PARSER_BEGIN(Foo) steht (in dem Fall wäre es "Foo"). |
| | |
| | Nach oben #12 |
| Neuer Benutzer Registriert seit: 02.02.2008
Beiträge: 9
|
Also es sieht nun so aus (leider), wir dürfen JavaCC nicht benutzen.. Unser Lehrer möchte dass wir einen Parser komplett alleine schreiben... Hätte jemand da vllt. Tipps wie man das umsetzen könnte? Handelt sich immernoch um Gleichungen
|
| | |
| | Nach oben #13 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.133
|
Ich kann's, aber die Erklärung dauert mir viel zu lang... erst recht, wenn du da hinterher noch was verstehen sollst. Wenn ich's entwickeln sollte, wär das ne Sache, die maximal 10 Minuten dauern würde. *sfz* Okay... wenn ihr schon so höhe Ansprüche habt, dann kannst du vielleicht was damit anfangen, wenn du nach "LL(k)" googlest. Alternativ wäre auch mit einem "Shift Reduce Parser" was anzufangen (ich bevorzuge einfach LL(k)). Alternativ kannst du mal austesten, ob du mit java.util.Scanner eher voran kommst, als mit "einfachen" regulären Ausdrücken. |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Atomare Funktionen | suppenmann | PHP-Programmierung | 2 | 08.03.2007 13:35 |
| Zugriff aus Variable aus Funktionen | bento124 | PHP-Programmierung | 3 | 24.04.2005 19:48 |
| Mehrere funktionen in einem Applet (design verändern) | mr.no | Allgemeine Java-Programmierung | 7 | 29.11.2004 23:24 |