C语言计算器程序错误

C语言写的一个简易计算器,编译没有错,把数组设成1+2*3/3-1结果是对的,但改成10+2*3/3-1就错了,自己怎么也找不出来,求帮助,原代码如下。
#include<stdio.h>
#include<math.h>
void jisuan(double b[],char c[]);
void main()
{
double x,n,l,z;
double b[30];
char c[30];
int i=0,j,k,m=0,w=0,y,p;
char a[30]="10+2*3/3-1";
while(a[i]!='\0')
{
if(a[i]>='0'&&a[i]<='9')
{
z=0;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{
j++;
}
j--;
for(k=i;k<=j;k++)
{
z=z*10+a[k]-'0';
}
j=j+1;
x=z;

if(a[j]=='.')
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{
j++;
}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);
l=l+1;
x=x+n*(a[k]-'0');
}
i=j+1;
}
else
{
i++;
}
b[m]=x;
m++;
}
else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')
{
c[w]=a[i];
w++;
i++;
}
}
b[m]='\0',c[w]='\0';
jisuan(b,c);
}
void jisuan(double b[],char c[])
{
int i,k;
for(k=0;c[k]!='\0';k++)
{
if (c[k] == '*')
{
b[k+1]=b[k+1]*b[k];
b[k] = 0;
c[k] = '+';
}

else if (c[k] == '/')
{
b[k+1]=b[k]/b[k+1];
b[k] = 0;
c[k] = '+';
}
}
for (i=0;c[i]!='\0';i++)
{
if(c[i]=='+')
{
b[i+1]+=b[i];
}
else
{
b[i+1]=b[i]-b[i+1];
}
}
printf("%f\n",b[i]);
}

第一次计算完毕z=10之后,没有更新i的位置,循环第二次又计算了z=0。所以你b数组最后存储的是 10,0,2,3,3,1,于是计算成了 10+0*2/3-3等于7.

在计算完z的数值后,要更新i的位置,在j=j+1与x=z之间添加 i = k -1这一句,如下。
简单测了一下,应该好了。
……
while(a[j]>='0'&&a[j]<='9')
{
j++;
}
j--;
for(k=i;k<=j;k++)
{
z=z*10+a[k]-'0';
}
j=j+1;
i=k - 1; //添加这一句!!!!!!!!!!!!
x=z;
……
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-07-23
我猜是优先级问题吧,你第一次的1看不出来

谁知道我这C语言的计算器的程序哪里错误了?
scanf("%lf%c%lf",n1,o,n2);\/\/这句错了。scanf("%lf%c%lf",&n1,&o,&n2);\/\/给地址赋值,前面加&

用C语言编写一个加减乘除计算器,不知道哪儿出错了。请各位帮帮忙!谢谢...
首先,scanf("%f%c%f",&a&t&b)这句有错,缺逗号。应改为scanf("%f%c%f",&a,&t,&b);其次, if(get(=))这句有错。字符输入有两种方式 1 char s;scanf("%c", &w);2 char s;s = getchar();字符型数组的输入方式有 char s[ ];gets(s);而用get来输入单个字符是不合法的...

C语言计算器程序错误
第一次计算完毕z=10之后,没有更新i的位置,循环第二次又计算了z=0。所以你b数组最后存储的是 10,0,2,3,3,1,于是计算成了 10+0*2\/3-3等于7.在计算完z的数值后,要更新i的位置,在j=j+1与x=z之间添加 i = k -1这一句,如下。简单测了一下,应该好了。……while(a[j]>='...

C语言计算器代码无法编译出现“ Cannot open include file: 'stdafx.h...
1,你把这个stdafx.h 头文件写错了,仔细检查一下这个是否写错了。2,可能是你的编译器中没有这个头文件,你可以从别人的编译器中拷贝一个 到你的编译器中。

C语言代码编写可以进行四则运算的计算器。下面的代码无法运行。求高手指...
你数组开了100,算的时候算到 了100,其实 你开了100 但是最大只能到 99,所以结果越界了,导致RE ,但是 你的结果是错的, 写的很乱,关键是感觉你乱写的啊。。建议你 不要用指针,用指针如果没用好很容易 出现 RE的情况,还有,你输出一句话之后最好加个换行吧,看着也比较舒服。。

C语言代码简单计算器,为什么运行结果多了0.000001(\/\/̀Д\/́\/)是...
由于小数的十进制与二进制转换的时候会有一个奇怪的现象:许多看起来非常简单的十进制小数转换为二进制的时候,可能位数超过计算机的精度、甚至是一个循环小数,计算机不得不进行截尾,二进制计算完毕再换算为十进制的时候我们就发现了误差。你的程序没有错误,这个问题无法避免。

c语言写计算器出现错误
字符,要用单引号,,,字符串才是是双引号 if(c == '+')s = i + y;else if(c == '-')s = i - y;else if(c == '*')s = i * y;else if(c == '\/')s = i \/ y;

c语言编写的加减乘除计算器,搞不懂哪里错了。
main(){ double a,b;char c;printf("Please input the first number:");getchar(); \/\/这个函数的目的是去掉回车符,下同 scanf("%lf",&a);printf("Please input + - * \/:");getchar();scanf("%c",&c);printf("Please input the second number:");getchar();scanf("%lf",&b...

C语言计算器程序错误
你好 你把后三个函数的返回值不要用double型的result接收了 重新定义一个int型的iResult接收 试试吧 你写得好工整,很方便读代码

这是个c语言分数计算器程序,请问各位大神,为什么输入数据运行之后不显示...
gys(y,x%y) : x; \/\/求最大公约数}int gbs(int x,int y) { \/\/求最小公倍数return x \/ gys(x,y) * y;}void yuefen(int fz,int fm) { \/\/两数约分int s = gys(fz,fm);fz \/= s;fm \/= s;printf("the result is %d\/%d\\n",fz,fm);}void add(int a,int b,int c,...

相似回答