Forum: Compiler & IDEs Taschenrechner in C


von André R. (andr_r23)


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

: Gesperrt durch User
von crest (Gast)


Lesenswert?

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.

von André R. (andr_r23)


Lesenswert?

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.

von Benjamin K. (benjamin92)


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 ;)

von André R. (andr_r23)


Lesenswert?

Ne ich will schon nen ganzen String eingeben und den dann von alleine 
berechnen lassen. Siehe ein Beitrag weiter oben :-)

von Floh (Gast)


Lesenswert?

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

von Vuvuzelatus (Gast)


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!

von André R. (andr_r23)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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"

von Stryker_2k (Gast)


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!

von Chose (Gast)


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

von Max (Gast)


Lesenswert?


von Max (Gast)


Lesenswert?

Bison für Windows: http://gnuwin32.sourceforge.net/packages/bison.htm
Flex: http://gnuwin32.sourceforge.net/packages/flex.htm

Oder als cygwin Packete instalieren.

von Karl H. (kbuchegg)


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.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hier alle Datein; C-Files zusammen kompilieren und ausprobieren :-)

von Adler (Gast)


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.

;-)

von Karl H. (kbuchegg)


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"

: Bearbeitet durch User
von UPN (Gast)


Lesenswert?

UPN kann helfen

von Klaus W. (mfgkw)


Lesenswert?

dazu wiederum steht im K&R ein Beispiel, wenn ich mich nicht täusche

von Klaus R. (klausro)


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.

von Joe F. (easylife)


Lesenswert?

Auch ein interessanter Ansatz: "umgekehrte Polnische Notation":

http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation

von Alexander S. (alesi)


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

von Halbaddierwerker (Gast)


Lesenswert?

Schaut doch bitte mal auf das Datum des ersten Beitrags ...

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.