📄 semantic.cpp
字号:
#include "semantics.h"
extern double
Parameter,
Origin_x,Origin_y,
Scale_x,Scale_y,
Rot_angle;
double GetExprValue(struct ExprNode *root);
void DelExprTree(struct ExprNode *root);
static void Errmsg(char *string);
static void CalcCoord(struct ExprNode *Hor_Exp,
struct ExprNode *Ver_Exp,
double &Hor_x,
double &Ver_y);
//..........出错处理
void Errmsg(char *string)
{
exit(1);
}
//...........计算被绘制的点的坐标
static void CalcCoord(
struct ExprNode *Hor_Exp,
struct ExprNode *Ver_Exp,
double &Hor_x,
double &Ver_y)
{
double HorCord,VerCord,Hor_tmp;
HorCord = GetExprValue(Hor_Exp);
VerCord = GetExprValue(Ver_Exp);
HorCord *= Scale_x;
VerCord *= Scale_y;
Hor_tmp = HorCord *cos(Rot_angle)+VerCord *sin(Rot_angle);
VerCord = VerCord *cos(Rot_angle)-HorCord*sin(Rot_angle);
HorCord = Hor_tmp;
HorCord += Origin_x;
VerCord += Origin_y;
Hor_x = HorCord;
Ver_y = VerCord;
}
//..........计算表达式的值
double GetExprValue(struct ExprNode *root)
{
if(root==NULL)
return 0.0;
switch(root->OpCode)
{
case PLUS:
return GetExprValue(root->Content.CaseOperator.Left)+
GetExprValue(root->Content.CaseOperator.Right);
case MINUS:
return GetExprValue(root->Content.CaseOperator.Left)-
GetExprValue(root->Content.CaseOperator.Right);
case MUL:
return GetExprValue(root->Content.CaseOperator.Left)*
GetExprValue(root->Content.CaseOperator.Right);
case DIV:
return GetExprValue(root->Content.CaseOperator.Left)/
GetExprValue(root->Content.CaseOperator.Right);
case POWER:
return pow(GetExprValue(root->Content.CaseOperator.Left),
GetExprValue(root->Content.CaseOperator.Right));
case FUNC:
return (*root->Content.CaseFunc.MathFuncPtr)
(GetExprValue(root->Content.CaseFunc.Child));
case CONST_ID:
return root->Content.CaseConst;
case T:
return *(root->Content.CaseParmPtr);
default :
return 0.0;
}
}
//...........删除一棵树
void DelExprTree(struct ExprNode *root)
{
if(root==NULL)
return ;
switch(root->OpCode)
{
case PLUS:
case MINUS:
case MUL:
case DIV:
case POWER:
DelExprTree(root->Content.CaseOperator.Left);
DelExprTree(root->Content.CaseOperator.Right);
break;
case FUNC:
DelExprTree(root->Content.CaseFunc.Child);
break;
default:
break;
}
delete(root);
}
#ifdef _BC_COMPILER
int InGraphMode=0;
int InitGraph(void)
{
int gd=DETECT,gm;
if(InGraphMode)
return 0;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm," ");
setcolor(-1);
InGraphMode=1;
return 1;
}
void CloseGraph(void)
{
if(!InGraphMode)
return;
getch();
closegraph();
InGraphMode=0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -