- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试重新排列我的计算器数组以逃避 BODMAS 条件。基本上,我读取一个字符串,将数字和运算符添加到不同的数组中,然后尝试重新排列每个数组以使操作具有优先级(在数组中从右到左)。我对“priorizar”功能进行了此更改。我猜重新排列不起作用。我的代码有问题吗?提前致谢
#include <stdio.h>
#define MAX 100
struct stacknum{
float nums[MAX];
int topnum;
}sn; //'stack' de numeros - nao prioritaria
struct stackops{
char ops[MAX];
int topop;
}so; // 'stack' de operadores - nao prioritaria
struct stacknum1{
float nums1[MAX];
int topnum1;
}sn1; // 'stack' de numeros - prioritaria
struct stackops1{
char ops1[MAX];
int topop1;
}so1; // 'stack' de operadores - prioritaria
float calculo(float vlr, float vlr2, char op) // funçao de operaçoes
{
if ('+' == op)
return vlr + vlr2;
if ( '-' == op)
return vlr2 - vlr;
if ( '*' == op)
return vlr * vlr2;
if ('/' == op)
return vlr2 / vlr;
else
return 0;
}
void priorizar()
{
int i, k = 0;
char aux;
float aux1, aux2;
for (i = 0; i < MAX; i++)
{
if (so.ops[i] == '*' || so.ops[i] == '/')
{
aux = so.ops[so.topop - k];
so.ops[so.topop - k] = so.ops[i];
so.ops[i] = aux;
aux1 = sn.nums[sn.topnum - (k + 1)];
aux2 = sn.nums[sn.topnum - k];
sn.nums[sn.topnum - (k + 1)] = sn.nums[i];
sn.nums[sn.topnum - k] = sn.nums[i + 1];
sn.nums[i] = aux2;
sn.nums[i + 1] = aux1;
k++;
}
}
}
float emptystack(int k) // faz operaçoes a partir da stack , esvazia-a fazendo todas as operaçoes dentro dela
{ // buffer size excedido quando 20+20*30 ????
float v1, v2;
char op;
if (k == 0)
{
while (so.topop != 0) // esvaziar stack
{
v1 = sn.nums[--(sn.topnum)];
v2 = sn.nums[--(sn.topnum)];
op = so.ops[--(so.topop)];
sn.nums[sn.topnum++] = calculo(v1, v2, op);
}
return sn.nums[sn.topnum - 1];
}
else
{
while(so1.topop1!=0) // esvaziar stack prioritaria
{
v1 = sn1.nums1[--(sn1.topnum1)];
v2 = sn1.nums1[--(sn1.topnum1)];
op = so1.ops1[--(so1.topop1)];
sn1.nums1[sn1.topnum1++] = calculo(v1, v2, op);
}
return 0;
}
}
int IsDigit(char str[], int i) // se é digito ou nao lel kek
{
if(str[i] >= '0' && str[i] <= '9')
return 1;
else return 0;
}
float analisa(char str[]) // analise de string, BODMAS + parenteses
{
int i;
float valor;
char op;
for (i = 0; str[i] != '\0'; i++)
{
if (IsDigit(str, i)) // Ñ PARENTESES
{
sscanf(str + i, "%f", &valor); // le e passa para float
sn.nums[sn.topnum++] = valor; // empilha numero
while (str[i + 1] == '.' || (str[i + 1] >= '0' && str[i + 1] <= '9'))
i++;
} else if (str[i] == '+' || str[i] == '-' || str[i]=='*' || str[i] == '/') // empilha se for operaçao nao prioritaria
so.ops[so.topop++] = str[i];
}
priorizar();
return emptystack(0); // esvazia stack nao prioritaria e retorna o resultado final
}
int main()
{
char str[100] = "3*3+2";
float resultado;
//printf("Expressao: ");
//scanf("%s",str);
resultado = analisa(str);
printf("%g\n",resultado);
return 0;
}
最佳答案
低级问题是 priorizar()
函数无法正确管理堆栈 - 它在错误的位置查找内容:
aux = so.ops[so.topop - k];
当k = 0
时,这是垃圾内存,它应该是:
aux = so.ops[so.topop - k - 1];
这是堆栈顶部的项目。而且它没有正确地解释这样一个事实:与 so
堆栈相比,sn
堆栈的增长速度有所不同,有时快两倍,有时则相同。因此,您不能使用固定偏移量来索引两者:
sn.nums[i] = aux2;
sn.nums[i + 1] = aux1;
有时这会是:
sn.nums[2 * i] = aux2;
sn.nums[2 * i + 1] = aux1;
而在其他情况下,只有一个数字可以操作,因为等式的另一半是一个表达式。
高级问题是逻辑错误。如果我们可视化堆栈:
so: * +
sn: 3 3 2
那么priorizar()
首先要做的是:
so: + *
sn: 3 2 3
这给了我们 9 ((2 * 3) + 3),而不是所需的 11。但是由于对运算符堆栈的搜索一直持续下去,它再次遇到 '*' 并再次错误地转换它:
so: * +
sn: 3 garbage 3
给我们带来了 (3 + 垃圾) * 3)。即使您修正了错误并防止 i
和 so.topop - k
交叉,您仍然会得到错误的答案。
您可以根据需要重新排列 priorizar()
中的代码,但我不相信您可以从这里到达那里。
关于c - 重新排列计算器 BODMAS 的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39925508/
我目前正在尝试使用 ParaView Calculator-Filter 将给定的笛卡尔坐标 (x,y,z) 转换为球坐标 (r, theta, phi),其中 theta 是极角,phi 是方位角。
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有这个问题,我想显示如果0/0,输出是:“不能将0除以自身”。如何调整我的代码以便可以显示该输出?如果是这样,我应该使用什么代码才能实现我的目标? 下面是我的代码: #include using
我正在尝试创建一个也支持负数的计算器,并最终创建一个 lisp 风格的树。 我像这样定义词法分析器规则: INT :'-'? [0-9]+ ; LBRACKET : '('; RBRACKET :
我正在开发一个基本的 JavaScript 计算器,我也希望能够开始计算负数。现在,如果我在输入数字之前单击“-”,“-”将不会显示,因此我只能从正数开始。有人可以告诉我如何将其包含在我的代码中吗?
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这是我第一次尝试 Java。该项目是一个计算器,它需要一个数字、一个运算符(operator)信号(+、-、*、/)和另一个数字来创建方程并给出其最终值,然后询问用户是否要重新启动程序另一个方程或不是
所以我写了这个脚本;它有点像我找到并拼凑起来的计算器的大杂烩。 KeyListener 来自 Java - oracle - .com 网站。顺便说一句,我对此非常陌生,不知道我在做什么。 我正在尝试
我正在尝试创建一个也支持负数的计算器,并最终创建一个 lisp 风格的树。 我像这样定义词法分析器规则: INT :'-'? [0-9]+ ; LBRACKET : '('; RBRACKET :
我正在开发一个基本的 JavaScript 计算器,我也希望能够开始计算负数。现在,如果我在输入数字之前单击“-”,“-”将不会显示,因此我只能从正数开始。有人可以告诉我如何将其包含在我的代码中吗?
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我开始在java中创建一个计算器,我试图循环遍历字符串输入,如果输入中有任何整数,则将它们添加到ArrayList calcOperands中。在 parseInput() 方法中,我使用 charA
我正忙着制作计算器,但不知怎的,整数没有被使用,我不知道为什么。我尝试修复它,但我不知道该怎么做。我使用带有事件的按钮来计算答案,也许有问题。这是我的代码:顺便说一句,我使用 Eclipse
我的主类中有这段代码。我的问题是,GPA 是用总分除以类(class)来计算的。它没有给我完整的号码。 EX,如果总数为 14,类(class)为 4,则为 3.5,我的代码只给我 3.0。有谁知道为
我需要创建一个可以加、减、乘、除、绝对值和舍入的计算器。这是我到目前为止所拥有的 import java.util.Scanner; public class Calculator { pub
我是一名 Java Noob,正在研究 GUI 计算器,但我刚刚来到这里..我已经有了按钮,我需要绑定(bind)这些数字并存储在运算符 ( + - */) 之间的某个位置以显示在我的 JTextAr
这是我的作业。但是,我无法让结果发挥作用。我希望它打印出来为: > 2*7*6 2 * 7 ---- 14 * 6 ---- 84 等等。我希望无论我输入多少个数字,代码都能正常工作
这个问题已经有答案了: What does a "Cannot find symbol" or "Cannot resolve symbol" error mean? (18 个回答) 已关闭 6 年
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
我一直在开发计算器作为自己的学习项目。它工作正常,只是我无法弄清楚如何阻止人们添加应用程序破坏输入,例如 1++-*/4。我尝试了各种方法,例如将当前显示拆分为一个数组,并将其与具有所有运算符的另一个
我是一名优秀的程序员,十分优秀!