Zum Inhalt springen

C++ Konsolen-Taschenrechner mit Ergenbis weiterrechnen


Empfohlene Beiträge

Geschrieben

Hallo, ich hab hier meinen einfachen Taschenrechner den ich etwas ausbauen möchte, ich möchte mit dem Ergebnis weiter rechnen können, hier mal mein bisheriger Code:

#include <cstdlib>

#include <iostream>


using namespace std;

float zahl1, zahl2,ergebnis; int rechen; char antwort = ' '; 

int main(int argc, char *argv[])

{

    begin:

 cout<< " Wählen Sie eine Rechenart aus : Addition [1] Subtraktion [2] Multiplikation [3] Division [4]. " ; cin>> rechen;

 cout<< " Bitte geben Sie die erste zahl ein: "; cin>>zahl1;

 cout<<endl;

 cout<< " Bitte geben Sie die zweite Zahl ein: "; cin>>zahl2;


 switch (rechen)

 {

        case 1 : ergebnis=zahl1+zahl2;

        break;  

        case 2 : ergebnis=zahl1-zahl2; //if (zahl1<zahl2) {cout<< "nicht moeglich!";}

        break;

        case 3 : ergebnis=zahl1*zahl2;

        break;

        case 4 : ergebnis=zahl1/zahl2;

        break;

        } 

        cout<<"Das Ergenbis lautet: "<<ergebnis<<endl;

        abfrage:



cout<<"noch ein Versuch ? Ja (j) /Nein (n): ";

cin>>antwort;


if (antwort == 'j') 

{ goto begin; }

else if (antwort == 'n')  goto end;

else cout<< "Sie koennen nur j oder n eingeben"<<endl; goto abfrage;

end:

    system("PAUSE");

    return EXIT_SUCCESS;

}

Geschrieben

Ich gebe dir einmal eine Starthilfe:


#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
float zahl1, zahl2, ergebnis;
int rechen;
char antwort = ' ';
do
{
cout<< " Wählen Sie eine Rechenart aus : Addition [1] Subtraktion [2] Multiplikation [3] Division [4]. " ; cin>> rechen;
cout<< " Bitte geben Sie die erste zahl ein: "; cin>>zahl1;
cout<<endl;
cout<< " Bitte geben Sie die zweite Zahl ein: "; cin>>zahl2;

switch (rechen)
{
case 1 : ergebnis=zahl1+zahl2;
break;
case 2 : ergebnis=zahl1-zahl2; //if (zahl1<zahl2) {cout<< "nicht moeglich!";}
break;
case 3 : ergebnis=zahl1*zahl2;
break;
case 4 : ergebnis=zahl1/zahl2;
break;
}
cout<<"Das Ergenbis lautet: "<<ergebnis<<endl;


do
{
cout<<"noch ein Versuch ? Ja (j) /Nein (n): ";
cin>>antwort;

if (antwort != 'j' && antwort != 'n')
cout<< "Sie koennen nur j oder n eingeben"<<endl;
} while(antwort != 'j' && antwort != 'n');

} while(antwort == 'j');

return EXIT_SUCCESS;
}[/code]

Das ist dein Programm, ohne gotos, und ordentlich eingerückt. Du solltest undebingt auf eine richtige Einrückung achten, sonst geht dir bei größeren Programmen ganz schnell die Übersicht verloren.

Geschrieben
while (antwort == ' j ')

sagt der Schleife also dass sie weitermachen soll ?

Genau, wenn an dieser Stelle die Bedingung true ergibt, fängt die Schleife wieder von vorne an.

Die do/while-Schleife ist für Anfänger am einfachsten zu verstehen. Sie wird immer mindestens einmal durchlaufen, und am Ende kann man eine Wiederholungsbedingung angeben.

Bei der while-Schleife muss man die Bedingung am Anfang angeben, dadurch kann es sein, dass die Schleife komplett übersprungen wird, wenn die Bedingung gleich am Anfang false ergibt.

Die for-Schleife ist eine spezialisierte Schleifenform mit einem Initialisierungs- und einem Schritt-Teil. Letztlich sind sie aber alle äquivalent, man kann jeden Schleifentyp in jeden anderen überführen.

Man kann übrings auch mit break aus der innersten aktiven Schleife herausspringen und mit continue einen neuen Schleifendurchlauf starten. Beide Anweisungen verhalten sich insofern wie goto, haben aber nicht denselben unstrukturierten Beigeschmack, weil man nicht irgendwohin springen kann, sondern eben nur an den Anfang oder ans Ende der Schleife.

Geschrieben

Nachdem ich das mit der while-Schleife nun auch verinnerlicht habe, kommen mir da so einige andere gedanken, wie zum Beispiel : Die Anfangsabfrage geht bis 4, es sollen aber keine Buchstaben eingegeben werden,ich dachte es geht vlt mit isnum() oder isdigit(), jedoch war bis jetzt alles erfolglos :(

 if (isdigit(rechen)) cout<<"bitte keine Buchstaben!"<<endl;

Das Programm läuft zwar, allerdings sobald ich dann einen Buchstaben eingebe, verursacht die den Absturz des Programms, ohne diese Anweisung verursacht eine Buchstabeneingabe eine Endlosschleife der do/while-Schleife und lässt sich nur mit strg+c hart abbrechen :upps

Dann wäre da natürlich auch noch meine ursprüngliche Frage: Wie rechne ich mit dem Ergebnis weiter?

lg keksi

Geschrieben

 if (isdigit(rechen)) cout<<"bitte keine Buchstaben!"<<endl;

Deine Schleife sagt:

Wenn der Wert von "rechen" eine Zahl ist, gib "bitte keine Buchstaben!" aus.

Was du willst ist aber:

Wenn der Wert von "rechen" keine Zahl ist, gib "bitte keine Buchstaben!" aus.

Geschrieben
Das Programm läuft zwar, allerdings sobald ich dann einen Buchstaben eingebe, verursacht die den Absturz des Programms, ohne diese Anweisung verursacht eine Buchstabeneingabe eine Endlosschleife der do/while-Schleife und lässt sich nur mit strg+c hart abbrechen :upps
Du kannst das abfangen. Siehe hier:

http://forum.fachinformatiker.de/c-c/139793-erstellen-doppeltverketteten-liste.html#post1244301

Dann wäre da natürlich auch noch meine ursprüngliche Frage: Wie rechne ich mit dem Ergebnis weiter?
Indem du die Variable zahl nach dem ersten Durchlauf nicht vom Benutzer eingeben lässt, sondern ihr den Wert von ergebnis zuweist.

Dazu müsstest du den ersten Schleifendurchlauf erkennen können. Du könntest eine bool-Variable hinzufügen (das wäre sauberer) oder die Variable antwort benutzen, denn die ist nur beim ersten Durchlauf ' ', danach hat sie den Wert 'j'.

Geschrieben

jo, du musst verzeihen ich fang grad iwie im urschleim an ^^ also hab noned soviel drauf :P

allerdings weiß ich nid wie ich meinem prog sag das es keine buchstaben nimmt oO

@ Klotzkopp muss ich mal guggen wie ich das Umsetz ^^ danke

Geschrieben
Was du willst ist aber:

Wenn der Wert von "rechen" keine Zahl ist, gib "bitte keine Buchstaben!" aus.

rechen ist ein int, das ist immer eine Zahl. Diese Prüfung ist insofern Unsinn.

isdigit (und die anderen is...-Funktionen) prüfen immer Zeichen einer Zeichenkette. Wenn man sofort in numerische variablen einliest, kann man mit ihnen nichts mehr anfangen.

Aber man sollte so etwas ohnehin besser dem jeweiligen Eingabeoperator überlassen. Die Prüfung, ob eine eingegebene Zeichenkette eine gültige Fließkommazahl ist, ist nicht ganz einfach.

  • 2 Wochen später...
Geschrieben (bearbeitet)

#include <cstdlib>

#include <iostream>

#include <ctype.h>


using namespace std;

int main()

{

    float zahl1, zahl2, ergebnis; 

    int  rechenart; 

    char antwort = 'j'; 



while(antwort == 'j')


{


 cout<< " Waehlen Sie eine Rechenart aus :"<<endl<<" Addition [1], Subtraktion [2], Multiplikation [3], Division [4]: " ; cin>> rechenart;

 cout<<endl;



        if ( rechenart >= 1 && rechenart <= 4)  


        {

             cout<< "Bitte geben Sie die erste Zahl ein : "; cin>>zahl1;

             cout<< " Bitte geben Sie die zweite Zahl ein: "; cin>>zahl2;  

             switch (rechenart)

             {

                    case 1 : ergebnis=zahl1+zahl2; break;  

                    case 2 : ergebnis=zahl1-zahl2; break;

                    case 3 : ergebnis=zahl1*zahl2; break;

                    case 4 : ergebnis=zahl1/zahl2; if ( zahl2 == 0) { cout<< "Teilen durch 0 ist nicht moeglich!"<<endl; continue;} break;

                           }   


        cout<<"Das Ergenbis lautet: "<<ergebnis<<endl;


             }


             else if ( rechenart >= 4)

             {

                  cout<< "Fehler,es sind nur Zahlen von 1-4 zulaessig!"<<endl;

                  cout<<endl;

                  continue;

                  }




     cout<<"noch ein Versuch ? Ja (j) /Nein (n): ";

            cin>>antwort;

}            


while (antwort != 'j' && antwort != 'n')


{ 



    if (antwort != 'j' && antwort != 'n') 

                cout<< "Sie koennen nur j oder n eingeben"<<endl;

}


    system("PAUSE");


}

Soweit bin ich jetzt mal, mit den Buchstaben hatte ich noch kein Glück -.-

Bearbeitet von boeseskeksi
Geschrieben

Hab da nen Fehler entdeckt:

  else if ( rechenart >= 4)

             {

                  cout<< "Fehler,es sind nur Zahlen von 1-4 zulaessig!"<<endl;

                  cout<<endl;

                  continue;

                  }

Du nimmst hier die 4 auch mit wegen >=, allerdings willst du sie ja in deiner Auswahl mit drin haben, das = muss also weg. Ausserdem brauchst du die elseif nicht unbedingt, ne normale else reicht auch, da du ja vorher 1-4 Aussortierst und alle anderen Werte ungültig sind. Anders wär das jetzt, wenn du beispielsweise sagen willst, ob ein zu niedriger oder zu hoher Wert eingegeben worden ist.

Um weiter zu Rechnen musst du vor der Eingabe der Zahlen verzweigen und überprüfen, ob du im ersten durchlauf bist oder nicht (wie von Klotzkopp beschrieben) und je nachdem entweder deinen bestehenden Ablauf verwenden oder nur eine Zahl einlesen und diese mit deinem vorigen Ergebnis verrechnen, also entweder mit der Variable ergebnis direkt rechnen, was aber unübersichtlich werden kann oder dein Ergebnis in eine der "zahl"-Variablen schreiben.

Geschrieben

In erster Linie ist die Sache mit dem Ergebnis weiterzurechnen auf Eis gelegt, was isch eigentlich möchte ist:

Wenn bei der Auswahl der Rechenart ein Buchstabe eingegeben wird

Dann gebe aus : Bitte keine Buchstaben eingeben

springe zum Schleifen-Anfang

sonst weitermachen

Leider weiß ich nicht wie ich das ganze in C++ umsetze.

Geschrieben

Da du eine variable mit dem Typ int verwendest, sind Buchstaben nicht erlaubte Werte, deshalb steigt auch das Programm dann aus.

Wenn ich jetzt nicht zu kompliziert denke, musst du den Fehler, der abgefeuert wird, wenn deine Eingabe einen ungültigen Wert hat, abfangen und entsprechend in deine Schleife springen. Schau mal Diesen Thread zum Thema an. Hab ihn nicht ganz durchgelesen, aber Klotzkopp hat da auch was interessantes Geschrieben:

Wenn der Benutzer einen oder mehrere Buchstaben eingibt, bekommt Dein int den Wert 0.

Wenn Null keine gültige Eingabe ist, dann prüf einfach den Wert nach der Eingabe und brich gegebenenfalls ab.

Wenn Null ein erlaubter Wert sein soll, dann liegt der Fehler an einer anderen Stelle in Deinem Programm. Was machst Du mit der eingegebenen Zahl?

Geschrieben
In erster Linie ist die Sache mit dem Ergebnis weiterzurechnen auf Eis gelegt, was isch eigentlich möchte ist:

Wenn bei der Auswahl der Rechenart ein Buchstabe eingegeben wird

Dann gebe aus : Bitte keine Buchstaben eingeben

springe zum Schleifen-Anfang


while(antwort == 'j')

{

[INDENT]cout<< " Waehlen Sie eine Rechenart aus :"<<endl<<" Addition [1], Subtraktion [2], Multiplikation [3], Division [4]: " ; 

if(!(cin>> rechenart))

{[INDENT]

cout << "Bitte keine Buchstaben eingeben." << endl;

cin.clear();

continue;

[/INDENT]
}

cout<<endl;

[/INDENT]


Man könnte natürlich auch good, bad, fail oder eine manuelle Prüfung (string Eingabe) benutzen. Geschmackssache.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...