Taschenrechner c++

fatal06

Newbie
Registriert
Okt. 2012
Beiträge
5
Hallo,

ich benötige Hilfe. Erstellt werden soll ein Taschenrechner mit den Grundrechenarten und beliebig vielen Zahlen in der if-Verzweigung.
Wie soll ich diese "beliebig viele Zahlen" unterbringen?

Habe bis jetzt so:

cout << " Rechnung:"<< endl;
cout << " 1. Zahl: ";
cin >> zahl1;
cout << "Rechenzeichen: ";
cin >> rechenzeichen;
cout << "2. Zahl: ";
cin >> zahl2;

if(rechenzeichen == '+')
{
ergebnis=zahl1+zahl2;
cout << "Ergebnis: " << ergebnis;


}

if(rechenzeichen == '-')
{
ergebnis=zahl1-zahl2;
cout << "Ergebnis: " << ergebnis;

}

if(rechenzeichen == '*')
{
ergebnis=zahl1*zahl2;
cout << "Ergebnis: " << ergebnis;


}

if(rechenzeichen == '/')
{
ergebnis=zahl1/zahl2;
cout << "Ergebnis: " << ergebnis;


}

return 0;
}
 
Mach das alles in einer Schleife solange kein = kommt und häng das Zwischenergebnis immer in Zahl1.
Erst bei einem '=' soll das Ergebnis stehen.

Mit dem Code solltest du selbst was machen :)
 
Kenne mich zwar mit C++ wenig aus, deshalb kann ich dir keinen fertigen Code schicken, jedoch sollst du das ganze mit ziemlicher Sicherheit über Schleifen lösen (for,while,do while etc...).
In jedem Durchlauf wird nach der nächsten Zahl gefragt und auch gleich gerechnet. Wenn der User keine Zahl mehr eingeben will, soll er z.B. ein "ENDE" eintippen. Das wird wieder in der Schleife überprüft:
Falls ein "ENDE" eingetippt wurde, soll er aufhören nochmal zu fragen und einen break ausführen. Wenn nicht, soll er weiter machen.

EDIT: Oh, siehe oben. :D
 
Chriss000 schrieb:
User keine Zahl mehr eingeben will, soll er z.B. ein "ENDE" eintippen. Das wird wieder in der Schleife überprüft:
Falls ein "ENDE" eingetippt wurde, soll er aufhören nochmal zu fragen und einen break ausführen. Wenn nicht, soll er weiter machen.

EDIT: Oh, siehe oben. :D
Man könnte auch einen leeren inhalt überprüfen :)
 
Bei beliebig vielen Zahlen wären die Kommandozeilenparameter die beste Lösung.

Code:
int main (int argc, char * argv[])
{

}

In argc steht die Anzahl der Parameter drin, in argv die Parameter selbst. Ein Aufruf des Programms könnte dann so aussehen:

rechne 1 + 2 - 9 + 4

Oder mit nur einer Rechenart:

rechne + 1 7 8 4

Das lässt sich wunderbar in einer einfachen Schleife abarbeiten.
 
@michi.o naja ich glaube es sollt einfache übung sein für schleifen und if abfragen, mehr nicht
 
Jup. Schaut sehr danach aus, als ob es um Schleifen vordergründig geht. Aber der TE kann ja auch mehrere Programme mit Unterschiedlichen Varianten schreiben. Vlt. verdient er sich ja ein paar Sonderpunkte... :D
 
Ich will nicht der Spielverderber sein, aber mit Schleifen ist das ganze ziemlich umständlich zu lösen. Das Problem ist die Operatorpräzedenz.

Wenn du wie vorgeschlagen Schleifen benutzt, wird dein Rechner falsch rechnen.

Z.B.:
2+2*2 = 6

Löst du den Term nun mit Schleifen, erhälst du 8.
-> 2+2 = 4 * 2 = 8.

Bei beliebig vielen Operanden macht es deswegen keinen Sinn Stück für Stück zu vorzugehen. Sinnvoller ist es den ganzen Term zu betrachten.
Ich habe keine Ahnung, wie dein Kenntnisstand ist, aber die naheliegenste Lösung ist folgende:

1. Term komplett einlesen
2. Term von Infix nach Postfix konvertieren (Shunting-Yard Algorithmus)
3. Postfix lösen

Wenn der komplette Term in der Postfix-Notation vorliegt, ist die Berechnung ziemlich trivial.
Wie gesagt, keine Ahnung wie dein Stand ist. Falls du nicht weißt, wovon ich rede, helfen dir sehr wahrscheinlich die beiden Links unten weiter. Dort wird sehr anschaulich erklärt, um was es geht.

Infix -> Postix
Postfix Evaluierung
 
Er kann ja auch, den Term über eine Schleife erst in eine Variable einlesen und später ordnen.
 
Chriss000 schrieb:
Er kann ja auch, den Term über eine Schleife erst in eine Variable einlesen und später ordnen.

1+4*5/2+45-6*65-3/99+55

Viel Spaß ;)

Wenn er irgendwann dann noch Klammern oder Potenzen benutzen möchte darf er sein komplettes Programm umschreiben ;)
 
musste einen fürs studium früher coden aber in java.. wenn du einen wirklich funktionalen taschenrechner bauen möchtest und nicht nur zwei zahlen mit einander verechnern willst.. dann google mal die begriffe postfix und stack
 
Hallo,

habe es jetzt soweit fertig bekommen. Möchte aber gerne noch nach der Eingabe von "=" Eine Abfrage starten zum beenden oder neustarten. Muss ich dafür neue Variablen nehmen? Wie ist der Befehl für beenden und neustarten?

Code:
char rechenzeichen;
  double zahl;
  double ergebnis;

  if (rechenzeichen != '=')
  {
  cout << "Zahl: ";
  cin >> ergebnis;
  }
  do
  {
  cout << "Rechenzeichen: ";
  cin >> rechenzeichen;
  if (rechenzeichen != '=')
  {
  cout << "Zahl: ";
  cin >> zahl;
  }

  if(rechenzeichen == '+')
  {
    ergebnis=ergebnis+zahl;
  }

  if(rechenzeichen == '-')
  {
   ergebnis=ergebnis-zahl;
  }

  if(rechenzeichen == '*')
  {
    ergebnis=ergebnis*zahl;
  }

  if(rechenzeichen == '/')
  {
    ergebnis=ergebnis/zahl;
  }

  if(rechenzeichen == '=')
  {
    cout << "Ergebnis: " << ergebnis << endl;
    cout << "****************" << endl;
    cout << "<b>eenden oder <n>eustarten?: ";
 
  }

} while (rechenzeichen != '=');
  return 0;
}
 
Befehl für Beenden und Neustarten des Programms?
Benutz am besten einfach eine do while-Schleife um das Ganze herum, frag am Ende den Benutzer, ob er noch eine Rechnung gelöst haben will, lies seine Eingabe ein und entscheide dann, ob die Schleife noch einmal durchlaufen werden muss ;)
 
für simple kombinationen aus +, -, * und / kann man das ganze unter berücksichtigung von "punkt vor strich" auch noch recht leicht implementieren, solange keine klammern erlaubt sind (was ja hier anscheinend der fall ist):

einmal eine ergebnisvariable, die schon fertig bearbeitete "blöcke" des terms aufsummiert bzw subtrahiert abspeichert.

dazu dann noch eine variable, die den aktuellen block beinhaltet und erst dann auf die ergebnisvariable addiert bzw subtrahiert wird, wenn der block durch ein "+", "-" oder "=" abgeschlossen wird.

immer wenn ein neuer block aufgemacht wird, muss man sich natürlich das vorzeichen merken.

kleines beispiel:

2 * 7 + 3 - 5 * 3 =

1. schritt:
ergebnis 0
aktueller block 2

2. schritt
ergebnis 0
aktueller block 14

3. schritt: block wird durch "+" abgeschlossen, also:
ergebnis 14
aktueller block 3

4. schritt: block wird durch "-" abgeschlossen, also:
ergebnis 17
aktueller block -5

5. schritt
ergebnis 17
aktueller block -15

6. schritt: term wird durch "=" abgeschlossen, also:
ergebnis 2

ausgabe 2


edit: ist natürlich die frage, ob man überhaupt punkt vor strich will, oder sich das programm wie ein einfacher realer taschenrechner ohne klammern verhalten soll, der auch immer nur das aktuelle ergebnis verrechnet. oder anders gesagt: sollen terme eingegeben werden können oder gelten immer implizit vor jedem operator klammern um alles davor?
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben