# [C] Problem mit einfachen Taschenrechner



## DAmico (8. April 2010)

Hallo Leute,

ich möchte einen Taschenrechner in C programmieren, doch leider muss ich zugeben, dass meine bisherigen Versuche alle gescheitert sind. 
Deshalb wende ich mich an euch.

Der Taschenrechner soll nur einstellige Zahlen(0-9) benutzen, nur Addition und Subtraktion beherrschen und Klammern unterstützen, die bei der Rechnung beachtet werden sollen, z.B.: (4+5)-(2) oder 3+6-4

Mein Problem bei dem Taschenrechner liegt darin, dass die ganze Rechenaufgabe als String eingelesen werden soll.

Habt ihr eine Idee, wie ich am besten dieses Problem in Angriff nehmen kann?

Vielen Dank für eure Hilfe im Voraus.
Mit freundlichen Grüßen


----------



## ComFreek (8. April 2010)

Such doch einfach mal bei Google. (Die meisten Taschenrechner basieren auf Strings).


----------



## deepthroat (8. April 2010)

Hi.

Das Thema hatten wir neulich erst: http://www.tutorials.de/forum/c-c/355637-c-gleichungen-loesen-equation-solver.html

Evtl. ist killerkirsche ja inzwischen mit der Implementierung fertig. Wenn du es selbst machen möchtest findest du aber auch ein paar Ansätze.

Gruß


----------



## DAmico (8. April 2010)

Dankeschön für die schnellen Antworten.

Google habe ich, bevor ich in das forum gepostet habe, durchforstet,
habe aber leider keinen passenden Ansatz gefunden. 

Habe mir den Thread von killerkirsche angeschaut, die Anforderungen an seinen Rechner sind noch hoher.
Leider steige ich mit meinen bisherigen Kenntnissen da nicht ganz durch.

Hat jemand von euch eine Idee, wie ich diese Problemstellung anpacken könnte? 
Mit freundlichen Grüßen


----------



## deepthroat (8. April 2010)

DAmico hat gesagt.:


> Habe mir den Thread von killerkirsche angeschaut, die Anforderungen an seinen Rechner sind noch hoher.
> Leider steige ich mit meinen bisherigen Kenntnissen da nicht ganz durch.


Evtl. solltest du dann deine Anforderungen korrigieren. Klammerausdrücke würde ich erstmal weglassen.


DAmico hat gesagt.:


> Hat jemand von euch eine Idee, wie ich diese Problemstellung anpacken könnte?


Ich vermute du hast das gelesen? http://www.tutorials.de/forum/c-c/247583-hilfe-beim-parsen.html

Dann mußt du ja eigentlich nur eine Ziffer lesen und dann in einer Schleife einen Operator, eine weitere Ziffer, die Operation ausführen bis der Ausdruck zuende ist. Letztendlich kannst du Klammern mit behandeln indem du deine Funktion rekursiv aufrufst.

Gruß


----------



## Vereth (8. April 2010)

Schau dir mal den Wiki-Artikel über die Umgekehrte Polnische Notation an, vielleicht ist das etwas für dich. Vielleicht kannst du auch mal probieren, einen normalen Ausdruck in UPN umzuwandeln und dann entsprechend zu verarbeiten.


----------



## DAmico (8. April 2010)

Dankeschön für die guten Anregungen,
ich werd mich mal auf den Stoff stürzen.

Eine spezielle Frage zum Verständnis habe ich:
Wenn ich vom Programm einen String "rechnung" einlesen lasse,
also als konkretes Beispiel 2 + 3.
Dann liegt ja in rechnung[0] die 2, das + in rechnung[1] und die 3 in rechnung[2].
Wie lässt es sich jetzt in C umsetzen, dass ich diese Rechnung ausführe?
Sprich ich initialisere die Variable ergebnis und möchte jetzt das Ergebnis von 2+3 in die Variable ergebnis speichern,
Wie lässt sich dies bewerkstelligen?

Vielen Dank im Voraus.
Mit freundlichen Grüßen


----------



## sheel (9. April 2010)

Gar nicht.
Das ist ja eben das Problem bei Taschenrechnern und ähnlichem, man muss die einzelnen Zahlen und Operatoren aus dem String rausholen (und möglichst alle math. Regeln dabei beachten)

Der C-Compiler kanns zwar, aber eben nur wenns im Quelltext steht.
Beim Ausführen hilft der nicht mehr


----------



## Chumper (9. April 2010)

Ist bei Addition und Subtraktion die Klammersetzung nicht sowieso obsolet (ich mag das Wort  )?


----------



## Matthias Reitinger (9. April 2010)

Chumper hat gesagt.:


> Ist bei Addition und Subtraktion die Klammersetzung nicht sowieso obsolet (ich mag das Wort  )?


Welche grundlegende Änderung an der Arithmetik gab es denn in letzter Zeit, die sich auf die Klammersetzung ausgewirkt hätte?

Grüße,
Matthias


----------



## deepthroat (9. April 2010)

Matthias Reitinger hat gesagt.:


> Welche grundlegende Änderung an der Arithmetik gab es denn in letzter Zeit, die sich auf die Klammersetzung ausgewirkt hätte?


Naja, *3 - 5 + 8* ist jetzt das gleiche wie *3 - (5 + 8) *. Oder nicht?! ;-]

Gruß


----------



## Chumper (9. April 2010)

Und doch auch das gleiche wie *2 + (1 - 5) + 8*


----------



## vfl_freak (9. April 2010)

Moin,



Chumper hat gesagt.:


> Ist bei Addition und Subtraktion die Klammersetzung nicht sowieso obsolet (ich mag das Wort  )?



ich auch 

Aber ob obsolet oder nicht .... ich finde, lieber einmal zuviel klammern als zuwenig 
Das hat ganz ein einfach was mit der Lesbarkeit Deines Codes zu tun .... Im Zweifel hilft es Dir, wenn Du nach Monaten mal wieder in den Code schaust ;-]

Gruß
Klaus


----------



## DAmico (9. April 2010)

Danke sheel für deinen Post,
dann leg ich mal den Gedankengang auf Eis, vllt findet sich ja ein anderer Lösungsweg.

Wäre es möglich einen Zeiger zu initialisieren, der dann die jeweiligen Stellen des Strings abklappert und mit dem Zeiger dann zu rechnen?

Ich stimme euch zu, dass die Klammersetzung bei diesem Rechner hier äußerst überflüssig ist.
Wo ich die Aufgabenstellung gelesen hab, hab ich mir gedacht, warum wird bei diesem Rechner wert auf Klammern gelegt, da sie ja bei Subtraktion und Addition eh keine Rolle spielen.

Mit freundlichen Grüßen


----------



## deepthroat (9. April 2010)

DAmico hat gesagt.:


> Wäre es möglich einen Zeiger zu initialisieren, der dann die jeweiligen Stellen des Strings abklappert und mit dem Zeiger dann zu rechnen?


Natürlich kann man das so machen. Du mußt nur die Zeichen in den jeweiligen Wert der Ziffer umrechnen (Hinweis: ASCII Code).


DAmico hat gesagt.:


> Ich stimme euch zu, dass die Klammersetzung bei diesem Rechner hier äußerst überflüssig ist.
> Wo ich die Aufgabenstellung gelesen hab, hab ich mir gedacht, warum wird bei diesem Rechner wert auf Klammern gelegt, da sie ja bei Subtraktion und Addition eh keine Rolle spielen.


Du scheinst die (subtile) Ironie in Matthias und meinem Beitrag nicht verstanden zu haben. Bitte überleg doch noch mal ob z.B. für den Term *3 - (5 + 8)* das gleiche herauskommt wenn man keine Klammern setzt.

Gruß


----------



## DAmico (9. April 2010)

Danke für die schnelle Antwort.

Ohne Klammersetzung ergibt sich ein Problem, da dann die erste Operation eine negative Zahl wird, die aber nicht als negativ erkannt wird

Leider weiß ich nicht wie es möglich ist den ASCII-Wert in die Ziffer umzuwandeln,
ich würde mich freuen, wenn du mich aufklären würdest.

Mit freundlichen Grüßen


----------



## deepthroat (9. April 2010)

DAmico hat gesagt.:


> Ohne Klammersetzung ergibt sich ein Problem, da dann die erste Operation eine negative Zahl wird, die aber nicht als negativ erkannt wird


Was soll das denn heißen? Warum _erkennst _du die Zahl nicht als negativ?


DAmico hat gesagt.:


> Leider weiß ich nicht wie es möglich ist den ASCII-Wert in die Ziffer umzuwandeln,
> ich würde mich freuen, wenn du mich aufklären würdest.


Welchen ASCII Code hat das Zeichen '0'?
Welchen ASCII Code hat das Zeichen '1'?
Welchen ASCII Code hat das Zeichen '2'?
Welchen ASCII Code hat das Zeichen '3'?
Welchen ASCII Code hat das Zeichen '4'?
Welchen ASCII Code hat das Zeichen '5'?
...

Gruß


----------



## DAmico (9. April 2010)

Des mit den Klammern war grad a schmarn.
Bei Subtraktion und Addition interessieren die Klammern niemanden.

Zu den ASCII-Codes:
0 hat den ASCII-Wert 48 .... soweit komm ich schon mit.
Der Pointer enthält ja dann den ASCII-Wert, aber ich weiß nicht, wie ich ihn dann in die Ziffer umwandle, dass ich dann mit ihr rechnen kann?

Mit freundlichen Grüßen


----------



## sheel (9. April 2010)

Die Klammern interessieren keinen?
1-2+3=2
1-(2+3)=-4

Bezüglich den Codes:
Du hast es ja schon erkannt: 0 hat 48, 1 hat 49...
Einfach Den char minus 48, dann hast du die pure Ziffer.


----------



## DAmico (9. April 2010)

Gut...die Klammern sind also von Relevanz.

Nun zu den ASCII-Werten:
Dankeschön für die Aufklärung, Wert-48 liefert dann die gewünschte Zahl.

Jetzt werd ich mich wohl mal ins Getümmel stürzen.


----------

