tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
375
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kingmar kingmar ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    17
    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!?
     

  2. #2
    anfängerregnäfna anfängerregnäfna ist offline Mitglied Silber
    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.
     

  3. #3
    kingmar kingmar ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    17
    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...
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  5. #5
    kingmar kingmar ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    17
    Kann ich die Eingabe auch mit getline realisieren?
    Also
    Code 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)
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    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") {
        }
      }
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    kingmar kingmar ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    17
    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)
     

  8. #8
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    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
     
    Ü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"

  9. #9
    kingmar kingmar ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    17
    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!
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von kingmar Beitrag anzeigen
    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.
    Zitat Zitat von kingmar Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    kingmar kingmar ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    17
    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?
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von kingmar Beitrag anzeigen
    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?
    Das kommt drauf an was genau du machen willst. Wie ist denn dein Plan?
    Zitat Zitat von kingmar Beitrag anzeigen
    kann mir zu scanf einer eine Hilfestellung geben?
    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.