【问题标题】:Making a C program return to the start and ask for input again if a user did not input the right value如果用户没有输入正确的值,使 C 程序返回开始并再次请求输入
【发布时间】:2016-03-23 21:47:02
【问题描述】:

这是我在这里的第一篇文章,所以请对我温柔一点。我最近在我的大学开设了一个 C 编程课程,我对它非常感兴趣。由于我正在处理音频(混合/母带音乐),我决定尝试制作一个简单的程序来计算用户定义的 BPM(每分钟节拍)的延迟时间(毫秒)。

我目前遇到的问题是:我希望程序返回开始,如果用户输入了错误的 BPM(在这种情况下为 0),我希望用户再次输入。

我尝试了 do while 循环,但它并没有完全正确,我的程序仍然会计算所有内容,就好像用户刚刚输入了 0,如果我输入了正确的值,它只会循环没完没了。

如果我执行 if else 语句,它会给用户一条消息,但我想连同消息一起提示用户再次输入。

我知道这是一个非常简单和基本的问题,但我们将不胜感激。

到目前为止,这是我的代码:

int main(){

    float BPM;

    printf("Please input the BPM:   ");
    scanf(" %f", &BPM);

    do{

    float HZ = 1000;
    float HZ_Result;
    float BPM_QuarterNote=(60/BPM)*1000;

    float BPM_WholeNote=BPM_QuarterNote*4;
    printf("\n\nDelay time for whole note is: %.2f ms or %.2f Hz", BPM_WholeNote, 1000/BPM_WholeNote);

    float BPM_HalfNote=BPM_QuarterNote*2.0;
    printf("\n\nDelay time for 1/2 note is: %.2f ms or %.2f Hz", BPM_HalfNote, 1000/BPM_HalfNote);

        printf("\n\nDelay time for 1/4 note is: %.2f ms or %.2f Hz", BPM_QuarterNote,  1000/BPM_QuarterNote);

    float BPM_EightNote=BPM_QuarterNote*0.5;
    printf("\n\nDelay time for 1/8 note is: %.2f ms or %.2f Hz", BPM_EightNote, 1000/BPM_EightNote);

    float BPM_SixteenthNote=BPM_QuarterNote*0.25;
    printf("\n\nDelay time for 1/16 note is: %.2f ms or %.2f Hz", BPM_SixteenthNote, 1000/BPM_SixteenthNote);

    float BPM_32ndNote=BPM_QuarterNote*0.125;
    printf("\n\nDelay time for 1/32 note is: %.2f ms or %.2f Hz", BPM_32ndNote, 1000/BPM_32ndNote);


    }while(BPM > 0);

return 0;
}

【问题讨论】:

  • 请显示您尝试的循环。
  • 请同时检查scanf的返回值以及扫描的输入值。如果scanf 没有返回1,您正在测试未初始化的变量 BPM
  • 听起来您只想围绕用户输入部分进行循环——第一个 printf()scanf()
  • @kaylum 很抱歉速度很慢,我编辑了主要帖子以显示我尝试做的事情,你能解释一下正确的方法吗?
  • 重新进行循环编辑:60/BPM 部门将崩溃,因为您在 之前检查是否BPM > 0

标签: c loops while-loop do-while


【解决方案1】:

您可以使用 while 循环而不是 if 来测试您的条件

例如

/* while loop execution */
while( BPM == 0 ) {
/* get my input values */
}

【讨论】:

  • 还需要初始化BPM
  • 事实上BPM == 0 带有float 可能是不可取的。为什么不选择一个现实的值,例如BPM < 1.0,但即使这样也是一首挽歌;)
【解决方案2】:

在您的 BPM 声明下方添加此代码。

do{
    printf("Please input the BPM:   ");
    scanf(" %f", &BPM);
  }while(BPM==0.00);

【讨论】:

  • 我建议避免在浮点中进行相等测试,使用while(BPM < 1.0)
  • 我这样做了,但我输入了 while(BPM
  • 你可能是对的,这取决于用户的要求......我不知道这个程序中的负值是否有效。
  • BPM = 每分钟节拍数。
  • 小编辑。现在,如果用户插入的值小于 1,则要求用户再次输入。我想知道是否有一种方法可以添加一条简单的消息,告诉用户他输入了错误的值?
【解决方案3】:

仅当用户满意时才退出的用户输入循环的简单示例:

int main(void)
{
    float fNum= 5.2;
    double dpNum= 5.2;
    long double ldFloat;

    char quit[]={" "};

    while(quit[0] != 'q')
    {
        printf("\n\nEnter a float number: ");
        scanf("%f", &fNum);
        printf("Enter a double precision number: ");
        scanf("%Lf", &ldFloat);
        ... other stuff as needed
        printf("Enter any key to continue or 'q' to exit.");
        scanf("%s", quit);
    }
    return 0;
}

【讨论】:

  • 为什么是float fNum= 5.2;?而不是 double =>> 5.2...dpNum 根本没有使用。
  • @Michi - 大声笑,只是从一些现有代码中剪切和粘贴。他们只是碰巧在那里。源示例 cpde 实际上将 5.2 显示为 64 位二进制文​​件。简短的回答,我很懒。
【解决方案4】:
do {
    printf("Please input the BPM: ");
} while (scanf("%f", &bpm) == 0 || bpm < 0);

这个循环会打印问题,直到用户输入一个有效的浮点数并且该数字至少为 0。

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 2018-01-14
    • 2017-07-16
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多