Почему мой код не возвращает требуемый вывод после запроса пользователя - PullRequest
0 голосов
/ 20 марта 2020

Я делаю простой Al go, который возвращает минимальное количество монет, необходимое для сдачи в обмен при вводе значения $, используя только 25 c, 10 c, 5 c и 1 c монет.

например, задолженность: 0,31 монеты: 3

пожалуйста, посмотрите код ниже, он запрашивает пользователя правильно, но возвращает любой номер при вводе.

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

int main(void)

{
    //Declaring the variables
   float change_owed;
   int quarter, dime, nickel, penny;
    //Defining types of coins that can be given as change.
    quarter = 25;
    dime = 10;
    nickel = 5;
    penny = 1;

    do
    {
    //Defining function and storing in variable change
        change_owed = get_float("Change: ");
    }  
    //Repeat prompt while input is negative  
    while (change_owed <= 0);
    //rounding the numbers so we can divide
    int amount = round(change_owed * 100);

    ///Deciding if to use a Quarter
    //Defining Quarter counter
    int count_quarter=0;
    while (amount >= quarter)
    {   
        //Counting number of quarters used
        count_quarter++;
        //Decreasing amount owed by a quarter
        return amount - quarter;
    }
    //Deciding whether to use a dime
    //Defining dime counter
    int count_dime=0;
    while (amount >= dime)
    {
        //Counting number of dimes used
        count_dime++;
        //Decreasing amount owed by a dime
        return amount - dime;
    }
    int count_nickel=0;
    while (amount >= nickel)
    {
       //Deciding whether to use a nickel
       //counting number of nickels used 
        count_nickel++;
        //Decreasing amount by a nickel
        return amount - nickel;
    }

    //Deciding whether to use a penny
    //Defining penny counter
    int count_penny=0;
    while (amount >= penny)
    {
       //counting number of pennies used
        count_penny++;
      //Decreasing amount by a penny
      return amount - penny; 
    }

  int total_coins = (count_quarter + count_dime + count_nickel + count_penny);

    printf("%i", total_coins);

}

1 Ответ

1 голос
/ 20 марта 2020

Оператор return в C (или на любом другом языке, который я могу придумать) возвращает значение из функции. Это означает, что после оператора return больше не выполняется код этой функции, и следующая инструкция будет следующей после вашей функции. Если вы вернетесь из main, вызывается функция выхода, которая, помимо прочего, завершает процесс и обеспечивает доступность возвращаемого значения процесса.

On bash, если вы делаете:

./a.out
echo $?

вы можете увидеть возвращаемое значение вашей программы C.

Вам нужно продолжать добавлять как можно большую монету как можно дольше (жадный алгоритм), а затем переключаться на следующую меньшую монету.

Хороший способ, использовать целые числа и вычислять все в центах.

#include "stdio.h"

#define NUM_COIN_TYPES 4

int main(void)
{
        int coins[NUM_COIN_TYPES] = {25, 10, 5, 1};
        float change_owed_float = 13.37; //insert your read from commandline code here
        int change_owed = (int)(change_owed_float * 100.f);
        int num_coins = 0;

        for(int ctr = 0; ctr < NUM_COIN_TYPES && change_owed > 0; ++ctr)
        {
                while(change_owed - coins[ctr] >= 0)
                {
                        change_owed -= coins[ctr];
                        ++num_coins;
                }
        }

        printf("Number of coins required: %d\nChange owed: %d\n", num_coins, change_owed);
        return 0; //could be void main and no return
}

Путь с плавающей точкой, который может привести к странностям:

#include "stdio.h"

#define NUM_COIN_TYPES 4

int main(void)
{
        float coins[NUM_COIN_TYPES] = {.25,.10,.05, .01};
        float change_owed = 13.37; //insert your read from commandline code here
        int num_coins = 0;

        for(int ctr = 0; ctr < NUM_COIN_TYPES && change_owed > 0.0; ++ctr)
        {
                while(change_owed - coins[ctr] >= -.009) //floats are weird
                {
                   change_owed -= coins[ctr];
                   ++num_coins;
                }
        }

        if(change_owed > -.01 && change_owed <= 0.0)
        {
                //sanity check
                printf("It works!\n");
                change_owed = 0;
        }

        printf("Number of coins required: %d\nChange owed: %f\n", num_coins, change_owed);
        return 0; //could be void main and no return
}

РЕДАКТИРОВАТЬ: Возможно, самый простой способ избежать странностей арифметики с плавающей точкой c, это просто использовать целые числа после умножения всего на 100.

HTH

...