Taschenrechner in C

OP #2524662
Lesenswert?

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
#2524695
Lesenswert?

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 ;)
Gast #2524707
Lesenswert?

>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!
Gast #2524837
Lesenswert?

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!
Gast #2524923
Lesenswert?

>(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
#2524960
Lesenswert?

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.
Gast #2524977
Lesenswert?

> 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.

;-)
#2524984
Lesenswert?

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"
#4001091
Lesenswert?

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.
#4002016
Lesenswert?

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
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.