Thứ Năm, 23 tháng 4, 2015

tính giá trị biểu thức toán học bất kỳ, giống máy tính casio

lập trình c/c++ tính giá trị của 1 biểu thức bất kỳ, giông máy tính casio

#include<iostream>
#include<time.h>
using namespace std;
long tinh(char *s)
{
char a[100],dau[100],b[100],e[100];
int i,d=0;
for(i=0;i<strlen(s);i++) if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/' || s[i]=='(' || s[i]==')') dau[d++]=s[i];
if(d==0) return atol(s);
for(i=0;i<d;i++) 
{
if(dau[i]!='*' && dau[i]!='/') 
{
int m,j;
char c;
for(m=0;m<strlen(s);m++)
{
if(s[m]=='+' || s[m]=='-' || s[m]=='('){c=s[m]; break;}
a[m]=s[m];
}
a[m]='\0';
if(c=='+' || c=='-')
{
int dd=0;
for(j=m+1;j<strlen(s);j++) b[dd++]=s[j];
b[dd]='\0';
if(c=='+') return tinh(a)+tinh(b);
else
{//doi dau chuoi b
j=0;
while(j<strlen(b))
{
while(b[j]!='(' && j<strlen(b))
{
if(b[j]=='+') b[j]='-';
else if(b[j]=='-') b[j]='+';
j++;
}
j++;dd=1;
while(j<strlen(b))
{
if(b[j]=='(') dd++;
if(b[j]==')') dd--;
if(dd==0) break;
j++;
}
j++;
}
return tinh(a)-tinh(b);
}
}
else if(c=='(')
{
char c1,c2,c3,a1[100],a2[100],a3[100],a4[100];
int p1,p2,p3,p4,dem=1;
p1=m;p2=p1+1;
while(p2<strlen(s))
{
if(s[p2]=='(') dem++;
else if(s[p2]==')') dem--;
if(dem==0) break;
p2++;
}
p4=0;
for(p3=p1+1;p3<p2;p3++) a2[p4++]=s[p3];
a2[p4]='\0';

p1--;
c1=s[p1];
for(p3=0;p3<p1;p3++) a1[p3]=s[p3];
a1[p3]='\0';

c2=s[p2+1];
if(c2=='*' || c2=='/')
{
p2+=2;
p4=0;
loop:;
while(p2<strlen(s) && s[p2]!='-' && s[p2]!='+' && s[p2]!='(') a3[p4++]=s[p2++];
if(s[p2]=='(')
{
p3=p2+1;
dem=1;
while(p3<strlen(s))
{
if(s[p3]=='(') dem++;
else if(s[p3]==')') dem--;
if(dem==0) break;
p3++;
}
for(p1=p2;p1<=p3;p1++) a3[p4++]=s[p1];
p2=p3+1;
goto loop;
}
a3[p4]='\0';
c3=s[p2];
p2++;p4=0;
while(p2<strlen(s)) a4[p4++]=s[p2++];
a4[p4]='\0';
}
else
{
c3=c2;
a3[0]='\0';
p4=0;p2+=2;
while(p2<strlen(s)) a4[p4++]=s[p2++];
a4[p4]='\0';
}
if(c3=='-')
{
p4=0;
while(p4<strlen(a4))
{
while(a4[p4]!='(' && p4<strlen(a4))
{
if(a4[p4]=='+') a4[p4]='-';
else if(a4[p4]=='-') a4[p4]='+';
p4++;
}
p4++;dem=1;
while(p4<strlen(a4))
{
if(a4[p4]=='(') dem++;
if(a4[p4]==')') dem--;
if(dem==0) break;
p4++;
}
p4++;
}
}
long k=tinh(a2);
if(strlen(a1)>0)
{
if(c1=='*') k=tinh(a1)*k;
else if(c1=='/') k=tinh(a1)/k;
}
if(strlen(a3)>0)
{
if(c2=='*') k=k*tinh(a3);
else if(c2=='/') k=k/tinh(a3);
}
if(strlen(a4)>0)
{
if(c3=='+') k=k+tinh(a4);
else if(c3=='-') k=k-tinh(a4);
}
return k;
}
}
}
char c;
for(i=0;i<strlen(s);i++)
{
if(s[i]=='*' || s[i]=='/') break;
a[i]=s[i];
}
a[i]='\0';
long kq=atol(a);
c=s[i];
i++;
while(i<strlen(s))
{
d=0;
while(s[i]!='*' && s[i]!='/' && i<strlen(s)) a[d++]=s[i++];
a[d]='\0';
if(c=='*') kq*=atol(a);
else kq/=atol(a);
c=s[i];
i++;
}
return kq;
}
void xuly(char *s,int x)
{
char a[100],b[100];
int i,j,m;
ltoa(x,a,10);
if(s[0]=='x')
{
for(i=0;i<strlen(a);i++) b[i]=a[i];
for(j=1;j<strlen(s);j++) b[i++]=s[j];
b[i]='\0';
for(i=0;i<strlen(b);i++) s[i]=b[i];
s[i]='\0';
}
for(i=1;i<strlen(s);i++)
{
if(s[i]=='x')
{
if(s[i-1]>='0' && s[i-1]<='9')
{
for(j=0;j<i;j++) b[j]=s[j];
b[j++]='*';
for(m=0;m<strlen(a);m++) b[j++]=a[m];
for(m=i+1;m<strlen(s);m++) b[j++]=s[m];
b[j]='\0';
for(j=0;j<strlen(b);j++) s[j]=b[j];
s[j]='\0';
}
else
{
for(j=0;j<i;j++) b[j]=s[j];
for(m=0;m<strlen(a);m++) b[j++]=a[m];
for(m=i+1;m<strlen(s);m++) b[j++]=s[m];
b[j]='\0';
for(j=0;j<strlen(b);j++) s[j]=b[j];
s[j]='\0';
}
}
}
}
void bang(char *a,char *b)
{
int i;
for(i=0;i<strlen(b);i++) a[i]=b[i];
a[i]='\0';
}
void main()
{
FILE *t1=fopen("bai1.inp","r");
FILE *t2=fopen("bai1.out","w");
if(t1==NULL || t2==NULL) exit(0);
char s[1000],a[1000];
long n,x,gt;
fgets(s,100,t1);
fscanf(t1,"%ld",&n);
for(int i=1;i<=n;i++)
{
bang(a,s);
fscanf(t1,"%ld",&x);
xuly(a,x);
gt=tinh(a);
fprintf(t2,"%ld ",gt);
}
fcloseall();
}

Không có nhận xét nào:

Đăng nhận xét