分数表达式计算器

到了数据结构课程设计的时候了,我选了一个表达式计算器,但没用老师要求的用堆栈结构运算,自己写了一个直接对字符串扫描运算的函数,以分数形式运算,结果为精确值,O(n)的复杂度,感觉比用堆栈的效率高。下面是主要部分代码。。。

 

程序支持运算符为()+-*/

 

 

 

char in[200],out[20]; int pos; int getgcd(int a,int b) { if(!a) return b; return getgcd(b%a,a); } void yuefen(int &fenzi,int &fenmu) { int gys=getgcd(abs(fenzi),abs(fenmu)); fenzi/=gys; fenmu/=gys; if(fenmu<0) { fenmu*=-1; fenzi*=-1; } } void cal(int &fenzi,int &fenmu) { int nowzi,nowmu,sign=1; nowzi=0; nowmu=1; for(;pos<strlen(in);pos++) if(in[pos]>='0'&&in[pos]<='9') nowzi=nowzi*10+in[pos]-48; else if (in[pos]=='(') { nowzi*=sign; fenzi=fenzi*nowmu+fenmu*nowzi; fenmu*=nowmu; yuefen(fenzi,fenmu); pos++; cal(nowzi,nowmu); } else if(in[pos]==')') { nowzi*=sign; fenzi=fenzi*nowmu+fenmu*nowzi; fenmu*=nowmu; yuefen(fenzi,fenmu); return ; } else if(in[pos]=='+') { nowzi*=sign; fenzi=fenzi*nowmu+fenmu*nowzi; fenmu*=nowmu; yuefen(fenzi,fenmu); nowzi=0; nowmu=1; sign=1; } else if(in[pos]=='-') { nowzi*=sign; fenzi=fenzi*nowmu+fenmu*nowzi; fenmu*=nowmu; yuefen(fenzi,fenmu); nowzi=0; nowmu=1; sign=-1; } else if(in[pos]=='*') { nowzi*=sign; sign=1; pos++; for(int nz=0,nm=1;pos<strlen(in)+1;pos++) if(in[pos]=='(') { pos++; cal(nz,nm); } else if(in[pos]>='0'&&in[pos]<='9') nz=nz*10+in[pos]-48; else { nowzi*=nz; nowmu*=nm; yuefen(nowzi,nowmu); pos--; break; } } else if(in[pos]=='/') { int temp=0; pos++; for(int nz=0,nm=1,flag=0;pos<strlen(in)+1;pos++) if(in[pos]=='(') { pos++; cal(nz,nm); flag=1; } else if(in[pos]>='0'&&in[pos]<='9') temp=temp*10+in[pos]-48; else { if(flag) { nowzi*=nm; nowmu*=nz; yuefen(nowzi,nowmu); } else { nowmu*=temp; yuefen(nowzi,nowmu); } pos--; break; } } nowzi*=sign; fenzi=fenzi*nowmu+fenmu*nowzi; fenmu*=nowmu; yuefen(fenzi,fenmu); return ; } void CAsdDlg::OnCal() { UpdateData(true); strcpy(in,m_in); pos=0; int fenzi=0,fenmu=1; cal(fenzi,fenmu); itoa(fenzi,out,10); if(fenzi%fenmu!=0) { strcat(out,"/"); itoa(fenmu,strrchr(out,'/0'),10); } m_out=out; UpdateData(false); }

 

 

 

你可能感兴趣的:(分数表达式计算器)