因此,在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;
}
答案 0 :(得分:0)
可能是你scanf
的问题?
试试这个:
scanf(" %c", &choice);
你拥有它scanf
的方式可能会留下在下一次迭代中消耗的换行符。
答案 1 :(得分:0)
程序输出菜单两次的原因
(包括&#34;无效输入&#34;消息)
是因为通过返回键输入值
(没有多少选择)
代码在循环回到循环顶部之前没有清空stdin。
建议在循环结束前添加:
while( getchar() != '\n' );