📄 count.h
字号:
class count{
Array<char> Char_Array;//存放表达式中的符号
Array<float> digital_Array;//存放表达式中的数字
stack<char> Char_Stack;//计算时表达式中的符号入栈
stack<float> digital_Stack;//计算时表达式中的数字入栈
int frontchar;//表达式最开始时符号的个数
int CACrrent,DAcurrent;//分别表示读到当前的符号和数字
public:
count();//构造函数赋初值
bool readtext();//读取数学表达式
bool putouttext();//输出表达式
bool counttext();//计算表达式的值
bool showresult();
};
count::count(){
CACrrent=DAcurrent=frontchar=0;//默认为零
}
bool count::readtext(){
char a;//
float di;
cout<<"请输入一个数学表达式"<<endl;
while(cin.peek()!=10){//首先查看表达式的开头是否为符号,如果是符号则符号放入符号的数组中
a=cin.peek();
if(a<'0'||a>'9'){//如果是符号
frontchar++;
cin>>a;//把符号读取
Char_Array.push(a);//把符号入栈
}
else break;
}
while(cin.peek()!=10){//以下为继续读入表达式
a=cin.peek();
if(a<'0'||a>'9'){//如果是符号
cin>>a;//把符号读取
Char_Array.push(a);//把符号入栈
}
else{
cin>>di;
digital_Array.push(di);
}
}
return true;
}
bool count::putouttext(){
char a;
int change=1;//用来判断输出顺序,1表示输出数字,0表示输出符号
float di;
cout<<"您所输入的数学表达式为:"<<endl;
for(CACrrent=0;CACrrent<frontchar&&Char_Array.getaele(CACrrent,a);CACrrent++){
//首先输出表达式最前面的符号
cout<<a;
}
while(1){
if( change && digital_Array.getaele(DAcurrent++,di)){//要求能取到当前值
cout<<di;
change=0;//输出数字之后一定是输出符号
continue;//接着进入下一次循环
}
else if(Char_Array.getaele(CACrrent++,a)){
cout<<a;//输出当前符号
if( a=='{' || a=='[' || a=='(' ){
change=1;continue;}
else if( a=='}' || a==']' || a==')' )
continue;//如果为以上三种符号,表示后面一定还要在输出符号,所以不改变 change的值
//继续输出符号
else if(a=='*' || a=='-'||a=='+'||a=='/' ){
Char_Array.getaele(CACrrent,a);
if( a=='{' || a=='[' || a=='(' )
continue;
else
change=1;//如果不是以上三符号一定是接下来输出数字
}
}
else break;//如果不输符号和数字则表明表达式完全输完
}
cout<<endl;
CACrrent=DAcurrent=0;
return true;
}
bool count::counttext(){
char a,b,nextchar,frontchar=0;
int change=1;//用来判断入栈顺序,1表示数字入栈,0表示符号入栈
float di,a1,a2;
for(CACrrent=0;CACrrent<frontchar&& Char_Array.getaele(CACrrent,a);CACrrent++){//首先把表达式最前面的
Char_Stack.push(a); //符号入栈
}
while(1){//开始计算
if( change && digital_Array.getaele(DAcurrent++,di)){//要求能取到当前值
digital_Stack.push(di);//把所计算的数字入栈
change=0;//数字入栈之后一定是符号入栈
continue;//接着进入下一次循环
}
else if( Char_Array.getaele(CACrrent++,a) ){//取到当前符号
Char_Array.getaele(CACrrent,nextchar);
switch(a){//用switch语句与下一个符号相比较
case '+':;
case '-':switch(nextchar){
case '*':;
case '/':change=1; //接下来读度数字,改变change的值为1
case '(':;
case '[':;
case '{':;
Char_Stack.push(a);
break;//如果接下来的是 + - } ] ) 则要进行计算
case '}':;
case ']':;
case ')':;
case 'e':;//没有nextchar所返回的值
case '-':;
case '+':digital_Stack.pop(a1);//一个数存放在栈中
digital_Array.getaele(DAcurrent++,a2);//另一个数还未进栈
if(a=='+')
di=a1+a2;
else
di=a1-a2;
digital_Stack.push(di);//把计算的结果放回栈中
break;
default:return false;//如果不匹配说明所写的表达式有错误
}
break;
case '*':;
case '/':switch(nextchar){
case '(':;
case '{':;
case '[':
Char_Stack.push(a);//接下来读度数字,不改变change的值
break;
case 'e':;//没有nextchar所返回的值
case '*':;
case '/':;
case '+':;
case '-':;
case '}':;
case ']':;
case ')':
digital_Stack.pop(a1);//一个数存放在栈中
digital_Array.getaele(DAcurrent++,a2);//另一个数还未进栈
if(a=='*')
di=a1*a2;
else di=a1/a2;
Char_Stack.checkele(0,b);//查看上次进栈的是否为 + -
if(b=='+'){
digital_Stack.pop(a1);
di=di+a1;
}//+-号没有出栈
else if(b=='-'){
digital_Stack.pop(a1);
di=a1-di;
}
digital_Stack.push(di);break;
}
break;
case '{':;
case '[':;
case '(':Char_Stack.push(a);change=1;break;
case '}':;
case ']':;
case ')':Char_Stack.pop(b);//出栈的为括号对应的反括号
Char_Stack.checkele(0,b);//查看括号前面所对应的符号
switch(b){
case '*':
case '/':digital_Stack.pop(a1);//一个数存放在栈中
digital_Stack.pop(a2);
if(b=='*')
di=a1*a2;
else
di=a2/a1;
Char_Stack.pop(b);
Char_Stack.checkele(0,b);//查看上次进栈的是否为 + -
if(b=='+'){
digital_Stack.pop(a1);
di=di+a1;
Char_Stack.pop(b);
}
else if(b=='-'){
digital_Stack.pop(a1);
di=a1-di;
Char_Stack.pop(b);
}
digital_Stack.push(di);
break;
case '+':
case '-':digital_Stack.pop(a1);//一个数存放在栈中
digital_Stack.pop(a2);
if(b=='+'){
di=a1+a2;
Char_Stack.pop(b);
}
else if(b=='-'){
di=a2-a1;
Char_Stack.pop(b);
}
digital_Stack.push(di);
default:break;
}
default:break;
}
}
else break;
}
digital_Stack.pop(di);
cout<<"表达式的值为:"<<endl;
cout<<di<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -