While-Loop中的错误使得计数超出条件

时间:2018-05-18 01:21:23

标签: c while-loop counter nested-loops

对于学校,我要写一个C程序,它需要一些现金并返回达到该数量所需的最少数量的硬币。我不知道我做错了什么。我一直在调整和尝试各种不同的东西,但我似乎无法完全调试该程序。

该程序为某些输入提供了正确答案,但夸大了许多输入所需的硬币数量。

这是我到目前为止所拥有的。

#include <stdio.h>

int main()
{
    float cash;
    int n;
    int counter=0;
    int quarters=0;
    int dimes=0;
    int nickels=0;
    int pennies=0;

    for (;;)
    {
        printf("Enter change amount: ");
        scanf("%f",&cash);

        if (cash > 0)
        {
            break;
        }
    }

    n = cash * 100; 
    counter = 0;

    while (n > 0)
    {
        while (n >= 25)
        {
            counter ++;
            n = n - 25;
            quarters ++;
            printf("%i\n",n);
        }

        while (n >= 10 && n < 25)
        {
            counter ++;
            n = n - 10;
            dimes ++;
            printf("%i\n",n);
        }

        while (n >= 5 && n < 10)
        {
            counter ++;
            n = n - 1;
            nickels++;
            printf("%i\n",n);
        }

        while (n > 0 && n < 5)
        {
            counter ++;
            n = n - 1;
            pennies ++;
            printf("%i\n",n);
        }
    }
    printf("%d\n",counter + n);
    printf("%i quarters, %i dimes, %i nickels, %i pennies\n", 
                quarters, dimes, nickels, pennies); 

    return 0;
}

3 个答案:

答案 0 :(得分:1)

我有点惊讶他们希望你使用break来退出循环,因为你通常希望循环“自然地”结束(你通常会为switch语句保存中断)。这样的东西应该工作,使用整数除法和模数运算符(编辑说明:我使用两个整数而不是一个浮点因为后者不准确。如果有更多知识渊博的人想要展示如何用浮点运算,那么很有趣。):

#include <stdio.h>

int main() {
    int dollar, cent;

    int q = 0;
    int d = 0;
    int n = 0;
    int p = 0;

    int re;

    printf("Enter amount: ");
    scanf(" %d.%d", &dollar, &cent);

    q = dollar * 4;        
    re = cent;

    q = q + (re / 25);
    re = re % 25;

    d = re / 10;
    re = re % 10;

    n = re / 5;
    re = re % 5;

    p = re;

    printf("q %d d %d n %d p %d\n", q, d, n, p);

    return 0;
}

例如,如果您给出秒数并想要从中找到min:sec,则此方法也有效。如果给你65秒,那么你的分钟部分是65/60(这是1),而秒部分就是你除以60或65%60(即5)之后的余数。

答案 1 :(得分:0)

这是一个更完整的答案,符合您给我们开始的代码。我将循环更改为减法/乘法并修复了您将镍币视为便士的错误。你不再需要计数器变量,但我把它留在了。

#include <stdio.h>

int main()
{
    float cash;
    int n;
    int counter=0;
    int quarters=0;
    int dimes=0;
    int nickels=0;
    int pennies=0;

    for (;;)
    {
        printf("Enter change amount: ");
        scanf("%f",&cash);

        if (cash > 0)
        {
            break;
        }
    }

    n = cash * 100; 
    counter = 0;

    if (n > 0)
    {
        quarters = (int)floor(n / 25);
        n -= quarters*25;
        printf( "%i\n", n );

        dimes = (int)floor(n / 10);
        n -= dimes*10;
        printf("%i\n",n);

        nickels = (int)floor(n / 5);
        n -= nickels*5;
        printf("%i\n",n);

        pennies = n;
        printf("%i\n",n);
    }
    printf("%i quarters, %i dimes, %i nickels, %i pennies\n", 
                quarters, dimes, nickels, pennies); 

    return 0;
}

答案 2 :(得分:-1)

首先,尝试从抽象出如何处理一种类型的硬币开始:

int coinsNeeded( int amount, int coinAmount )
{
    return (int) floor( amount / coinAmount );
}

然后,分开处理每个硬币:

quarters = coinsNeeded( cash, 25 );
cash -= (quarters * 25);

请为您想要考虑的每种类型的硬币重复一遍,然后在最后打印出信息。关于是否要使用浮点存在一些分歧。浮点确实存在使用金钱时要避免的舍入错误。你真正需要的是一个定点数据类型,但我离题了。你可以按照你的方式做到足够接近(乘以100,只需要处理便士)。