2016-08-15 3 views
0

Ich schreibe ein Programm, das eine Eingabe nimmt und die geringste Anzahl von Münzen ausdrucken soll. Wenn ich das Programm ausführe und eine Eingabe eingabe, funktioniert es nicht wie erwartet und druckt nichts. Was mache ich hier falsch?CS50 PSet 1 Greedy

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

int main (void) 
{ 
    float f = 0; 
     int count = 0;//number of coins 
     do 
     { 
      printf("How much change is owed?\n"); 
      f = GetFloat(); 
     } 
     while (f < 0); 

    //Convert to cents 
     f = f * 100; 
     while (f > 0) 
     { 
      if (f > 25) 
      { 
        f = f - 25; 
        count++; 
      } 
      else if (f > 10) 
      { 
        f = f - 10; 
        count++; 
      } 
      else if (f > 5) 
      { 
        f = f - 5; 
        count++; 
      } 
      else if (f > 1) 
      { 
        f = f - 1; 
        count++; 
      } 
     } 
     printf("%d", count); 
} 

It doesn't print anything

+3

Es ist wahrscheinlich eine Endlosschleife. Beachten Sie die Lücke (Hinweis: Anders als die Ganzzahl) – BLUEPIXY

+2

abhängig von den Bedingungen Ihre zweite Schleife könnte unendlich sein, da f ist ein float (Drucken Sie den Float-Wert von f am Ende der Schleife) – dvhh

+1

Umgerechnet auf Cent, besser zu runden zu der nächsten ganzen Zahl 'f = rintf (f * 100);' oder 'f = roundf (f * 100);' – chux

Antwort

2

Das Problem ist, dass das Programm in einer Endlosschleife steckt. Anfangs f=0.41. Dann tun Sie f = f * 100; und wir haben f = 41.

Dann wird, wie Sie durch die Schleife bewegen,

Zuerst f>25, so f = f - 25, und Sie erhalten f = 16.

Dann, nächste Iteration, f>10, so , und Sie erhalten f = 6.

Dann f>5, also f = f - 5, und Sie erhalten f = 1.

Nun ist keine der if-Bedingungen in der Schleife erfüllt, aber die Bedingung in der while bleibt wahr. Also bricht es nie aus. Um dies zu korrigieren, ersetzen Sie alle > Symbole in den if-Blöcken durch >=. Dadurch erhalten Sie die korrekte Anzahl an Münzen. (aber Sie müssen sicherstellen, dass f keinen Bruchteil nach f = f * 100 hat).

f = (int)(f * 100); 
     while (f > 0) 
     { 
      if (f >= 25) 
      { 
        f = f - 25; 
        count++; 
      } 
      else if (f >= 10) 
      { 
        f = f - 10; 
        count++; 
      } 
      else if (f >= 5) 
      { 
        f = f - 5; 
        count++; 
      } 
      else if (f >= 1) 
      { 
        f = f - 1; 
        count++; 
      } 
     } 
+1

argh! Ich kann nicht glauben, dass ich das übersehen habe. Vielen dank für Deine Hilfe. Schätzen Sie es: D –

+1

Es gibt eine Anzahl von Problemen mit '(int)' in 'f = (int) (f * 100);', besonders Abschneiden. Besser mit 'rintf() 'oder' roundf() 'runden. – chux

0

Ihr Programm wird niemals enden nach Wert von f 1 wird Ersetzen ‚>‘ Zeichen mit ‚> =‘ Zeichen

+0

Obwohl wir Ihnen für Ihre Antwort danken, wäre es besser, wenn es zusätzlichen Wert über die anderen Antworten hinaus bietet. In diesem Fall bietet Ihre Antwort keinen zusätzlichen Wert, da ein anderer Benutzer diese Lösung bereits veröffentlicht hat. Wenn eine vorherige Antwort hilfreich für Sie war, sollten Sie sie abstimmen, anstatt dieselben Informationen zu wiederholen. –

+0

Sorry, ich habe nur versucht, etwas Reputation zu bekommen, da ich neu bei stackoverflow bin und keine Programmierkenntnisse habe. Kannst du mir ein paar gute Schritte empfehlen, damit ich einen guten Ruf erlange? –