c++ eigene matheaufgabe eingeben

...komplette Frage anzeigen

5 Antworten

zB. so:

#include <iostream>
#include <stdio.h>

using namespace std;

int main (void)
{
    char c, zeichen;
    int a = 0, b = 0, d = 0;
    for (int i = 0; i < 2; )
    {
        c = getchar();          //einzelnes zeichen lesen
        if ((c >= '0')&&(c <= '9'))         //ist die eine Zahl?
        {
            d = a - '0';                //in Zahl umwandeln
            if (i = 0) a = a * 10 + d;      //hinten anhängen
            else b = b * 10 + d;
        }
        else if ((c = '+')||(c = '-')||(c = '*')||(c = '/'))    //ist dies ein Rechenzeichen?
        {
            zeichen = c;
            i++;                                //andere Zahl beschreiben
        }
        else i=2;                               //bestätigung
    }
    system("cls");
    cout<<a<<zeichen<<b<<"=/n";             //aufgabe schreiben
    if (zeichen = 0) cout<<a;
    else
    {
        switch (zeichen)                    //unterscheide zwichen rechenarten und schreibe Ergebnis:
        {
        case '+':
            cout<<a+b;
            break;
        case '-':
            cout<<a-b;
            break;
        case '*':
            cout<<a*b;
            break;
        case '/':
            if (b = 0)cout<<"/n/nError, kann nicht durch 0 dividieren";
            else cout<<a/b;
            break;
        }
    }
    system("Pause");            //benutzer lesen lassen
    return 0;
}

ist villeicht nicht die beste Lösung, aber hoffentlich hilft dir das Weiter... ;)

habe noch keine Zeit gehabt, den Code zu testen

ich hoffe ich konnte dir helfen

HUND999

Pischi 09.07.2013, 22:23

Sorry, aber ich weiß nicht wie man da zu einer normalen Lösung kommen soll.

0
Hund999 10.07.2013, 10:32
@Pischi

wo genau liegt denn dein Problem und als was für eine Anwendung möchtest du es machen?
Konsolen-Anwendung oder mit Windows-Obeläche?

0
Hund999 10.07.2013, 12:23
@Pischi

ich hatte gestern keine richtige Zeit, dass Programm zu prüfen... und es waren einige Fehler vorhanden, die ich behoben habe....

nun müsste es laufen:

#include <iostream>
#include <conio.h>

using namespace std;

int main (void)
{
    char c, zeichen = ' ';
    int a = 0, b = 0, result = 0;
    cout<<"Bitte eine Aufgabe eingeben, zB.\n1+1=\n56 - 23 =\n\n";
    cout<<"_________________________________________________________________________\n\n"<<endl;
    for (int i = 0; i != 2; )
    {
        c = getch();
        cout<<c;
        switch (c)                                          //einzelnes zeichen lesen
        {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            if (i == 0) a = (a * 10) + c - '0';                 //hinten anhängen
            else        b = (b * 10) + c - '0';
            break;
        case '+':
        case '-':
        case '/':
        case '*':
            if (zeichen == ' ') zeichen = c;
            i++;                                                //andere Zahl beschreiben
            break;
        case ' ': break;
        default: i=2;                                           //bestätigung
        }
    }
    system("cls");
    cout<<a<<zeichen<<b<<"=\n";                                 //aufgabe schreiben
    if (zeichen == ' ') cout<<a;
    else
    {
        switch (zeichen)                                        //unterscheide zwichen rechenarten und schreibe Ergebnis:
        {
        case '+':
            result = ((int)a + (int)b);
            break;
        case '-':
            result = ((int)a - (int)b);
            break;
        case '*':
            result = ((int)a * (int)b);
            break;
        case '/':
            if (b == 0)cout<<"\n\nError, kann nicht durch 0 dividieren";
            else result = ((int)a / (int)b);
            break;
        }
    }
    cout<<result<<"\n\n\n"<<endl;
    system("Pause");                                            //benutzer lesen lassen
    return 0;
}

ich hoffe es kann dir etwas weiterhelfen...

wenn du fragen hast, einfach schreiben...

HUND999

0

Was Du machen willst, ist ein Interpreter für mathematische Formeln. Du brauchst diese zwei Bausteine dazu:

  • Einen Parser, der die Formeln in umgekehrt polnische Notation (UPN,. Postfix-Notation) umwandelt. Macht man deshalb, weil UPN einfacher weiterverarbeitet werden kann. (Wie Parser funktionieren, ist in jedem Lehrbuch über Compilerbau erklärt.)
  • Einen Evaluator (Auswerter), der aus den UPN-Ausdrücken die Lösungen errechnet

Schau hier mal nach:

w w w punkt smccd.net/accounts/hasson/C++2Notes/ArithmeticParsing.html
w w w punkt dailyfreecode.com/code/convert-infix-expression-postfix-1012.aspx
de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation
de.wikipedia.org/wiki/Shunting-yard-Algorithmus

Die Eingabe erfolgt als String ....

das einzigste was du machen musst ist den String zu Zerteilen in die Entsprechenden Teile mit DEIN_STRING.substr(POSITION,LÄNGE)

Das Ganze machst du für die anzahl der Leerzeichen mal

aus Dem Zeichen ergibt sich dann die jeweilige rechenart

wobei ich sagen muss das die Antwort von Franz1957 kompetenter aussieht

Wenns nur um das finktionale geht kannst du auch

int x, y;
char r;

cin >> x >> r >> y;

benutzen. Das ist zwar prinzipiell total falsch, aber wenn du nacheinander [Ganze Zahl] [Rechenzeichen] [ganze zahl] eigibst funktionierts, weil er für den integer nur die zahlen wertet und für char nur ein zeichen :D

PS: Es IST falsch, also muss das keiner drunterschreiben und evtl. funktoniert es bei dir auch nicht. Ansonsten hast du den richtigen Weg ja schon erhalten...

Du musst das Rechnenartssymbol separät eingegeben lassen.

Pischi 04.07.2013, 20:36
cout << "Zahl 1" << endl;
cin >> zahl1;
cout << "Zahl 2" << endl;
cin >> zahl2;
cout << "Welche Rechnenoption"? << endl;
cin >> rechnung;

So habe ich das jetzt da stehen. Aber es muss doch möglich sein, dass man statt alles mit Enter zu bestätigen einfach selber " 2 + 2 " eingibt.

0

Was möchtest Du wissen?