C++ Taschenrechner programmieren..

AndrejPi

Cadet 1st Year
Registriert
Okt. 2018
Beiträge
9
Einen schönen guten Abend,

ich habe gerade erst begonnen mich in der Uni in C++ einzuarbeiten und hoffe das meine erste Frage hier nicht allzu dumm ist. Aber ich habe nirgends etwas finden können was mich weiter gebracht hätte.

Wir haben von der Uni Aufgaben bekommen, eine davon ist die Programmierung eines Taschenrechners, was ja eigentlich recht leicht ist, wenn man if...else und switch...case benutzen dürfte. Bild der Aufgabe ist im Anhang.

Bei der Programm muss der Benutzer eine arithmetische Operation aus 4 auswählen und das ist mein Problem. Ich versuche es schon seit Stunden.

Hier ist wie weit ich schon gekommen bin:

#include<iostream>
#include<string>
using namespace std;

int main()
{
int A=1;
int B=0;
int C=0;
int D=0;
int zahl1 = 0;
int zahl2 = 0;
cout << "Geben Sie 2 Zahlen ein:\n";
cin >> zahl1 >> zahl2 ;

cout<<"Ergebnis lautet: "
<< A * (zahl1 + zahl2) + B * (zahl1 * zahl2) + C * (zahl1 - zahl2) + D * (zahl1 / zahl2)<< '\n';

system("pause");
return 0;
}

Ich muss jetzt erst einmal es irgendwie hinkriegen das ich zwischen den Operationen wählen kann. Ich hoffe jemand kann mir bei diesem Problem helfen. Ich wäre sehr dankbar.

Gruß
Andrej
 

Anhänge

  • IMG_20181024_221317.jpg
    IMG_20181024_221317.jpg
    1,2 MB · Aufrufe: 1.037
  • IMG_20181024_222946.jpg
    IMG_20181024_222946.jpg
    929,4 KB · Aufrufe: 783
  • Gefällt mir
Reaktionen: Jobrick1
  • Gefällt mir
Reaktionen: AndrejPi
Danke für die Antwort, aber wie ich geschrieben habe darf ich in diesem Fall switch-case nicht verwenden, sonst hätte ich dieses Problem nicht.
 
kA ob das so gewollt ist, aber wieso fragst du nicht einfach jede Operation nacheinander ab? Im Sinne von:
cout << "Wollen Sie addieren? (0=Nein, 1=Ja): ";
cin >> A;
...

Dann hättest du leider keine Sicherheit, dass nicht mehrere Operationen ausgewählt werden.
 
  • Gefällt mir
Reaktionen: psYcho-edgE und AndrejPi
Ich weiß nicht ob das C++ kann, da objektorientiert:

1 abstrakte Klasse/Interface "Rechenoperation" mit der Methode Calculate()
4 abgeleitete Klassen "Addition", "Subtraktion", "Multiplikation", "Division" die die Methode Calculate() implementieren

Eine Liste/Hashmap/etc... erstellen und diese füllen
1 = Addition
2 = Multiplation
3 = Subtraktion
4 = Division

Nach der Eingabe mit dem Key 1...4 das entsprechende Rechenoperationen-Objekt aus der Liste/Hashmap holen

Ergebnis = Rechenoperation.Calculate(zahl1, zahl2) aufrufen, dann wird die richtige Methode aus der richtigen Klasse aufgerufen

P.S.: Als Vor-Studium-Anfänger allerdings etwas komplex, das muss einfacher gehen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: AndrejPi
Meine Posts werden leider zeit verzögert freigeschaltet daher kann ich nicht direkt antworten. Ich habe sowas als Tipp bekommen ((input==Bedingung) und dann die Formel), kann damit aber nicht direkt etwas anfangen
 
@cppnap Sie dürfen kein if und switch verwenden, erwähnt er doch extra und steht auf dem Blatt.

@iks.ypsilon Entspräche nicht dem Blatt, sofern die Testausgabe 1:1 nachgebaut werden soll.

@Theobald93 Sie dürfen kein if und switch verwenden, weil diese Dinge noch nicht gelehrt wurden und du kommst mit Listen, Hashmap und Klassen an. Bravo.

@AndrejPi Du kannst die Zahl für die Operation einlesen und dann A bis D mit einem Vergleich der eingegeben Zahl zu der korrekten Zahl belegen, z.B. wäre "A = 1 == operationInput" und der Rest äquivalent. Eigentlich gibt der Vergleich einen boolean(true/false) aber durch den Typ int der Variablen wird es zu einer Zahl umgewandelt.
 
  • Gefällt mir
Reaktionen: AndrejPi
@DaysShadow "IF" ist doch nach den Datentypen das erste was man lernt Oo

Aber ja steht tatsächlich so dort. Krass. Lieber irgendeine komische Sonderlösung entwickeln...

Ich hab den Thread gelesen, nur den gesamten Bildtext nicht.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: psYcho-edgE, xenon-seven und AndrejPi
@Theobald93 Schau dir das Bild an und lies den Text in der Mitte, wenn du den Text des TEs schon nicht liest.

Vom Sinn solcher Beschränkungen mal ganz abgesehen.
 
  • Gefällt mir
Reaktionen: AndrejPi
Danke Leute habe es endlich hingekriegt, mit etwas Hilfe. Und das seltsame ist ja das wir if else und switch cases schon durch genommen haben, aber naja verstehe mal einer die Dozenten. Hier noch der funktionierende Code:

C++:
#include<iostream>
#include<string>
using namespace std;

float Rechnung(int a, float b, float c)
{
    bool sum(a == 1);
    bool mul(a == 2);
    bool sub(a == 3);
    bool div(a == 4);
    return sum * (b + c) + mul * (b * c) + sub * (b - c) + div * (b / c);

}


int main()
{
    int operation;
    float zahl1;
    float zahl2;

    cout << "Geben Sie 2 Zahlen: \n";
    cin >> zahl1 >> zahl2;

    cout << "Waehlen Sie eine arithmetische Operation aus: \n";
    cout << "1 : Summieren\n";
    cout << "2 : Multiplizieren\n";
    cout << "3 : Subtrahieren\n";
    cout << "4 : Dividieren\n";

    cin >> operation;


    cout << "Ergebnis lautet: " << Rechnung(operation, zahl1, zahl2) << '\n';

    system("pause");
    return 0;

}

Wie schon gesagt, danke allen für die Mühe :))
 
  • Gefällt mir
Reaktionen: DaysShadow und Valeria
Beitrag geschrieben noch bevor der Beitrag von AndreiPi freigeschalten wurde:

Ich könnte mir noch so ein Konstrukt mit Bedingungsoperator vorstellen:
Code:
Ergebnis = (zahl1 + zahl2) * (auswahl == 1 ? 1 : 0)
         + (zahl1 * zahl2) * (auswahl == 2 ? 1 : 0)
         + (zahl1 - zahl2) * (auswahl == 3 ? 1 : 0)
         + (zahl1 / zahl2) * (auswahl == 4 ? 1 : 0)
Oder wenn "true" richtig zu 1 und "false" zu 0 umgewandelt wird:
Code:
Ergebnis = (zahl1 + zahl2) * (auswahl == 1)
         + (zahl1 * zahl2) * (auswahl == 2)
         + (zahl1 - zahl2) * (auswahl == 3)
         + (zahl1 / zahl2) * (auswahl == 4)
Das tut ja schon beim Hinsehen weh^^

Also ja, wird wirklich so gemacht, nur in seperaten Statements.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: AndrejPi
Was für eine tolle und sinnvolle Aufgabenstellung, dass euch die absoluten Basis-Operationen einer Programmier-Sprache verboten werden.
 
  • Gefällt mir
Reaktionen: John Reese, AndrejPi und Valeria
Es ist eine sinnvolle Aufgabenstellung.

Dadurch wird nämlich klar, dass man mit booleans implizit rechnen kann.
 
  • Gefällt mir
Reaktionen: psYcho-edgE und AndrejPi
new Account() schrieb:
Es ist eine sinnvolle Aufgabenstellung.
Dadurch wird nämlich klar, dass man mit booleans implizit rechnen kann.

Dann sollte man solche Erkenntnisse auch klar kennzeichnen. So wie die Aufgabenstellung jetzt formuliert ist, sorgt Sie lediglich für Kopf-Schütteln, denn es wird ausdrücklich erwähnt "noch nicht behandelt also darfst dus nicht benutzen"

Das sind eher Schulpraktiken und weniger Universitäts-Praktiken.
 
  • Gefällt mir
Reaktionen: psYcho-edgE, AndrejPi und Valeria
Edit: Vergiss es.
 
Alternativ könnte man für sum, mul, sub und div auch Lagrangepolynome mit Stützstellen x_j={1,2,3,4} hernehmen.
 
  • Gefällt mir
Reaktionen: lemon03, John Reese und cppnap
simpsonsfan schrieb:
Alternativ könnte man für sum, mul, sub und div auch Lagrangepolynome mit Stützstellen x_j={1,2,3,4} hernehmen.

If-Else-Switch nicht benutzen aber paar Lagrangepolynome für Erstsemestler benutzen - ich würde zu gern den Gesichtsausdruck von dem Dozenten sehen, der den Code dann prüft :-D
 
  • Gefällt mir
Reaktionen: simpsonsfan
cppnap schrieb:
Dann sollte man solche Erkenntnisse auch klar kennzeichnen. So wie die Aufgabenstellung jetzt formuliert ist, sorgt Sie lediglich für Kopf-Schütteln, denn es wird ausdrücklich erwähnt "noch nicht behandelt also darfst dus nicht benutzen"
Mit ein bisschen nachdenkt kommt man durchaus auf die Erkenntnis der Erkenntnis.
Ich hatte in meinem ganzen Studium keine Übungsaufgabe, in Der jene in Der Aufgabenstellung erklärt worden ist :D
Da könnte man sich die Aufgabe ja gleich sparen.
Und sobald die Aufgabenstellung gelöst ist, ist es eh klar.
 
Nur so nebenbei: Der obige vorgeschlagene Lösungsansatz ist im Prinzip eine From von Predication in Software, diverse Architekturen unterstützen diesen Ansatz in Hardware. Dieses "Software Predication" hat aber prinzipiell den Nachteil dass idr immer sämtliche Pfade ausgeführt werden müssen wodurch der Compiler es nur schlecht optimieren kann bzw. manche Eingaben durch das Prädikat nicht "deaktiviert" werden können, wie zum Beispiel NAN, INF, und 0; obiges Code Beispiel wird dementsprechend bei zahl2 = 0 unabhängig von der Auswahl wegen einer Division durch 0 abstürzen.
 
  • Gefällt mir
Reaktionen: psYcho-edgE
Zurück
Oben