Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环输出我的C程序的菜单两次_C_Loops_For Loop_Menu_Do While - Fatal编程技术网

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

循环输出我的C程序的菜单两次,c,loops,for-loop,menu,do-while,C,Loops,For Loop,Menu,Do While,所以在代码回顾中,我制作了一个计算器,可以进行加法等正常操作。无论如何,我遵循了一些建议并更新了程序。然而,原始程序的菜单工作正常,当用户运行程序时,它会输出一次菜单,当他们完成计算时,程序会循环回到开始并再次退出菜单。就像其他无限循环一样。但我决定从头开始重新编写程序,但这次在用户进行第一次计算后,程序会输出两次菜单。我尝试过为(;)执行,而不是执行while循环,但我遇到了同样的问题。我不知道出了什么问题,如果有人能帮我解决这个问题,我将不胜感激,这样我就不会再遇到这个问题了 代码如下: #

所以在代码回顾中,我制作了一个计算器,可以进行加法等正常操作。无论如何,我遵循了一些建议并更新了程序。然而,原始程序的菜单工作正常,当用户运行程序时,它会输出一次菜单,当他们完成计算时,程序会循环回到开始并再次退出菜单。就像其他无限循环一样。但我决定从头开始重新编写程序,但这次在用户进行第一次计算后,程序会输出两次菜单。我尝试过为(;)执行
,而不是执行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;
}
#包括
#包括
无效数字(浮动*,浮动*);
浮子添加(浮子,浮子);
浮点减法(浮点,浮点);
浮点乘法(浮点,浮点);
浮动分割(浮动,浮动);
内部主(空)
{
做
{
浮点数num1,num2;
字符选择;
放入(“\n输入下面的数字或字母\n\n”
“\t1.添加\n”
“\t2.减法\n”
“\t3.乘法\n”
“\t4.分区\n”
“\tQ.退出程序”);
printf(“\n输入选项:”);
scanf(“%c”,选择(&c));
if(choice='q'| | choice='q')
{
放入(“\n退出程序…”);
出口(0);
}
else if(选项<'1'|选项>'4')
{
puts(“\n无效输入”);
}
其他的
{
getNumbers(num1和num2);
如果(选项='1')
{
printf(“\n%.2f+%.2f=%.2f\n”,num1,num2,加法(num1,num2));
}
else if(选项='2')
{
printf(“\n%.2f-%.2f=%.2f\n”,num1,num2,减法(num1,num2));
}
else if(选项='3')
{
printf(“\n%.2f*%.2f=%.2f\n”,num1,num2,乘法(num1,num2));
}
else if(选项='4')
{
如果(num2==0)
{
将(“\nDivision除以零”);
}
否则如果(num2!=0)
{
printf(“\n%.2f/%.2f=%.2f\n”,num1,num2,除法(num1,num2));
}
}
其他的
{
puts(“\n无效输入”);
}
}
}而(1),;
返回0;
}
void getNumbers(浮点*num1\u ptr,浮点*num2\u ptr)
{
printf(“\n输入第一个数字:”);
scanf(“%f”,num1_ptr);
printf(“\n输入第二个数字:”);
scanf(“%f”,num2_ptr);
}
浮子添加(浮子num1、浮子num2)
{
返回num1+num2;
}
浮点减法(浮点num1,浮点num2)
{
返回num1-num2;
}
浮点乘法(浮点num1,浮点num2)
{
返回num1*num2;
}
浮动分割(浮动num1、浮动num2)
{
返回num1/num2;
}

可能是您的
scanf
有问题吗? 试试这个:

scanf(" %c", &choice);

您使用它的方式可以保留换行符,该换行符将在下一次迭代中使用。

程序两次输出菜单的原因

(包括“无效输入”消息)

是因为这些值是通过返回键输入的

(没有太多选择)

代码在循环回循环顶部之前不会清空stdin

建议在循环结束前添加:

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

您可能希望尝试在代码周围添加
printf
s以查看它在做什么更改为
scanf(“%c”和&choice)跳过新行。很奇怪,它是怎么做到的。在另一个程序中,我执行了
scanf(“%c”&choice)但没有两次输出菜单。