四则运算的题目一般含有两个或两个以上运算符号及括号,可以计算出为一个数的结果。
要求是判断输入的表达式是否正确,分母不能为零,括号的正确性,操作是否正确等。
#include "stdafx.h"
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<fstream>
using namespace std;
class calculator
{
public:
calculator(char str1[100]);
~calculator();
int check(char *c);
void move(char *f, double *s,int p);
double convnum(char *c);
double good(char *c);
int print();
char str[100];
};
calculator::calculator(char str1[100])
{
strcpy(str,str1);
}
calculator::~calculator()
{
}
int calculator::check(char *c)
{
int k=0;
int i=0;
int len=strlen(c);
while(*c!=' ')
{
if((*c>='0' && *c<='9') || *c=='+' ||
*c=='-' || *c=='*' || *c=='/' ||
*c=='.' || *c=='(' || *c==')' )
{
}
else
{
cout<<"输入的表达式错误,请重新输入!"<<endl;
return 0;
}
for(i=0;i<len;i++)
{
if(*c=='/'&&*(c+1)=='0')
{
cout<<"分母不能为零!"<<endl;
return 0;
}
}
if(*c=='(')
k++;
else if(*c==')')
k--;
c++;
}
if(k!=0)
{
cout<<"括号输入错误!"<<endl;
return 0;
}
return 1;
}
void calculator::move(char *f, double *s,int p)
{
int i=0,len=strlen(f);
for(i=p; i<len; i++)
{
f[i]=f[i+1];
s[i]=s[i+1];
}
s[i]=s[i+1];
f[len-1]=' ';
}
double calculator::convnum(char *c)
{
double num=0.0;
double a=1.0;
int i=0,p=0,len=0;
char temp[100];
int tempi=0;
int start=0;
int f=1;
len=strlen(c);
if(c[0]=='-')
{
start=1;
f=-1;
}
for(i=start; i<len; i++)
{
if(c[i]=='.')
{
p=i;
break;
}
temp[tempi++]=c[i];
}
temp[tempi]=' ';
if(p!=0)
{
for(i=p+1;i<len;i++)
{
if(c[i]=='.')
{
cout<<"小数点输入错误!"<<endl;
exit(0);
}
a=a*0.1;
num+=(a*(c[i]-48));
}
}
a=1.0;
len=strlen(temp);
for(i=len-1;i>=0; i--)
{
num=num+(a*(temp[i]-48));
a*=10;
}
num=num*f;
return num;
}
double calculator::good(char *c)
{
char g[100],number[30];
char f[80];
int fi=0;
double s[80];
int si=0;
int k=0;
int num=0,i=0;
int cc=0;
int jj=0;
while(*c!=' ')
{
num=0;
k=0;
switch(*c)
{
case '*':
case '/':
case '+':
case '-':
f[fi++]=*c;
if(*c=='*'||*c=='/')
cc++;
else
jj++;
if(*(c-1)!=')')
{
number[i]=' ';
i=0;
s[si++]=convnum(number);
}
break;
case '(':
k++;
while(k>0)
{
c++;
g[num]=*c;
num++;
if(*c==')')
{
k--;
}
else if(*c=='(')
{
k++;
}
}
g[num-1]=' ';
num=0;
s[si++]=good(g);
break;
default:
number[i++]=*c;
if(*(c+1)==' ')
{
number[i]=' ';
s[si++]=convnum(number);
}
break;
}
c++;
}
f[fi]=' ';
i=0;
while(cc>0)
{
switch(f[i])
{
case '*': cc--;
s[i+1]=s[i]*s[i+1];
move(f,s,i);
break;
case '/': cc--;
s[i+1]=s[i]/(float)s[i+1];
move(f,s,i);
break;
default:
i++;
break;
}
}
i=0;
while(jj>0)
{
switch(f[i])
{
case '+': s[i+1]=s[i]+s[i+1];
jj--;
move(f,s,i);
break;
case '-': s[i+1]=s[i]-s[i+1];
jj--;
move(f,s,i);
break;
default:
cout<<"操作错误!"<<endl;
break;
}
}
return s[0];
}
int calculator::print()
{
double sum=0;
sum=good(str);
ofstream fout("text");
if(!fout)
{
cout<<"打不开该文件!"<<endl;
return 1;
}
fout<<"输入的表达式:"<<str<<endl;
fout<<"sum="<<sum<<endl;
fout.close();
cout<<sum;
cout<<endl;
return 0;
}
void main()
{
char str1[100];
int p=1;
while(1)
{
cout<<"请输入表达式,退出请输入end!"<<endl;
cin>>str1;
p=strcmp(str1,"end");
if(p==0)
break;
calculator A(str1);
p=A.check(str1);
if(p==0)
continue;
A.print();
}
cout<<"系统已退出"<<endl;
}