4 svar
112 visningar
Elias Sk är nöjd med hjälpen
Elias Sk 59
Postad: 30 aug 2021 10:11 Redigerad: 30 aug 2021 10:14

Den ska räkna ut maxantal av olika mynt, men gör det inte.

Hej. Jag har fastnat på denna uppgift, och kommer inte vidare. Det problem som uppstår är att när jag har skrivit in ett värde på Owed money, är det inte alltid max antal av varje mynt som räknas in. 
Här har jag exkluderat hälften då jag tror att det är samma problem på alla 4 "myntdelar". Så nu när jag ska skriva in money, skriver jag in 4.2, vilket borde bli 16 quarters och 2 dimers, men programmet vill bara "dela ut" 1 dimer, så jag blir lämnad med 0.1 money kvar. Kan nån förklara varför det blir fel, för jag kan verkligen inte förstå vart det är fel. Om du behöver hela koden skickar jag den gärna. Tack på förhand!

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

float quarters = 0;
float dimers = 0;
float nickels = 0.;
float pennies = 0.;
float money;
int howManyQuarters;
int howManyDimers;
int howManyNickels;
int howManyPennies;
//To devide it easier
string dash = ("----");

int main(void)
{
    // Ask the user how much money the program will calculate
    do
    {
    money = get_float("Owed money(x.xx): ");
    }
    while(money < 0 || money > 1000);
    printf("%s\n", dash);
    
    // How many quarters the user is "owed", and how much money is owed after payed quarters
    while(quarters < money)
    {
        quarters += 0.25;
        howManyQuarters += 1;
    }
    if(quarters > money)
    {
        quarters -= 0.25;
        howManyQuarters -= 1;
    }
    money -=quarters;
    
    printf("Owed quarters: %i (%f)\n", howManyQuarters, quarters);
    printf("Owed money: %f\n", money);
    printf("%s\n", dash);
    
    // How many dimers the user is "owed", and how much money is owed after payed dimers
    while(dimers < money)
    {
        dimers += 0.1;
        howManyDimers += 1;
    }
    if(dimers > money)
    {
        dimers -= 0.1;
        howManyDimers -= 1;
    }
    money -= dimers;
    
    printf("Owed dimers: %i (%f)\n", howManyDimers, dimers);
    printf("Owed money: %f\n", money);
    printf("%s\n", dash);
    
}
creamhog 286 – Livehjälpare
Postad: 30 aug 2021 10:29

Kan du visa vad du får om du sätter en

printf("Owed dimers: %i (%f)\n", howManyDimers, dimers);

före

if(dimers>money)?

Det kan vara därför att float beter sig ganska konstigt i hardware (se t ex här). Kan du använda int istället? 

Elias Sk 59
Postad: 30 aug 2021 17:59 Redigerad: 30 aug 2021 18:01

Grejjen e den att jag måste använda en float för att få till decimaltalen (det ska ju kunna vara 2 decimaltal), och med int kan jag väll inte få det. När jag la till det du skrev blev det såhär:

så problemet är väll då det du sa, att float inte är exakt. Vet dock inte hur jag ska lösa det så att det ska kunna vara 2 exakta decimaltal.

Ska också kika lite på länken du skickade!

Laguna Online 28448
Postad: 30 aug 2021 18:03 Redigerad: 30 aug 2021 18:04

Jag föreslår att du använder heltal och räknar cent.

Problemet med flyttal är att 0,1 inte går att representera exakt, så om man lägger ihop tio sådana får man inte 1. Utskrift med %f avrundar så då ser det rätt ut.

(Förresten heter det one dime, several dimes.) 

Elias Sk 59
Postad: 30 aug 2021 18:06

Okey så att jag använder 1, 5 10 och 25 istället? 

För känns som att det borde gå att göra det på något sätt med decimaler, men det kanske är lite krångligare.

Haha tack för noteringen, ska ändra det!

Svara Avbryt
Close