📄 4rdview.cpp
字号:
case 12:
case 13:
case 14:
MessageBox("error!\n表达式输入有错,=+,-=,*=,/=前面只能为变量,不能为常量!");
m_cal=false;
return;
}
p->code=8;
q.Delete(p->left);
q.Delete(p->right);
p->left=NULL;
p->right=NULL;
sl.Pop(); //弹出栈顶元素
Invalidate();
if(sl.IsEmpty()) //运算完毕
{
m_result=true;
Invalidate();
m_cal=false;
MessageBox("完毕!","编译原理");
}
return;
}//if
else
if(p->left->code==7||p->right->code==7)
{
if(p->left->code==7&&table[p->left->entry].evaluated==false)
{
CIn dlg;
string="请输入标识符"+(CString)table[p->left->entry].name+"的值";
if(dlg.DoModal()==IDOK)
{
table[p->left->entry].value=dlg.m_var;
table[p->left->entry].evaluated=true;
}
m_id=true; //显示标识符的值
Invalidate();
}//if
else
if(p->right->code==7&&table[p->right->entry].evaluated==false)
{
CIn dlg;
string="请输入标识符"+(CString)table[p->right->entry].name+"的值";
if(dlg.DoModal()==IDOK)
{
table[p->right->entry].value=dlg.m_var;
table[p->right->entry].evaluated=true;
}
m_id=true; //显示标识符的值
Invalidate();
}//if
}//if
}//if first2==true
else //按了第一下以后
{
p=sl.GetTop();
if(p->left->code==8&&p->right->code==8)//左右子树都为数字立即运算
{
switch((int)p->code){
case 1:
p->value=p->left->value+p->right->value;
break;
case 2:
p->value=p->left->value-p->right->value;
break;
case 3:
p->value=p->left->value*p->right->value;
break;
case 4:
if(p->right->value>-0.00001&&p->right->value<0.00001)
{
MessageBox("错误:除法时除数为0!");
isok=false;
m_cal=false;
return;
}
p->value=p->left->value/p->right->value;
break;
case 9:
if(p->right->value>-0.00001&&p->right->value<0.00001)
{
MessageBox("错误:整除时除数为0!");
isok=false;
m_cal=false;
return;
}
if(p->left->value>=p->right->value)
p->value=(int)p->left->value/(int)p->right->value;
else
p->value=0;
break;
case 10:
if(p->right->value>-0.00001&&p->right->value<0.00001)
{
MessageBox("错误:求余是除数为0!");
isok=false;
m_cal=false;
return;
}
p->value=(int)p->left->value%(int)p->right->value;
break;
case 11:
case 12:
case 13:
case 14:
MessageBox("error!\n表达式输入有错,=+,-=,*=,/=前面只能为变量,不能为常量!");
m_cal=false;
return;
}
p->code=8;
q.Delete(p->left);
q.Delete(p->right);
p->left=NULL;
p->right=NULL;
sl.Pop(); //弹出栈顶元素
Invalidate();
if(sl.IsEmpty())
{
m_result=true;
Invalidate();
m_cal=false;
MessageBox("完毕!","编译原理");
}
}
else
if(p->left->code==7||p->right->code==7) //左或右孩子有标识符
{
if(p->left->code==7&&table[p->left->entry].evaluated==false)//左标识符未赋值
{
CIn dlg;
string="请输入标识符"+(CString)table[p->left->entry].name+"的值";
if(dlg.DoModal()==IDOK)
{
table[p->left->entry].value=dlg.m_var;
table[p->left->entry].evaluated=true;
}
m_id=true;
Invalidate();
}//if
else
if(p->right->code==7&&table[p->right->entry].evaluated==false)//右标识符未赋值
{
CIn dlg;
string="请输入标识符"+(CString)table[p->right->entry].name+"的值";
if(dlg.DoModal()==IDOK)
{
table[p->right->entry].value=dlg.m_var;
table[p->right->entry].evaluated=true;
}
m_id=true;
Invalidate();
}//if
else
{
double a,b;
if(p->left->code==7)
a=table[p->left->entry].value;
else
a=p->left->value;
if(p->right->code==7)
b=table[p->right->entry].value;
else
b=p->right->value;
switch((int)p->code){
case 1:
p->value=a+b;
p->code=8;
break;
case 2:
p->value=a-b;
p->code=8;
break;
case 3:
p->value=a*b;
p->code=8;
break;
case 4:
if(b>-0.00001&&b<0.00001)
{
MessageBox("错误:除法是除数为0!");
isok=false;
m_cal=false;
return;
}
p->value=a/b;
p->code=8;
break;
case 9:
if(b>-0.00001&&b<0.00001)
{
MessageBox("错误:整除时除数为0!","编译原理");
isok=false;
m_cal=false;
return;
}
if(a>=b)
p->value=(int)a/(int)b;
else
p->value=0;
p->code=8;
break;
case 10:
if(b>-0.00001&&b<0.00001)
{
MessageBox("错误:求余时除数为0!","编译原理");
isok=false;
m_cal=false;
return;
}
p->value=(int)a%(int)b;
p->code=8;
break;
case 11:
if(p->left->code!=7)
{
MessageBox("error!\n表达式输入有错,=+前面只能为变量,不能为常量!","编译原理");
m_cal=false;
return;
}
p->value=a+b;
table[p->left->entry].value=p->value;
p->code=7;
p->entry=p->left->entry;
table[p->entry].evaluated=true;
break;
case 12:
if(p->left->code!=7)
{
MessageBox("error!\n表达式输入有错,-=前面只能为变量,不能为常量!","编译原理");
m_cal=false;
return;
}
p->value=a-b;
table[p->left->entry].value=p->value;
p->code=7;
p->entry=p->left->entry;
table[p->entry].evaluated=true;
break;
case 13:
if(p->left->code!=7)
{
MessageBox("error!\n表达式输入有错,*=前面只能为变量,不能为常量!","编译原理");
m_cal=false;
return;
}
p->value=a*b;
table[p->left->entry].value=p->value;
p->code=7;
p->entry=p->left->entry;
table[p->entry].evaluated=true;
break;
case 14:
if(p->left->code!=7)
{
MessageBox("error!\n表达式输入有错,/=前面只能为变量,不能为常量!","编译原理");
m_cal=false;
return;
}
p->value=a/b;
table[p->left->entry].value=p->value;
p->code=7;
p->entry=p->left->entry;
table[p->entry].evaluated=true;
break;
}//switch
q.Delete(p->left);
q.Delete(p->right);
p->left=NULL;
p->right=NULL;
node *result;
result=sl.Pop(); //弹出栈顶元素
Invalidate();
if(sl.IsEmpty())
{
m_WndDlgBar.GetDlgItem(ID_Caculate)->SetWindowText("开始进行计算(F8)");
m_result=true;
Invalidate();
m_cal=false;
MessageBox("完毕!","编译原理");
}
}//else
}//if
}//else
}//if m_cal==true
else
MessageBox("请先生成语法树!","编译原理");
}
void CMy4rdView::PTree(CDC *pDC) //画图单步输出语法树
{
listnode *p;
node *temp;
CString str;
p=q.front->next;
m_num=0;
while(p!=NULL)
{
temp=p->data;
switch((int)temp->code){
case 1:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"+");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 2:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"-");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 3:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"*");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 4:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"/");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 7:
pDC->SetTextColor(RGB(0,0,255));
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,CString(table[temp->entry].name));
pDC->SetTextColor(RGB(0,0,0));
break;
case 8:
str.Format("%.2f",temp->value);
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,str);
break;
case 9:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"DIV");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 10:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"MOD");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 11:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"+=");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 12:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"-=");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 13:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"*=");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
break;
case 14:
pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"/=");
if(temp->left!=NULL&&temp->right!=NULL)
{
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -