Ich möchte gerne einen Taschenrechner in C programmieren. Können soll er ersteinmal die Grundrechenarten. Selbstständig Punkt vor Strichrechnung machen und unendlich Klammerebenen haben. Gibt es dafür irgendwelche Beispielprojekte? Im Internet finde ich nichts. Alles in anderen Programmiersprachen. Ich würde mir halt gerne die Systematik anschauen wollen. Gibt da ja mehrere Lösungsmethoden. Die Lösung ein struct zu benutzen und eine Art Baumdiagramm aufzubauen gefällt mir da bisher am besten. Danke
:
Gesperrt durch User
Das ist eine Standardaufgabe für Yacc und Lex. Suche danach und du wirst Beispiele finden. Auf einem kleinen uC würde ich den Output von Lex und Yacc allerdings nicht ausführen wollen.
Das sind ja Sachen die es ermöglichen einen eigenen Compiler zu bauen oder wie? Ich will doch nur einen String den ich habe wie zB (8+9)-7*8+5(4-3) ausrechnen und das ergebnis angeben. Keine Sonderrechenarten.
Sieh dir mal das an:
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | |
4 | int main() |
5 | { |
6 | float erg, zahl1, zahl2; |
7 | char op, wd; |
8 | do |
9 | { |
10 | printf("Bitte 1. Zahl:"); |
11 | scanf("%f",&zahl1); |
12 | printf("Bitte 2. Zahl:"); |
13 | scanf("%f",&zahl2); |
14 | printf("Bitte Operator eingeben:"); |
15 | scanf("\n%c",&op); |
16 | switch(op) |
17 | { |
18 | case '+': |
19 | erg=zahl1+zahl2; |
20 | break; |
21 | case '-': |
22 | erg=zahl1-zahl2; |
23 | break; |
24 | case '*': |
25 | erg=zahl1*zahl2; |
26 | break; |
27 | case '/': |
28 | erg=zahl1/zahl2; |
29 | break; |
30 | default:printf("Fehler\n"); |
31 | } |
32 | printf("Erg=%8.3f\n",erg); |
33 | |
34 | do |
35 | { |
36 | printf("Wiederholen(J/N)"); |
37 | scanf("\n%c",&wd); |
38 | } |
39 | while((wd!='j')&&(wd!='J')&&(wd!='n')&&(wd!='N')); |
40 | } |
41 | while((wd=='j')||(wd=='J')); |
42 | return 0; |
43 | } |
War eine meiner ersten Programmieraufgaben ;)
Ne ich will schon nen ganzen String eingeben und den dann von alleine berechnen lassen. Siehe ein Beitrag weiter oben :-)
André R. schrieb: > Ne ich will schon nen ganzen String eingeben und den dann von alleine > berechnen lassen. Siehe ein Beitrag weiter oben :-) Dann musst du dir halt einen Parser schreiben, ist eine gute Übung. ;-)
>Das sind ja Sachen die es ermöglichen einen eigenen Compiler zu bauen >oder wie? Richtig. >Ich will doch nur einen String den ich habe wie zB >(8+9)-7*8+5(4-3) >ausrechnen Ja, und? Das ist Compilerbau! OK, zumindest ein essentieller Teil davon. >Keine Sonderrechenarten. Ob Du auf Sonderrechenarten verzichtest oder nicht, spielt kaum eine Rolle. Viel Glück!
Floh schrieb: > André R. schrieb: >> Ne ich will schon nen ganzen String eingeben und den dann von alleine >> berechnen lassen. Siehe ein Beitrag weiter oben :-) > > Dann musst du dir halt einen Parser schreiben, ist eine gute Übung. ;-) Leider bin ich das allerletzte was C angeht ;-).
Hier ist so etwas in C++: Beitrag "Re: Weis jemand, wie man mathematische Ausdrücke in C++ auswert" Das in C umzuschreiben, dürfte nicht der große Act sein. Im Wesentlichen musst du die Klasse außenrum weglassen. Die einfachere Version für Integerarithmetik steht weiter oben: Beitrag "Re: Weis jemand, wie man mathematische Ausdrücke in C++ aus"
Vuvuzelatus schrieb: >>Ich will doch nur einen String den ich habe wie zB >>(8+9)-7*8+5(4-3) >>ausrechnen > > Ja, und? Das ist Compilerbau! OK, zumindest ein essentieller Teil > davon. Nana - soetwas macht der Precompiler oder teilweise die Analysephase aber der eigendliche Compiler nimmt nur den Output von denen ;-) Du bist aber auf dem richtigen Weg - ich habe es damals im 1. Semester auch mit hilfe eines Baumes gelöst. Erst String analysieren und Baum erstellen - ein Knoten ist immer ein Operator mit 2 Kindern - die Blätter des Baumes sind die Werte. Dann im 2. Schritt je nach Aufbau im Infix drübergehen und berechnen - hierbei dann peinlichst auf autocast's achten ;-) Ich finde das ist eine schöne Aufgabe, auch wenn viele denken ein Taschenrechner wäre zu billig - wie man sieht muss man sich gedanken machen. Viel Erfolg!
>(8+9)-7*8+5(4-3)
Zeichen für Zeichen auswerten.
Im String nach Klammerauf suchen. Position speichern
Dann Klammerzu suchen. Pos speichern.
Falls keine Klammer gefunden Anzahl Zeichen ermitteln und dies als Max
wert abspeichern (für Stringsuche).
zwischen beiden Positionen Zahlen und Operatoren separieren.
Zahlen berechnen. (Anhand zusammenhängender Zahlen Stellenanzahl
ermitteln
und dementsprechend jede stelle mit zb 1000,100,10 ect multiplizieren
und dann alle addieren).
Diese Binärzahlen abspeichern und dann mittels der gefundenen Operatoren
berechnen.
bei ZB (2-4*8) haben wir 3 Zahlen und 2 Operatoren gefunden und
gespeichert.
Höchsten Operator suchen (*) . gefunden an 2.Stelle
Das heißt Zahl 2 * Zahl 3 = Ergebnis_1
usw
Hier hast Du, was Du brauchst mit Flex&Bison: http://www.codeguru.com/csharp/.net/net_general/patterns/article.php/c12805
Bison für Windows: http://gnuwin32.sourceforge.net/packages/bison.htm Flex: http://gnuwin32.sourceforge.net/packages/flex.htm Oder als cygwin Packete instalieren.
André R. schrieb: > Floh schrieb: >> André R. schrieb: >>> Ne ich will schon nen ganzen String eingeben und den dann von alleine >>> berechnen lassen. Siehe ein Beitrag weiter oben :-) >> >> Dann musst du dir halt einen Parser schreiben, ist eine gute Übung. ;-) > > Leider bin ich das allerletzte was C angeht ;-). Dann solltest du das erst mal abstellen. Ein Taschenrechner, der arithmetische Ausdrücke richtig auswerten kann, ist definitiv kein Einsteigerprojekt mehr. Nicht wenn man es richtig machen will.
> Hier alle Datein; C-Files zusammen kompilieren und ausprobieren :-)
Und hilft der schwer zu durchschauende fertige Kauderwelch dem TE auch
wirklich weiter? Mit C-Quelltexten beginnen, anstatt sich mal zu
überlegen, wie sowas zunächst mal auf Papier als Prozedur aussehen
könnte? Da habe ich des Karl Heinz Buchegger's Reden immer anderes
verstanden.
;-)
Flex und Bison braucht man dafür nicht unbedingt. So einen arithmetischen Auswerter zu schreiben, ist nicht so schwer, wenn man die Grundtechniken des Compilerbaus kennt. Ganz im Gegenteil, meistens ist das eines der ersten Dinge, die man im Compilerbau macht. > Ich will doch nur einen String den ich habe wie zB > ... > ausrechnen und das ergebnis angeben. Keine Sonderrechenarten. Das spielt so gut wie keine Rolle. Der Aufwand besteht darin, dass man einen String zerlegen muss und dann Anhand von Regeln auswertet. Darin besteht die Komplexität. Sonderrechenarten sind, wenn man die Grundrechenarten erst mal hat, eine leichte Übung und für jede Rechenart eine ca. 3-zeilen große Erweiterung. Grundrechenarten und Klammern
1 | Expression = Term { [ '+' | '-' ] Term } . |
2 | Term = Faktor { [ '*' | '/' } Faltor } . |
3 | Faktor = Zahl |
4 | | '(' Expression ')' . |
Das ist das Regelwerk, welches man für die Grundrechenarten inklusive Klammern benötigt. Eine Erweiterun um zb eine Wurzel ist simpel
1 | Faktor = Zahl |
2 | | '(' Expression ')' |
3 | | 'sqrt' '(' Expression ')' . |
Aber: Dazu muss man 1) sein C Handwerkszeug schon etwas im Griff haben 2) grundlegende Abläufe im Compilerbau kennen. Dann ist sowas eine Sache auf ein paar Stunden. Aber für jemanden mit der Aussage 'In C bin ich eine Niete' ist das definitiv nichts. Da hilft dir auch kein mit noch solch Inbrust hervorgestossenes "Ich will". Erst mal muss es heißen "Ich kann"
:
Bearbeitet durch User
Das, was du suchst, ist ziemlich genau im "Drachenbuch" (Aho, Sethi, Ullmann, Compilers, auf Deutsch "Compilerbau") beschrieben. Kapitel 2, inkl. kompletten C-Listing (ein paar Seiten). Ein bisschen C sollte man aber schon können und das Kapitel auch lesen, wenn man was groß verändern möchte.
Auch ein interessanter Ansatz: "umgekehrte Polnische Notation": http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation
André R. schrieb: > Ich möchte gerne einen Taschenrechner in C programmieren. > Gibt es dafür irgendwelche Beispielprojekte? Hallo, in "The C++ Programming Language" beschreibt Bjarne Stroustrup in mehreren Beispielen auf S. 107, 165, 190 und 208 (3rd ed) wie das geht. Dabei ist vieles reines C und nur wenig C++. Siehe auch 10 Expressions und 10.2 A Desk Calculator unter http://www.stroustrup.com/4thContents.html