【问题标题】:If user input is negative, prompt again如果用户输入是否定的,再次提示
【发布时间】:2015-07-22 23:33:23
【问题描述】:

所以我在计算零钱,如果用户的输入是0.41,结果将是:1 quarter, 1 dime, 1 nickel, 1 penny

代码运行良好,直到您提供负值。 我添加了一个 if 语句来检查这一点,之后我所能做的就是exit(0)。我想一次又一次地提示用户输入一个正值,我该怎么做?

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

int main (void) {

    printf("How much change do you owe: ");

    float amount = GetFloat();
    float cents = 100.0 * amount;
    float quarter = 0;
    float dime = 0;
    float nickel = 0;
    float penny = 0;

    if (amount < 0) {
        printf("Please provide a positive value.");
        exit(0);
    }

    while (cents > 0) {
        if (cents >= 25.0) {
            cents -= 25.0;
            quarter += 1;
        } else if (cents >= 10.0) {
            cents -= 10.0;
            dime += 1;
        } else if (cents >= 5.0) {
            cents -= 5.0;
            nickel += 1;
        } else if (cents >= 1.0) {
            cents -= 1.0;
            penny += 1;
        }
    }
    printf("%f quarters, %f dimes, %f nickels, %f pennies, Total of %f coins.\n", quarter, dime, nickel, penny, quarter + dime + nickel + penny);
}

【问题讨论】:

  • 那个while 循环你在你的代码中更进一步。尝试其中一种环绕您的输入序列。
  • 使用 do-while 循环?顺便说一句,请不要将float 用于金钱和零钱问题,由于不精确的表示,您会收到奇怪的错误。最好使用int 以美分工作。
  • 使用float 计算金钱是bad idea。请改用整数类型。在显示美元时,请在显示时对其进行缩放。
  • 这是我正在学习的课程的一部分,他们明确要求我们使用float 和来自#include &lt;cs50.h&gt;GetFloat()
  • 当然,它在名称中,但重点是(当不受课程及其规定的摆布时)在需要精确比较时有充分的理由避免使用浮点类型。跨度>

标签: c if-statement while-loop cs50


【解决方案1】:

对于新手来说在哪里放置声明可能有点尴尬,所以这里是:

float amount;

for (;;)
{
    amount = GetFloat();

    if ( amount >= 0 ) 
        break;

    printf("Please provide a positive value.\n");
}

float cents = 100.0 * amount;
float quarter = 0;
// etc.

您不能将float amount 放在{ } 内,否则该变量将被限定在该范围内,并且在} 之后无法访问。

编写相同循环的更紧凑的方法是:

while( (amount = GetFloat()) < 0 )
    printf("Please provide a positive value.");

但您可以使用您认为更合理的版本。

【讨论】:

  • 注意。正如其他人所提到的,由于舍入错误,浮点数是一种不好的表示货币的方式。
  • 很好地使用了break 和最终高度紧凑的版本。但是,我不确定您为什么要避免混淆新编码人员,然后立即使用for (;;)!当然,它们是等价的,但通常的while (1) 似乎更容易理解。我见过的许多新编码人员都很难准确掌握for 括号中的三个“子条款”的真正作用。
  • @underscore_d 现在是了解for(;;) 的意思是一个循环,直到它被break;(或另一个控制语句)退出为止。这是一种常见的模式
  • 谢谢你,成功了。但是,我不明白for (;;)的含义是什么意思?
  • 然而,如果没有我提出来,OP 就不会得到这种解释或确认它在语义上是等价的。
【解决方案2】:
float amount;
do
{
    amount = GetFloat();
}
while (0 < amount);

编辑:马特赢得了包含告诉用户为什么他们被循环的消息,当然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2020-08-04
    相关资源
    最近更新 更多