一个C++编的简单计算器源码,有几个疑问
#include<iostream.h>
#include<stdio.h>
#include<string>
#include<cmath>
struct shuju//数据的每一个节点
{double a;shuju * next;};
struct yunsuan //元算符的每一个节点
{char a;yunsuan * next;};//设计的是链栈程序
shuju * tops;yunsuan * topc;int i;
///字符串到浮点型的转换///..只保留6位有效数字
////在字符串中提取数字?下面的这几行怎么解释啊?
double ftd(char * a)
{double sj;double j=-1.0;sj=0;
while(*a>=48 && *a<=57){sj=10*sj+*a-48;a++;i=i+1;}
if(*a==46){a+=1;i=i+1;while(*a>=48 && *a<=57){
sj+=(*a-48.0)*(pow(10.0,j));a+=1;i=i+1;j-=1.0;}}
return sj;}
void pushs(double x) //数据的进出栈是用来干什么的?
{shuju * p;p=new shuju;p->a=x;//数据的进出“栈”
p->next=tops;tops=p;}
double pops(shuju * a)
{
shuju * q; double pq;
q=tops;pq=q->a ;
tops=tops->next;
free(q); return pq;
}
void push(char x)
{ yunsuan * p;p=new yunsuan;
p->a=x;p->next=topc;topc=p; }
char pop(yunsuan * a)//运算符的进出“栈”
{yunsuan * q;char ss ;q=topc;ss=q->a;
topc=topc->next; free(q); return ss ;}
double zz(double a,char b,double c)
{switch(b){
case 42:return a*c;
case 43:return a+c;
case 45:return c-a;
case 47:{if(a==0){cout<<"输入有错!"<<endl;}else return c/a;}
}}//判断现在的字符是数字还是符号
int pan(char * a)
{if(*a>=48 && *a<=57)return 1;//数据
if(*a>=40 && *a<=43||*a==45||*a==47)return 2;//符号
return 0;///错误、、、输入的不是规定的字符
}
///////比较现在的两个运算符比判断下一步的计划
char bijiao(char a,char b)
{ char pq;
if(b==41||a==42&&b!=40||a==47&&b!=40||(b==43||b==45)&&(a==43||a==45))
pq=60;//将前一个运算运算
if(b==40||a==40||(b==42||b==47)&&(a==43||a==45))
pq=62;///将刚刚进去的运算进栈
return pq;}
int main()
{ double mm=0;i=0;tops=new shuju;topc=new yunsuan;tops->next=NULL;
topc->next=NULL;char as[100];
cout<<"*******************************************************************************"<<endl<<endl;
cout<<"************************************作品简介***********************************"<<endl<<endl;
cout<<" 该软件用于简单的加、 减、乘、除四则运算!"<<endl<<endl;
cout<<" 允许输入 0、1、2、3、4、5、6、7、8、 9、 (、)、*、/、+、-。"<<endl<<endl;
cout<<" 请输入要计算的算式:(比如输入 4+(1+2*3)/5-6 回车 ,输出 :其数值为: -0.6"<<endl;
cout<<" 直接输入 任意非法字符 结束程序!"<<endl;
scanf("%s",as);
while(pan(&as[0])!=0)
{ i=0;
while(as[i]!=0)/////////////////////////////////jisuan
//下面这些是什么意思啊。。不懂,实现什么的
switch(pan(&as[i]))
{
case 1:{pushs(ftd(&as[i]));break;}
case 2:
{ if(topc->next==NULL){push(as[i]),i=i+1;}
else
switch(bijiao(topc->a,as[i]))
{
case 60:
{ double l=pops(tops);
mm=zz(l,pop(topc),pops(tops));
pushs(mm);
if(char(as[i])==41)
{ char zl;
zl=pop(topc);
while(char(zl)!=40)
{ double l=pops(tops);
mm=zz(l,zl,pops(tops));
pushs(mm);zl=pop(topc);
}
}
else push(as[i]);
while(topc->next!=NULL&&topc->next->next!=NULL&&bijiao(topc->next->a,topc->a)==60)
{
char ls;double l=pops(tops);
ls=pop(topc);
mm=zz(l,pop(topc),pops(tops));
pushs(mm);push(ls);
}
i=i+1;break;}
case 62:{push(as[i]);i=i+1;break;}
}
break;}
default:{cout<<"输入有误!"<<endl;break;}
}
while(topc->next!=NULL) {double l=pops(tops);mm=zz(l,pop(topc),pops(tops));pushs(mm);}
cout<<"其数值为: "<<pops(tops)<<endl<<endl<<endl;
cout<<" 直接输入 任意非法字符 结束程序! 或者继续输入要计算的算式!"<<endl;
scanf("%s",as);
}
return 0;
}
我想把这个源码,改为能够体现 面对对象的程序设计,就是有体现类,多态,继承,运算符重载等要素的。。。
好新人帮帮忙吧。。小弟愚钝。。指导一二吧!!!