![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
/(bb|[^b]{2})/
Registriert seit: 05.11.2006
Beiträge: 29
|
Hi@all!
Ich habe ein kleines Prob. Und zwar habe ich diesen Code: PHP-Code:
Der soll für eine Gleichung, die ich eingebe, die x durch $null ersetzen und davor ein* hinzufügen, falls da kein +-*/ steht. Leider kriege ich immer, wenn ich ihn ausführe, einige Warnungen und Notizen, dass in Zeile soundso (je nach Gleichung) der Offset undefiniert ist und in der Funktion strpos() der Offset nicht funktioniert. Wenn ich in Zeile 27 die and durch or ersetze, kriege ich keine Meldungen, aber dann fügt der in jedem Fall ein * vor dem x ein, auch wenn da ein+-*/ steht. Kann mir jemand helfen? Greetz, Ilinsekt Geändert von Ilinsekt (05.11.2006 um 15:00 Uhr). |
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Hallo und willkommen im Forum.
Du kannst deine Beiträge editieren. Bitte tu dies und nutze die PHP-Tags. Danke dir. Danach schaue ich mir dein Problem auch an. Grüße, Ben. [EDIT] Danke, ich schau mal.
__________________
Mehr TuS Koblenz geht nicht ... Aktuell ... - Neue Gegner für die TuS: 1.FC Nürnberg - 5 neue Gegner 2008/09 - Informationsveranstaltung für Mitglieder - Förderkasse füllt sich - B-Jugend Rheinlandpokalfinale terminiert - A-Jugend I gewinnt Rheinlandpokal Geändert von Ben (05.11.2006 um 13:24 Uhr). |
|
|
|
|
|
Nach oben #3 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Äh, ja. Also ich erhalte das hier
Code:
y = x^2........y = *$null^2+0-0/1*1.......y = *pow($null,2)+0-0/1*1 Der Code ist recht wirr, da nicht wirklich dokumentiert. Zitat:
Was genau ist dein Fehler? (Muss gestehen, dass ich mich jetzt nicht intensiv damit befasst habe .. mich hat die Lust verlassen, als ich den Code gesehen hab Kannst du uns eventuell sagen, wann genau du eine Meldung erhälst? Danke. Grüße, Ben. |
|
|
|
|
|
|
Nach oben #4 | |||
|
/(bb|[^b]{2})/
Registriert seit: 05.11.2006
Beiträge: 29
|
Wenn ich eingebe: 25x^23+5*x^2
sollte er das in 25*pow($null,23)+5*($null,2) umwandeln, d.h. wenn kein +-*/ vor dem x steht, soll er ein *-Zeichen hinzufügen. Bei dieser Gleichung erhalte ich folgendes: Zitat:
Zitat:
Greetz, Ilinsekt Geändert von Ilinsekt (05.11.2006 um 15:08 Uhr). |
|||
|
|
|
|
|
Nach oben #5 |
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 388
|
ALso ich habe deinen Code ausprobiert und versucht, ihn zu verstehen, aber ich glaube, dass du leider auf dem falschen Dampfer bist.
Denn sobald du eine Funkton vom Format [i}y=(24+x)^4-x(5+x)[/i] bekommst, wirst du ein Problem haben. Ich würde folgendermaßen vorgehen: Zuerst würde ich eine Art Hierarchie der Funktion entwerfen entsprechend den Zugehörigkeiten der einzelnen Teile. Für unsere Beispielfunktion sähe diese Hierarchie folgendermaßen aus: (in geschweiften Klammern nach dem Wort "Array" immer der Teil auf das sich das Array bezieht) Code:
$function =
Array { (24+x)^4-x(5+x) }
[0] => Array { (24+x)^4 }
[0] => Array { 24+x }
[0] => 24
[1] => x
['Konnektor'] => +
[1] => 4
['Konntektor'] => ^
[1] => Array { x(5+x) }
[0] => x
[1] => Array { 5+x }
[0] => 5
[1] => x
['Konnektor'] => +
['Konnektor'] => *
['Konnektor'] => -
( aus 25+x+3 wird 28+x ) Ich kann dir jetzt nicht sagen, wie du das exakt machen kannst, aber im Grunde funktioniert es so. Ich würde so vorgehen: Zuerst würde ich alle Leerstellen aus der Gleichung entfernen. Anschließend würde ich alle ax bzw. xa zu a*x bzw. zu x*a umwandeln. Danach würde ich alle Zugehörigkeiten anhand von Klammern in eine Hierarchie umwandeln. Dann würde ich innerhalb der gleichen Ebene (in der gleichen Klammer) nach gleich starken Verknüpfungen suchen und sie zusammenfassen. ( 4+(5+x) ist legitim (4+5+x) nicht!! ) Danach könnte man die Hierarchie von vorhin aufstellen. Und dann würde ich daran gehen, die x durch $null zu ersetzen und die einzelnen Operatoren durch ihre Entsprechung in PHP Und dann alles wieder zusammensetzen, wobei Ebenen geklammert werden. Tadaaa! Fertig. Noch dabei? Gut, weil ich nämlich fast nicht mehr Also ich fände es eine Herausforderung. Helfen würde dir dabei die Funktion preg_match_all sowie weitere pref-Funktionen. Und vielleicht auch das Tut über Rekursion Grüße, Jojo
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
|
|
|
|
|
Nach oben #6 |
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 388
|
Also ich lag gestern noch lange wach, weil mich ein ungutes Gefühl bei meiner Antwort plagte.
Am Ende habe ich dann doch nen Fehler gefunden. Mit meiner Technik hast du leider folgenden Fall nicht abgedeckt: Code:
y=(23+x)^3+2x^2+2 Zuerst trennst du wie gehabt die Gleichung nach Klammern auf. Dann erstellt du auf dieser Basis davon einen Hierarchiebaum, mit jeweils zwei Elementen. mehrere gleiche Verknüpfungen würde ich wie folgt aufbauen: x^3+x^2+x wird zu Code:
Array [0] => x^3+x^2 [1] => x ['Konnektor'] => + Code:
Array
[0] => Array
[0] => x^3
[1] => x^2
['Konnektor'] => +
[1] => x
['Konnektor'] => +
So hast du nicht das Problem, zusammenfügen zu müssen und behälst doch die binäre Struktur bei. Dann fängst du an, aufgrund deines "Klammerbaumes" die Elemente aufsteigend nach ihren Verknüpfungen immer mehr zu unterteilen, bis du zu einem Baum wie in meinem Thread vorher kommst. Dann entsprechend ersetzen und fertig.
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
|
|
|
|
|
Nach oben #7 |
|
/(bb|[^b]{2})/
Registriert seit: 05.11.2006
Beiträge: 29
|
Also, danke erstmal für die Antworten!
Mein ursprüngliches Problem habe ich jetzt gelöst, es hat eine else-Struktur gefehlt. Nun zu deiner Idee, Jojo: Ich finde, das ist unnötig, da PHP die Klammerregeln kennt. Ich werde meinen Code halt etwas umbauen müssen, á la wenn vor dem Cirkoflex eine Klammer steht, dann sucht er die vorherige Position einer öffnenden Klammer und ersetzt die Klammern und die Potent durch pow(Klammerinhalt z.B. 5+$null,Potenz z.B. 4). Es geht darum, in der Stringvariable $xpotenz einen gültigen PHP-Code als String zu speichern, sodass ich ihn mit eval() nutzen kann. Greetz, Ilinsekt |
|
|
|
|
|
Nach oben #8 |
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 388
|
Mir ist klar, dass PHP Klammern kennt.
Nur könntest du eventuell Schwierigkeiten bekommen, wenn du damit bestimmte Funktionen ausführst. Aber nun gut, war ein Vorschlag. Kann man sicherlich auch anders machen. Grüße, Jojo
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
|
|
|
|
|
Nach oben #9 |
|
/(bb|[^b]{2})/
Registriert seit: 05.11.2006
Beiträge: 29
|
Der Code ist jetzt soweit fertig, dass er die Gleichung in PHP-Code übersetzt, auch wenn vor der Potenz Klammern oder Zahlen stehen. eval() funktioniert auch, fehlt nur noch die Bestimmung der Nullstelle, was aber einfach sein dürfte, da ich den dafür nötigen Code bereits auf meinem Taschenrechner (Texas Instruments TI 82 Stats, bin jetzt 10. Klasse, da kriegt man sowas) programmiert habe, muss ihn nur noch für PHP abschreiben. Falls es dich interessiert, hier mein Code soweit: PHP-Code:
|