循环输出我的C程序的菜单两次

时间:2015-05-30 20:34:50

标签: c loops for-loop menu do-while

因此,在Code Review上,我制作了一个计算器来执行正常操作,如添加等(Here was the question)。无论如何,我遵循了一些建议并更新了程序。然而,原始程序的菜单工作正常,它在用户运行程序时输出一次菜单,当他们完成计算后,程序将再次循环回到开始和菜单。像任何其他无限循环一样。但我决定再次从头开始制作程序,但这次程序在用户进行第一次计算后输出菜单两次。我尝试过for(;;)而不是do-while循环,但我遇到了同样的问题。我不知道出了什么问题,如果有人能为我解决这个问题会非常感激,所以我再也不会遇到这个问题了。

以下是代码:

#include <stdio.h>
#include <stdlib.h>

void getNumbers(float *, float *);
float addition(float, float);
float subtraction(float, float);
float multiplication(float, float);
float division(float, float);

int main(void)
{
    do
    {
        float num1, num2;
        char choice;

        puts("\nEnter number or letter from below\n\n"
             "\t1. Addition\n"
             "\t2. Subtraction\n"
             "\t3. Multiplication\n"
             "\t4. Division\n"
             "\tQ. Quit program");

        printf("\nEnter choice: ");
        scanf("%c", &choice);

        if(choice == 'q' || choice == 'Q')
        {
            puts("\nQuitting program...");
            exit(0);
        }
        else if(choice < '1' || choice > '4')
        {
            puts("\nInvalid input");
        }
        else
        {
            getNumbers(&num1, &num2);

            if(choice == '1')
            {
                printf("\n%.2f + %.2f = %.2f\n", num1, num2, addition(num1, num2));
            }
            else if(choice == '2')
            {
                printf("\n%.2f - %.2f = %.2f\n", num1, num2, subtraction(num1, num2));
            }
            else if(choice == '3')
            {
                printf("\n%.2f * %.2f = %.2f\n", num1, num2, multiplication(num1, num2));
            }
            else if(choice == '4')
            {
                if(num2 == 0)
                {
                    puts("\nDivision by zero");
                }
                else if(num2 != 0)
                {
                    printf("\n%.2f / %.2f = %.2f\n", num1, num2, division(num1, num2));
                }
            }
            else
            {
                puts("\nInvalid input");
            }
        }
    }while(1);
    return 0;
}

void getNumbers(float *num1_ptr, float *num2_ptr)
{
    printf("\nEnter first number: ");
    scanf("%f", num1_ptr);

    printf("\nEnter second number: ");
    scanf("%f", num2_ptr);
}
float addition(float num1, float num2)
{
    return num1 + num2;
}
float subtraction(float num1, float num2)
{
    return num1 - num2;
}
float multiplication(float num1, float num2)
{
    return num1 * num2;
}
float division(float num1, float num2)
{
    return num1 / num2;
}

2 个答案:

答案 0 :(得分:0)

可能是你scanf的问题? 试试这个:

scanf(" %c", &choice);

你拥有它scanf的方式可能会留下在下一次迭代中消耗的换行符。

答案 1 :(得分:0)

程序输出菜单两次的原因

(包括&#34;无效输入&#34;消息)

是因为通过返回键输入值

(没有多少选择)

代码在循环回到循环顶部之前没有清空stdin。

建议在循环结束前添加:

while( getchar() != '\n' );