循环输出我的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)代码>但没有两次输出菜单。