ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
375
375
EMPFEHLEN
-
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:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13
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!?
-
14.11.11 18:28 #2
- Registriert seit
- May 2009
- Beiträge
- 88
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...Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Kann ich die Eingabe auch mit getline realisieren?
AlsoCode cpp:1
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...Geändert von kingmar (15.11.11 um 09:39 Uhr)
-
15.11.11 10:02 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Wenn du C++ verwendest kannst du natürlich auch mit getline und strings und stringstreams arbeiten:
GrußCode cpp:1 2 3 4 5 6 7 8
while (getline(cin , zeile)) { istringstream input(zeile); string op; if (input >> op) { if (op == "add") { } } }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Bin bis jetzt so vorgegegangen:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
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?Geändert von kingmar (15.11.11 um 11:33 Uhr)
-
15.11.11 11:45 #8
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hi,
Welche Meldung? An welcher Stelle?[...] aber bricht dann ab und sagt mir, dass das Programm nicht mehr funktioniert.[...]
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Über eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
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!
-
15.11.11 13:26 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
mit strtok unterteile ich meinen eingegebenen String ja, die while schleife hab ich aus der Doku. Muss in diese dann noch die if Abfrage, damit ich den ungültigen Zeiger behebe oder wie sieht das aus?
kann mir zu scanf einer eine Hilfestellung geben?
-
15.11.11 15:51 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das kommt drauf an was genau du machen willst. Wie ist denn dein Plan?
Ja, z.B. http://www.cplusplus.com/reference/c...cstdio/sscanf/
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.





Zitieren


Login






