帮我写一个c语言计算器

要求可以计算小数,支持括号例如:2*(1+3)+2*2.212.4之前有个网友给我写了一个计算小数会出错,把int改了也不行,不知道怎么改。。。#include<stdi... 要求可以计算小数,支持括号
例如:2*(1+3)+2*2.2
12.4
之前有个网友给我写了一个计算小数会出错,把int改了也不行,不知道怎么改。。。
#include <stdio.h>
#include<string.h>
int s1[100];
char s2[100];
int t1,t2;
void c()
{
int x1,x2,x;
char p;
p=s2[t2--];
x2=s1[t1--];
x1=s1[t1--];
switch(p)
{
case '+':x=x1+x2;break;
case '-':x=x1-x2;break;
case 'x':x=x1*x2;break;
case '/':x=x1/x2;
}
t1++;
s1[t1]=x;
}
int cal(char *p)
{
int m,i=0;
t1=t2=0;
while (*p!='\0')
switch(*p)
{
case '+':
case '-':
while (t2&&(s2[t2]!='('))
c();
s2[++t2]=*p;
p++;
break;
case 'x':
case '/':
if (t2&&((s2[t2]=='x')||(s2[t2]=='/')))
c();
s2[++t2]=*p;
p++;
break;
case '(':
s2[++t2]=*p;
p++;
break;
case ')':
while (s2[t2]!='(')
c();
t2--;
p++;
break;
default:
m=0;
do
{
m=10*m+*p-'0';
p++;
} while((*p>='0')&&(*p<='9'));
t1++;
s1[t1]=m;
};
while (t2)
c();
return s1[t1];
}
int main()
{
int len,i;
char str[100]={0};
gets(str);
len=strlen(str);
for(i=0;i<len;i++)
{

if(str[i]=='[' )
str[i]='(';
if(str[i]=='{' )
str[i]='(';
if(str[i]==']' )
str[i]=')';
if(str[i]=='}' )
str[i]=')';
}
printf("%d\n",cal(str));
return 0;
}
尽量和这个差不多把。。
最好加注释
展开
 我来答
porker2008
2012-06-01 · TA获得超过1.4万个赞
知道大有可为答主
回答量:7066
采纳率:62%
帮助的人:1.1亿
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int errorflag;

typedef struct
{
double array[100];
int top;
}stack;

int isNumeric(char s) // 判断是不是数字
{
if(s>='0'&&s<='9' || s=='.')
return 1;
return 0;
}

int empty(stack* s) // 判断stack是不是为空
{
return s->top == 0;
}

void init(stack *s) // 初始化 stack
{
s->top = 0;
}

void push(stack* s, double a) // 入stack
{
s->array[s->top++] = a;
}

double pop(stack* s) // 出stack
{
if(!empty(s))
return s->array[--s->top];
}

double eval(char* s, char* e) // 解析算式
{
stack t;
double temp,temp2;
char *p, *q, *r;
int flag;
char op = '+';
init(&t);
push(&t,0);
while(s<e && *s==' ') s++; // 清空前导 0
while(s<e && *(e-1)==' ') e--; // 清空后导 0
if(s==e) return 0; // 空串 返回 0
p = s;
q = e;
for(;!errorflag&&p<q;p++) // 历遍整个串
{
if(*p == ' ') continue; // 无视空格
else if(*p=='+' || *p == '-' || *p == '*' || *p == '/')
{
op = *p; // 更换操作符
continue;
}
else
{
if(*p == '(') // 遇到左括号
{
r = p+1;
flag = 1;
while(flag)
{
p++;
if(p>=e)
{
printf("\nError: ( and ) not matched.\n");
errorflag = 1;
q = s;
while(q<e)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q < p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
if(*p=='(')
flag++;
if(*p==')') // 找到匹配的右括号
flag--;
}
temp = eval(r,p); // 括号内调用eval函数得到值
}
else if( *p == ')' )
{
printf("\nError: ( and ) not matched.\n");
errorflag = 1;
q = s;
while(q<e)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q < p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
else if(isNumeric(*p)) // 如果是简单数字
{
sscanf(p,"%lf",&temp); // 利用sscanf扫入数字
while(isNumeric(*p)) p++; // 指针偏移
p--;
}
else
{
printf("\nError: character not recognized.\n");
errorflag = 1;
q = s;
while(q<e)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q < p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
if(op=='+') // 根据操作符入stack
push(&t,temp);
else if(op=='-')
push(&t,-temp);
else if(op=='*')
{
temp2 = pop(&t);
temp2 *= temp;
push(&t,temp2);
}
else if(op=='/')
{
if(temp == 0)
{
printf("\nError: divided by zero.\n");
errorflag = 1;
q = s;
while(q<e)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q < p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
temp2 = pop(&t);
temp2 /= temp;
push(&t,temp2);
}
}
}
if(errorflag)
{
return -1;
}
temp = 0;
while(!empty(&t)) // 统计stack内所有数之和
{
temp2 = pop(&t);
temp += temp2;
}
return temp; // 返回总和
}

int main()
{
char s[1000];
int len;
double result;
while(gets(s))
{
errorflag = 0;
len = strlen(s);
result = eval(s,s+len);
if(!errorflag)
printf("%lf\n",result);
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式