tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
660
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    mazzaker mazzaker ist offline Grünschnabel
    Registriert seit
    Nov 2007
    Beiträge
    4
    Schönen guten Tag,

    studiere Informatik und bin absoluter Neuling in C.
    Habe die Aufgabe bekommen einen kleinen Rechner zu programmieren. Meiner ersten Meinung nach nicht schwer nur habe ich ein kleines Problem.


    Schreiben Sie ein Programm calculator.cpp, welches folgender Spezifikation entspricht:
    1.1 Nach einer Eingabehilfe soll am Beginn der nächsten Zeile eine 0 (Null) ausgegeben werden.

    1.2 Anschließend sollen paarweise Operator und Operand mit abschließendem <ret> eingelesen werden und
    das Ergebnis berechnet und am Beginn der nächsten Zeile ausgegeben werden. (siehe Beispiel unten)

    1.3 Eingabe und Berechnung sollen solange wiederholt werden, bis als Operator ein e eingegeben wird;
    anschließend soll das Programm ohne weitere Aktivitäten (also auch ohne weitere Eingabe) terminieren.

    1.4 Gültige Operatoren sind +, -, * und /. Die Division durch Null soll ignoriert werden. (In diesem Fall
    soll eine Fehlermeldung ausgegeben und das Programm fortgesetzt werden.)
    Bei Eingabe von c (für clear) soll das Ergebnis auf 0 zurückgesetzt und ausgegeben werden.
    Achtung: die clear-Operation enthält keinen Operanden, also keine weitere Eingabe.

    1.5 Bei Eingabe ungültiger Operatoren soll eine Fehlermeldung ausgegeben und das Programm fortgesetzt
    werden.
    Beachten Sie, daß bei Eingabe eines falschen Operators nach der Fehlerausgabe das "alte" Ergebnis
    ausgegeben werden muß und daß der auf den falschen Operator (siehe unten %) folgende Operand
    (siehe unten 3) gegebenenfalls auch als Operator zu interpretieren versucht wird.

    1.6 Beachten Sie, daß hier eine typische Mehrfachentscheidung vorliegt; verwenden Sie die geeignete
    Anweisung.
    Beispiel: Ausgaben Eingaben
    Bitte ... (e = ende)
    0+3
    3*5
    15%3
    ->%: falsche Operation
    15 ->3: falsche Operation
    15-16
    -1e

    Mit dem Programm habe ich keine Probleme, nur würde ich die Eingabe verteilen, also erst Operator dann Operant, was laut Aufgabenstellung jedoch nicht gewünscht ist. Meine Frage wie löse ich das Problem am elegantesten? Dachte schon über einen String nach, finde es aber unschön gelöst.

    Vielen Dank
     

  2. #2
    CodeFlatter CodeFlatter ist offline Mitglied Bronze
    Registriert seit
    Jun 2006
    Beiträge
    36
    Hallo,

    als Vorschlag: verwende doch printf und scanf abwechselnd.

    char op = 0;
    int value_a = 0, value_b = 0;

    printf("Bitte den Operator eingeben: ");
    scanf( "%c", &op );

    oder auch
    printf("Bitte eine ganze Zahl eingeben: ");
    scanf( "%d", &value_a );

    usw...

    in c++ entsprchend mit cin, cout.

    Gruß
     
    Es gibt immer einen Weg ...
    --------------------------------------------------------------------
    Plugins für unterschiedliche Plattformen, ein Code?
    http://www.codeproject.com/dll/multi...plugin_spl.asp

  3. #3
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    Dann werden sie aber nicht paarweise eingelesen. Also mir faellt auch nur das mit dem String einlesen ein. Und dann aufteilen in Operant und Zahl.
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Was ist daran so schlecht? Lies die komplette Zeile erstmal ein.

    Dann kannst du mit sscanf(zeile, "%d %[+-*/] %d", &a, &op, &b) die Variablen befüllen.

    Gruß
    Geändert von deepthroat (12.11.07 um 14:46 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    mazzaker mazzaker ist offline Grünschnabel
    Registriert seit
    Nov 2007
    Beiträge
    4
    Erstmal Danke für deine Antwort.
    Leider wäre es in deinem Beispiel so, dass ich 2 Eingaben hätte, was leider nicht (laut Aufgabenstellung) erwünscht ist. Das Programm soll später so aussehen, dass am Anfang eine 0 steht, nun gibt der Benutzer "+3" ein und drückt Enter. Dann erscheint die 3 und der Benutzer gibt "*5" ein (Enter), so erscheint in der nächsten Zeile eine 15 usw. usw..
    Das Trennen der Eingabe hätte ich normal auch gemacht ist ja auch einfacher, nur wie löse ich das Problem so wie in der Aufgabe.

    Zu deepthroat:
    kannst du mir diese Zeile nocheinmal genauer erklären?

    sscanf(zeile, "%d $[+-*/] %d", &a, &op, &b)

    sscanf entspricht auch cin unter c++?
    Geändert von mazzaker (12.11.07 um 14:48 Uhr)
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von mazzaker Beitrag anzeigen
    Das Programm soll später so aussehen, dass am Anfang eine 0 steht, nun gibt der Benutzer "+3" ein und drückt Enter. Dann erscheint die 3 und der Benutzer gibt "*5" ein (Enter), so erscheint in der nächsten Zeile eine 15 usw. usw..
    Ah, jetzt hab ich das verstanden. (die farbige Schrift in deinem ersten Beitrag kann man aber auch wirklich schlecht lesen; und ein besserer Titel wäre gut gewesen - jede zweite Frage ist hier eine Anfängerfrage.)

    Zitat Zitat von mazzaker Beitrag anzeigen
    kannst du mir diese Zeile nocheinmal genauer erklären?

    sscanf(zeile, "%d $[+-*/] %d", &a, &op, &b)

    sscanf entspricht auch cin unter c++?
    Nein. In C++ würde man dafür einen istringstream verwenden.

    Im Grunde ist es ja so, dass du 6 Operatoren hast (+, -, *, /, e, c).

    D.h. du solltest erstmal den Operator einlesen und entscheiden was zu tun ist. Ist es ein arithmetischer Operator liest du noch den Operanden ein. Falls nicht durch 0 dividiert werden soll, führst du die Operation durch usw.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    mazzaker mazzaker ist offline Grünschnabel
    Registriert seit
    Nov 2007
    Beiträge
    4
    So habe das Problem gelöst. Sieht recht gut aus denke ich werde es so morgen abgeben:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    
    #include <iostream>
    using namespace std;
     
    int main()  
    {
        char eingabeoperator;
        
        double ausgabeoperand = 0, eingabeoperand;
     
     
        cout << "\nFolgende Operatoren werden unterstuetzt:+-*/ c setzt die Rechnung                 zurueck und e beendet das Programm";
        
        do {
        
            cout << "\n" << ausgabeoperand;
            cin >> eingabeoperator;
     
            switch (eingabeoperator) {
     
                case '+': cin >> eingabeoperand;
                         ausgabeoperand += eingabeoperand;
                         break;
     
                case '-': cin >> eingabeoperand;
                        ausgabeoperand -=  eingabeoperand;
                        break;
     
                case '*': cin >> eingabeoperant;
                        ausgabeoperant = ausgabeoperant * eingabeoperant;
                        break;
     
                case '/': if (eingabeoperand == 0) {
                              cout << "\nTeilen durch 0 ist nicht gestattet";
                        }
     
                       else {
                        cin >> eingabeoperand;
                        ausgabeoperand = ausgabeoperand / eingabeoperand;
                       }
                       break;
     
                case 'c':   ausgabeoperand = (0);
                            break;
     
                case 'e':   cout << "Programm wird beendet";
                            break;
     
                default:    cout << "\nOperator nicht bekannt!";
                
            }   
     
     
     
        } while (eingabeoperator != 'e');
    }

    Vielen Dank für eure Hilfe, dieses Forum wird mich öfters sehen.
    Geändert von mazzaker (13.11.07 um 14:38 Uhr)
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Ja, das sieht schon ganz gut aus. Aber

    1. Operand schreibt man mit d
    2. die main Funktion muss int zurückgeben
    3. du könntest die Kurzschreibweise für die Zuweisungen verwenden:
    Code cpp:
    1
    2
    3
    
    a += b;
    // statt:
    a = a + b;
    4. Es ist vielleicht etwas merkwürdig, das die Eingabe ein int, die Ausgabe allerdings ein double ist..

    Und bitte verwende immer die richtigen Code Tags wenn du Code postest!

    Gruß
    Geändert von deepthroat (13.11.07 um 07:22 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    mazzaker mazzaker ist offline Grünschnabel
    Registriert seit
    Nov 2007
    Beiträge
    4
    So habe es geändert. zu 1. peinlich Danke

    2. Was meinst du damit

    3. bin ich noch nicht so vertraut mit

    4. Eingabe ist jetzt auch ein double, bin aus irgendeinem nicht ersichtlichen Grund davon ausgegangen, dass nur Ganzezahlen eingegeben werden dürfen.

    Sind die Codetags nicht richtig? Leider wurde beim Einfügen alle Tabs gelöscht, oder versteh ich dich falsch?
     

  10. #10
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    Du musst code mit
    [ CODE] .. code ... [ /CODE]
    einfuegen (ohne die Leerzeichen natuerlich)
    Dann hast du auch formatierungen und es sieht aus wie bei deepthroat

    Oder besser:
    Bei java
    [ JAVA] .. code ... [ /JAVA]

    Bei c++
    [ CPP] .. code ... [ /CPP]
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von mazzaker Beitrag anzeigen
    2. Was meinst du damit
    Deine Deklaration von main mit
    Code c:
    1
    
    void main()
    ist laut C und C++ Standard nicht zulässig. Die Funktion muss int zurückgeben:
    Code c:
    1
    2
    3
    
    int main() {
      return 0;
    }
    Laut C99 und C++ Standard darf man das "return 0;" in der main Funktion weglassen, das Programm gibt dann implizit 0 zurück.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Anfängerfrage zu CS4
    Von Nord-Süd-Richtung im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 08.06.09, 20:58
  2. anfängerfrage
    Von minusbrain im Forum Autodesk Maya (ehemals Alias)
    Antworten: 3
    Letzter Beitrag: 03.06.07, 13:46
  3. Anfängerfrage
    Von kmf im Forum PHP
    Antworten: 3
    Letzter Beitrag: 11.04.05, 09:42
  4. anfängerfrage
    Von Manfred Lieven im Forum Photoshop
    Antworten: 10
    Letzter Beitrag: 22.03.05, 18:32
  5. anfängerfrage
    Von webraccoon im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 29.01.05, 13:26