Das hier ist der erste Teil einer Reihe von Contests; man sollte diesen hier erfolgreich bestritten haben damit man sich an die anderen wagen kann.
Ziel dieses Teils: Ein Taschenrechner mit Punkt-vor-Strich, also Operatorprioritäten und Klammernsetzung. Potenzen sollten auch enthalten sein. Also so etwas:
3*(5+3^2)-12
soll eingelesen werden. Ausgabe sollte dann 30 sein. (^ ist Potenz.)
Aber vorsicht bei der Potenz: die ist rechtsassoziativ, heisst:
2^2^2^2 = 2^(2^(2^2)) und nicht ((2^2)^2)^2.
Kriterium bei diesem Contest ist eine möglichst niedrige Laufzeitkomplexität. Auf deutsch: Wenn die Eingabe doppelt so lang ist, und euer Programm annähernd doppelt so lange braucht, ist es besser als ein Programm, das annähernd 4 mal so lange braucht. Ersteres wäre linear, zweiteres quadratisch.
Wir wollen nicht absolut die Zeit messen, damit ein PHPler gegen einen C-Programmierer überhaupt eine Chance hat.
Wenn 2 die selbe Laufzeitkomplexität haben, zählt die Lesbarkeit des Programms.
Falsche Eingaben kommen übrigens nicht vor, also müsst ihr nicht auf Korrektheit überprüfen, einfach nur lesen und auswerten.
könntest du denn wenigstens die Zeichen nennen, die eine Mathematische Funktion beinhalten.
z.b.:
Grundrechenarten:
+: Addieren (Plus)
-: Subtrahieren (Minus) und Negatives Vorzeichen
*: Multiplizieren (Mal nehmen)
/: Dividieren (Teilen)
,: Nachkommabereich beginnen
.: Nachkommabereich beginnen (US/EN-Schreibweise)
Erweiterte Arithmetische Funktionen:
^: hast du ja schon gesagt; Potenzieren (Hoch nehmen)
_: würde ich als Radizieren nutzen (Wurzelziehen)
%: entweder als Modulo (Rest einer Teilung) oder Prozent (n*0,01)
': Modulo, wenn % als Prozent genutzt werden soll
lx: Logarithmus von x (x durch zahl ersetzen)
ln: Natürlicher Logarithmus (= lE)
sin: Sinus
cos: Kosinus
asin: Arkussinus
acos: Arkuskosinus
tan: Tangens
cot: Kotangens
atan: Arkustangens
abs: Absolutwert (>=0 keine Änderung des Vorzeichens, <0 x*-1)
Des weiteren würde ich auch ein paar Konstanten mit einbringen:
PI: Zahl Pi (etwa 3,14159)
E: Eulersche Zahl (etwa 2,718, wird für ln gebraucht)
Eine Liste von Konstanten, die es so gibt:
http://de.wikipedia.org/wiki/Mathematische_Konstante
Danke für die Einsendung c1b1, leider wars die Einzige. Auswertung kann man sich da ja praktisch sparen... :|
Damit hat c1b1 auch gewonnen, da ist c1b1s Code zu finden: http://np.gfx-dose.de/2319/na/ Also gratz ;)
Scheiße, jetzt habe ich mich die ganze Nacht mit rum geschlagen, und noch nicht mal bei der Hälfte meiner Planung angekommen Ich werde das Ding jedoch noch Fertigstellen;
währe echt zu schade, wenn die ganze Arbeit für lau gewesen währe^^
Hatte die letzten Wochen etwas zu viel um die Ohren, daher erst gestern Nachmittag anfangen können.
(Ich mach auch JS und XHTML1.1, jedoch als jQuery-Plugin, kann also schon jetzt sagen, das c1's auf jeden Fall beim starten schneller sein wird^^)
http://np.gfx-dose.de/2323/na/ das wäre übrigens meine Lösung. Der string wird genau einmal durchlaufen und dann ist das Ergebnis da, also optimale Laufzeit. Ist relativ einfach aufgebaut:
Die oberste Ebene ist ne Summe. Eine Summe besteht aus vielen Produkten die mit + oder - aneinandergereiht sind. Ein Produkt besteht aus vielen Potenzen die mit * oder / aneinandergereiht sind. Ein Potenz besteht aus einem Term und evtl. einem ^ gefolgt von noch einer Potenz. Ein Term besteht entweder aus einem + und einem Term, einem - und einem Term, einer Summe die in Klammern steht oder einer Zahl.
Mehr braucht man gar nicht
P.S.: Wenn ein nicht-C++ler den Code liest, peek() gibt das aktuelle Zeichen zurück, pop() schiebt den Lesezeiger eins weiter und get() gibt das aktuelle Zeichen zurück und schiebt den Lesezeiger eins weiter.
so, hat nu aber lang genug gedauert Habe eben mein Ergebnis hochgeladen:
http://forum.afflatus-arts.com/calc/ (Momentan nur auf FF getestet)
Ich kann mir ned helfen, aber entweder ich bin zu gut oder zu schlecht:
mein kleines Benchmark zeigt mir entweder an, das die Berechnung in 0ms oder in 1ms erledigt wurde, kann aber irgendwas ned stimmen, da egal wie lang die Rechnung wird, das Ergebnis fast immer in der selben Geschwindigkeit ausgeführt wird (Oder FF is einfach nur zu schnell auf meinen 2*3GHz^^, jedoch werden nur effektiv 800MHz auf einem Kern genutzt)
Wenn jemand helfen kann, bitte mal Schreiben.