Zeichen in Strings

Solor

Aktives Mitglied
Hallo alle zusammen,
Hab da ein kleines Problem. Ich habe ein Programm geschrieben, dass die Nullstellen von Funktionen ausrechnen kann. Nun möchte ich noch eine Eingabemöglichkeit für den User schreiben. Dieser soll zuerst den grad der Funktion angeben und dann die Funktionsgleichung in folgender Form angeben:
"3X^4 + 5X^2 - 3X + 4"
Mein Problem liegt nun darin, alle Koeffizienten und Exponenten zu ermitteln. Gibt es eine Möglichkeit nach allen "X" bzw. "^" zu suchen und zu schauen was davor oder dahinter steht?

Vielen Dank schon mal im Voraus
MFG Solor
 
N

nillehammer

Gast
Die diversen indexOf- und substring-Methoden von String sollten Dir da weiterhelfen:
Java:
private static final String DACH = "^";
....
String funktionsString = "3X^4 + 5X^2 - 3X + 4";
....
int firstDachIndex = funktionsString.indexOf(DACH);

String ersterTeil = funktionsString.substring(0,firstDachIndex);
...
so ganz grob...
 

HoaX

Top Contributor
Sowas ist ne schöne kleine Aufgabe um sich in das Schreiben von Kompilern/Parsern einzuarbeiten.

Man nehme z.B. Antlr und füttere es mit
Code:
grammar polynom;

poly	:	(p=polypart { System.out.println($p.list); })+
	;
	
polypart returns [java.util.List<Object> list]:	
	s=SIGN m=NUMBER 'X' e=exponent { list = new java.util.ArrayList(); list.add($s.text); list.add($m.text); list.add($e.value); }
	| m=NUMBER 'X' e=exponent { list = new java.util.ArrayList(); list.add("+"); list.add($m.text); list.add($e.value); }
	| s=SIGN 'X' e=exponent { list = new java.util.ArrayList(); list.add($s.text); list.add("1"); list.add($e.value); }
	| 'X' e=exponent { list = new java.util.ArrayList(); list.add("+"); list.add("1"); list.add($e.value); }
	
	| s=SIGN m=NUMBER { list = new java.util.ArrayList(); list.add($s.text); list.add($m.text); list.add("0"); }
	| m=NUMBER { list = new java.util.ArrayList(); list.add("+"); list.add($m.text); list.add("0"); }
	;

exponent returns [int value]: ('^' n=NUMBER)? { $value = 1; if ( $n != null && $n.text.length() > 0) $value = Integer.parseInt($n.text); }
	;
	
NUMBER	: '0'..'9'+
	;

SIGN 	:	('+'|'-')
	;

WS  :   (' '|'\t')+ {skip();} ;

Steckt man dann in den Parser "X + 3X - X ^ 6 + 99" als Eingabe, so erhält man als Ausgabe:
[+, 1, 1]
[+, 3, 1]
[-, 1, 6]
[+, 99, 0]

Das erste ist das Vorzeichen, das zweite der Multiplikator, das dritte der Exponent.
 

Solor

Aktives Mitglied
Danke für die schnellen antworten, aber deins versteh ich nich so ganz, hoaX, könnte aber an meinen wenigen erfahrungen liegen.
Ansonsten probier ichs jetz so, wie weiter oben beschrieben
 
Zuletzt bearbeitet:

AquaBall

Top Contributor
HoaX meint, das das keine triviale Aufgabe ist, wenn sie nicht auf sehr wenig Sonderfälle beschränkt wird.

Solange du einen exakt normierte Schreibweise (n*x^4 n*x^3 n*x^2 ...) hast reicht deine einfache Stringzerlegung.
Aber stell dir nur vor, du willst ein bisschen Flexibilität zulassen, oder gar Klammern, zb.
1X^4+2(X^3 +X^2)+X, dann stehst du blitzschnell vor einem enormen Haufen von Problemen.

Dann greift man besser zu Hilfsprogrammen die dir den Text zerlegen (Parsen) und standardisierte Rechenwege ermöglichen (z.B. polnische Notation). Einer dieser Parser ist "Antlr".

Das ist aber einige Stufen höher.
 

Skrodde

Aktives Mitglied
Man nehme z.B. Antlr und füttere es mit
Code:
grammar polynom;

poly	:	(p=polypart { System.out.println($p.list); })+
	;
	
polypart returns [java.util.List<Object> list]:	
	s=SIGN m=NUMBER 'X' e=exponent { list = new java.util.ArrayList(); list.add($s.text); list.add($m.text); list.add($e.value); }
	| m=NUMBER 'X' e=exponent { list = new java.util.ArrayList(); list.add("+"); list.add($m.text); list.add($e.value); }
	| s=SIGN 'X' e=exponent { list = new java.util.ArrayList(); list.add($s.text); list.add("1"); list.add($e.value); }
	| 'X' e=exponent { list = new java.util.ArrayList(); list.add("+"); list.add("1"); list.add($e.value); }
	
	| s=SIGN m=NUMBER { list = new java.util.ArrayList(); list.add($s.text); list.add($m.text); list.add("0"); }
	| m=NUMBER { list = new java.util.ArrayList(); list.add("+"); list.add($m.text); list.add("0"); }
	;

exponent returns [int value]: ('^' n=NUMBER)? { $value = 1; if ( $n != null && $n.text.length() > 0) $value = Integer.parseInt($n.text); }
	;
	
NUMBER	: '0'..'9'+
	;

SIGN 	:	('+'|'-')
	;

WS  :   (' '|'\t')+ {skip();} ;

Wenn ich diese Grammatik mit Antlr kompilieren will, erhalte ich:
Code:
warning(200): polynom.g:6:47:
Decision can match input such as "SIGN NUMBER 'X'" using multiple alternatives: 1,5

As a result, alternative(s) 5 were disbaled for that input
warning(200): polynom.g:6:47:
Decision can match input such as "NUMBER 'X'" using multiple alternatives: 2,6

As a result, alternative(s) 6 were disabled for that input

Was heißt das nun genau?
 

HoaX

Top Contributor
So ist's nun richtig:
Code:
grammar polynom;

poly	: o=SIGN? p=polypart { $p.list.add(0, $o==null?"+":$o.text); System.out.println($p.list); }
	(o2=SIGN p2=polypart { $p2.list.add(0, $o2.text); System.out.println($p2.list); })*

	;
	
polypart returns [java.util.List<Object> list]:	
	m=NUMBER 'X' e=exponent { list = new java.util.ArrayList(); list.add($m.text); list.add($e.value); }
	| m=NUMBER { list = new java.util.ArrayList(); list.add($m.text); list.add("0"); }
	| 'X' e=exponent { list = new java.util.ArrayList(); list.add("1"); list.add($e.value); }
	;

exponent returns [int value]:
	('^' n=NUMBER)? { $value = 1; if ( $n != null && $n.text.length() > 0) $value = Integer.parseInt($n.text); }
	;
	
NUMBER	: '0'..'9'+
	;

SIGN 	:	('+'|'-')
	;

WS  :   (' '|'\t')+ {skip();} ;
War wirklich noch eine Mehrdeutigkeit enthalten.
Angenommen der Input ist: NUMBER X
Dann wäre es nicht klar ob so aufgelöst werden soll:
Code:
poly -> NUMBER
poly -> X
oder nach
Code:
poly -> NUMBER X
Jetzt ist es so umgestellt, dass SIGN als Trenner zwischen zwei einzelnen Polynomen fungiert.

Ist es nachvollziehbar wie das ganze funktioniert, oder soll ich das noch etwas kommentieren?
Momentan wird nur X als Variablenname im Term akzeptiert und auch nur Ganzzahlen, kannst das ja als Hausaufgabe auf beliebige Variablennamen (erstes Zeichen Buchstabe, Rest Buchstabe oder Ziffer) und zusätzlich Kommazahlen umändern.

Terence Parr, der Autor von Antlr, hat auch ein super Buch zu Antlr geschrieben.
 
Zuletzt bearbeitet:

Skrodde

Aktives Mitglied
Hallo Hoax,
vielen Dank für die Erläuterung, die hat mir dann auch gleich bei meinem Problem auf die Sprünge geholfen! :toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
N Bestimmte Zeichen eines Strings umwandeln Java Basics - Anfänger-Themen 4
T Auf jedes Zeichen eines Strings zugreifen? Java Basics - Anfänger-Themen 2
B Strings nur aus bestimmten Zeichen? Java Basics - Anfänger-Themen 4
N Bestimmte Zeichen aus Strings zählen Java Basics - Anfänger-Themen 11
S Zeichen aus Strings auslesen und in zweidimensionalen Reihungen positionieren. Java Basics - Anfänger-Themen 10
C Größer - Kleiner - Zeichen in Strings Java Basics - Anfänger-Themen 3
M Die letzten Zeichen eines Strings Java Basics - Anfänger-Themen 6
G Feststellen, ob erstes Zeichen eines Strings eine Ziffer ist Java Basics - Anfänger-Themen 11
D Strings vergleichen, Problem "" Zeichen? Java Basics - Anfänger-Themen 3
T Strings bis zum Zeichen ";" vergleichen! Java Basics - Anfänger-Themen 6
G erstes Zeichen eines Strings herausfinden Java Basics - Anfänger-Themen 3
M Strings nach ASCII Zeichen trennen. Java Basics - Anfänger-Themen 7
H Zeichen aus Strings löschen Java Basics - Anfänger-Themen 10
G die ersten Zeichen eines Strings Vergleichen mit String Java Basics - Anfänger-Themen 6
T Zeichen eines Strings an festgelegter Position einfügen Java Basics - Anfänger-Themen 8
B Zeichen eines Strings über Datei verteilen Java Basics - Anfänger-Themen 9
J Quelltext mit komischen griechischen Zeichen Java Basics - Anfänger-Themen 4
T or zeichen Java Basics - Anfänger-Themen 2
L 4 stelliges Passwort aus bestimmten Zeichen. Java Basics - Anfänger-Themen 27
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
S Was bedeutet das Zeichen := Java Basics - Anfänger-Themen 9
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
L Zeichen an bestimmter Stelle auslesen Java Basics - Anfänger-Themen 4
S Arrayausgabe und nur einmal ein Zeichen davor Java Basics - Anfänger-Themen 12
johnboyne Java Zeichen Trennen Java Basics - Anfänger-Themen 1
T Zeichen im String verschiebe Java Basics - Anfänger-Themen 17
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
pkm Regexproblem - Wie kann ich zwei oder mehr beliebige Zeichen matchen? Java Basics - Anfänger-Themen 7
Dimax Erste Schritte String replace alle Zeichen Java Basics - Anfänger-Themen 10
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
M Regex für bestimmte Wörter bzw. bestimmte Zeichen erstellen Java Basics - Anfänger-Themen 5
F RegEx "+" nur als Zeichen, nicht als Operator oder Sonstiges Java Basics - Anfänger-Themen 2
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
J ObjectOutputStream writeChars, komische Zeichen nur in 1. Zeile Java Basics - Anfänger-Themen 2
H Fehlerausgabe (Ungewollte Zeichen) Java Basics - Anfänger-Themen 1
R Komische Zeichen in Java Java Basics - Anfänger-Themen 5
N Zeichen in einem Textfeld zählen und hinterlegen Java Basics - Anfänger-Themen 6
W Einfachen, ein beliebiges Zeichen oft erkennenden Regex Parser selber schreiben - wie vorgehen? Java Basics - Anfänger-Themen 12
J Vorkommen von Zeichen Java Basics - Anfänger-Themen 44
H Verschiebung von Zeichen Java Basics - Anfänger-Themen 18
O String von vorne nach hinten an einem Zeichen Java Basics - Anfänger-Themen 10
S char auf buchstabe/zeichen prüfen Java Basics - Anfänger-Themen 1
P Zeichenkette Zeichen ausschlißen funktioniert nicht richtig Java Basics - Anfänger-Themen 9
L String auf bestimmte zeichen untersuchen Java Basics - Anfänger-Themen 9
D gebe string zurück mit von bis bestimmtes Zeichen Java Basics - Anfänger-Themen 4
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
Y String auf allgemein Zeichen untersuchen Java Basics - Anfänger-Themen 3
S String trennen nach beliebigen Zeichen Java Basics - Anfänger-Themen 3
C Zeichen im String bis zu bestimmter Stelle entfernen Java Basics - Anfänger-Themen 6
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
H Zeichen im algorithmus Java Basics - Anfänger-Themen 4
S Das Anführungszeichen(") Zeichen in einen String setzen Java Basics - Anfänger-Themen 1
G Zeichen suchen und Ausgeben. Java Basics - Anfänger-Themen 3
D Input/Output Split am Zeichen | Java Basics - Anfänger-Themen 2
B zeichen eines String mit der kleinsten Frequenz zurückgeben Java Basics - Anfänger-Themen 25
m0n4ch Variablen String auf ungültige Zeichen überprüfen Java Basics - Anfänger-Themen 13
Voreck String Zeichen für Zeichen auslesen Java Basics - Anfänger-Themen 9
R Zeichen in String vergleichen Java Basics - Anfänger-Themen 75
G Gibt es eine Methode die bei einem StringBuilder n mal das Zeichen c hinzufügt? Java Basics - Anfänger-Themen 6
D String Zeichen für Zeichen auslesen Java Basics - Anfänger-Themen 5
S Zeichen ab Suchstring einlesen Java Basics - Anfänger-Themen 6
Z char Array unbekanntes Zeichen selbstständig anlegen Java Basics - Anfänger-Themen 6
M Pipe-Zeichen "|" in Java Java Basics - Anfänger-Themen 1
S Zeichen von abgerundeten Rechtecken auf einem Applet Java Basics - Anfänger-Themen 5
R Anzahl von Zeichen in einem Char Array Java Basics - Anfänger-Themen 4
F StringBuilder: Zeilenumbruch nach x Zeichen ohne Worttrennung Java Basics - Anfänger-Themen 1
F Zeichen einer Datei zaehlen Java Basics - Anfänger-Themen 1
D Java doppelte Zahl/Zeichen in einem String entfernen Java Basics - Anfänger-Themen 6
W JTextField-Objekt liest Umlaute mit falschen Zeichen ein Java Basics - Anfänger-Themen 5
G zeichen einer Zeile löschen Java Basics - Anfänger-Themen 4
M problem mit diesem zeichen | Java Basics - Anfänger-Themen 10
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
B lanterna einzelne Zeichen aus dem Terminal löschen Java Basics - Anfänger-Themen 0
S Input/Output Alphabet in eine Datei schreiben und Anzahl von Zeichen ausgeben. Java Basics - Anfänger-Themen 4
C Anzahl bestimmter Zeichen in einem String ausgeben Java Basics - Anfänger-Themen 7
I String abschneiden erste und letzte Zeichen Java Basics - Anfänger-Themen 3
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
S Leerzeichen zwischen zwei Zeichen im String entfernen Java Basics - Anfänger-Themen 19
F Methoden split() - Mehrere Zeichen Java Basics - Anfänger-Themen 5
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
F In einem String nach einem String suchen und Zeichen danach ausgeben Java Basics - Anfänger-Themen 6
S Kleines Zeichen berechnen Java Basics - Anfänger-Themen 5
Q Erste Schritte Zeichen in String farblich hervorheben Java Basics - Anfänger-Themen 4
U markierten Text auf Zeichen zuvor/danach pruefen Java Basics - Anfänger-Themen 9
M Input/Output Zeichen on Konsole einlesen Java Basics - Anfänger-Themen 3
DStrohma Operatoren Kleiner-Zeichen in Größer-Zeichen ändern wenn boolen true? Java Basics - Anfänger-Themen 6
G Input/Output Verhalten BuffferedReader bei unvollständigen Zeichen Java Basics - Anfänger-Themen 1
P String Zeichen zuweisen Java Basics - Anfänger-Themen 3
Q Erste Schritte In CharArrayWriter Zeichen an Stelle einfügen Java Basics - Anfänger-Themen 4
H Programm zum Zählen von Zeichen Java Basics - Anfänger-Themen 5
P Methode die String auf Zeichen überprüft Java Basics - Anfänger-Themen 2
A Seltsame Zeichen vor Clienteingabe Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben