Taschenrechneraufgabe: [arg zahl1 zahl2 zahl3 zahln] bsp. add 4 2 1 = 7

kingmar

Grünschnabel
Hey Leute ich habe die Aufgabe einen Taschenrechner zu Coden, bei dem eine Eingabe in einer Zeile erfolgen soll. Hierzu haben ich verschiedene Operationen wie z.B. add, sub usw.
Nun soll über die Konsole zuerst die gewünschte Operation und dann jeweils mit Leerzeichen getrennt die verschiedenen Zahlen eingegeben werden. Es soll also eine variable Parameterliste sein und die Argumente sollen einzeln ansprechbar sein.

Bsp:
Konsoleneingabe: add 5 6 1 2 // Ergebnisanzeige: 14
Konsoleneingabe: sub 7-9 // Ergebnisanzeige: -2

Zudem soll noch eine Speichern-Operation integriert werden, die ähnlich aufgebaut ist
Konsoleneingabe: save a 8
Konsoleneingabe: save b 2
Konsoleneingabe: mul $a $b // Ergebnisanzeige: 16

Nun meine Frage? Wie realisiere ich diese VARIABLE Parametereingabe?

Mein Ansatz ist folgender:
C++:
int berechnung (char operation, int* feld)
{
      int erg;
      int laenge = feld.length;
         /* Das ich als ersten Parameter die Operation übergebe (add, sub....) 
             und als zeiten  Parameter das Feld mit den jeweiligen Werten */
    if(operation=='add')
   {
         for(int i =0; i<=laenge; i++)
              erg+=feld[i];
   }
   return erg;
}

Ist das überhaupt richtig, dass ich bei der berechnen Funktion 2 Parameter habe, oder kann ich das nur mit einer Parameterliste realisieren, da ich ja alles zusammen und hintereinander in die Konsole eingebe. Muss ich dann das erste Feldelement, in dem z.B. add steht nehmen und somit feld[0] als Operator wählen oder wie gehe ich vor?
Ich stehe gerade etwas auf dem Schlauch!?
 
Ich verstehe deinen Ansatz nicht ganz. Wie würdest du die Funktion aufrufen ?
Unabhängig davon: char ist nur ein Zeichen, um "add" zu speichern, brauchst du einen anderen Variablentyp.
 
ups ok.. das stimmt :) dann würde ich das natürlich mit string machen.
und zu dem Aufruf der Funktion hatte ich erst überlegt, dass ich den benutzer frage, wie viele Werte er eingeben möchte, aber dann hab ich ja nicht wirklich ne variable Anzahl. Am besten soll der User einfach die Operation eingeben und dann nach der gewünschten Zahl einfach mit Return die Anweisung abschließen, so dass die Ausgabe kommt. Geht das, da ich nicht genau weiß wie ich ein solch dyn. Feld erzeuge....

Und zum Aufruf bin ich mir nicht ganz sicher. Mein Ansatz war, dass ich das Feld als String deklariere und den ersten Parameter als Operator benutze und die folgenden alle als Zahlen caste.... Aber bei der Umsetzung hakt es noch etwas... :(
 
Hi

lies zuerst die ganze Zeile als einen String (char-Array) ein.
Mit sscanf-%s trennst du das erste Wort heraus.
Speicher irgendwo, wleche Rechenart gemacht werden soll.
Dann suchst du das erste Leerzeichen im String und entfernst alles davor
(also das Wort, mit strcpy).

Jetzt machst du
a) ein sscanf-%d zum Eine-Zahl-Einlesen
b) Leerzeichen suchen
c) Alles davor weg
bis der String leer ist.
So bekommst du beliebig viel Zahlen raus, die sofort zusammengerechnet werden.

Zum Save: Du musst alle Namen mit den dazugehörenden Zahlen abspeichern.
Stichwort Map.

Gruß

PS: Was machst du mit einem ".length" bei int-Pointern?
Kein JS hier...
 
Kann ich die Eingabe auch mit getline realisieren?
Also
C++:
getline(cin,zeile);

Wie schneide ich dann den ersten Bereich also zB. Das add ab (also suchen, String beschneiden um so bis zur ersten Zahl zu gelangen) vergleichen kann ich ja mit strcmp machen...
 
Zuletzt bearbeitet:
Hi.

Wenn du C++ verwendest kannst du natürlich auch mit getline und strings und stringstreams arbeiten:
C++:
while (getline(cin , zeile)) {
  istringstream input(zeile);
  string op;
  if (input >> op) {
    if (op == "add") {
    }
  }
}
Gruß
 
Bin bis jetzt so vorgegegangen:

C++:
int main(int argc, char* argv[])
{
	cout << "Eingabe:";
	char zeichenkette[100];
	cin.getline(zeichenkette, 100);
	int ergebnis = NULL;
	char* eingabewert;
	eingabewert = strtok (zeichenkette, " \n\t");
	while (eingabewert != NULL)
       {
             printf ("%s\n", eingabewert);
             eingabewert = strtok (NULL, "\n\t");
       }
       if(strcmp(eingabewert, "add") ==0)
      {
            cout << "ADD\n";	
      }
    return 0;
}

Jetzt kann ich zwar die Eingabe wie: add 1 3 4 eingeben und er teilt sie mir auch und gibt sie mir gesplittet an, aber bricht dann ab und sagt mir, dass das Programm nicht mehr funktioniert.

Wo liegt der Fehler und wie kann ich die einzelnen Zahlen nach dem add behandeln?
Bzw. Wie mache ich die einzelnen Argumente ansprechbar?
 
Zuletzt bearbeitet:
Hi,

[...] aber bricht dann ab und sagt mir, dass das Programm nicht mehr funktioniert.[...]

Welche Meldung? An welcher Stelle?
Warum ein "\n\t"?

Ich schätze mal dass es mit dem strcmp() zusammenhängt in Zeile 14. Bei dem Aufruf ist "eingabewert" immer NULL, da der Befehl nach der while()-Schleife ausgeführt wird.

Gruß
BK
Gruß
BK
 
hab das mit dem \n\t mal rausgenommen. Also das Programm bricht nach dem letzten Durchlauf der while Schleife ab... dann kommt die Meldung, dass es nicht mehr funktionert. Ich kann dann auf Programm beenden klicken und dann erscheint in der der Konsole erst die Meldung....Drücken Sie eine beliebige Taste......

Wie kann ich aber nun jetzt auf die einzelnen Argumente die ich eingabe zugreifen, dass versteh ich irgendwie noch nicht ganz! :(
 
hab das mit dem \n\t mal rausgenommen. Also das Programm bricht nach dem letzten Durchlauf der while Schleife ab... dann kommt die Meldung, dass es nicht mehr funktionert.
Das hat Bratkartoffel bereits geschrieben, du greifst nach der Schleife (dein Code ist schlecht eingerückt) auf einen ungültigen Zeiger / Nullzeiger zu.
Wie kann ich aber nun jetzt auf die einzelnen Argumente die ich eingabe zugreifen, dass versteh ich irgendwie noch nicht ganz! :(
z.b. mit sscanf - siehe den Beitrag von sheel.

Gruß
 
Zurück