按回车键或任何字母后,我的计算器都会死机.为什么


#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void run_calc();
void scandata(char *op, double * operand);
void do_next_op(char op, double operand, double *akku);
int main()
{
run_calc();
return 0;
}
void run_calc(){
double akku = 0, operand = 0;
char op, answer;
printf("Press enter to use the calculator");
printf("n");
scanf("%c", &answer);
while(answer='q'||answer!='Q');
{
if(answer=='q'||answer=='Q')
{
printf("The last result was %1.2fn", akku);
exit(0);
}
else if (answer=='h'||answer=='H')
{
printf("%st%sn", "+" , "add");
printf("%st%sn", "-" , "subtract");
printf("%st%sn", "*" , "multiply");
printf("%st%sn", "/" , "divide");
printf("%st%sn", "^" , "power");
printf("%st%sn", "q" , "quit");
}
else
{
printf("Enter an operator (+,-,/,#,^,*) and optional operand.Enter 'h' for help. Enter 'q' to exit the program.");
scandata(&op, &operand);
do_next_op(op, operand, &akku);
printf("Result so far is: %1.2lf n", akku);
printf("n");
}
}
}

void scandata(char *op, double *operand) {
scanf("%c", op);
scanf ("%lf", operand);
}
void do_next_op(char op, double operand, double *akku)
{
switch(op)
{
case '+': *akku += operand; break;
case '-': *akku -= operand; break;
case '*': *akku *= operand; break;
case '/': *akku /= operand; break;
case '#': *akku = sqrt(*akku); break;
case '^': *akku = pow(*akku,operand); break;
case '%': *akku *=  -1; break;
case '!': *akku =  1 / *akku; break;
case '@': *akku = log(*akku); break;
case 'q': printf(" The final value of akku is %1.2lf n", *akku);  exit(0);
}
}

运行程序后,按回车键或任意字母。它只是卡住了。有人能帮帮我吗?这个程序是我试着做的一个计算器。这是给我下周的家庭作业用的。我还是这个程序的新手。我需要帮助和很多改进。有人能指出我做错了什么吗?

我认为run_Calc有问题,但我不知道出了什么问题

while(answer='q'||answer!='Q');
{

这是一个无限循环。首先,第一行末尾的分号将左大括号(a(while语句解除关联,这意味着,如果条件为true,它将永远不起任何作用。

条件true,因为answer='q'会将answer变量设置为'q',然后将其用作表达式。由于'q'是非零的,所以它被认为是真的。

但是,即使您通过将=更改为!=来更正此问题(假设您只想继续,直到用户输入退出(,也应该使用&&而不是||。没有字符可以同时是qQ,因此使用||也会导致条件始终为真。

我怀疑你应该拥有的东西会更多地遵循(比较而不是赋值,去掉分号,并修复连词(:

while(answer != 'q' && answer != 'Q')
{

很可能还有其他问题,但这是导致您明显的";"卡住";行为


(a(a";裸的";支撑段可用于创建一个新的、孤立的范围,例如:

{
int xyzzy = 42;
// Can use xyzzy here.
}
// But not here.

这就是分号在您发布的代码中的作用。

相关内容

  • 没有找到相关文章

最新更新