kostenloser Webspace werbefrei: lima-city


Wo ist der Fehler?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    infinitysounds

    Kostenloser Webspace von infinitysounds

    infinitysounds hat kostenlosen Webspace.

    Hi Leute,

    Ich habe mich mal an einem einfachen Taschenrechner versucht und habe dabei folgendes Problem:

    Bei der Funktion calc1() habe ich folgenden Code:
    void calc1()
    {
        float math1 = 0;
        float math2 = 0;
        char sign = 0;
        float out;
        printf("Geben sie den ersten Term ein. Die Rechenzeichen sind wie folgt:\nMal: *\nPlus: +\nMinus:-\nGeteilt durch:/\n\n");
        scanf("%f",&math1);
        printf("Geben sie jetzt das Rechenzeichen ein:\n");
        scanf("%c",&sign);
        printf("Geben sie jetzt den zweiten Term ein:\n");
        scanf("%f",&math2);
        if(sign == '+')    out = math1 + math2;
        else if(sign == '-')    out = math1 - math2;
        else if(sign == '*')    out = math1 * math2;
        else if(sign == '/')    out = math1 / math2;
        else printf("Bitte ein g\x81ltiges Rechenzeichen angeben!!!");
        printf("Ergebnis: %f\n",out);
        printf("Geben sie ein beliebiges Zeichen ein\n");
        getch();
        system("cls");
    }

    Und das ist die Ausgabe:

    Geben sie den ersten Term ein. Die Rechenzeichen sind wie folgt:
    Mal: *
    Plus: +
    Minus:-
    Geteilt durch:/
    
    4
    Geben sie jetzt das Rechenzeichen ein:
    Geben sie jetzt den zweiten Term ein:
    2
    Bitte ein gültiges Rechenzeichen angeben!!!Ergebnis: 0.000000
    Geben sie ein beliebiges Zeichen ein


    Ich denke mal der Ausgabefehler ist erkennbar, aber ich sehe den Programmierfehler nicht... :/

    Kann ihn jemand entdecken???

    Grüße,

    InfinitySounds

    Beitrag zuletzt geändert: 9.8.2011 17:50:05 von infinitysounds
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Naja du hast zum einen kein Line Feed oder Carriage Return eingefügt, deshalb auf derselben Zeile und außerdem steckt es in keinem if und wird immer ausgefährt. Ich kann alelrdings nicht genau sagen, was du nun als Fehler anprangerst, denn alles läuft wirklich offensichtlich so wies im Quelltext steht.
  4. Autor dieses Themas

    infinitysounds

    Kostenloser Webspace von infinitysounds

    infinitysounds hat kostenlosen Webspace.

    reimann schrieb:
    Naja du hast zum einen kein Line Feed oder Carriage Return eingefügt, deshalb auf derselben Zeile und außerdem steckt es in keinem if und wird immer ausgefährt. Ich kann alelrdings nicht genau sagen, was du nun als Fehler anprangerst, denn alles läuft wirklich offensichtlich so wies im Quelltext steht.


    line Feed? Carriage Return? SInd beides Fremdwörter für mich....

    Das ganze ist nur eine Funktion eines größeren Programmes, reicht aber aus, um Fehler zu erkennen, denke ich...

    Der Fehler ist, dass ich kein Zeichen eingeben kann, irgendwas stimmt mit dem scanf() und printf() nicht, das scanf() wird einfach ausgelassen, wie mir auch ein Debugging Vorgang gezeigt hat :/
  5. Ich dachte du meinst "Ergebnis ist 0.000...".
    Das sind beides Begriffe für die beiden Steuerzeichen für eine neue Zeile. Unter Windows Carriage Return und dann Line Feed (\r\n) unter Linux nur Line Feed.
    Ich kann an dem scanf aber auch keinen Fehler entdecken. Wie sieht es denn mit einem String(%s) aus funktioniert zumindest das?
  6. Autor dieses Themas

    infinitysounds

    Kostenloser Webspace von infinitysounds

    infinitysounds hat kostenlosen Webspace.

    Oh, vielen Dank, das hat geholfen, super, jetzt stimmts ;)
    dankeschön

    noch ne frage:

    wenn ich verhindern will, dass bei ganzzahligen ergebnissen Nachkommastellen sind, aber bei dezimalzahlen mit Nachkommastellen, auch welche angezeigt werden, was müsste ich dann in einer If-Schleife anführen, wie hier:

    if(out==[ganze zahl])    printf("Ergebnis: %.0f\n",out);
        if(out==[dezimalzahl])    printf("Ergebnis: %.2f\n",out);


    Beitrag zuletzt geändert: 9.8.2011 20:15:42 von infinitysounds
  7. Wegen Line Feed und Carriage Return solltest du noch weiter googeln. Sind wichtig und werden dir immer wieder begegnen (genauso wie weitere ASCII-Zeichen). Weil genau diese könnten dir gerade in Zusammenhang mit scanf die Tour vermasselt haben.

    Bin mir nicht ganz sicher, würde momentan aber Folgendes vermuten:

    Du verwendest Windows? Bei einem Tastendruck auf Enter (also nach dem du den ersten Term eingegeben hast), werden zwei Zeichen gesendet: Carriage Return und Line Feed. Das erste wird wohl verwendet, um die Zeile abzuschließen, das andere schlummert wohl noch irgendwo in dem Tastaturpuffer und schließt dir deine zweite scanf-Abfrage ab, ohne dass du vorher was eingeben kannst.

    Lösungsmöglichkeit: versuch es mal, in dem du vor jedem scanf den Tastaturpuffer leerst. Dies erreichst du mit dem Befehl fflush(stdin), wenn ich mich nicht irre. Funktioniert merkwürdigerweise aber auch nicht immer... scanf ist halt eine beknackte Funktion, die immer rumspinnt. Wenn sich jemand besser damit auskennt und mir seine Tücken näher bringen kann, dann immer raus damit.

    Ansonsten kann ich nur sagen: verwende andere Funktionen, wie z.B. fgets oder fgetc... ist zwar im Endeffekt aufwändiger, aber besser.

    PS: für ein kleines Taschenrechnerprogramm sollte ein Scanf auch erstmal reichen, aber für größere Programme lohnt sich der Aufwand eher...

    Edit: zu deiner nächsten Frage:

    Ich geb dir mal einige Hinweise, vielleicht findest du mit diesen Mitteln eine Lösung: Es gibt Befehle zum Runden, fabs(zahl). Und es gibt den sogenannten Modulo-Operator, zahl1 % zahl2. Mit den beiden lässt sich so einiges anstellen, wobei nicht unbedingt beide für die Lösung notwendig sind... viel Spaß beim Knobeln :-)

    Beitrag zuletzt geändert: 9.8.2011 20:27:37 von tangoal
  8. Falls dus noch nicht gemacht hast, würd eich zur Sicherheit noch "width" als 1 übergeben, weil ich ansosnten nicht weiß, was da speichertechnisch passiert.

    Das würde ich so machen:
    if( out - floor( out ) != 0f ) // hat komma
    else // hat keine komma

    Allerdings musst du beachten, dass Fließkommazahlen in der Genauigkeit begrenzt sind und deshalb die Zahl nicht immer genau passt.
    Beispiel: 1f / 3f * 3f // ergibt 0.99
    Außerdem kann bei einem Float von 1.001 trotzdem zu der Ausgabe 1.00 kommen.

    @tangoal:
    Mit modulo kann er bei float leider nix anfangen.:wink:

    Allerdings muss ich dazu sagen, dass wenn man eine eigene Idee zur Lösung hat diese auch verwenden kann und wenns nicht klappt, dann einfach wieder melden.:wave:

    Beitrag zuletzt geändert: 9.8.2011 20:31:13 von reimann
  9. Autor dieses Themas

    infinitysounds

    Kostenloser Webspace von infinitysounds

    infinitysounds hat kostenlosen Webspace.

    reimann schrieb:
    Falls dus noch nicht gemacht hast, würd eich zur Sicherheit noch "width" als 1 übergeben, weil ich ansosnten nicht weiß, was da speichertechnisch passiert.

    Das würde ich so machen:
    if( out - floor( out ) != 0f ) // hat komma
    else // hat keine komma

    Allerdings musst du beachten, dass Fließkommazahlen in der Genauigkeit begrenzt sind und deshalb die Zahl nicht immer genau passt.
    Beispiel: 1f / 3f * 3f // ergibt 0.99
    Außerdem kann bei einem Float von 1.001 trotzdem zu der Ausgabe 1.00 kommen.

    @tangoal:
    Mit modulo kann er bei float leider nix anfangen.:wink:

    Allerdings muss ich dazu sagen, dass wenn man eine eigene Idee zur Lösung hat diese auch verwenden kann und wenns nicht klappt, dann einfach wieder melden.:wave:


    All right, bis auf einen kleinen fehler (
    if(out-floor(out) == .0f
    wäre richtig gewesen) super
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!