SLIDE1

Friday, April 24, 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();
}