当前位置:文档之家› C语言简单计算器,实现四则运算,可带括号

C语言简单计算器,实现四则运算,可带括号

/*
1、只能进行整数运算,
2、可以有括号的嵌套,如(a+b*(c+d)-e)-f,
但对(a+((b+c)+d*e)-f)形如的算式无法计算
*/
#include
#include
#include
#include
using namespace std;
struct Element
{
double data;
char sign;
char bracket_left;
char bracket_right;
Element *next;
};
int check(char *s)
{
int count_bracket=0;
int i=0;
while(i{
if(s[i]=='(') count_bracket++;
else if(s[i]==')') count_bracket--;
if(count_bracket<0)
return 0;
if(!(s[i]>='0'&&s[i]<='9'||s[i]==')'||s[i]=='('||s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'))
return 0;
i++;
}
if(count_bracket) return 0;
return 1;
}
void create_expression(char *s,Element *head)
{
Element *p=head;
p->next=(Element *)malloc(sizeof(Element));
p=p->next,p->next=NULL;
p->bracket_left=p->bracket_right='\0';
p->sign='\0',p->data=0;
int x=0;
while(x{
if(s[x]>='0'&&s[x]<='9')
{
while(s[x]>='0'&&s[x]<='9'&&s[x]!='\0')
p->data*=10,p->data+=s[x++]-'0';
x--;
}
else if(s[x]=='+'||s[x]=='-'||s[x]=='*'||s[x]=='/')
{
p->next=(Element *)malloc(sizeof(Element));
if(!p->next)
{
cout<<"ERROR"<exit(0);
}
p=p->next,p->next=NULL;
p->bracket_left=p->bracket_right='\0';
p->sign=s[x],p->data=0;
}
else if(s[x]==')')
{
p->bracket_right=')';
p->bracket_left='\0';
}
else if(s[x]=='(')
{
p->bracket_left='(';
p->bracket_right='\0';
}
x++;
}
p=head->next;
while(p->next) p=p->next;
p->next=(Element *)malloc(sizeof(Element));
p=p->next;
p->data=0,p->sign='+',p->next=NULL;
p->bracket_left=p->bracket_right='\0';
}
/*double chang_int(char *s)
{
double sum=0;
int x=0,mark=0;
while(x{
if(s[x]=='.')
{
mark=1;
break;
}
sum*=10,sum+=s[x]-'0';
x++;
}
if(mark)
{
double m=0;
for(int i=strlen(s)-1;i>x;i--)
m+=s[i]-'0',m/=10;
sum+=m;
}
return sum;
}*/
double calculate(Element *start,Element *end)
{
Element *p=start;
while(p!=end)
{
if(p->next->sign=='*')
{
p->data*=p->next->data;
p->next=p->next->next;
p=start;continue;
}
else if(p->next->sign=='/')
{
p->data/=p->next->data*1.0;
p->next=p->next->next;
p=start;continue;
}
p=p->next;
}
double sum=start->data;
start=start->next;
while(start!=end)
{
if(start->sign=='+') sum+=start->data;

else sum-=start->data;
start=start->next;
}
return sum;
}
void cancel_bracket(Element *head)
{
Element *start=head->next;
Element *p=head;
while(start)
{
int flag=0;
if(start->bracket_left)
{
Element *end=start;
int count_bracket=1;
while(end)
{
if(end->bracket_right)
{
count_bracket--;
if(!count_bracket)
{
start->data=calculate(start,end->next);
start->bracket_left=start->bracket_right='\0';
start->next=end->next;
}
}
else if(end->bracket_left)
{
flag=1;
count_bracket=1;
start=end;
}
end=end->next;
}
}
if(flag) start=p;
start=start->next;
}
}
int main()
{
char s[100];
while(1)
{
do
{
system("cls");
puts("\n请输入正确的表达式");
cin.getline(s,100);
}while(!check(s));
Element *head=(Element *)malloc(sizeof(Element));
head->next=NULL;
create_expression(s,head);
Element *p=head->next;
cancel_bracket(head);
while(p->next)
{
if(p->sign) cout<sign;
if(p->bracket_left) cout<bracket_left;
cout<data;
if(p->bracket_right) cout<bracket_right;
p=p->next;
}
cout<<'='<next,p)<puts("\n按任意键继续计算\n");
system("pause");
}
}
/* 1+2-(8+9)+(3+4)-6 */
/* 1+2-(8+9)+(3+(3+3)+4)-6 = -7 */
/* 1+2-(8*9)+(3*4)-6 */
/* 1-(3-(3+3)+4)-6 = -6 */

相关主题
文本预览
相关文档 最新文档