2016-10-30 3 views
1

Ich sollte Benutzereingaben, ein float, dann verfolgen, wie oft 0,25, 0,10, 0,05 und 0,01 kann davon mit einem Zähler abgezogen werden. Dann soll es die Anzahl der Zählungen drucken. Aber als ich versuchte, den Code ausgeführt wird, es eine Benutzereingabe bekommt, aber wenn ich eine beliebige Anzahl versuchen, dies zeigt sich:Warum funktioniert meine Theke nicht?

greedy.c:18:14: runtime error: signed integer overflow: 2147483647 + 1 cannot be >represented in type 'int'

Bitte Fehler hinweisen, hier ist mein Code:

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int main(void) 

{ 

    float b; 
    float a; 
    int count = 0; 
    printf("How much change is owed? "); 
    a = GetFloat(); 

    do 
    { 
     b = a - 0.25; 
     count++; 
    } 
    while(a>0.25); 

    do 
    { 
     b = a - 0.10; 
     count++; 
    } 
    while(a>0.10); 

    do 
    { 
     b= a - 0.05; 
     count++; 
    } 
    while(a>0.05); 

    do 
    { 
     b= a- 0.01; 
     count++; 
    } 
    while(a>0.01); 
    printf("%d coins\n", count); 
} 
+2

'while (a> 0,25);.?', Wie die Schleife enden soll, wenn 'a' ändert sich nie – tkausl

+1

Die Botschaft ist klar, was ist Ihre ** spezifische ** Frage? – Olaf

+0

@ Olaf mein Code kompiliert, aber es funktioniert nicht.Wenn ich Daten eingeben, ist es nicht in der Lage zu geben, was ich will. – user7091717

Antwort

2

statt "b = a - 0.25;" versuchen Sie "a = a - 0.25;". Und das gleiche für die anderen Subtraktionen. Die Variable a bleibt jetzt in Ihrer Schleife gleich.

+0

Ich habe das gerade jetzt versucht, es gab mir eine tatsächliche numerische Ausgabe anstelle der oben genannten Fehlermeldung. ABER da stimmt etwas nicht mit den Berechnungen, denke ich. Ich habe 10 als Eingabe versucht, aber was es berechnet hat, war 43. Das hat mich zum Nachdenken gebracht, warum wird es sich nicht einfach durch 0,25 teilen? – user7091717

+0

@jjjjj bitte [diese Frage] (http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency) über "ändern" Probleme, und [dieses ] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) über Fließkommaberechnungen .. –

+0

Das ist technisch korrekt, man bekommt 40 aus der ersten Schleife und man schleift immer mindestens einmal Durch die anderen Loops bekommst du 3 hinzu. Ändern Sie die while-Schleife von 'do {...} while (...)' nach 'while (...) {...}' geben Sie das gewünschte Ergebnis. Aber ich empfehle sehr, einen Debugger zu starten und den Code Zeile für Zeile durchzugehen, damit es klarer wird, was passiert. – user189695

1

Sie ändern nie den Wert von a so keiner Ihrer while Bedingungen jemals falsch erreichen. Um dies zu beheben, diese Änderung bedeutet, dass jeder b = a - coinvalue zu a = a - coinvalue (was auch können Sie beseitigen b

+0

Danke, ich habe b zu a geändert und alles scheint gut, es gibt keine Fehlermeldung und die Ausgabe ist eine tatsächliche Zahl, aber es ist etwas falsch mit den Berechnungen, seit ich versuchte, 10 einzugeben, aber die Ausgabe ist 43 statt nur 40, weißt du, Teilen Sie einfach 10 durch 0,25? Das Ziel dieses Codes ist es, zuerst die größtmögliche Menge (0,25) von der Eingabe zu subtrahieren – user7091717

+0

@jjjjj So zwei Dinge: 1. Ändern Sie Ihre 'do {} while' zu ​​normalen' while'. 'do-while'-Schleifen werden verwendet, wenn Sie mindestens einmal iterieren möchten. Auf diese Weise subtrahieren Sie nicht den Wert und erhöhen die Anzahl, wenn der Wert bereits kleiner ist als der Münzbetrag 2. Der Grund dafür ist, dass, sobald Ihre 0,25 Münzen fertig sind und die Zahl 40 erreicht, die anderen Münzen durchgehen mindestens einmal. Meine in meinem letzten Punkt erwähnte Lösung sollte das ebenfalls beheben. – theKunz

+0

Ändern der Do While-Schleife alles behoben. Vielen Dank! – user7091717

Verwandte Themen