2017-06-30 2 views
-2

Ich habe gerade angefangen zu programmieren, also weiß ich, das ist wahrscheinlich ein sehr grundlegender Fehler, aber ich habe versucht, herauszufinden, wie Sie den logischen Fehler in meinem Code beheben für die greedy.c Auftrag von Harvard CS50 Kurs ohne Erfolg. Ich habe nach Lösungen für das Problem gesucht, aber alle scheinen es auf eine andere Weise zu lösen, als ich es versuche. Ich habe die anderen Beispiele umgedreht, und ich verstehe sie jetzt, aber ich möchte wirklich wissen, wie ich meine eigene Version gut laufen lassen kann.Neuer Programmierer, ich brauche Hilfe auf greedy.c von Harvard CS50

Ich versuche, das Problem durch eine Reihe von while-Schleifen zu lösen, die jeweils einen bestimmten Münzwert vom Gesamtbetrag subtrahieren und eine Münze zur Gesamtanzahl der Münzen hinzufügen. Für mich scheint es logisch, dass es Sinn macht, aber wenn ich das Programm ausführe, gibt es mir nicht die erwartete Ausgabe. Es führt die printf-Anweisung einfach nicht unten aus. Ich hoffe, dass einer von euch da draußen witzelt und mir dabei helfen kann! Danke für jede Hilfe!

Heres mein Code:

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

int main (void) 
{ 
    printf("How much change is needed?\n"); 
    float owed = get_float(); 
    int coins = 0; 
    /*While loops subtracting one coin from change owed, and adding one to coin count*/ 
    while (owed >= 0.25) 
    { 
     owed = owed - 0.25; 
     coins = coins + 1; 
    } 
    while (owed >= 0.1) 
    { 
     owed = owed - 0.1; 
     coins = coins + 1; 
    } 
    while (owed >= 0.05) 
    { 
     owed = owed - 0.05; 
     coins = coins + 1; 
    } 
    while (owed >= 0.01) 
    { 
     owed = owed - 0.01; 
     coins = coins + 1; 
    } 
    /*While loops done, now print value of "coins" to screen*/ 
    if (owed == 0) 
    { 
     printf("You need %i coins\n", coins); 
    } 
} 

Edit:

Also spielte ich mit ihm um ein wenig mehr, und fertig, dass "wenn" Aussage. Es gibt einen Fehler für mich zurück, also wie ist der Wert von "geschuldet" am Ende des Programms ungleich 0?

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

int main (void) 
{ 
    printf("How much change is needed?\n"); 
    float owed = get_float(); //Gets amount owed from user in "x.xx" format 
    int coins = 0; //Sets initial value of the coins paid to 0 
    //While loops subtracting one coin from change owed, and adding one to coin count 
    while (owed > 0.25) 
    { 
     owed = owed - 0.25; 
     coins = coins + 1; 
    } 
    while (owed > 0.1) 
    { 
     owed = owed - 0.1; 
     coins = coins + 1; 
    } 
    while (owed > 0.05) 
    { 
     owed = owed - 0.05; 
     coins = coins + 1; 
    } 
    while (owed > 0.01) 
    { 
     owed = owed - 0.01; 
     coins = coins + 1; 
    } 
    //While loops done, now print value of "coins" to screen 
    if (owed == 0) 
    { 
     printf("You need %i coins\n", coins); 
    } 
    else 
    { 
     printf("Error\n"); 
    } 
} 

Edit:

Also, wenn mein Code arbeitet, begann ich mit ihm und Overengineering Hantieren. Heres die letzte (für jetzt) ​​Version!

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



int main (void) 
{ 
    srand(time(0));            //generates random seed 
    float price = round(rand()%500);       //generates random price between 0 and 500 cents 
    printf("You owe %f. How much are you paying?\n", price/100); //shows user their price between 0 and 5 dollars 
    printf("Dollars: "); 
    float paymnt = get_float()*100;        //gets the amount user will pay in dollars then converts to cents 

    int owed = round (paymnt - price);       //calculates the change owed by paymnt-price 
    int coins = 0;            //Sets initial value of the coins paid to 0 
    int quarters= 0; 
    int dimes = 0; 
    int nickels = 0; 
    int pennies = 0; 

    if (owed ==0 && price >0)         //If someone pays in exact 
    { 
     printf("You paid the exact amount!\n"); 
    } 
    else if (owed < 0)           //If someone doesn't pay enough 
    { 
     printf("You didn't give us enough money!\n"); 
    } 
    else              //Else(We owe them change) 
    { 
     printf("Your change is %i cents\n", owed); 
     //While loops subtracting one coin from change owed, and adding one to coin count 
     while (owed >= 25) 
     { 
      owed = owed - 25; 
      quarters = quarters + 1; 
     } 
     while (owed >= 10) 
     { 
      owed = owed - 10; 
      dimes = dimes + 1; 
     } 
     while (owed >= 5) 
     { 
      owed = owed - 5; 
      nickels = nickels + 1; 
     } 
     while (owed >= 1) 
     { 
      owed = owed - 1; 
      pennies = pennies + 1; 
     } 
     //While loops done, now print each coin and total coins needed to screen 
     if (owed == 0) 
     { 
      coins = quarters + dimes + nickels + pennies; 
      printf("You need %i coins (%i quarters, %i dimes, %i nickels, and %i pennies)\n", coins, quarters, dimes, nickels, pennies); 
     } 
     else 
     { 
      printf("Error\n"); 
     } 
    } 
} 
+0

Die Verwendung von Gleitkommatypen für die Währungsbuchhaltung wird als schlechte Idee angesehen (und eine nette Hintertür zum Runden von Betrügereien). –

+0

Für einige Beispieleingabe, was ist die erwartete Ausgabe? Und was ist die * tatsächliche * Ausgabe? Bitte bearbeiten Sie Ihre Frage, um diese Details hinzuzufügen. Und bitte nehmen Sie sich auch etwas Zeit, um zu lesen [Wie kleine Programme zu debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) von Eric Lippert. –

+0

Danke Eugene. Ich habe es in ganzzahlige Berechnungen geändert. Gute Idee. –

Antwort

0

Man kann nicht wirklich einen Schwimmer Punktnummer auf eine ganze Zahl vergleichen (0), weil einige der tiefen Montagemechanismus

Was können Sie tun:

  1. einfach tun printf("You need %i coins\n", coins) ohne Bedingung

  2. Do

    if (owed <= 0.001 && owed >= -0.001) 
    { 
        printf("You need %i coins\n", coins); 
    } 
    

    Es ist eigentlich eine ziemlich gängige Praxis

+0

Oder das OP könnte folgen EugeneSh.'s Kommentar, und implementieren Ganzzahl-Arithmetik und tun alle Zählen in Cent. – Tardis

+0

Danke!Ich habe etwas in dieser Richtung gedacht. Ich habe versucht, dies in meinen Code einzufügen, und ich bekomme immer noch Fehler zurück. Ich habe die Werte auf if (owed <0,01 && owed> -0.01) { printf ("Sie benötigen% i coins \ n", Münzen); } sonst { printf ("Fehler \ n"); } und es funktioniert immer noch nicht. Irgendwelche Ideen? –

+0

@ Dr.B ist es Drucken Fehler oder es ist nicht looping –

0

Ihnen allen für Ihre Hilfe danken. Ich folgte Tardis 'Vorschlag und verwendete stattdessen ganze Zahlen für die Berechnungen. Es war ein Erfolg! Heres der Code, den ich endete mit:

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

int main (void) 
{ 
    printf("How much change is needed?\n"); 
    float tmp = get_float() * 100;//Gets amount owed from user in "x.xx" format 
    int owed = round(tmp); 
    int coins = 0; //Sets initial value of the coins paid to 0 
    //While loops subtracting one coin from change owed, and adding one to coin count 
    while (owed >= 25) 
    { 
     owed = owed - 25; 
     coins = coins + 1; 
    } 
    while (owed >= 10) 
    { 
     owed = owed - 10; 
     coins = coins + 1; 
    } 
    while (owed >= 5) 
    { 
     owed = owed - 5; 
     coins = coins + 1; 
    } 
    while (owed >= 1) 
    { 
     owed = owed - 1; 
     coins = coins + 1; 
    } 
    //While loops done, now print value of "coins" to screen 
    if (owed == 0) 
    { 
    printf("You need %i coins\n", coins); 
    } 
    else 
    { 
     printf("Error\n"); 
    } 
} 

Liebe das Gefühl, endlich ein Programm richtig zu bekommen. Ich wünschte nur, ich hätte das alleine ausdenken können:/Trotzdem, vielen Dank für deine Vorschläge.

+0

Könnte ich es so geschrieben haben? 'float owed = round (get_float() * 100);' und die Notwendigkeit für die Variable tmp beseitigt? –