gpt4 book ai didi

c - 在c中制作一个计算器,如何计算超过2个数字

转载 作者:太空宇宙 更新时间:2023-11-04 07:50:49 24 4
gpt4 key购买 nike

我必须用 c 语言制作一个计算器,程序在其中读取第一行的数学运算并在下一行打印结果。如果数学运算中的字符不是数字,则还必须写入错误消息。现在我的程序只在一行中读取一个数学运算(例如 2+5)。有什么想法可以在一行中读取更多操作吗? (例如 2+5+7+8)我的代码如下:

#include <stdio.h>

int main(void) {
int ch;
int input1 = 0, input2 = 0, flag = 0, flag1 = 0;
char oper;
int i = 1;
while ((ch = getchar()) != EOF){
int result = 0;
if (ch != '\n'){ /* If user didnt change line */
if (ch >= '0' && ch <= '9'){ /* Checks if ch is a number */
if(flag == 0) /* flag is used to change to the second number */
input1 = input1*10 + ch - '0'; /* Converts ASCII to decimal */
else
input2 = input2*10 + ch - '0'; /* Converts ASCII to decimal*/
}
if (ch == '+' || ch == '-' || ch == '*'){ /* Operator has been detected */
oper = ch;
flag = 1;
}
if (ch >= 'A'){
flag1 = 1; /* flag1 is used to determine if a non-number character was written */
}
}
else{
switch(oper){
case '+': /* if operator is "+" add the numbers */
result = input1 + input2;
break;
case '-': /* if operator is "-" subtract the numbers */
result = input1 - input2;
break;
case '*': /* if operator is "*" multiply the numbers */
result = input1 * input2;
break;
}
if (flag1 == 0){
printf("Result %d: %d\n", i, result);
i++;
input1 = 0;
input2 = 0;
flag = 0;
}
else if (flag1 == 1){
printf("Result %d: Error!\n", i);
i++;
input1 = 0;
input2 = 0;
flag = 0;
flag1 = 0;
}
}
}
return 0;
}

最佳答案

您可以使用前缀表示法以方便计算。
您有很多关于中缀-前缀表示法的在线资料和代码。
基本思想是你的输入(例如:(1+2)*(3*4)),代表中缀符号,可以转换为前缀符号(*+12*34)。使用堆栈数据结构 计算给定的前缀结构。

EVALUATE_PREFIX(字符串):

假设您有:*+12*34,就像我们之前的例子一样。

  1. 在表达式的末尾放置一个指针,使其指向我们示例中的数字 4,然后读取该字符。
  2. 如果指针处的字符是一个操作数,则将其压入堆栈。
  3. 如果指针处的字符是运算符,则从堆栈中弹出两个元素。根据操作符对这些元素进行操作,并将结果推回 Stack。
  4. 将指针减 1 并转到第 2 步,只要表达式中还有要扫描的字符。
  5. 当没有剩余字符时结果存储在堆栈的顶部,因此只需返回它即可。

我建议您看一下前缀、中缀和后缀表达式。理解它不会花很长时间,它应该为您的问题提供一个很好的解决方案。希望能帮助到你。 :)

关于c - 在c中制作一个计算器,如何计算超过2个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54006966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com