📄 2.txt
字号:
#include<iostream.h>
#include<stdio.h>
//////////////////////////////
//程序员:郑泽宇 00846127
//类说明开始
//类功能:
//采用栈的思想生成计算器,实现输入浮点型的表达式求值.
//主要子函数:
//1 栈操作子函数.包括开栈、压栈、出栈、栈清空.
//2 run子函数.实现表达式的输入并将中缀表达式转化为后缀表达式.存储在DTD中.
//3 set子函数.将后缀表达式求值并且输出结果.
//4 compute子函数:在输入过程中对符号进行处理.
//版本:1.0
//类说明结束
/////////////////////////////
class calculate
{
private:
double dtd[1000],handle[1000];//dtd用于转化后缀表达式。handle用于后缀表达式求值。
int data,top,alg,rec;//data用来记录dtd中当前位置。alg记录操作符。
double *list;//定义栈的初始指针
public:
calculate();//开栈
void run();
void clear();
void push(double c);
double pop();
void compute(int alg);
void compute2();
void set();
~calculate();
};
calculate::calculate(void){
list=new double[1000];;
top=-1;
data=0;
}
calculate::~calculate(){
delete list;
clear();
}
void calculate::push(double c)
{
top++;
list[top]=c;
}//压栈
void calculate::clear()
{
top=-1;
}
double calculate::pop()
{
if(top>=0)
return list[top--];//判断栈是否为空,不为空则弹出栈顶元素。
}
void calculate::run(void)
{
char c;
double temp=0,flag;
c=getchar();
rec=0;
if(c!='\n')//如果最开始输入的就是\n,则不进行操作。
{
rec=1;
while(c!='\n'){
switch(c){
//将符号转化为负数数字,便于dtd进行储存。
case'+':compute(-1);c=getchar();break;
case'-':compute(-2);c=getchar();break;
case'*':compute(-3);c=getchar();break;
case'/':compute(-4);c=getchar();break;
case'(':push(-5);c=getchar();break;
case')':compute2();c=getchar();break;
default:
flag=0.1;
temp=0;
if(c=='.')//判断是否开始即为小数点
{
c=getchar();
while(c>='0'&&c<='9')
{
temp+=(c-'0')*flag;
flag*=0.1;
c=getchar();
}
dtd[data++]=temp;
}//此处进行小数点后面位数的操作。
else
{
temp=c-'0';
c=getchar();
while(c!='.'){
temp=temp*10+c-'0';
c=getchar();
}//小数点之前的录入.
c=getchar();
while(c>='0'&&c<='9')
{
temp+=flag*(c-'0');
flag*=0.1;
c=getchar();
}//小数点之后的录入.
dtd[data++]=temp;
}
}
}
while(top>=0)dtd[data++]=pop();
}//将符号栈里剩余的符号转入dtd中.
}
void calculate::compute(int alg)
{
if(top==-1||list[top]==-5)
push(alg);//
else{
if(alg>=-2)//对加号和减号进行操作
{
while(top>=0&&list[top]!=-5)
dtd[data++]=pop();//循环比较优先级
push(alg);
}
else{
if(list[top]>=-2)push(alg);
else{dtd[data++]=pop();push(alg);}
}
}
}
void calculate::compute2(){
while(list[top]!=-5){
dtd[data++]=pop();
}
top--;//遇到右括号时向前搜寻左括号,并使其中的符号出栈.
}
void calculate::set(){
int i,j=0;
for(i=0;i<data;i++)
{
if (dtd[i]==-1){j=j-1;handle[j-1]=handle[j-1]+handle[j];}
else if(dtd[i]==-2){j=j-1;handle[j-1]=handle[j-1]-handle[j];}
else if(dtd[i]==-3){j=j-1;handle[j-1]=handle[j-1]*handle[j];}
else if(dtd[i]==-4){j=j-1;handle[j-1]=handle[j-1]/handle[j];}
else
handle[j++]=dtd[i];
}
if(rec==1)//检验输入的表达式是否为空。
printf("%.6lf\n",handle[j-1]);
}
int main(){
int i;
printf("由于本程序专为浮点数设计,请您保证输入的操作数是小数形式,谢谢合作.\n");
for(i=0;i<100;i++){
calculate now;
now.run();
now.set();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -